diff options
349 files changed, 5659 insertions, 1843 deletions
diff --git a/Documentation/hwmon/lm93 b/Documentation/hwmon/lm93 index 7a10616d0b44..f3b2ad2ceb01 100644 --- a/Documentation/hwmon/lm93 +++ b/Documentation/hwmon/lm93 | |||
@@ -6,6 +6,10 @@ Supported chips: | |||
6 | Prefix 'lm93' | 6 | Prefix 'lm93' |
7 | Addresses scanned: I2C 0x2c-0x2e | 7 | Addresses scanned: I2C 0x2c-0x2e |
8 | Datasheet: http://www.national.com/ds.cgi/LM/LM93.pdf | 8 | Datasheet: http://www.national.com/ds.cgi/LM/LM93.pdf |
9 | * National Semiconductor LM94 | ||
10 | Prefix 'lm94' | ||
11 | Addresses scanned: I2C 0x2c-0x2e | ||
12 | Datasheet: http://www.national.com/ds.cgi/LM/LM94.pdf | ||
9 | 13 | ||
10 | Authors: | 14 | Authors: |
11 | Mark M. Hoffman <mhoffman@lightlink.com> | 15 | Mark M. Hoffman <mhoffman@lightlink.com> |
@@ -56,6 +60,9 @@ previous motherboard management ASICs and uses some of the LM85's features | |||
56 | for dynamic Vccp monitoring and PROCHOT. It is designed to monitor a dual | 60 | for dynamic Vccp monitoring and PROCHOT. It is designed to monitor a dual |
57 | processor Xeon class motherboard with a minimum of external components. | 61 | processor Xeon class motherboard with a minimum of external components. |
58 | 62 | ||
63 | LM94 is also supported in LM93 compatible mode. Extra sensors and features of | ||
64 | LM94 are not supported. | ||
65 | |||
59 | 66 | ||
60 | User Interface | 67 | User Interface |
61 | -------------- | 68 | -------------- |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 2 | 1 | VERSION = 2 |
2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
3 | SUBLEVEL = 37 | 3 | SUBLEVEL = 38 |
4 | EXTRAVERSION = | 4 | EXTRAVERSION = -rc1 |
5 | NAME = Flesh-Eating Bats with Fangs | 5 | NAME = Flesh-Eating Bats with Fangs |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/mach-s5p6442/mach-smdk6442.c b/arch/arm/mach-s5p6442/mach-smdk6442.c index e69f137b0a39..eaf6b9c489ff 100644 --- a/arch/arm/mach-s5p6442/mach-smdk6442.c +++ b/arch/arm/mach-s5p6442/mach-smdk6442.c | |||
@@ -68,6 +68,7 @@ static struct s3c2410_uartcfg smdk6442_uartcfgs[] __initdata = { | |||
68 | 68 | ||
69 | static struct platform_device *smdk6442_devices[] __initdata = { | 69 | static struct platform_device *smdk6442_devices[] __initdata = { |
70 | &s3c_device_i2c0, | 70 | &s3c_device_i2c0, |
71 | &samsung_asoc_dma, | ||
71 | &s5p6442_device_iis0, | 72 | &s5p6442_device_iis0, |
72 | &s3c_device_wdt, | 73 | &s3c_device_wdt, |
73 | }; | 74 | }; |
diff --git a/arch/arm/mach-s5p64x0/mach-smdk6440.c b/arch/arm/mach-s5p64x0/mach-smdk6440.c index e9802755daeb..e5beb84e2393 100644 --- a/arch/arm/mach-s5p64x0/mach-smdk6440.c +++ b/arch/arm/mach-s5p64x0/mach-smdk6440.c | |||
@@ -95,6 +95,7 @@ static struct platform_device *smdk6440_devices[] __initdata = { | |||
95 | &s3c_device_i2c1, | 95 | &s3c_device_i2c1, |
96 | &s3c_device_ts, | 96 | &s3c_device_ts, |
97 | &s3c_device_wdt, | 97 | &s3c_device_wdt, |
98 | &samsung_asoc_dma, | ||
98 | &s5p6440_device_iis, | 99 | &s5p6440_device_iis, |
99 | }; | 100 | }; |
100 | 101 | ||
diff --git a/arch/arm/mach-s5p64x0/mach-smdk6450.c b/arch/arm/mach-s5p64x0/mach-smdk6450.c index b78f56292780..3a20de0a9264 100644 --- a/arch/arm/mach-s5p64x0/mach-smdk6450.c +++ b/arch/arm/mach-s5p64x0/mach-smdk6450.c | |||
@@ -113,6 +113,7 @@ static struct platform_device *smdk6450_devices[] __initdata = { | |||
113 | &s3c_device_i2c1, | 113 | &s3c_device_i2c1, |
114 | &s3c_device_ts, | 114 | &s3c_device_ts, |
115 | &s3c_device_wdt, | 115 | &s3c_device_wdt, |
116 | &samsung_asoc_dma, | ||
116 | &s5p6450_device_iis0, | 117 | &s5p6450_device_iis0, |
117 | /* s5p6450_device_spi0 will be added */ | 118 | /* s5p6450_device_spi0 will be added */ |
118 | }; | 119 | }; |
diff --git a/arch/arm/mach-s5pv210/mach-smdkc110.c b/arch/arm/mach-s5pv210/mach-smdkc110.c index bb20a14da100..ce11a02eabf3 100644 --- a/arch/arm/mach-s5pv210/mach-smdkc110.c +++ b/arch/arm/mach-s5pv210/mach-smdkc110.c | |||
@@ -81,6 +81,7 @@ static struct s3c_ide_platdata smdkc110_ide_pdata __initdata = { | |||
81 | }; | 81 | }; |
82 | 82 | ||
83 | static struct platform_device *smdkc110_devices[] __initdata = { | 83 | static struct platform_device *smdkc110_devices[] __initdata = { |
84 | &samsung_asoc_dma, | ||
84 | &s5pv210_device_iis0, | 85 | &s5pv210_device_iis0, |
85 | &s5pv210_device_ac97, | 86 | &s5pv210_device_ac97, |
86 | &s5pv210_device_spdif, | 87 | &s5pv210_device_spdif, |
diff --git a/arch/arm/mach-s5pv210/mach-smdkv210.c b/arch/arm/mach-s5pv210/mach-smdkv210.c index 88e45223c8af..bc9fdb52a020 100644 --- a/arch/arm/mach-s5pv210/mach-smdkv210.c +++ b/arch/arm/mach-s5pv210/mach-smdkv210.c | |||
@@ -225,6 +225,7 @@ static struct platform_device *smdkv210_devices[] __initdata = { | |||
225 | &s5pv210_device_ac97, | 225 | &s5pv210_device_ac97, |
226 | &s5pv210_device_iis0, | 226 | &s5pv210_device_iis0, |
227 | &s5pv210_device_spdif, | 227 | &s5pv210_device_spdif, |
228 | &samsung_asoc_dma, | ||
228 | &samsung_device_keypad, | 229 | &samsung_device_keypad, |
229 | &smdkv210_dm9000, | 230 | &smdkv210_dm9000, |
230 | &smdkv210_lcd_lte480wv, | 231 | &smdkv210_lcd_lte480wv, |
diff --git a/arch/arm/mach-s5pv310/mach-smdkc210.c b/arch/arm/mach-s5pv310/mach-smdkc210.c index 2d49273c0a26..d9cab02e23ca 100644 --- a/arch/arm/mach-s5pv310/mach-smdkc210.c +++ b/arch/arm/mach-s5pv310/mach-smdkc210.c | |||
@@ -163,8 +163,9 @@ static struct platform_device *smdkc210_devices[] __initdata = { | |||
163 | &s5pv310_device_pd[PD_CAM], | 163 | &s5pv310_device_pd[PD_CAM], |
164 | &s5pv310_device_pd[PD_TV], | 164 | &s5pv310_device_pd[PD_TV], |
165 | &s5pv310_device_pd[PD_GPS], | 165 | &s5pv310_device_pd[PD_GPS], |
166 | &smdkc210_smsc911x, | ||
167 | &s5pv310_device_sysmmu, | 166 | &s5pv310_device_sysmmu, |
167 | &samsung_asoc_dma, | ||
168 | &smdkc210_smsc911x, | ||
168 | }; | 169 | }; |
169 | 170 | ||
170 | static void __init smdkc210_smsc911x_init(void) | 171 | static void __init smdkc210_smsc911x_init(void) |
diff --git a/arch/arm/mach-s5pv310/mach-smdkv310.c b/arch/arm/mach-s5pv310/mach-smdkv310.c index 28680cf9a72c..b1cddbf3c616 100644 --- a/arch/arm/mach-s5pv310/mach-smdkv310.c +++ b/arch/arm/mach-s5pv310/mach-smdkv310.c | |||
@@ -163,8 +163,9 @@ static struct platform_device *smdkv310_devices[] __initdata = { | |||
163 | &s5pv310_device_pd[PD_CAM], | 163 | &s5pv310_device_pd[PD_CAM], |
164 | &s5pv310_device_pd[PD_TV], | 164 | &s5pv310_device_pd[PD_TV], |
165 | &s5pv310_device_pd[PD_GPS], | 165 | &s5pv310_device_pd[PD_GPS], |
166 | &smdkv310_smsc911x, | ||
167 | &s5pv310_device_sysmmu, | 166 | &s5pv310_device_sysmmu, |
167 | &samsung_asoc_dma, | ||
168 | &smdkv310_smsc911x, | ||
168 | }; | 169 | }; |
169 | 170 | ||
170 | static void __init smdkv310_smsc911x_init(void) | 171 | static void __init smdkv310_smsc911x_init(void) |
diff --git a/arch/m68k/include/asm/cacheflush_no.h b/arch/m68k/include/asm/cacheflush_no.h index 7085bd51668b..cb88aa96c4f1 100644 --- a/arch/m68k/include/asm/cacheflush_no.h +++ b/arch/m68k/include/asm/cacheflush_no.h | |||
@@ -2,21 +2,22 @@ | |||
2 | #define _M68KNOMMU_CACHEFLUSH_H | 2 | #define _M68KNOMMU_CACHEFLUSH_H |
3 | 3 | ||
4 | /* | 4 | /* |
5 | * (C) Copyright 2000-2004, Greg Ungerer <gerg@snapgear.com> | 5 | * (C) Copyright 2000-2010, Greg Ungerer <gerg@snapgear.com> |
6 | */ | 6 | */ |
7 | #include <linux/mm.h> | 7 | #include <linux/mm.h> |
8 | #include <asm/mcfsim.h> | ||
8 | 9 | ||
9 | #define flush_cache_all() __flush_cache_all() | 10 | #define flush_cache_all() __flush_cache_all() |
10 | #define flush_cache_mm(mm) do { } while (0) | 11 | #define flush_cache_mm(mm) do { } while (0) |
11 | #define flush_cache_dup_mm(mm) do { } while (0) | 12 | #define flush_cache_dup_mm(mm) do { } while (0) |
12 | #define flush_cache_range(vma, start, end) __flush_cache_all() | 13 | #define flush_cache_range(vma, start, end) do { } while (0) |
13 | #define flush_cache_page(vma, vmaddr) do { } while (0) | 14 | #define flush_cache_page(vma, vmaddr) do { } while (0) |
14 | #define flush_dcache_range(start,len) __flush_cache_all() | 15 | #define flush_dcache_range(start, len) __flush_dcache_all() |
15 | #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0 | 16 | #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0 |
16 | #define flush_dcache_page(page) do { } while (0) | 17 | #define flush_dcache_page(page) do { } while (0) |
17 | #define flush_dcache_mmap_lock(mapping) do { } while (0) | 18 | #define flush_dcache_mmap_lock(mapping) do { } while (0) |
18 | #define flush_dcache_mmap_unlock(mapping) do { } while (0) | 19 | #define flush_dcache_mmap_unlock(mapping) do { } while (0) |
19 | #define flush_icache_range(start,len) __flush_cache_all() | 20 | #define flush_icache_range(start, len) __flush_icache_all() |
20 | #define flush_icache_page(vma,pg) do { } while (0) | 21 | #define flush_icache_page(vma,pg) do { } while (0) |
21 | #define flush_icache_user_range(vma,pg,adr,len) do { } while (0) | 22 | #define flush_icache_user_range(vma,pg,adr,len) do { } while (0) |
22 | #define flush_cache_vmap(start, end) do { } while (0) | 23 | #define flush_cache_vmap(start, end) do { } while (0) |
@@ -27,66 +28,52 @@ | |||
27 | #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ | 28 | #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ |
28 | memcpy(dst, src, len) | 29 | memcpy(dst, src, len) |
29 | 30 | ||
31 | void mcf_cache_push(void); | ||
32 | |||
30 | static inline void __flush_cache_all(void) | 33 | static inline void __flush_cache_all(void) |
31 | { | 34 | { |
32 | #if defined(CONFIG_M5407) || defined(CONFIG_M548x) | 35 | #ifdef CACHE_PUSH |
33 | /* | 36 | mcf_cache_push(); |
34 | * Use cpushl to push and invalidate all cache lines. | 37 | #endif |
35 | * Gas doesn't seem to know how to generate the ColdFire | 38 | #ifdef CACHE_INVALIDATE |
36 | * cpushl instruction... Oh well, bit stuff it for now. | ||
37 | */ | ||
38 | __asm__ __volatile__ ( | ||
39 | "nop\n\t" | ||
40 | "clrl %%d0\n\t" | ||
41 | "1:\n\t" | ||
42 | "movel %%d0,%%a0\n\t" | ||
43 | "2:\n\t" | ||
44 | ".word 0xf468\n\t" | ||
45 | "addl #0x10,%%a0\n\t" | ||
46 | "cmpl #0x00000800,%%a0\n\t" | ||
47 | "blt 2b\n\t" | ||
48 | "addql #1,%%d0\n\t" | ||
49 | "cmpil #4,%%d0\n\t" | ||
50 | "bne 1b\n\t" | ||
51 | "movel #0xb6088500,%%d0\n\t" | ||
52 | "movec %%d0,%%CACR\n\t" | ||
53 | : : : "d0", "a0" ); | ||
54 | #endif /* CONFIG_M5407 */ | ||
55 | #if defined(CONFIG_M523x) || defined(CONFIG_M527x) | ||
56 | __asm__ __volatile__ ( | ||
57 | "movel #0x81400100, %%d0\n\t" | ||
58 | "movec %%d0, %%CACR\n\t" | ||
59 | "nop\n\t" | ||
60 | : : : "d0" ); | ||
61 | #endif /* CONFIG_M523x || CONFIG_M527x */ | ||
62 | #if defined(CONFIG_M528x) | ||
63 | __asm__ __volatile__ ( | ||
64 | "movel #0x81000200, %%d0\n\t" | ||
65 | "movec %%d0, %%CACR\n\t" | ||
66 | "nop\n\t" | ||
67 | : : : "d0" ); | ||
68 | #endif /* CONFIG_M528x */ | ||
69 | #if defined(CONFIG_M5206) || defined(CONFIG_M5206e) || defined(CONFIG_M5272) | ||
70 | __asm__ __volatile__ ( | 39 | __asm__ __volatile__ ( |
71 | "movel #0x81000100, %%d0\n\t" | 40 | "movel %0, %%d0\n\t" |
72 | "movec %%d0, %%CACR\n\t" | 41 | "movec %%d0, %%CACR\n\t" |
73 | "nop\n\t" | 42 | "nop\n\t" |
74 | : : : "d0" ); | 43 | : : "i" (CACHE_INVALIDATE) : "d0" ); |
75 | #endif /* CONFIG_M5206 || CONFIG_M5206e || CONFIG_M5272 */ | 44 | #endif |
76 | #ifdef CONFIG_M5249 | 45 | } |
46 | |||
47 | /* | ||
48 | * Some ColdFire parts implement separate instruction and data caches, | ||
49 | * on those we should just flush the appropriate cache. If we don't need | ||
50 | * to do any specific flushing then this will be optimized away. | ||
51 | */ | ||
52 | static inline void __flush_icache_all(void) | ||
53 | { | ||
54 | #ifdef CACHE_INVALIDATEI | ||
77 | __asm__ __volatile__ ( | 55 | __asm__ __volatile__ ( |
78 | "movel #0xa1000200, %%d0\n\t" | 56 | "movel %0, %%d0\n\t" |
79 | "movec %%d0, %%CACR\n\t" | 57 | "movec %%d0, %%CACR\n\t" |
80 | "nop\n\t" | 58 | "nop\n\t" |
81 | : : : "d0" ); | 59 | : : "i" (CACHE_INVALIDATEI) : "d0" ); |
82 | #endif /* CONFIG_M5249 */ | 60 | #endif |
83 | #ifdef CONFIG_M532x | 61 | } |
62 | |||
63 | static inline void __flush_dcache_all(void) | ||
64 | { | ||
65 | #ifdef CACHE_PUSH | ||
66 | mcf_cache_push(); | ||
67 | #endif | ||
68 | #ifdef CACHE_INVALIDATED | ||
84 | __asm__ __volatile__ ( | 69 | __asm__ __volatile__ ( |
85 | "movel #0x81000200, %%d0\n\t" | 70 | "movel %0, %%d0\n\t" |
86 | "movec %%d0, %%CACR\n\t" | 71 | "movec %%d0, %%CACR\n\t" |
87 | "nop\n\t" | 72 | "nop\n\t" |
88 | : : : "d0" ); | 73 | : : "i" (CACHE_INVALIDATED) : "d0" ); |
89 | #endif /* CONFIG_M532x */ | 74 | #else |
75 | /* Flush the wrtite buffer */ | ||
76 | __asm__ __volatile__ ( "nop" ); | ||
77 | #endif | ||
90 | } | 78 | } |
91 | |||
92 | #endif /* _M68KNOMMU_CACHEFLUSH_H */ | 79 | #endif /* _M68KNOMMU_CACHEFLUSH_H */ |
diff --git a/arch/m68k/include/asm/coldfire.h b/arch/m68k/include/asm/coldfire.h index 3b0a34d0fe33..213028cbe110 100644 --- a/arch/m68k/include/asm/coldfire.h +++ b/arch/m68k/include/asm/coldfire.h | |||
@@ -32,7 +32,7 @@ | |||
32 | */ | 32 | */ |
33 | #define MCF_MBAR 0x10000000 | 33 | #define MCF_MBAR 0x10000000 |
34 | #define MCF_MBAR2 0x80000000 | 34 | #define MCF_MBAR2 0x80000000 |
35 | #if defined(CONFIG_M548x) | 35 | #if defined(CONFIG_M54xx) |
36 | #define MCF_IPSBAR MCF_MBAR | 36 | #define MCF_IPSBAR MCF_MBAR |
37 | #elif defined(CONFIG_M520x) | 37 | #elif defined(CONFIG_M520x) |
38 | #define MCF_IPSBAR 0xFC000000 | 38 | #define MCF_IPSBAR 0xFC000000 |
diff --git a/arch/m68k/include/asm/entry_no.h b/arch/m68k/include/asm/entry_no.h index 26be277394f9..627d69bacc58 100644 --- a/arch/m68k/include/asm/entry_no.h +++ b/arch/m68k/include/asm/entry_no.h | |||
@@ -42,12 +42,16 @@ | |||
42 | */ | 42 | */ |
43 | 43 | ||
44 | #ifdef CONFIG_COLDFIRE | 44 | #ifdef CONFIG_COLDFIRE |
45 | #ifdef CONFIG_COLDFIRE_SW_A7 | ||
45 | /* | 46 | /* |
46 | * This is made a little more tricky on the ColdFire. There is no | 47 | * This is made a little more tricky on older ColdFires. There is no |
47 | * separate kernel and user stack pointers. Need to artificially | 48 | * separate supervisor and user stack pointers. Need to artificially |
48 | * construct a usp in software... When doing this we need to disable | 49 | * construct a usp in software... When doing this we need to disable |
49 | * interrupts, otherwise bad things could happen. | 50 | * interrupts, otherwise bad things will happen. |
50 | */ | 51 | */ |
52 | .globl sw_usp | ||
53 | .globl sw_ksp | ||
54 | |||
51 | .macro SAVE_ALL | 55 | .macro SAVE_ALL |
52 | move #0x2700,%sr /* disable intrs */ | 56 | move #0x2700,%sr /* disable intrs */ |
53 | btst #5,%sp@(2) /* from user? */ | 57 | btst #5,%sp@(2) /* from user? */ |
@@ -74,9 +78,7 @@ | |||
74 | 7: | 78 | 7: |
75 | .endm | 79 | .endm |
76 | 80 | ||
77 | .macro RESTORE_ALL | 81 | .macro RESTORE_USER |
78 | btst #5,%sp@(PT_SR) /* going user? */ | ||
79 | bnes 8f /* no, skip */ | ||
80 | move #0x2700,%sr /* disable intrs */ | 82 | move #0x2700,%sr /* disable intrs */ |
81 | movel sw_usp,%a0 /* get usp */ | 83 | movel sw_usp,%a0 /* get usp */ |
82 | movel %sp@(PT_OFF_PC),%a0@- /* copy exception program counter */ | 84 | movel %sp@(PT_OFF_PC),%a0@- /* copy exception program counter */ |
@@ -91,19 +93,22 @@ | |||
91 | subql #8,sw_usp /* set exception */ | 93 | subql #8,sw_usp /* set exception */ |
92 | movel sw_usp,%sp /* restore usp */ | 94 | movel sw_usp,%sp /* restore usp */ |
93 | rte | 95 | rte |
94 | 8: | ||
95 | moveml %sp@,%d1-%d5/%a0-%a2 | ||
96 | lea %sp@(32),%sp /* space for 8 regs */ | ||
97 | movel %sp@+,%d0 | ||
98 | addql #4,%sp /* orig d0 */ | ||
99 | addl %sp@+,%sp /* stkadj */ | ||
100 | rte | ||
101 | .endm | 96 | .endm |
102 | 97 | ||
98 | .macro RDUSP | ||
99 | movel sw_usp,%a2 | ||
100 | .endm | ||
101 | |||
102 | .macro WRUSP | ||
103 | movel %a0,sw_usp | ||
104 | .endm | ||
105 | |||
106 | #else /* !CONFIG_COLDFIRE_SW_A7 */ | ||
103 | /* | 107 | /* |
104 | * Quick exception save, use current stack only. | 108 | * Modern ColdFire parts have separate supervisor and user stack |
109 | * pointers. Simple load and restore macros for this case. | ||
105 | */ | 110 | */ |
106 | .macro SAVE_LOCAL | 111 | .macro SAVE_ALL |
107 | move #0x2700,%sr /* disable intrs */ | 112 | move #0x2700,%sr /* disable intrs */ |
108 | clrl %sp@- /* stkadj */ | 113 | clrl %sp@- /* stkadj */ |
109 | movel %d0,%sp@- /* orig d0 */ | 114 | movel %d0,%sp@- /* orig d0 */ |
@@ -112,7 +117,7 @@ | |||
112 | moveml %d1-%d5/%a0-%a2,%sp@ | 117 | moveml %d1-%d5/%a0-%a2,%sp@ |
113 | .endm | 118 | .endm |
114 | 119 | ||
115 | .macro RESTORE_LOCAL | 120 | .macro RESTORE_USER |
116 | moveml %sp@,%d1-%d5/%a0-%a2 | 121 | moveml %sp@,%d1-%d5/%a0-%a2 |
117 | lea %sp@(32),%sp /* space for 8 regs */ | 122 | lea %sp@(32),%sp /* space for 8 regs */ |
118 | movel %sp@+,%d0 | 123 | movel %sp@+,%d0 |
@@ -121,6 +126,18 @@ | |||
121 | rte | 126 | rte |
122 | .endm | 127 | .endm |
123 | 128 | ||
129 | .macro RDUSP | ||
130 | /*move %usp,%a2*/ | ||
131 | .word 0x4e6a | ||
132 | .endm | ||
133 | |||
134 | .macro WRUSP | ||
135 | /*move %a0,%usp*/ | ||
136 | .word 0x4e60 | ||
137 | .endm | ||
138 | |||
139 | #endif /* !CONFIG_COLDFIRE_SW_A7 */ | ||
140 | |||
124 | .macro SAVE_SWITCH_STACK | 141 | .macro SAVE_SWITCH_STACK |
125 | lea %sp@(-24),%sp /* 6 regs */ | 142 | lea %sp@(-24),%sp /* 6 regs */ |
126 | moveml %a3-%a6/%d6-%d7,%sp@ | 143 | moveml %a3-%a6/%d6-%d7,%sp@ |
@@ -131,14 +148,6 @@ | |||
131 | lea %sp@(24),%sp /* 6 regs */ | 148 | lea %sp@(24),%sp /* 6 regs */ |
132 | .endm | 149 | .endm |
133 | 150 | ||
134 | /* | ||
135 | * Software copy of the user and kernel stack pointers... Ugh... | ||
136 | * Need these to get around ColdFire not having separate kernel | ||
137 | * and user stack pointers. | ||
138 | */ | ||
139 | .globl sw_usp | ||
140 | .globl sw_ksp | ||
141 | |||
142 | #else /* !CONFIG_COLDFIRE */ | 151 | #else /* !CONFIG_COLDFIRE */ |
143 | 152 | ||
144 | /* | 153 | /* |
@@ -167,6 +176,6 @@ | |||
167 | moveml %sp@+,%a3-%a6/%d6-%d7 | 176 | moveml %sp@+,%a3-%a6/%d6-%d7 |
168 | .endm | 177 | .endm |
169 | 178 | ||
170 | #endif /* !CONFIG_COLDFIRE */ | 179 | #endif /* !COLDFIRE_SW_A7 */ |
171 | #endif /* __ASSEMBLY__ */ | 180 | #endif /* __ASSEMBLY__ */ |
172 | #endif /* __M68KNOMMU_ENTRY_H */ | 181 | #endif /* __M68KNOMMU_ENTRY_H */ |
diff --git a/arch/m68k/include/asm/gpio.h b/arch/m68k/include/asm/gpio.h index 1b57adbafad5..c64c7b74cf86 100644 --- a/arch/m68k/include/asm/gpio.h +++ b/arch/m68k/include/asm/gpio.h | |||
@@ -37,7 +37,7 @@ | |||
37 | #if defined(CONFIG_M5206) || defined(CONFIG_M5206e) || \ | 37 | #if defined(CONFIG_M5206) || defined(CONFIG_M5206e) || \ |
38 | defined(CONFIG_M520x) || defined(CONFIG_M523x) || \ | 38 | defined(CONFIG_M520x) || defined(CONFIG_M523x) || \ |
39 | defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ | 39 | defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ |
40 | defined(CONFIG_M532x) || defined(CONFIG_M548x) | 40 | defined(CONFIG_M532x) || defined(CONFIG_M54xx) |
41 | 41 | ||
42 | /* These parts have GPIO organized by 8 bit ports */ | 42 | /* These parts have GPIO organized by 8 bit ports */ |
43 | 43 | ||
diff --git a/arch/m68k/include/asm/io_no.h b/arch/m68k/include/asm/io_no.h index 6e2413e518cb..cf20f3097af6 100644 --- a/arch/m68k/include/asm/io_no.h +++ b/arch/m68k/include/asm/io_no.h | |||
@@ -145,7 +145,6 @@ static inline void io_insl(unsigned int addr, void *buf, int len) | |||
145 | #define IOMAP_WRITETHROUGH 3 | 145 | #define IOMAP_WRITETHROUGH 3 |
146 | 146 | ||
147 | extern void *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag); | 147 | extern void *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag); |
148 | extern void __iounmap(void *addr, unsigned long size); | ||
149 | 148 | ||
150 | static inline void *ioremap(unsigned long physaddr, unsigned long size) | 149 | static inline void *ioremap(unsigned long physaddr, unsigned long size) |
151 | { | 150 | { |
diff --git a/arch/m68k/include/asm/m5206sim.h b/arch/m68k/include/asm/m5206sim.h index 9c384e294af9..561b03b5ddf8 100644 --- a/arch/m68k/include/asm/m5206sim.h +++ b/arch/m68k/include/asm/m5206sim.h | |||
@@ -12,6 +12,10 @@ | |||
12 | #define m5206sim_h | 12 | #define m5206sim_h |
13 | /****************************************************************************/ | 13 | /****************************************************************************/ |
14 | 14 | ||
15 | #define CPU_NAME "COLDFIRE(m5206)" | ||
16 | #define CPU_INSTR_PER_JIFFY 3 | ||
17 | |||
18 | #include <asm/m52xxacr.h> | ||
15 | 19 | ||
16 | /* | 20 | /* |
17 | * Define the 5206 SIM register set addresses. | 21 | * Define the 5206 SIM register set addresses. |
@@ -88,6 +92,14 @@ | |||
88 | #define MCFSIM_PADDR (MCF_MBAR + 0x1c5) /* Parallel Direction (r/w) */ | 92 | #define MCFSIM_PADDR (MCF_MBAR + 0x1c5) /* Parallel Direction (r/w) */ |
89 | #define MCFSIM_PADAT (MCF_MBAR + 0x1c9) /* Parallel Port Value (r/w) */ | 93 | #define MCFSIM_PADAT (MCF_MBAR + 0x1c9) /* Parallel Port Value (r/w) */ |
90 | 94 | ||
95 | #if defined(CONFIG_NETtel) | ||
96 | #define MCFUART_BASE1 0x180 /* Base address of UART1 */ | ||
97 | #define MCFUART_BASE2 0x140 /* Base address of UART2 */ | ||
98 | #else | ||
99 | #define MCFUART_BASE1 0x140 /* Base address of UART1 */ | ||
100 | #define MCFUART_BASE2 0x180 /* Base address of UART2 */ | ||
101 | #endif | ||
102 | |||
91 | /* | 103 | /* |
92 | * Define system peripheral IRQ usage. | 104 | * Define system peripheral IRQ usage. |
93 | */ | 105 | */ |
@@ -95,7 +107,7 @@ | |||
95 | #define MCF_IRQ_PROFILER 31 /* Timer1, Level 7 */ | 107 | #define MCF_IRQ_PROFILER 31 /* Timer1, Level 7 */ |
96 | 108 | ||
97 | /* | 109 | /* |
98 | * Generic GPIO | 110 | * Generic GPIO |
99 | */ | 111 | */ |
100 | #define MCFGPIO_PIN_MAX 8 | 112 | #define MCFGPIO_PIN_MAX 8 |
101 | #define MCFGPIO_IRQ_VECBASE -1 | 113 | #define MCFGPIO_IRQ_VECBASE -1 |
diff --git a/arch/m68k/include/asm/m520xsim.h b/arch/m68k/include/asm/m520xsim.h index db824a4b136e..88ed8239fe4e 100644 --- a/arch/m68k/include/asm/m520xsim.h +++ b/arch/m68k/include/asm/m520xsim.h | |||
@@ -11,6 +11,11 @@ | |||
11 | #define m520xsim_h | 11 | #define m520xsim_h |
12 | /****************************************************************************/ | 12 | /****************************************************************************/ |
13 | 13 | ||
14 | #define CPU_NAME "COLDFIRE(m520x)" | ||
15 | #define CPU_INSTR_PER_JIFFY 3 | ||
16 | |||
17 | #include <asm/m52xxacr.h> | ||
18 | |||
14 | /* | 19 | /* |
15 | * Define the 520x SIM register set addresses. | 20 | * Define the 520x SIM register set addresses. |
16 | */ | 21 | */ |
@@ -54,6 +59,9 @@ | |||
54 | #define MCFSIM_SDCS0 0x000a8110 /* SDRAM Chip Select 0 Configuration */ | 59 | #define MCFSIM_SDCS0 0x000a8110 /* SDRAM Chip Select 0 Configuration */ |
55 | #define MCFSIM_SDCS1 0x000a8114 /* SDRAM Chip Select 1 Configuration */ | 60 | #define MCFSIM_SDCS1 0x000a8114 /* SDRAM Chip Select 1 Configuration */ |
56 | 61 | ||
62 | /* | ||
63 | * EPORT and GPIO registers. | ||
64 | */ | ||
57 | #define MCFEPORT_EPDDR 0xFC088002 | 65 | #define MCFEPORT_EPDDR 0xFC088002 |
58 | #define MCFEPORT_EPDR 0xFC088004 | 66 | #define MCFEPORT_EPDR 0xFC088004 |
59 | #define MCFEPORT_EPPDR 0xFC088005 | 67 | #define MCFEPORT_EPPDR 0xFC088005 |
@@ -97,6 +105,7 @@ | |||
97 | #define MCFGPIO_PCLRR_UART 0xFC0A402A | 105 | #define MCFGPIO_PCLRR_UART 0xFC0A402A |
98 | #define MCFGPIO_PCLRR_FECH 0xFC0A402B | 106 | #define MCFGPIO_PCLRR_FECH 0xFC0A402B |
99 | #define MCFGPIO_PCLRR_FECL 0xFC0A402C | 107 | #define MCFGPIO_PCLRR_FECL 0xFC0A402C |
108 | |||
100 | /* | 109 | /* |
101 | * Generic GPIO support | 110 | * Generic GPIO support |
102 | */ | 111 | */ |
@@ -109,7 +118,6 @@ | |||
109 | #define MCFGPIO_PIN_MAX 80 | 118 | #define MCFGPIO_PIN_MAX 80 |
110 | #define MCFGPIO_IRQ_MAX 8 | 119 | #define MCFGPIO_IRQ_MAX 8 |
111 | #define MCFGPIO_IRQ_VECBASE MCFINT_VECBASE | 120 | #define MCFGPIO_IRQ_VECBASE MCFINT_VECBASE |
112 | /****************************************************************************/ | ||
113 | 121 | ||
114 | #define MCF_GPIO_PAR_UART (0xA4036) | 122 | #define MCF_GPIO_PAR_UART (0xA4036) |
115 | #define MCF_GPIO_PAR_FECI2C (0xA4033) | 123 | #define MCF_GPIO_PAR_FECI2C (0xA4033) |
@@ -126,6 +134,13 @@ | |||
126 | #define MCF_GPIO_PAR_FECI2C_PAR_SCL_UTXD2 (0x04) | 134 | #define MCF_GPIO_PAR_FECI2C_PAR_SCL_UTXD2 (0x04) |
127 | 135 | ||
128 | /* | 136 | /* |
137 | * UART module. | ||
138 | */ | ||
139 | #define MCFUART_BASE1 0x60000 /* Base address of UART1 */ | ||
140 | #define MCFUART_BASE2 0x64000 /* Base address of UART2 */ | ||
141 | #define MCFUART_BASE3 0x68000 /* Base address of UART2 */ | ||
142 | |||
143 | /* | ||
129 | * Reset Controll Unit. | 144 | * Reset Controll Unit. |
130 | */ | 145 | */ |
131 | #define MCF_RCR 0xFC0A0000 | 146 | #define MCF_RCR 0xFC0A0000 |
diff --git a/arch/m68k/include/asm/m523xsim.h b/arch/m68k/include/asm/m523xsim.h index e8d06b24a48e..4ad7a00257a8 100644 --- a/arch/m68k/include/asm/m523xsim.h +++ b/arch/m68k/include/asm/m523xsim.h | |||
@@ -11,6 +11,10 @@ | |||
11 | #define m523xsim_h | 11 | #define m523xsim_h |
12 | /****************************************************************************/ | 12 | /****************************************************************************/ |
13 | 13 | ||
14 | #define CPU_NAME "COLDFIRE(m523x)" | ||
15 | #define CPU_INSTR_PER_JIFFY 3 | ||
16 | |||
17 | #include <asm/m52xxacr.h> | ||
14 | 18 | ||
15 | /* | 19 | /* |
16 | * Define the 523x SIM register set addresses. | 20 | * Define the 523x SIM register set addresses. |
@@ -50,6 +54,13 @@ | |||
50 | #define MCF_RCR_SWRESET 0x80 /* Software reset bit */ | 54 | #define MCF_RCR_SWRESET 0x80 /* Software reset bit */ |
51 | #define MCF_RCR_FRCSTOUT 0x40 /* Force external reset */ | 55 | #define MCF_RCR_FRCSTOUT 0x40 /* Force external reset */ |
52 | 56 | ||
57 | /* | ||
58 | * UART module. | ||
59 | */ | ||
60 | #define MCFUART_BASE1 0x200 /* Base address of UART1 */ | ||
61 | #define MCFUART_BASE2 0x240 /* Base address of UART2 */ | ||
62 | #define MCFUART_BASE3 0x280 /* Base address of UART3 */ | ||
63 | |||
53 | #define MCFGPIO_PODR_ADDR (MCF_IPSBAR + 0x100000) | 64 | #define MCFGPIO_PODR_ADDR (MCF_IPSBAR + 0x100000) |
54 | #define MCFGPIO_PODR_DATAH (MCF_IPSBAR + 0x100001) | 65 | #define MCFGPIO_PODR_DATAH (MCF_IPSBAR + 0x100001) |
55 | #define MCFGPIO_PODR_DATAL (MCF_IPSBAR + 0x100002) | 66 | #define MCFGPIO_PODR_DATAL (MCF_IPSBAR + 0x100002) |
diff --git a/arch/m68k/include/asm/m5249sim.h b/arch/m68k/include/asm/m5249sim.h index 79b7b402f3c9..4908b118f2fd 100644 --- a/arch/m68k/include/asm/m5249sim.h +++ b/arch/m68k/include/asm/m5249sim.h | |||
@@ -11,6 +11,11 @@ | |||
11 | #define m5249sim_h | 11 | #define m5249sim_h |
12 | /****************************************************************************/ | 12 | /****************************************************************************/ |
13 | 13 | ||
14 | #define CPU_NAME "COLDFIRE(m5249)" | ||
15 | #define CPU_INSTR_PER_JIFFY 3 | ||
16 | |||
17 | #include <asm/m52xxacr.h> | ||
18 | |||
14 | /* | 19 | /* |
15 | * Define the 5249 SIM register set addresses. | 20 | * Define the 5249 SIM register set addresses. |
16 | */ | 21 | */ |
@@ -56,6 +61,11 @@ | |||
56 | #define MCFSIM_DACR1 0x110 /* DRAM 1 Addr and Ctrl (r/w) */ | 61 | #define MCFSIM_DACR1 0x110 /* DRAM 1 Addr and Ctrl (r/w) */ |
57 | #define MCFSIM_DMR1 0x114 /* DRAM 1 Mask reg (r/w) */ | 62 | #define MCFSIM_DMR1 0x114 /* DRAM 1 Mask reg (r/w) */ |
58 | 63 | ||
64 | /* | ||
65 | * UART module. | ||
66 | */ | ||
67 | #define MCFUART_BASE1 0x1c0 /* Base address of UART1 */ | ||
68 | #define MCFUART_BASE2 0x200 /* Base address of UART2 */ | ||
59 | 69 | ||
60 | /* | 70 | /* |
61 | * Some symbol defines for the above... | 71 | * Some symbol defines for the above... |
diff --git a/arch/m68k/include/asm/m5272sim.h b/arch/m68k/include/asm/m5272sim.h index df3332c2317d..b7cc50abc831 100644 --- a/arch/m68k/include/asm/m5272sim.h +++ b/arch/m68k/include/asm/m5272sim.h | |||
@@ -12,6 +12,11 @@ | |||
12 | #define m5272sim_h | 12 | #define m5272sim_h |
13 | /****************************************************************************/ | 13 | /****************************************************************************/ |
14 | 14 | ||
15 | #define CPU_NAME "COLDFIRE(m5272)" | ||
16 | #define CPU_INSTR_PER_JIFFY 3 | ||
17 | |||
18 | #include <asm/m52xxacr.h> | ||
19 | |||
15 | /* | 20 | /* |
16 | * Define the 5272 SIM register set addresses. | 21 | * Define the 5272 SIM register set addresses. |
17 | */ | 22 | */ |
@@ -62,6 +67,9 @@ | |||
62 | #define MCFSIM_DCMR1 0x5c /* DRAM 1 Mask reg (r/w) */ | 67 | #define MCFSIM_DCMR1 0x5c /* DRAM 1 Mask reg (r/w) */ |
63 | #define MCFSIM_DCCR1 0x63 /* DRAM 1 Control reg (r/w) */ | 68 | #define MCFSIM_DCCR1 0x63 /* DRAM 1 Control reg (r/w) */ |
64 | 69 | ||
70 | #define MCFUART_BASE1 0x100 /* Base address of UART1 */ | ||
71 | #define MCFUART_BASE2 0x140 /* Base address of UART2 */ | ||
72 | |||
65 | #define MCFSIM_PACNT (MCF_MBAR + 0x80) /* Port A Control (r/w) */ | 73 | #define MCFSIM_PACNT (MCF_MBAR + 0x80) /* Port A Control (r/w) */ |
66 | #define MCFSIM_PADDR (MCF_MBAR + 0x84) /* Port A Direction (r/w) */ | 74 | #define MCFSIM_PADDR (MCF_MBAR + 0x84) /* Port A Direction (r/w) */ |
67 | #define MCFSIM_PADAT (MCF_MBAR + 0x86) /* Port A Data (r/w) */ | 75 | #define MCFSIM_PADAT (MCF_MBAR + 0x86) /* Port A Data (r/w) */ |
diff --git a/arch/m68k/include/asm/m527xsim.h b/arch/m68k/include/asm/m527xsim.h index 1feb46f108ce..e8042e8bc003 100644 --- a/arch/m68k/include/asm/m527xsim.h +++ b/arch/m68k/include/asm/m527xsim.h | |||
@@ -11,6 +11,10 @@ | |||
11 | #define m527xsim_h | 11 | #define m527xsim_h |
12 | /****************************************************************************/ | 12 | /****************************************************************************/ |
13 | 13 | ||
14 | #define CPU_NAME "COLDFIRE(m527x)" | ||
15 | #define CPU_INSTR_PER_JIFFY 3 | ||
16 | |||
17 | #include <asm/m52xxacr.h> | ||
14 | 18 | ||
15 | /* | 19 | /* |
16 | * Define the 5270/5271 SIM register set addresses. | 20 | * Define the 5270/5271 SIM register set addresses. |
@@ -55,6 +59,12 @@ | |||
55 | #define MCFSIM_DMR1 0x5c /* SDRAM address mask 1 */ | 59 | #define MCFSIM_DMR1 0x5c /* SDRAM address mask 1 */ |
56 | #endif | 60 | #endif |
57 | 61 | ||
62 | /* | ||
63 | * UART module. | ||
64 | */ | ||
65 | #define MCFUART_BASE1 0x200 /* Base address of UART1 */ | ||
66 | #define MCFUART_BASE2 0x240 /* Base address of UART2 */ | ||
67 | #define MCFUART_BASE3 0x280 /* Base address of UART3 */ | ||
58 | 68 | ||
59 | #ifdef CONFIG_M5271 | 69 | #ifdef CONFIG_M5271 |
60 | #define MCFGPIO_PODR_ADDR (MCF_IPSBAR + 0x100000) | 70 | #define MCFGPIO_PODR_ADDR (MCF_IPSBAR + 0x100000) |
diff --git a/arch/m68k/include/asm/m528xsim.h b/arch/m68k/include/asm/m528xsim.h index 891cbedad972..a6d2f4d9aaa0 100644 --- a/arch/m68k/include/asm/m528xsim.h +++ b/arch/m68k/include/asm/m528xsim.h | |||
@@ -11,6 +11,10 @@ | |||
11 | #define m528xsim_h | 11 | #define m528xsim_h |
12 | /****************************************************************************/ | 12 | /****************************************************************************/ |
13 | 13 | ||
14 | #define CPU_NAME "COLDFIRE(m528x)" | ||
15 | #define CPU_INSTR_PER_JIFFY 3 | ||
16 | |||
17 | #include <asm/m52xxacr.h> | ||
14 | 18 | ||
15 | /* | 19 | /* |
16 | * Define the 5280/5282 SIM register set addresses. | 20 | * Define the 5280/5282 SIM register set addresses. |
@@ -42,6 +46,13 @@ | |||
42 | #define MCFSIM_DMR1 0x54 /* SDRAM address mask 1 */ | 46 | #define MCFSIM_DMR1 0x54 /* SDRAM address mask 1 */ |
43 | 47 | ||
44 | /* | 48 | /* |
49 | * UART module. | ||
50 | */ | ||
51 | #define MCFUART_BASE1 0x200 /* Base address of UART1 */ | ||
52 | #define MCFUART_BASE2 0x240 /* Base address of UART2 */ | ||
53 | #define MCFUART_BASE3 0x280 /* Base address of UART3 */ | ||
54 | |||
55 | /* | ||
45 | * GPIO registers | 56 | * GPIO registers |
46 | */ | 57 | */ |
47 | #define MCFGPIO_PORTA (MCF_IPSBAR + 0x00100000) | 58 | #define MCFGPIO_PORTA (MCF_IPSBAR + 0x00100000) |
diff --git a/arch/m68k/include/asm/m52xxacr.h b/arch/m68k/include/asm/m52xxacr.h new file mode 100644 index 000000000000..abc391a9ae8d --- /dev/null +++ b/arch/m68k/include/asm/m52xxacr.h | |||
@@ -0,0 +1,94 @@ | |||
1 | /****************************************************************************/ | ||
2 | |||
3 | /* | ||
4 | * m52xxacr.h -- ColdFire version 2 core cache support | ||
5 | * | ||
6 | * (C) Copyright 2010, Greg Ungerer <gerg@snapgear.com> | ||
7 | */ | ||
8 | |||
9 | /****************************************************************************/ | ||
10 | #ifndef m52xxacr_h | ||
11 | #define m52xxacr_h | ||
12 | /****************************************************************************/ | ||
13 | |||
14 | /* | ||
15 | * All varients of the ColdFire using version 2 cores have a similar | ||
16 | * cache setup. Although not absolutely identical the cache register | ||
17 | * definitions are compatible for all of them. Mostly they support a | ||
18 | * configurable cache memory that can be instruction only, data only, | ||
19 | * or split instruction and data. The exception is the very old version 2 | ||
20 | * core based parts, like the 5206(e), 5249 and 5272, which are instruction | ||
21 | * cache only. Cache size varies from 2k up to 16k. | ||
22 | */ | ||
23 | |||
24 | /* | ||
25 | * Define the Cache Control register flags. | ||
26 | */ | ||
27 | #define CACR_CENB 0x80000000 /* Enable cache */ | ||
28 | #define CACR_CDPI 0x10000000 /* Disable invalidation by CPUSHL */ | ||
29 | #define CACR_CFRZ 0x08000000 /* Cache freeze mode */ | ||
30 | #define CACR_CINV 0x01000000 /* Invalidate cache */ | ||
31 | #define CACR_DISI 0x00800000 /* Disable instruction cache */ | ||
32 | #define CACR_DISD 0x00400000 /* Disable data cache */ | ||
33 | #define CACR_INVI 0x00200000 /* Invalidate instruction cache */ | ||
34 | #define CACR_INVD 0x00100000 /* Invalidate data cache */ | ||
35 | #define CACR_CEIB 0x00000400 /* Non-cachable instruction burst */ | ||
36 | #define CACR_DCM 0x00000200 /* Default cache mode */ | ||
37 | #define CACR_DBWE 0x00000100 /* Buffered write enable */ | ||
38 | #define CACR_DWP 0x00000020 /* Write protection */ | ||
39 | #define CACR_EUSP 0x00000010 /* Enable separate user a7 */ | ||
40 | |||
41 | /* | ||
42 | * Define the Access Control register flags. | ||
43 | */ | ||
44 | #define ACR_BASE_POS 24 /* Address Base (upper 8 bits) */ | ||
45 | #define ACR_MASK_POS 16 /* Address Mask (next 8 bits) */ | ||
46 | #define ACR_ENABLE 0x00008000 /* Enable this ACR */ | ||
47 | #define ACR_USER 0x00000000 /* Allow only user accesses */ | ||
48 | #define ACR_SUPER 0x00002000 /* Allow supervisor access only */ | ||
49 | #define ACR_ANY 0x00004000 /* Allow any access type */ | ||
50 | #define ACR_CENB 0x00000000 /* Caching of region enabled */ | ||
51 | #define ACR_CDIS 0x00000040 /* Caching of region disabled */ | ||
52 | #define ACR_BWE 0x00000020 /* Write buffer enabled */ | ||
53 | #define ACR_WPROTECT 0x00000004 /* Write protect region */ | ||
54 | |||
55 | /* | ||
56 | * Set the cache controller settings we will use. On the cores that support | ||
57 | * a split cache configuration we allow all the combinations at Kconfig | ||
58 | * time. For those cores that only have an instruction cache we just set | ||
59 | * that as on. | ||
60 | */ | ||
61 | #if defined(CONFIG_CACHE_I) | ||
62 | #define CACHE_TYPE (CACR_DISD + CACR_EUSP) | ||
63 | #define CACHE_INVTYPEI 0 | ||
64 | #elif defined(CONFIG_CACHE_D) | ||
65 | #define CACHE_TYPE (CACR_DISI + CACR_EUSP) | ||
66 | #define CACHE_INVTYPED 0 | ||
67 | #elif defined(CONFIG_CACHE_BOTH) | ||
68 | #define CACHE_TYPE CACR_EUSP | ||
69 | #define CACHE_INVTYPEI CACR_INVI | ||
70 | #define CACHE_INVTYPED CACR_INVD | ||
71 | #else | ||
72 | /* This is the instruction cache only devices (no split cache, no eusp) */ | ||
73 | #define CACHE_TYPE 0 | ||
74 | #define CACHE_INVTYPEI 0 | ||
75 | #endif | ||
76 | |||
77 | #define CACHE_INIT (CACR_CINV + CACHE_TYPE) | ||
78 | #define CACHE_MODE (CACR_CENB + CACHE_TYPE + CACR_DCM) | ||
79 | |||
80 | #define CACHE_INVALIDATE (CACHE_MODE + CACR_CINV) | ||
81 | #if defined(CACHE_INVTYPEI) | ||
82 | #define CACHE_INVALIDATEI (CACHE_MODE + CACR_CINV + CACHE_INVTYPEI) | ||
83 | #endif | ||
84 | #if defined(CACHE_INVTYPED) | ||
85 | #define CACHE_INVALIDATED (CACHE_MODE + CACR_CINV + CACHE_INVTYPED) | ||
86 | #endif | ||
87 | |||
88 | #define ACR0_MODE ((CONFIG_RAMBASE & 0xff000000) + \ | ||
89 | (0x000f0000) + \ | ||
90 | (ACR_ENABLE + ACR_ANY + ACR_CENB + ACR_BWE)) | ||
91 | #define ACR1_MODE 0 | ||
92 | |||
93 | /****************************************************************************/ | ||
94 | #endif /* m52xxsim_h */ | ||
diff --git a/arch/m68k/include/asm/m5307sim.h b/arch/m68k/include/asm/m5307sim.h index c6830e5b54ce..0bf57397e7a9 100644 --- a/arch/m68k/include/asm/m5307sim.h +++ b/arch/m68k/include/asm/m5307sim.h | |||
@@ -14,6 +14,11 @@ | |||
14 | #define m5307sim_h | 14 | #define m5307sim_h |
15 | /****************************************************************************/ | 15 | /****************************************************************************/ |
16 | 16 | ||
17 | #define CPU_NAME "COLDFIRE(m5307)" | ||
18 | #define CPU_INSTR_PER_JIFFY 3 | ||
19 | |||
20 | #include <asm/m53xxacr.h> | ||
21 | |||
17 | /* | 22 | /* |
18 | * Define the 5307 SIM register set addresses. | 23 | * Define the 5307 SIM register set addresses. |
19 | */ | 24 | */ |
@@ -94,6 +99,17 @@ | |||
94 | #define MCFSIM_PADAT (MCF_MBAR + 0x248) | 99 | #define MCFSIM_PADAT (MCF_MBAR + 0x248) |
95 | 100 | ||
96 | /* | 101 | /* |
102 | * UART module. | ||
103 | */ | ||
104 | #if defined(CONFIG_NETtel) || defined(CONFIG_SECUREEDGEMP3) | ||
105 | #define MCFUART_BASE1 0x200 /* Base address of UART1 */ | ||
106 | #define MCFUART_BASE2 0x1c0 /* Base address of UART2 */ | ||
107 | #else | ||
108 | #define MCFUART_BASE1 0x1c0 /* Base address of UART1 */ | ||
109 | #define MCFUART_BASE2 0x200 /* Base address of UART2 */ | ||
110 | #endif | ||
111 | |||
112 | /* | ||
97 | * Generic GPIO support | 113 | * Generic GPIO support |
98 | */ | 114 | */ |
99 | #define MCFGPIO_PIN_MAX 16 | 115 | #define MCFGPIO_PIN_MAX 16 |
@@ -146,32 +162,5 @@ | |||
146 | #define MCF_IRQ_TIMER 30 /* Timer0, Level 6 */ | 162 | #define MCF_IRQ_TIMER 30 /* Timer0, Level 6 */ |
147 | #define MCF_IRQ_PROFILER 31 /* Timer1, Level 7 */ | 163 | #define MCF_IRQ_PROFILER 31 /* Timer1, Level 7 */ |
148 | 164 | ||
149 | /* | ||
150 | * Define the Cache register flags. | ||
151 | */ | ||
152 | #define CACR_EC (1<<31) | ||
153 | #define CACR_ESB (1<<29) | ||
154 | #define CACR_DPI (1<<28) | ||
155 | #define CACR_HLCK (1<<27) | ||
156 | #define CACR_CINVA (1<<24) | ||
157 | #define CACR_DNFB (1<<10) | ||
158 | #define CACR_DCM_WTHRU (0<<8) | ||
159 | #define CACR_DCM_WBACK (1<<8) | ||
160 | #define CACR_DCM_OFF_PRE (2<<8) | ||
161 | #define CACR_DCM_OFF_IMP (3<<8) | ||
162 | #define CACR_DW (1<<5) | ||
163 | |||
164 | #define ACR_BASE_POS 24 | ||
165 | #define ACR_MASK_POS 16 | ||
166 | #define ACR_ENABLE (1<<15) | ||
167 | #define ACR_USER (0<<13) | ||
168 | #define ACR_SUPER (1<<13) | ||
169 | #define ACR_ANY (2<<13) | ||
170 | #define ACR_CM_WTHRU (0<<5) | ||
171 | #define ACR_CM_WBACK (1<<5) | ||
172 | #define ACR_CM_OFF_PRE (2<<5) | ||
173 | #define ACR_CM_OFF_IMP (3<<5) | ||
174 | #define ACR_WPROTECT (1<<2) | ||
175 | |||
176 | /****************************************************************************/ | 165 | /****************************************************************************/ |
177 | #endif /* m5307sim_h */ | 166 | #endif /* m5307sim_h */ |
diff --git a/arch/m68k/include/asm/m532xsim.h b/arch/m68k/include/asm/m532xsim.h index c4bf1c81e3cf..e6470f8ca324 100644 --- a/arch/m68k/include/asm/m532xsim.h +++ b/arch/m68k/include/asm/m532xsim.h | |||
@@ -9,6 +9,11 @@ | |||
9 | #define m532xsim_h | 9 | #define m532xsim_h |
10 | /****************************************************************************/ | 10 | /****************************************************************************/ |
11 | 11 | ||
12 | #define CPU_NAME "COLDFIRE(m532x)" | ||
13 | #define CPU_INSTR_PER_JIFFY 3 | ||
14 | |||
15 | #include <asm/m53xxacr.h> | ||
16 | |||
12 | #define MCF_REG32(x) (*(volatile unsigned long *)(x)) | 17 | #define MCF_REG32(x) (*(volatile unsigned long *)(x)) |
13 | #define MCF_REG16(x) (*(volatile unsigned short *)(x)) | 18 | #define MCF_REG16(x) (*(volatile unsigned short *)(x)) |
14 | #define MCF_REG08(x) (*(volatile unsigned char *)(x)) | 19 | #define MCF_REG08(x) (*(volatile unsigned char *)(x)) |
@@ -74,31 +79,11 @@ | |||
74 | #define MCF_IRQ_PROFILER (64 + 33) /* Timer1 */ | 79 | #define MCF_IRQ_PROFILER (64 + 33) /* Timer1 */ |
75 | 80 | ||
76 | /* | 81 | /* |
77 | * Define the Cache register flags. | 82 | * UART module. |
78 | */ | 83 | */ |
79 | #define CACR_EC (1<<31) | 84 | #define MCFUART_BASE1 0xFC060000 /* Base address of UART1 */ |
80 | #define CACR_ESB (1<<29) | 85 | #define MCFUART_BASE2 0xFC064000 /* Base address of UART2 */ |
81 | #define CACR_DPI (1<<28) | 86 | #define MCFUART_BASE3 0xFC068000 /* Base address of UART3 */ |
82 | #define CACR_HLCK (1<<27) | ||
83 | #define CACR_CINVA (1<<24) | ||
84 | #define CACR_DNFB (1<<10) | ||
85 | #define CACR_DCM_WTHRU (0<<8) | ||
86 | #define CACR_DCM_WBACK (1<<8) | ||
87 | #define CACR_DCM_OFF_PRE (2<<8) | ||
88 | #define CACR_DCM_OFF_IMP (3<<8) | ||
89 | #define CACR_DW (1<<5) | ||
90 | |||
91 | #define ACR_BASE_POS 24 | ||
92 | #define ACR_MASK_POS 16 | ||
93 | #define ACR_ENABLE (1<<15) | ||
94 | #define ACR_USER (0<<13) | ||
95 | #define ACR_SUPER (1<<13) | ||
96 | #define ACR_ANY (2<<13) | ||
97 | #define ACR_CM_WTHRU (0<<5) | ||
98 | #define ACR_CM_WBACK (1<<5) | ||
99 | #define ACR_CM_OFF_PRE (2<<5) | ||
100 | #define ACR_CM_OFF_IMP (3<<5) | ||
101 | #define ACR_WPROTECT (1<<2) | ||
102 | 87 | ||
103 | /********************************************************************* | 88 | /********************************************************************* |
104 | * | 89 | * |
diff --git a/arch/m68k/include/asm/m53xxacr.h b/arch/m68k/include/asm/m53xxacr.h new file mode 100644 index 000000000000..cd952b0a8bd3 --- /dev/null +++ b/arch/m68k/include/asm/m53xxacr.h | |||
@@ -0,0 +1,101 @@ | |||
1 | /****************************************************************************/ | ||
2 | |||
3 | /* | ||
4 | * m53xxacr.h -- ColdFire version 3 core cache support | ||
5 | * | ||
6 | * (C) Copyright 2010, Greg Ungerer <gerg@snapgear.com> | ||
7 | */ | ||
8 | |||
9 | /****************************************************************************/ | ||
10 | #ifndef m53xxacr_h | ||
11 | #define m53xxacr_h | ||
12 | /****************************************************************************/ | ||
13 | |||
14 | /* | ||
15 | * All varients of the ColdFire using version 3 cores have a similar | ||
16 | * cache setup. They have a unified instruction and data cache, with | ||
17 | * configurable write-through or copy-back operation. | ||
18 | */ | ||
19 | |||
20 | /* | ||
21 | * Define the Cache Control register flags. | ||
22 | */ | ||
23 | #define CACR_EC 0x80000000 /* Enable cache */ | ||
24 | #define CACR_ESB 0x20000000 /* Enable store buffer */ | ||
25 | #define CACR_DPI 0x10000000 /* Disable invalidation by CPUSHL */ | ||
26 | #define CACR_HLCK 0x08000000 /* Half cache lock mode */ | ||
27 | #define CACR_CINVA 0x01000000 /* Invalidate cache */ | ||
28 | #define CACR_DNFB 0x00000400 /* Inhibited fill buffer */ | ||
29 | #define CACR_DCM_WT 0x00000000 /* Cacheable write-through */ | ||
30 | #define CACR_DCM_CB 0x00000100 /* Cacheable copy-back */ | ||
31 | #define CACR_DCM_PRE 0x00000200 /* Cache inhibited, precise */ | ||
32 | #define CACR_DCM_IMPRE 0x00000300 /* Cache inhibited, imprecise */ | ||
33 | #define CACR_WPROTECT 0x00000020 /* Write protect*/ | ||
34 | #define CACR_EUSP 0x00000010 /* Eanble separate user a7 */ | ||
35 | |||
36 | /* | ||
37 | * Define the Access Control register flags. | ||
38 | */ | ||
39 | #define ACR_BASE_POS 24 /* Address Base (upper 8 bits) */ | ||
40 | #define ACR_MASK_POS 16 /* Address Mask (next 8 bits) */ | ||
41 | #define ACR_ENABLE 0x00008000 /* Enable this ACR */ | ||
42 | #define ACR_USER 0x00000000 /* Allow only user accesses */ | ||
43 | #define ACR_SUPER 0x00002000 /* Allow supervisor access only */ | ||
44 | #define ACR_ANY 0x00004000 /* Allow any access type */ | ||
45 | #define ACR_CM_WT 0x00000000 /* Cacheable, write-through */ | ||
46 | #define ACR_CM_CB 0x00000020 /* Cacheable, copy-back */ | ||
47 | #define ACR_CM_PRE 0x00000040 /* Cache inhibited, precise */ | ||
48 | #define ACR_CM_IMPRE 0x00000060 /* Cache inhibited, imprecise */ | ||
49 | #define ACR_WPROTECT 0x00000004 /* Write protect region */ | ||
50 | |||
51 | /* | ||
52 | * Define the cache type and arrangement (needed for pushes). | ||
53 | */ | ||
54 | #if defined(CONFIG_M5307) | ||
55 | #define CACHE_SIZE 0x2000 /* 8k of unified cache */ | ||
56 | #define ICACHE_SIZE CACHE_SIZE | ||
57 | #define DCACHE_SIZE CACHE_SIZE | ||
58 | #elif defined(CONFIG_M532x) | ||
59 | #define CACHE_SIZE 0x4000 /* 32k of unified cache */ | ||
60 | #define ICACHE_SIZE CACHE_SIZE | ||
61 | #define DCACHE_SIZE CACHE_SIZE | ||
62 | #endif | ||
63 | |||
64 | #define CACHE_LINE_SIZE 16 /* 16 byte line size */ | ||
65 | #define CACHE_WAYS 4 /* 4 ways - set associative */ | ||
66 | |||
67 | /* | ||
68 | * Set the cache controller settings we will use. This default in the | ||
69 | * CACR is cache inhibited, we use the ACR register to set cacheing | ||
70 | * enabled on the regions we want (eg RAM). | ||
71 | */ | ||
72 | #if defined(CONFIG_CACHE_COPYBACK) | ||
73 | #define CACHE_TYPE ACR_CM_CB | ||
74 | #define CACHE_PUSH | ||
75 | #else | ||
76 | #define CACHE_TYPE ACR_CM_WT | ||
77 | #endif | ||
78 | |||
79 | #ifdef CONFIG_COLDFIRE_SW_A7 | ||
80 | #define CACHE_MODE (CACR_EC + CACR_ESB + CACR_DCM_PRE) | ||
81 | #else | ||
82 | #define CACHE_MODE (CACR_EC + CACR_ESB + CACR_DCM_PRE + CACR_EUSP) | ||
83 | #endif | ||
84 | |||
85 | /* | ||
86 | * Unified cache means we will never need to flush for coherency of | ||
87 | * instruction fetch. We will need to flush to maintain memory/DMA | ||
88 | * coherency though in all cases. And for copyback caches we will need | ||
89 | * to push cached data as well. | ||
90 | */ | ||
91 | #define CACHE_INIT CACR_CINVA | ||
92 | #define CACHE_INVALIDATE CACR_CINVA | ||
93 | #define CACHE_INVALIDATED CACR_CINVA | ||
94 | |||
95 | #define ACR0_MODE ((CONFIG_RAMBASE & 0xff000000) + \ | ||
96 | (0x000f0000) + \ | ||
97 | (ACR_ENABLE + ACR_ANY + CACHE_TYPE)) | ||
98 | #define ACR1_MODE 0 | ||
99 | |||
100 | /****************************************************************************/ | ||
101 | #endif /* m53xxsim_h */ | ||
diff --git a/arch/m68k/include/asm/m5407sim.h b/arch/m68k/include/asm/m5407sim.h index c399abbf953c..75f5c28a551d 100644 --- a/arch/m68k/include/asm/m5407sim.h +++ b/arch/m68k/include/asm/m5407sim.h | |||
@@ -14,6 +14,11 @@ | |||
14 | #define m5407sim_h | 14 | #define m5407sim_h |
15 | /****************************************************************************/ | 15 | /****************************************************************************/ |
16 | 16 | ||
17 | #define CPU_NAME "COLDFIRE(m5407)" | ||
18 | #define CPU_INSTR_PER_JIFFY 3 | ||
19 | |||
20 | #include <asm/m54xxacr.h> | ||
21 | |||
17 | /* | 22 | /* |
18 | * Define the 5407 SIM register set addresses. | 23 | * Define the 5407 SIM register set addresses. |
19 | */ | 24 | */ |
@@ -73,6 +78,9 @@ | |||
73 | #define MCFSIM_DACR1 0x110 /* DRAM 1 Addr and Ctrl (r/w) */ | 78 | #define MCFSIM_DACR1 0x110 /* DRAM 1 Addr and Ctrl (r/w) */ |
74 | #define MCFSIM_DMR1 0x114 /* DRAM 1 Mask reg (r/w) */ | 79 | #define MCFSIM_DMR1 0x114 /* DRAM 1 Mask reg (r/w) */ |
75 | 80 | ||
81 | #define MCFUART_BASE1 0x1c0 /* Base address of UART1 */ | ||
82 | #define MCFUART_BASE2 0x200 /* Base address of UART2 */ | ||
83 | |||
76 | #define MCFSIM_PADDR (MCF_MBAR + 0x244) | 84 | #define MCFSIM_PADDR (MCF_MBAR + 0x244) |
77 | #define MCFSIM_PADAT (MCF_MBAR + 0x248) | 85 | #define MCFSIM_PADAT (MCF_MBAR + 0x248) |
78 | 86 | ||
@@ -117,39 +125,5 @@ | |||
117 | #define MCF_IRQ_TIMER 30 /* Timer0, Level 6 */ | 125 | #define MCF_IRQ_TIMER 30 /* Timer0, Level 6 */ |
118 | #define MCF_IRQ_PROFILER 31 /* Timer1, Level 7 */ | 126 | #define MCF_IRQ_PROFILER 31 /* Timer1, Level 7 */ |
119 | 127 | ||
120 | /* | ||
121 | * Define the Cache register flags. | ||
122 | */ | ||
123 | #define CACR_DEC 0x80000000 /* Enable data cache */ | ||
124 | #define CACR_DWP 0x40000000 /* Data write protection */ | ||
125 | #define CACR_DESB 0x20000000 /* Enable data store buffer */ | ||
126 | #define CACR_DDPI 0x10000000 /* Disable CPUSHL */ | ||
127 | #define CACR_DHCLK 0x08000000 /* Half data cache lock mode */ | ||
128 | #define CACR_DDCM_WT 0x00000000 /* Write through cache*/ | ||
129 | #define CACR_DDCM_CP 0x02000000 /* Copyback cache */ | ||
130 | #define CACR_DDCM_P 0x04000000 /* No cache, precise */ | ||
131 | #define CACR_DDCM_IMP 0x06000000 /* No cache, imprecise */ | ||
132 | #define CACR_DCINVA 0x01000000 /* Invalidate data cache */ | ||
133 | #define CACR_BEC 0x00080000 /* Enable branch cache */ | ||
134 | #define CACR_BCINVA 0x00040000 /* Invalidate branch cache */ | ||
135 | #define CACR_IEC 0x00008000 /* Enable instruction cache */ | ||
136 | #define CACR_DNFB 0x00002000 /* Inhibited fill buffer */ | ||
137 | #define CACR_IDPI 0x00001000 /* Disable CPUSHL */ | ||
138 | #define CACR_IHLCK 0x00000800 /* Intruction cache half lock */ | ||
139 | #define CACR_IDCM 0x00000400 /* Intruction cache inhibit */ | ||
140 | #define CACR_ICINVA 0x00000100 /* Invalidate instr cache */ | ||
141 | |||
142 | #define ACR_BASE_POS 24 /* Address Base */ | ||
143 | #define ACR_MASK_POS 16 /* Address Mask */ | ||
144 | #define ACR_ENABLE 0x00008000 /* Enable address */ | ||
145 | #define ACR_USER 0x00000000 /* User mode access only */ | ||
146 | #define ACR_SUPER 0x00002000 /* Supervisor mode only */ | ||
147 | #define ACR_ANY 0x00004000 /* Match any access mode */ | ||
148 | #define ACR_CM_WT 0x00000000 /* Write through mode */ | ||
149 | #define ACR_CM_CP 0x00000020 /* Copyback mode */ | ||
150 | #define ACR_CM_OFF_PRE 0x00000040 /* No cache, precise */ | ||
151 | #define ACR_CM_OFF_IMP 0x00000060 /* No cache, imprecise */ | ||
152 | #define ACR_WPROTECT 0x00000004 /* Write protect */ | ||
153 | |||
154 | /****************************************************************************/ | 128 | /****************************************************************************/ |
155 | #endif /* m5407sim_h */ | 129 | #endif /* m5407sim_h */ |
diff --git a/arch/m68k/include/asm/m54xxacr.h b/arch/m68k/include/asm/m54xxacr.h new file mode 100644 index 000000000000..16a1835f9b2a --- /dev/null +++ b/arch/m68k/include/asm/m54xxacr.h | |||
@@ -0,0 +1,97 @@ | |||
1 | /* | ||
2 | * Bit definitions for the MCF54xx ACR and CACR registers. | ||
3 | */ | ||
4 | |||
5 | #ifndef m54xxacr_h | ||
6 | #define m54xxacr_h | ||
7 | |||
8 | /* | ||
9 | * Define the Cache register flags. | ||
10 | */ | ||
11 | #define CACR_DEC 0x80000000 /* Enable data cache */ | ||
12 | #define CACR_DWP 0x40000000 /* Data write protection */ | ||
13 | #define CACR_DESB 0x20000000 /* Enable data store buffer */ | ||
14 | #define CACR_DDPI 0x10000000 /* Disable invalidation by CPUSHL */ | ||
15 | #define CACR_DHCLK 0x08000000 /* Half data cache lock mode */ | ||
16 | #define CACR_DDCM_WT 0x00000000 /* Write through cache*/ | ||
17 | #define CACR_DDCM_CP 0x02000000 /* Copyback cache */ | ||
18 | #define CACR_DDCM_P 0x04000000 /* No cache, precise */ | ||
19 | #define CACR_DDCM_IMP 0x06000000 /* No cache, imprecise */ | ||
20 | #define CACR_DCINVA 0x01000000 /* Invalidate data cache */ | ||
21 | #define CACR_BEC 0x00080000 /* Enable branch cache */ | ||
22 | #define CACR_BCINVA 0x00040000 /* Invalidate branch cache */ | ||
23 | #define CACR_IEC 0x00008000 /* Enable instruction cache */ | ||
24 | #define CACR_DNFB 0x00002000 /* Inhibited fill buffer */ | ||
25 | #define CACR_IDPI 0x00001000 /* Disable CPUSHL */ | ||
26 | #define CACR_IHLCK 0x00000800 /* Intruction cache half lock */ | ||
27 | #define CACR_IDCM 0x00000400 /* Intruction cache inhibit */ | ||
28 | #define CACR_ICINVA 0x00000100 /* Invalidate instr cache */ | ||
29 | #define CACR_EUSP 0x00000020 /* Enable separate user a7 */ | ||
30 | |||
31 | #define ACR_BASE_POS 24 /* Address Base */ | ||
32 | #define ACR_MASK_POS 16 /* Address Mask */ | ||
33 | #define ACR_ENABLE 0x00008000 /* Enable address */ | ||
34 | #define ACR_USER 0x00000000 /* User mode access only */ | ||
35 | #define ACR_SUPER 0x00002000 /* Supervisor mode only */ | ||
36 | #define ACR_ANY 0x00004000 /* Match any access mode */ | ||
37 | #define ACR_CM_WT 0x00000000 /* Write through mode */ | ||
38 | #define ACR_CM_CP 0x00000020 /* Copyback mode */ | ||
39 | #define ACR_CM_OFF_PRE 0x00000040 /* No cache, precise */ | ||
40 | #define ACR_CM_OFF_IMP 0x00000060 /* No cache, imprecise */ | ||
41 | #define ACR_CM 0x00000060 /* Cache mode mask */ | ||
42 | #define ACR_WPROTECT 0x00000004 /* Write protect */ | ||
43 | |||
44 | #if defined(CONFIG_M5407) | ||
45 | |||
46 | #define ICACHE_SIZE 0x4000 /* instruction - 16k */ | ||
47 | #define DCACHE_SIZE 0x2000 /* data - 8k */ | ||
48 | |||
49 | #elif defined(CONFIG_M54xx) | ||
50 | |||
51 | #define ICACHE_SIZE 0x8000 /* instruction - 32k */ | ||
52 | #define DCACHE_SIZE 0x8000 /* data - 32k */ | ||
53 | |||
54 | #endif | ||
55 | |||
56 | #define CACHE_LINE_SIZE 0x0010 /* 16 bytes */ | ||
57 | #define CACHE_WAYS 4 /* 4 ways */ | ||
58 | |||
59 | /* | ||
60 | * Version 4 cores have a true harvard style separate instruction | ||
61 | * and data cache. Enable data and instruction caches, also enable write | ||
62 | * buffers and branch accelerator. | ||
63 | */ | ||
64 | /* attention : enabling CACR_DESB requires a "nop" to flush the store buffer */ | ||
65 | /* use '+' instead of '|' for assembler's sake */ | ||
66 | |||
67 | /* Enable data cache */ | ||
68 | /* Enable data store buffer */ | ||
69 | /* outside ACRs : No cache, precise */ | ||
70 | /* Enable instruction+branch caches */ | ||
71 | #if defined(CONFIG_M5407) | ||
72 | #define CACHE_MODE (CACR_DEC+CACR_DESB+CACR_DDCM_P+CACR_BEC+CACR_IEC) | ||
73 | #else | ||
74 | #define CACHE_MODE (CACR_DEC+CACR_DESB+CACR_DDCM_P+CACR_BEC+CACR_IEC+CACR_EUSP) | ||
75 | #endif | ||
76 | #if defined(CONFIG_CACHE_COPYBACK) | ||
77 | #define DATA_CACHE_MODE (ACR_ENABLE+ACR_ANY+ACR_CM_CP) | ||
78 | #else | ||
79 | #define DATA_CACHE_MODE (ACR_ENABLE+ACR_ANY+ACR_CM_WT) | ||
80 | #endif | ||
81 | #define INSN_CACHE_MODE (ACR_ENABLE+ACR_ANY) | ||
82 | |||
83 | #define CACHE_INIT (CACR_DCINVA+CACR_BCINVA+CACR_ICINVA) | ||
84 | #define CACHE_INVALIDATE (CACHE_MODE+CACR_DCINVA+CACR_BCINVA+CACR_ICINVA) | ||
85 | #define CACHE_INVALIDATEI (CACHE_MODE+CACR_BCINVA+CACR_ICINVA) | ||
86 | #define CACHE_INVALIDATED (CACHE_MODE+CACR_DCINVA) | ||
87 | #define ACR0_MODE (0x000f0000+DATA_CACHE_MODE) | ||
88 | #define ACR1_MODE 0 | ||
89 | #define ACR2_MODE (0x000f0000+INSN_CACHE_MODE) | ||
90 | #define ACR3_MODE 0 | ||
91 | |||
92 | #if ((DATA_CACHE_MODE & ACR_CM) == ACR_CM_CP) | ||
93 | /* Copyback cache mode must push dirty cache lines first */ | ||
94 | #define CACHE_PUSH | ||
95 | #endif | ||
96 | |||
97 | #endif /* m54xxacr_h */ | ||
diff --git a/arch/m68k/include/asm/m548xgpt.h b/arch/m68k/include/asm/m54xxgpt.h index 33b2eef90f0a..df75dd87ae7a 100644 --- a/arch/m68k/include/asm/m548xgpt.h +++ b/arch/m68k/include/asm/m54xxgpt.h | |||
@@ -1,13 +1,13 @@ | |||
1 | /* | 1 | /* |
2 | * File: m548xgpt.h | 2 | * File: m54xxgpt.h |
3 | * Purpose: Register and bit definitions for the MCF548X | 3 | * Purpose: Register and bit definitions for the MCF54XX |
4 | * | 4 | * |
5 | * Notes: | 5 | * Notes: |
6 | * | 6 | * |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #ifndef m548xgpt_h | 9 | #ifndef m54xxgpt_h |
10 | #define m548xgpt_h | 10 | #define m54xxgpt_h |
11 | 11 | ||
12 | /********************************************************************* | 12 | /********************************************************************* |
13 | * | 13 | * |
@@ -87,4 +87,4 @@ | |||
87 | 87 | ||
88 | /********************************************************************/ | 88 | /********************************************************************/ |
89 | 89 | ||
90 | #endif /* m548xgpt_h */ | 90 | #endif /* m54xxgpt_h */ |
diff --git a/arch/m68k/include/asm/m548xsim.h b/arch/m68k/include/asm/m54xxsim.h index 149135ef30d2..462ae5328441 100644 --- a/arch/m68k/include/asm/m548xsim.h +++ b/arch/m68k/include/asm/m54xxsim.h | |||
@@ -1,11 +1,16 @@ | |||
1 | /* | 1 | /* |
2 | * m548xsim.h -- ColdFire 547x/548x System Integration Unit support. | 2 | * m54xxsim.h -- ColdFire 547x/548x System Integration Unit support. |
3 | */ | 3 | */ |
4 | 4 | ||
5 | #ifndef m548xsim_h | 5 | #ifndef m54xxsim_h |
6 | #define m548xsim_h | 6 | #define m54xxsim_h |
7 | 7 | ||
8 | #define MCFINT_VECBASE 64 | 8 | #define CPU_NAME "COLDFIRE(m54xx)" |
9 | #define CPU_INSTR_PER_JIFFY 2 | ||
10 | |||
11 | #include <asm/m54xxacr.h> | ||
12 | |||
13 | #define MCFINT_VECBASE 64 | ||
9 | 14 | ||
10 | /* | 15 | /* |
11 | * Interrupt Controller Registers | 16 | * Interrupt Controller Registers |
@@ -22,6 +27,14 @@ | |||
22 | #define MCFINTC_ICR0 0x40 /* Base ICR register */ | 27 | #define MCFINTC_ICR0 0x40 /* Base ICR register */ |
23 | 28 | ||
24 | /* | 29 | /* |
30 | * UART module. | ||
31 | */ | ||
32 | #define MCFUART_BASE1 0x8600 /* Base address of UART1 */ | ||
33 | #define MCFUART_BASE2 0x8700 /* Base address of UART2 */ | ||
34 | #define MCFUART_BASE3 0x8800 /* Base address of UART3 */ | ||
35 | #define MCFUART_BASE4 0x8900 /* Base address of UART4 */ | ||
36 | |||
37 | /* | ||
25 | * Define system peripheral IRQ usage. | 38 | * Define system peripheral IRQ usage. |
26 | */ | 39 | */ |
27 | #define MCF_IRQ_TIMER (64 + 54) /* Slice Timer 0 */ | 40 | #define MCF_IRQ_TIMER (64 + 54) /* Slice Timer 0 */ |
@@ -52,4 +65,4 @@ | |||
52 | #define MCF_PAR_PSC_RTS_RTS (0x30) | 65 | #define MCF_PAR_PSC_RTS_RTS (0x30) |
53 | #define MCF_PAR_PSC_CANRX (0x40) | 66 | #define MCF_PAR_PSC_CANRX (0x40) |
54 | 67 | ||
55 | #endif /* m548xsim_h */ | 68 | #endif /* m54xxsim_h */ |
diff --git a/arch/m68k/include/asm/mcfcache.h b/arch/m68k/include/asm/mcfcache.h deleted file mode 100644 index f49dfc09f70a..000000000000 --- a/arch/m68k/include/asm/mcfcache.h +++ /dev/null | |||
@@ -1,150 +0,0 @@ | |||
1 | /****************************************************************************/ | ||
2 | |||
3 | /* | ||
4 | * mcfcache.h -- ColdFire CPU cache support code | ||
5 | * | ||
6 | * (C) Copyright 2004, Greg Ungerer <gerg@snapgear.com> | ||
7 | */ | ||
8 | |||
9 | /****************************************************************************/ | ||
10 | #ifndef __M68KNOMMU_MCFCACHE_H | ||
11 | #define __M68KNOMMU_MCFCACHE_H | ||
12 | /****************************************************************************/ | ||
13 | |||
14 | |||
15 | /* | ||
16 | * The different ColdFire families have different cache arrangments. | ||
17 | * Everything from a small instruction only cache, to configurable | ||
18 | * data and/or instruction cache, to unified instruction/data, to | ||
19 | * harvard style separate instruction and data caches. | ||
20 | */ | ||
21 | |||
22 | #if defined(CONFIG_M5206) || defined(CONFIG_M5206e) || defined(CONFIG_M5272) | ||
23 | /* | ||
24 | * Simple version 2 core cache. These have instruction cache only, | ||
25 | * we just need to invalidate it and enable it. | ||
26 | */ | ||
27 | .macro CACHE_ENABLE | ||
28 | movel #0x01000000,%d0 /* invalidate cache cmd */ | ||
29 | movec %d0,%CACR /* do invalidate cache */ | ||
30 | movel #0x80000100,%d0 /* setup cache mask */ | ||
31 | movec %d0,%CACR /* enable cache */ | ||
32 | .endm | ||
33 | #endif /* CONFIG_M5206 || CONFIG_M5206e || CONFIG_M5272 */ | ||
34 | |||
35 | #if defined(CONFIG_M523x) || defined(CONFIG_M527x) | ||
36 | /* | ||
37 | * New version 2 cores have a configurable split cache arrangement. | ||
38 | * For now I am just enabling instruction cache - but ultimately I | ||
39 | * think a split instruction/data cache would be better. | ||
40 | */ | ||
41 | .macro CACHE_ENABLE | ||
42 | movel #0x01400000,%d0 | ||
43 | movec %d0,%CACR /* invalidate cache */ | ||
44 | nop | ||
45 | movel #0x0000c000,%d0 /* set SDRAM cached only */ | ||
46 | movec %d0,%ACR0 | ||
47 | movel #0x00000000,%d0 /* no other regions cached */ | ||
48 | movec %d0,%ACR1 | ||
49 | movel #0x80400100,%d0 /* configure cache */ | ||
50 | movec %d0,%CACR /* enable cache */ | ||
51 | nop | ||
52 | .endm | ||
53 | #endif /* CONFIG_M523x || CONFIG_M527x */ | ||
54 | |||
55 | #if defined(CONFIG_M528x) | ||
56 | .macro CACHE_ENABLE | ||
57 | nop | ||
58 | movel #0x01000000, %d0 | ||
59 | movec %d0, %CACR /* Invalidate cache */ | ||
60 | nop | ||
61 | movel #0x0000c020, %d0 /* Set SDRAM cached only */ | ||
62 | movec %d0, %ACR0 | ||
63 | movel #0x00000000, %d0 /* No other regions cached */ | ||
64 | movec %d0, %ACR1 | ||
65 | movel #0x80000200, %d0 /* Setup cache mask */ | ||
66 | movec %d0, %CACR /* Enable cache */ | ||
67 | nop | ||
68 | .endm | ||
69 | #endif /* CONFIG_M528x */ | ||
70 | |||
71 | #if defined(CONFIG_M5249) || defined(CONFIG_M5307) | ||
72 | /* | ||
73 | * The version 3 core cache. Oddly enough the version 2 core 5249 | ||
74 | * has the same SDRAM and cache setup as the version 3 cores. | ||
75 | * This is a single unified instruction/data cache. | ||
76 | */ | ||
77 | .macro CACHE_ENABLE | ||
78 | movel #0x01000000,%d0 /* invalidate whole cache */ | ||
79 | movec %d0,%CACR | ||
80 | nop | ||
81 | #if defined(DEBUGGER_COMPATIBLE_CACHE) || defined(CONFIG_SECUREEDGEMP3) | ||
82 | movel #0x0000c000,%d0 /* set SDRAM cached (write-thru) */ | ||
83 | #else | ||
84 | movel #0x0000c020,%d0 /* set SDRAM cached (copyback) */ | ||
85 | #endif | ||
86 | movec %d0,%ACR0 | ||
87 | movel #0x00000000,%d0 /* no other regions cached */ | ||
88 | movec %d0,%ACR1 | ||
89 | movel #0xa0000200,%d0 /* enable cache */ | ||
90 | movec %d0,%CACR | ||
91 | nop | ||
92 | .endm | ||
93 | #endif /* CONFIG_M5249 || CONFIG_M5307 */ | ||
94 | |||
95 | #if defined(CONFIG_M532x) | ||
96 | .macro CACHE_ENABLE | ||
97 | movel #0x01000000,%d0 /* invalidate cache cmd */ | ||
98 | movec %d0,%CACR /* do invalidate cache */ | ||
99 | nop | ||
100 | movel #0x4001C000,%d0 /* set SDRAM cached (write-thru) */ | ||
101 | movec %d0,%ACR0 | ||
102 | movel #0x00000000,%d0 /* no other regions cached */ | ||
103 | movec %d0,%ACR1 | ||
104 | movel #0x80000200,%d0 /* setup cache mask */ | ||
105 | movec %d0,%CACR /* enable cache */ | ||
106 | nop | ||
107 | .endm | ||
108 | #endif /* CONFIG_M532x */ | ||
109 | |||
110 | #if defined(CONFIG_M5407) || defined(CONFIG_M548x) | ||
111 | /* | ||
112 | * Version 4 cores have a true harvard style separate instruction | ||
113 | * and data cache. Invalidate and enable cache, also enable write | ||
114 | * buffers and branch accelerator. | ||
115 | */ | ||
116 | .macro CACHE_ENABLE | ||
117 | movel #0x01040100,%d0 /* invalidate whole cache */ | ||
118 | movec %d0,%CACR | ||
119 | nop | ||
120 | movel #0x000fc000,%d0 /* set SDRAM cached only */ | ||
121 | movec %d0, %ACR0 | ||
122 | movel #0x00000000,%d0 /* no other regions cached */ | ||
123 | movec %d0, %ACR1 | ||
124 | movel #0x000fc000,%d0 /* set SDRAM cached only */ | ||
125 | movec %d0, %ACR2 | ||
126 | movel #0x00000000,%d0 /* no other regions cached */ | ||
127 | movec %d0, %ACR3 | ||
128 | movel #0xb6088400,%d0 /* enable caches */ | ||
129 | movec %d0,%CACR | ||
130 | nop | ||
131 | .endm | ||
132 | #endif /* CONFIG_M5407 */ | ||
133 | |||
134 | #if defined(CONFIG_M520x) | ||
135 | .macro CACHE_ENABLE | ||
136 | move.l #0x01000000,%d0 /* invalidate whole cache */ | ||
137 | movec %d0,%CACR | ||
138 | nop | ||
139 | move.l #0x0000c000,%d0 /* set SDRAM cached (write-thru) */ | ||
140 | movec %d0,%ACR0 | ||
141 | move.l #0x00000000,%d0 /* no other regions cached */ | ||
142 | movec %d0,%ACR1 | ||
143 | move.l #0x80400000,%d0 /* enable 8K instruction cache */ | ||
144 | movec %d0,%CACR | ||
145 | nop | ||
146 | .endm | ||
147 | #endif /* CONFIG_M520x */ | ||
148 | |||
149 | /****************************************************************************/ | ||
150 | #endif /* __M68KNOMMU_MCFCACHE_H */ | ||
diff --git a/arch/m68k/include/asm/mcfsim.h b/arch/m68k/include/asm/mcfsim.h index 6901fd68165b..ebd0304054ad 100644 --- a/arch/m68k/include/asm/mcfsim.h +++ b/arch/m68k/include/asm/mcfsim.h | |||
@@ -41,8 +41,8 @@ | |||
41 | #elif defined(CONFIG_M5407) | 41 | #elif defined(CONFIG_M5407) |
42 | #include <asm/m5407sim.h> | 42 | #include <asm/m5407sim.h> |
43 | #include <asm/mcfintc.h> | 43 | #include <asm/mcfintc.h> |
44 | #elif defined(CONFIG_M548x) | 44 | #elif defined(CONFIG_M54xx) |
45 | #include <asm/m548xsim.h> | 45 | #include <asm/m54xxsim.h> |
46 | #endif | 46 | #endif |
47 | 47 | ||
48 | /****************************************************************************/ | 48 | /****************************************************************************/ |
diff --git a/arch/m68k/include/asm/mcfuart.h b/arch/m68k/include/asm/mcfuart.h index db72e2b889ca..2abedff0a694 100644 --- a/arch/m68k/include/asm/mcfuart.h +++ b/arch/m68k/include/asm/mcfuart.h | |||
@@ -12,49 +12,6 @@ | |||
12 | #define mcfuart_h | 12 | #define mcfuart_h |
13 | /****************************************************************************/ | 13 | /****************************************************************************/ |
14 | 14 | ||
15 | /* | ||
16 | * Define the base address of the UARTS within the MBAR address | ||
17 | * space. | ||
18 | */ | ||
19 | #if defined(CONFIG_M5272) | ||
20 | #define MCFUART_BASE1 0x100 /* Base address of UART1 */ | ||
21 | #define MCFUART_BASE2 0x140 /* Base address of UART2 */ | ||
22 | #elif defined(CONFIG_M5206) || defined(CONFIG_M5206e) | ||
23 | #if defined(CONFIG_NETtel) | ||
24 | #define MCFUART_BASE1 0x180 /* Base address of UART1 */ | ||
25 | #define MCFUART_BASE2 0x140 /* Base address of UART2 */ | ||
26 | #else | ||
27 | #define MCFUART_BASE1 0x140 /* Base address of UART1 */ | ||
28 | #define MCFUART_BASE2 0x180 /* Base address of UART2 */ | ||
29 | #endif | ||
30 | #elif defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) | ||
31 | #define MCFUART_BASE1 0x200 /* Base address of UART1 */ | ||
32 | #define MCFUART_BASE2 0x240 /* Base address of UART2 */ | ||
33 | #define MCFUART_BASE3 0x280 /* Base address of UART3 */ | ||
34 | #elif defined(CONFIG_M5249) || defined(CONFIG_M5307) || defined(CONFIG_M5407) | ||
35 | #if defined(CONFIG_NETtel) || defined(CONFIG_SECUREEDGEMP3) | ||
36 | #define MCFUART_BASE1 0x200 /* Base address of UART1 */ | ||
37 | #define MCFUART_BASE2 0x1c0 /* Base address of UART2 */ | ||
38 | #else | ||
39 | #define MCFUART_BASE1 0x1c0 /* Base address of UART1 */ | ||
40 | #define MCFUART_BASE2 0x200 /* Base address of UART2 */ | ||
41 | #endif | ||
42 | #elif defined(CONFIG_M520x) | ||
43 | #define MCFUART_BASE1 0x60000 /* Base address of UART1 */ | ||
44 | #define MCFUART_BASE2 0x64000 /* Base address of UART2 */ | ||
45 | #define MCFUART_BASE3 0x68000 /* Base address of UART2 */ | ||
46 | #elif defined(CONFIG_M532x) | ||
47 | #define MCFUART_BASE1 0xfc060000 /* Base address of UART1 */ | ||
48 | #define MCFUART_BASE2 0xfc064000 /* Base address of UART2 */ | ||
49 | #define MCFUART_BASE3 0xfc068000 /* Base address of UART3 */ | ||
50 | #elif defined(CONFIG_M548x) | ||
51 | #define MCFUART_BASE1 0x8600 /* on M548x */ | ||
52 | #define MCFUART_BASE2 0x8700 /* on M548x */ | ||
53 | #define MCFUART_BASE3 0x8800 /* on M548x */ | ||
54 | #define MCFUART_BASE4 0x8900 /* on M548x */ | ||
55 | #endif | ||
56 | |||
57 | |||
58 | #include <linux/serial_core.h> | 15 | #include <linux/serial_core.h> |
59 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
60 | 17 | ||
@@ -217,7 +174,7 @@ struct mcf_platform_uart { | |||
217 | #define MCFUART_URF_RXS 0xc0 /* Receiver status */ | 174 | #define MCFUART_URF_RXS 0xc0 /* Receiver status */ |
218 | #endif | 175 | #endif |
219 | 176 | ||
220 | #if defined(CONFIG_M548x) | 177 | #if defined(CONFIG_M54xx) |
221 | #define MCFUART_TXFIFOSIZE 512 | 178 | #define MCFUART_TXFIFOSIZE 512 |
222 | #elif defined(CONFIG_M5272) | 179 | #elif defined(CONFIG_M5272) |
223 | #define MCFUART_TXFIFOSIZE 25 | 180 | #define MCFUART_TXFIFOSIZE 25 |
diff --git a/arch/m68k/include/asm/processor.h b/arch/m68k/include/asm/processor.h index 7a6a7590cc02..278c69bad57a 100644 --- a/arch/m68k/include/asm/processor.h +++ b/arch/m68k/include/asm/processor.h | |||
@@ -20,23 +20,26 @@ | |||
20 | 20 | ||
21 | static inline unsigned long rdusp(void) | 21 | static inline unsigned long rdusp(void) |
22 | { | 22 | { |
23 | #ifdef CONFIG_COLDFIRE | 23 | #ifdef CONFIG_COLDFIRE_SW_A7 |
24 | extern unsigned int sw_usp; | 24 | extern unsigned int sw_usp; |
25 | return sw_usp; | 25 | return sw_usp; |
26 | #else | 26 | #else |
27 | unsigned long usp; | 27 | register unsigned long usp __asm__("a0"); |
28 | __asm__ __volatile__("move %/usp,%0" : "=a" (usp)); | 28 | /* move %usp,%a0 */ |
29 | __asm__ __volatile__(".word 0x4e68" : "=a" (usp)); | ||
29 | return usp; | 30 | return usp; |
30 | #endif | 31 | #endif |
31 | } | 32 | } |
32 | 33 | ||
33 | static inline void wrusp(unsigned long usp) | 34 | static inline void wrusp(unsigned long usp) |
34 | { | 35 | { |
35 | #ifdef CONFIG_COLDFIRE | 36 | #ifdef CONFIG_COLDFIRE_SW_A7 |
36 | extern unsigned int sw_usp; | 37 | extern unsigned int sw_usp; |
37 | sw_usp = usp; | 38 | sw_usp = usp; |
38 | #else | 39 | #else |
39 | __asm__ __volatile__("move %0,%/usp" : : "a" (usp)); | 40 | register unsigned long a0 __asm__("a0") = usp; |
41 | /* move %a0,%usp */ | ||
42 | __asm__ __volatile__(".word 0x4e60" : : "a" (a0) ); | ||
40 | #endif | 43 | #endif |
41 | } | 44 | } |
42 | 45 | ||
diff --git a/arch/m68knommu/Kconfig b/arch/m68knommu/Kconfig index fa9f746cf4ae..704e7b92334c 100644 --- a/arch/m68knommu/Kconfig +++ b/arch/m68knommu/Kconfig | |||
@@ -75,6 +75,16 @@ config GENERIC_CLOCKEVENTS | |||
75 | config NO_IOPORT | 75 | config NO_IOPORT |
76 | def_bool y | 76 | def_bool y |
77 | 77 | ||
78 | config COLDFIRE_SW_A7 | ||
79 | bool | ||
80 | default n | ||
81 | |||
82 | config HAVE_CACHE_SPLIT | ||
83 | bool | ||
84 | |||
85 | config HAVE_CACHE_CB | ||
86 | bool | ||
87 | |||
78 | source "init/Kconfig" | 88 | source "init/Kconfig" |
79 | 89 | ||
80 | source "kernel/Kconfig.freezer" | 90 | source "kernel/Kconfig.freezer" |
@@ -107,69 +117,90 @@ config M68360 | |||
107 | 117 | ||
108 | config M5206 | 118 | config M5206 |
109 | bool "MCF5206" | 119 | bool "MCF5206" |
120 | select COLDFIRE_SW_A7 | ||
110 | help | 121 | help |
111 | Motorola ColdFire 5206 processor support. | 122 | Motorola ColdFire 5206 processor support. |
112 | 123 | ||
113 | config M5206e | 124 | config M5206e |
114 | bool "MCF5206e" | 125 | bool "MCF5206e" |
126 | select COLDFIRE_SW_A7 | ||
115 | help | 127 | help |
116 | Motorola ColdFire 5206e processor support. | 128 | Motorola ColdFire 5206e processor support. |
117 | 129 | ||
118 | config M520x | 130 | config M520x |
119 | bool "MCF520x" | 131 | bool "MCF520x" |
120 | select GENERIC_CLOCKEVENTS | 132 | select GENERIC_CLOCKEVENTS |
133 | select HAVE_CACHE_SPLIT | ||
121 | help | 134 | help |
122 | Freescale Coldfire 5207/5208 processor support. | 135 | Freescale Coldfire 5207/5208 processor support. |
123 | 136 | ||
124 | config M523x | 137 | config M523x |
125 | bool "MCF523x" | 138 | bool "MCF523x" |
126 | select GENERIC_CLOCKEVENTS | 139 | select GENERIC_CLOCKEVENTS |
140 | select HAVE_CACHE_SPLIT | ||
127 | help | 141 | help |
128 | Freescale Coldfire 5230/1/2/4/5 processor support | 142 | Freescale Coldfire 5230/1/2/4/5 processor support |
129 | 143 | ||
130 | config M5249 | 144 | config M5249 |
131 | bool "MCF5249" | 145 | bool "MCF5249" |
146 | select COLDFIRE_SW_A7 | ||
132 | help | 147 | help |
133 | Motorola ColdFire 5249 processor support. | 148 | Motorola ColdFire 5249 processor support. |
134 | 149 | ||
135 | config M5271 | 150 | config M5271 |
136 | bool "MCF5271" | 151 | bool "MCF5271" |
152 | select HAVE_CACHE_SPLIT | ||
137 | help | 153 | help |
138 | Freescale (Motorola) ColdFire 5270/5271 processor support. | 154 | Freescale (Motorola) ColdFire 5270/5271 processor support. |
139 | 155 | ||
140 | config M5272 | 156 | config M5272 |
141 | bool "MCF5272" | 157 | bool "MCF5272" |
158 | select COLDFIRE_SW_A7 | ||
142 | help | 159 | help |
143 | Motorola ColdFire 5272 processor support. | 160 | Motorola ColdFire 5272 processor support. |
144 | 161 | ||
145 | config M5275 | 162 | config M5275 |
146 | bool "MCF5275" | 163 | bool "MCF5275" |
164 | select HAVE_CACHE_SPLIT | ||
147 | help | 165 | help |
148 | Freescale (Motorola) ColdFire 5274/5275 processor support. | 166 | Freescale (Motorola) ColdFire 5274/5275 processor support. |
149 | 167 | ||
150 | config M528x | 168 | config M528x |
151 | bool "MCF528x" | 169 | bool "MCF528x" |
152 | select GENERIC_CLOCKEVENTS | 170 | select GENERIC_CLOCKEVENTS |
171 | select HAVE_CACHE_SPLIT | ||
153 | help | 172 | help |
154 | Motorola ColdFire 5280/5282 processor support. | 173 | Motorola ColdFire 5280/5282 processor support. |
155 | 174 | ||
156 | config M5307 | 175 | config M5307 |
157 | bool "MCF5307" | 176 | bool "MCF5307" |
177 | select COLDFIRE_SW_A7 | ||
178 | select HAVE_CACHE_CB | ||
158 | help | 179 | help |
159 | Motorola ColdFire 5307 processor support. | 180 | Motorola ColdFire 5307 processor support. |
160 | 181 | ||
161 | config M532x | 182 | config M532x |
162 | bool "MCF532x" | 183 | bool "MCF532x" |
184 | select HAVE_CACHE_CB | ||
163 | help | 185 | help |
164 | Freescale (Motorola) ColdFire 532x processor support. | 186 | Freescale (Motorola) ColdFire 532x processor support. |
165 | 187 | ||
166 | config M5407 | 188 | config M5407 |
167 | bool "MCF5407" | 189 | bool "MCF5407" |
190 | select COLDFIRE_SW_A7 | ||
191 | select HAVE_CACHE_CB | ||
168 | help | 192 | help |
169 | Motorola ColdFire 5407 processor support. | 193 | Motorola ColdFire 5407 processor support. |
170 | 194 | ||
195 | config M547x | ||
196 | bool "MCF547x" | ||
197 | select HAVE_CACHE_CB | ||
198 | help | ||
199 | Freescale ColdFire 5470/5471/5472/5473/5474/5475 processor support. | ||
200 | |||
171 | config M548x | 201 | config M548x |
172 | bool "MCF548x" | 202 | bool "MCF548x" |
203 | select HAVE_CACHE_CB | ||
173 | help | 204 | help |
174 | Freescale ColdFire 5480/5481/5482/5483/5484/5485 processor support. | 205 | Freescale ColdFire 5480/5481/5482/5483/5484/5485 processor support. |
175 | 206 | ||
@@ -181,9 +212,14 @@ config M527x | |||
181 | select GENERIC_CLOCKEVENTS | 212 | select GENERIC_CLOCKEVENTS |
182 | default y | 213 | default y |
183 | 214 | ||
215 | config M54xx | ||
216 | bool | ||
217 | depends on (M548x || M547x) | ||
218 | default y | ||
219 | |||
184 | config COLDFIRE | 220 | config COLDFIRE |
185 | bool | 221 | bool |
186 | depends on (M5206 || M5206e || M520x || M523x || M5249 || M527x || M5272 || M528x || M5307 || M532x || M5407 || M548x) | 222 | depends on (M5206 || M5206e || M520x || M523x || M5249 || M527x || M5272 || M528x || M5307 || M532x || M5407 || M54xx) |
187 | select GENERIC_GPIO | 223 | select GENERIC_GPIO |
188 | select ARCH_REQUIRE_GPIOLIB | 224 | select ARCH_REQUIRE_GPIOLIB |
189 | default y | 225 | default y |
@@ -230,6 +266,46 @@ config OLDMASK | |||
230 | Build support for the older revision ColdFire 5307 silicon. | 266 | Build support for the older revision ColdFire 5307 silicon. |
231 | Specifically this is the 1H55J mask revision. | 267 | Specifically this is the 1H55J mask revision. |
232 | 268 | ||
269 | if HAVE_CACHE_SPLIT | ||
270 | choice | ||
271 | prompt "Split Cache Configuration" | ||
272 | default CACHE_I | ||
273 | |||
274 | config CACHE_I | ||
275 | bool "Instruction" | ||
276 | help | ||
277 | Use all of the ColdFire CPU cache memory as an instruction cache. | ||
278 | |||
279 | config CACHE_D | ||
280 | bool "Data" | ||
281 | help | ||
282 | Use all of the ColdFire CPU cache memory as a data cache. | ||
283 | |||
284 | config CACHE_BOTH | ||
285 | bool "Both" | ||
286 | help | ||
287 | Split the ColdFire CPU cache, and use half as an instruction cache | ||
288 | and half as a data cache. | ||
289 | endchoice | ||
290 | endif | ||
291 | |||
292 | if HAVE_CACHE_CB | ||
293 | choice | ||
294 | prompt "Data cache mode" | ||
295 | default CACHE_WRITETHRU | ||
296 | |||
297 | config CACHE_WRITETHRU | ||
298 | bool "Write-through" | ||
299 | help | ||
300 | The ColdFire CPU cache is set into Write-through mode. | ||
301 | |||
302 | config CACHE_COPYBACK | ||
303 | bool "Copy-back" | ||
304 | help | ||
305 | The ColdFire CPU cache is set into Copy-back mode. | ||
306 | endchoice | ||
307 | endif | ||
308 | |||
233 | comment "Platform" | 309 | comment "Platform" |
234 | 310 | ||
235 | config PILOT3 | 311 | config PILOT3 |
@@ -245,16 +321,16 @@ config XCOPILOT_BUGS | |||
245 | Support the bugs of Xcopilot. | 321 | Support the bugs of Xcopilot. |
246 | 322 | ||
247 | config UC5272 | 323 | config UC5272 |
248 | bool 'Arcturus Networks uC5272 dimm board support' | 324 | bool 'Arcturus Networks uC5272 dimm board support' |
249 | depends on M5272 | 325 | depends on M5272 |
250 | help | 326 | help |
251 | Support for the Arcturus Networks uC5272 dimm board. | 327 | Support for the Arcturus Networks uC5272 dimm board. |
252 | 328 | ||
253 | config UC5282 | 329 | config UC5282 |
254 | bool "Arcturus Networks uC5282 board support" | 330 | bool "Arcturus Networks uC5282 board support" |
255 | depends on M528x | 331 | depends on M528x |
256 | help | 332 | help |
257 | Support for the Arcturus Networks uC5282 dimm board. | 333 | Support for the Arcturus Networks uC5282 dimm board. |
258 | 334 | ||
259 | config UCSIMM | 335 | config UCSIMM |
260 | bool "uCsimm module support" | 336 | bool "uCsimm module support" |
@@ -279,7 +355,7 @@ config DIRECT_IO_ACCESS | |||
279 | depends on (UCSIMM || UCDIMM || DRAGEN2) | 355 | depends on (UCSIMM || UCDIMM || DRAGEN2) |
280 | help | 356 | help |
281 | Disable the CPU internal registers protection in user mode, | 357 | Disable the CPU internal registers protection in user mode, |
282 | to allow a user application to read/write them. | 358 | to allow a user application to read/write them. |
283 | 359 | ||
284 | config INIT_LCD | 360 | config INIT_LCD |
285 | bool "Initialize LCD" | 361 | bool "Initialize LCD" |
@@ -517,7 +593,7 @@ config EMAC_INC | |||
517 | depends on (SOM5282EM) | 593 | depends on (SOM5282EM) |
518 | 594 | ||
519 | config SNEHA | 595 | config SNEHA |
520 | bool | 596 | bool |
521 | default y | 597 | default y |
522 | depends on CPU16B | 598 | depends on CPU16B |
523 | 599 | ||
diff --git a/arch/m68knommu/Makefile b/arch/m68knommu/Makefile index 026ef16fa68e..589613fed31d 100644 --- a/arch/m68knommu/Makefile +++ b/arch/m68knommu/Makefile | |||
@@ -25,7 +25,7 @@ platform-$(CONFIG_M528x) := 528x | |||
25 | platform-$(CONFIG_M5307) := 5307 | 25 | platform-$(CONFIG_M5307) := 5307 |
26 | platform-$(CONFIG_M532x) := 532x | 26 | platform-$(CONFIG_M532x) := 532x |
27 | platform-$(CONFIG_M5407) := 5407 | 27 | platform-$(CONFIG_M5407) := 5407 |
28 | platform-$(CONFIG_M548x) := 548x | 28 | platform-$(CONFIG_M54xx) := 54xx |
29 | PLATFORM := $(platform-y) | 29 | PLATFORM := $(platform-y) |
30 | 30 | ||
31 | board-$(CONFIG_PILOT) := pilot | 31 | board-$(CONFIG_PILOT) := pilot |
@@ -74,7 +74,7 @@ cpuclass-$(CONFIG_M528x) := coldfire | |||
74 | cpuclass-$(CONFIG_M5307) := coldfire | 74 | cpuclass-$(CONFIG_M5307) := coldfire |
75 | cpuclass-$(CONFIG_M532x) := coldfire | 75 | cpuclass-$(CONFIG_M532x) := coldfire |
76 | cpuclass-$(CONFIG_M5407) := coldfire | 76 | cpuclass-$(CONFIG_M5407) := coldfire |
77 | cpuclass-$(CONFIG_M548x) := coldfire | 77 | cpuclass-$(CONFIG_M54xx) := coldfire |
78 | cpuclass-$(CONFIG_M68328) := 68328 | 78 | cpuclass-$(CONFIG_M68328) := 68328 |
79 | cpuclass-$(CONFIG_M68EZ328) := 68328 | 79 | cpuclass-$(CONFIG_M68EZ328) := 68328 |
80 | cpuclass-$(CONFIG_M68VZ328) := 68328 | 80 | cpuclass-$(CONFIG_M68VZ328) := 68328 |
@@ -91,18 +91,18 @@ export PLATFORM BOARD MODEL CPUCLASS | |||
91 | # Some CFLAG additions based on specific CPU type. | 91 | # Some CFLAG additions based on specific CPU type. |
92 | # | 92 | # |
93 | cflags-$(CONFIG_M5206) := $(call cc-option,-mcpu=5206,-m5200) | 93 | cflags-$(CONFIG_M5206) := $(call cc-option,-mcpu=5206,-m5200) |
94 | cflags-$(CONFIG_M5206e) := $(call cc-option,-m5206e,-m5200) | 94 | cflags-$(CONFIG_M5206e) := $(call cc-option,-mcpu=5206e,-m5200) |
95 | cflags-$(CONFIG_M520x) := $(call cc-option,-mcpu=5208,-m5200) | 95 | cflags-$(CONFIG_M520x) := $(call cc-option,-mcpu=5208,-m5200) |
96 | cflags-$(CONFIG_M523x) := $(call cc-option,-mcpu=523x,-m5307) | 96 | cflags-$(CONFIG_M523x) := $(call cc-option,-mcpu=523x,-m5307) |
97 | cflags-$(CONFIG_M5249) := $(call cc-option,-mcpu=5249,-m5200) | 97 | cflags-$(CONFIG_M5249) := $(call cc-option,-mcpu=5249,-m5200) |
98 | cflags-$(CONFIG_M5271) := $(call cc-option,-mcpu=5271,-m5307) | 98 | cflags-$(CONFIG_M5271) := $(call cc-option,-mcpu=5271,-m5307) |
99 | cflags-$(CONFIG_M5272) := $(call cc-option,-mcpu=5272,-m5307) | 99 | cflags-$(CONFIG_M5272) := $(call cc-option,-mcpu=5272,-m5307) |
100 | cflags-$(CONFIG_M5275) := $(call cc-option,-mcpu=5275,-m5307) | 100 | cflags-$(CONFIG_M5275) := $(call cc-option,-mcpu=5275,-m5307) |
101 | cflags-$(CONFIG_M528x) := $(call cc-option,-m528x,-m5307) | 101 | cflags-$(CONFIG_M528x) := $(call cc-option,-mcpu=528x,-m5307) |
102 | cflags-$(CONFIG_M5307) := $(call cc-option,-m5307,-m5200) | 102 | cflags-$(CONFIG_M5307) := $(call cc-option,-mcpu=5307,-m5200) |
103 | cflags-$(CONFIG_M532x) := $(call cc-option,-mcpu=532x,-m5307) | 103 | cflags-$(CONFIG_M532x) := $(call cc-option,-mcpu=532x,-m5307) |
104 | cflags-$(CONFIG_M5407) := $(call cc-option,-m5407,-m5200) | 104 | cflags-$(CONFIG_M5407) := $(call cc-option,-mcpu=5407,-m5200) |
105 | cflags-$(CONFIG_M548x) := $(call cc-option,-m5407,-m5200) | 105 | cflags-$(CONFIG_M54xx) := $(call cc-option,-mcpu=5475,-m5200) |
106 | cflags-$(CONFIG_M68328) := -m68000 | 106 | cflags-$(CONFIG_M68328) := -m68000 |
107 | cflags-$(CONFIG_M68EZ328) := -m68000 | 107 | cflags-$(CONFIG_M68EZ328) := -m68000 |
108 | cflags-$(CONFIG_M68VZ328) := -m68000 | 108 | cflags-$(CONFIG_M68VZ328) := -m68000 |
diff --git a/arch/m68knommu/kernel/setup.c b/arch/m68knommu/kernel/setup.c index c684adf5dc40..16b2de7f5101 100644 --- a/arch/m68knommu/kernel/setup.c +++ b/arch/m68knommu/kernel/setup.c | |||
@@ -55,55 +55,29 @@ void (*mach_halt)(void); | |||
55 | void (*mach_power_off)(void); | 55 | void (*mach_power_off)(void); |
56 | 56 | ||
57 | #ifdef CONFIG_M68328 | 57 | #ifdef CONFIG_M68328 |
58 | #define CPU "MC68328" | 58 | #define CPU_NAME "MC68328" |
59 | #endif | 59 | #endif |
60 | #ifdef CONFIG_M68EZ328 | 60 | #ifdef CONFIG_M68EZ328 |
61 | #define CPU "MC68EZ328" | 61 | #define CPU_NAME "MC68EZ328" |
62 | #endif | 62 | #endif |
63 | #ifdef CONFIG_M68VZ328 | 63 | #ifdef CONFIG_M68VZ328 |
64 | #define CPU "MC68VZ328" | 64 | #define CPU_NAME "MC68VZ328" |
65 | #endif | 65 | #endif |
66 | #ifdef CONFIG_M68360 | 66 | #ifdef CONFIG_M68360 |
67 | #define CPU "MC68360" | 67 | #define CPU_NAME "MC68360" |
68 | #endif | 68 | #endif |
69 | #if defined(CONFIG_M5206) | 69 | #ifndef CPU_NAME |
70 | #define CPU "COLDFIRE(m5206)" | 70 | #define CPU_NAME "UNKNOWN" |
71 | #endif | 71 | #endif |
72 | #if defined(CONFIG_M5206e) | 72 | |
73 | #define CPU "COLDFIRE(m5206e)" | 73 | /* |
74 | #endif | 74 | * Different cores have different instruction execution timings. |
75 | #if defined(CONFIG_M520x) | 75 | * The old/traditional 68000 cores are basically all the same, at 16. |
76 | #define CPU "COLDFIRE(m520x)" | 76 | * The ColdFire cores vary a little, their values are defined in their |
77 | #endif | 77 | * headers. We default to the standard 68000 value here. |
78 | #if defined(CONFIG_M523x) | 78 | */ |
79 | #define CPU "COLDFIRE(m523x)" | 79 | #ifndef CPU_INSTR_PER_JIFFY |
80 | #endif | 80 | #define CPU_INSTR_PER_JIFFY 16 |
81 | #if defined(CONFIG_M5249) | ||
82 | #define CPU "COLDFIRE(m5249)" | ||
83 | #endif | ||
84 | #if defined(CONFIG_M5271) | ||
85 | #define CPU "COLDFIRE(m5270/5271)" | ||
86 | #endif | ||
87 | #if defined(CONFIG_M5272) | ||
88 | #define CPU "COLDFIRE(m5272)" | ||
89 | #endif | ||
90 | #if defined(CONFIG_M5275) | ||
91 | #define CPU "COLDFIRE(m5274/5275)" | ||
92 | #endif | ||
93 | #if defined(CONFIG_M528x) | ||
94 | #define CPU "COLDFIRE(m5280/5282)" | ||
95 | #endif | ||
96 | #if defined(CONFIG_M5307) | ||
97 | #define CPU "COLDFIRE(m5307)" | ||
98 | #endif | ||
99 | #if defined(CONFIG_M532x) | ||
100 | #define CPU "COLDFIRE(m532x)" | ||
101 | #endif | ||
102 | #if defined(CONFIG_M5407) | ||
103 | #define CPU "COLDFIRE(m5407)" | ||
104 | #endif | ||
105 | #ifndef CPU | ||
106 | #define CPU "UNKNOWN" | ||
107 | #endif | 81 | #endif |
108 | 82 | ||
109 | extern int _stext, _etext, _sdata, _edata, _sbss, _ebss, _end; | 83 | extern int _stext, _etext, _sdata, _edata, _sbss, _ebss, _end; |
@@ -208,7 +182,7 @@ void __init setup_arch(char **cmdline_p) | |||
208 | command_line[sizeof(command_line) - 1] = 0; | 182 | command_line[sizeof(command_line) - 1] = 0; |
209 | #endif /* CONFIG_UBOOT */ | 183 | #endif /* CONFIG_UBOOT */ |
210 | 184 | ||
211 | printk(KERN_INFO "\x0F\r\n\nuClinux/" CPU "\n"); | 185 | printk(KERN_INFO "\x0F\r\n\nuClinux/" CPU_NAME "\n"); |
212 | 186 | ||
213 | #ifdef CONFIG_UCDIMM | 187 | #ifdef CONFIG_UCDIMM |
214 | printk(KERN_INFO "uCdimm by Lineo, Inc. <www.lineo.com>\n"); | 188 | printk(KERN_INFO "uCdimm by Lineo, Inc. <www.lineo.com>\n"); |
@@ -257,11 +231,6 @@ void __init setup_arch(char **cmdline_p) | |||
257 | memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE); | 231 | memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE); |
258 | boot_command_line[COMMAND_LINE_SIZE-1] = 0; | 232 | boot_command_line[COMMAND_LINE_SIZE-1] = 0; |
259 | 233 | ||
260 | #ifdef DEBUG | ||
261 | if (strlen(*cmdline_p)) | ||
262 | printk(KERN_DEBUG "Command line: '%s'\n", *cmdline_p); | ||
263 | #endif | ||
264 | |||
265 | #if defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_DUMMY_CONSOLE) | 234 | #if defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_DUMMY_CONSOLE) |
266 | conswitchp = &dummy_con; | 235 | conswitchp = &dummy_con; |
267 | #endif | 236 | #endif |
@@ -303,15 +272,10 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
303 | char *cpu, *mmu, *fpu; | 272 | char *cpu, *mmu, *fpu; |
304 | u_long clockfreq; | 273 | u_long clockfreq; |
305 | 274 | ||
306 | cpu = CPU; | 275 | cpu = CPU_NAME; |
307 | mmu = "none"; | 276 | mmu = "none"; |
308 | fpu = "none"; | 277 | fpu = "none"; |
309 | 278 | clockfreq = (loops_per_jiffy * HZ) * CPU_INSTR_PER_JIFFY; | |
310 | #ifdef CONFIG_COLDFIRE | ||
311 | clockfreq = (loops_per_jiffy * HZ) * 3; | ||
312 | #else | ||
313 | clockfreq = (loops_per_jiffy * HZ) * 16; | ||
314 | #endif | ||
315 | 279 | ||
316 | seq_printf(m, "CPU:\t\t%s\n" | 280 | seq_printf(m, "CPU:\t\t%s\n" |
317 | "MMU:\t\t%s\n" | 281 | "MMU:\t\t%s\n" |
diff --git a/arch/m68knommu/mm/Makefile b/arch/m68knommu/mm/Makefile index fc91f254f51b..b54ab6b4b523 100644 --- a/arch/m68knommu/mm/Makefile +++ b/arch/m68knommu/mm/Makefile | |||
@@ -2,4 +2,4 @@ | |||
2 | # Makefile for the linux m68knommu specific parts of the memory manager. | 2 | # Makefile for the linux m68knommu specific parts of the memory manager. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y += init.o fault.o memory.o kmap.o | 5 | obj-y += init.o kmap.o |
diff --git a/arch/m68knommu/mm/fault.c b/arch/m68knommu/mm/fault.c deleted file mode 100644 index bc05cf74d9c0..000000000000 --- a/arch/m68knommu/mm/fault.c +++ /dev/null | |||
@@ -1,57 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/m68knommu/mm/fault.c | ||
3 | * | ||
4 | * Copyright (C) 1998 D. Jeff Dionne <jeff@lineo.ca>, | ||
5 | * Copyright (C) 2000 Lineo, Inc. (www.lineo.com) | ||
6 | * | ||
7 | * Based on: | ||
8 | * | ||
9 | * linux/arch/m68k/mm/fault.c | ||
10 | * | ||
11 | * Copyright (C) 1995 Hamish Macdonald | ||
12 | */ | ||
13 | |||
14 | #include <linux/mman.h> | ||
15 | #include <linux/mm.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/ptrace.h> | ||
18 | |||
19 | #include <asm/system.h> | ||
20 | #include <asm/pgtable.h> | ||
21 | |||
22 | extern void die_if_kernel(char *, struct pt_regs *, long); | ||
23 | |||
24 | /* | ||
25 | * This routine handles page faults. It determines the problem, and | ||
26 | * then passes it off to one of the appropriate routines. | ||
27 | * | ||
28 | * error_code: | ||
29 | * bit 0 == 0 means no page found, 1 means protection fault | ||
30 | * bit 1 == 0 means read, 1 means write | ||
31 | * | ||
32 | * If this routine detects a bad access, it returns 1, otherwise it | ||
33 | * returns 0. | ||
34 | */ | ||
35 | asmlinkage int do_page_fault(struct pt_regs *regs, unsigned long address, | ||
36 | unsigned long error_code) | ||
37 | { | ||
38 | #ifdef DEBUG | ||
39 | printk(KERN_DEBUG "regs->sr=%#x, regs->pc=%#lx, address=%#lx, %ld\n", | ||
40 | regs->sr, regs->pc, address, error_code); | ||
41 | #endif | ||
42 | |||
43 | /* | ||
44 | * Oops. The kernel tried to access some bad page. We'll have to | ||
45 | * terminate things with extreme prejudice. | ||
46 | */ | ||
47 | if ((unsigned long) address < PAGE_SIZE) | ||
48 | printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference"); | ||
49 | else | ||
50 | printk(KERN_ALERT "Unable to handle kernel access"); | ||
51 | printk(KERN_ALERT " at virtual address %08lx\n", address); | ||
52 | die_if_kernel("Oops", regs, error_code); | ||
53 | do_exit(SIGKILL); | ||
54 | |||
55 | return 1; | ||
56 | } | ||
57 | |||
diff --git a/arch/m68knommu/mm/kmap.c b/arch/m68knommu/mm/kmap.c index 902c1dfda9e5..ece8d5ad4e6c 100644 --- a/arch/m68knommu/mm/kmap.c +++ b/arch/m68knommu/mm/kmap.c | |||
@@ -36,15 +36,6 @@ void iounmap(void *addr) | |||
36 | } | 36 | } |
37 | 37 | ||
38 | /* | 38 | /* |
39 | * __iounmap unmaps nearly everything, so be careful | ||
40 | * it doesn't free currently pointer/page tables anymore but it | ||
41 | * wans't used anyway and might be added later. | ||
42 | */ | ||
43 | void __iounmap(void *addr, unsigned long size) | ||
44 | { | ||
45 | } | ||
46 | |||
47 | /* | ||
48 | * Set new cache mode for some kernel address space. | 39 | * Set new cache mode for some kernel address space. |
49 | * The caller must push data for that range itself, if such data may already | 40 | * The caller must push data for that range itself, if such data may already |
50 | * be in the cache. | 41 | * be in the cache. |
diff --git a/arch/m68knommu/mm/memory.c b/arch/m68knommu/mm/memory.c deleted file mode 100644 index 8f7949e786d4..000000000000 --- a/arch/m68knommu/mm/memory.c +++ /dev/null | |||
@@ -1,33 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/m68knommu/mm/memory.c | ||
3 | * | ||
4 | * Copyright (C) 1998 Kenneth Albanowski <kjahds@kjahds.com>, | ||
5 | * Copyright (C) 1999-2002, Greg Ungerer (gerg@snapgear.com) | ||
6 | * | ||
7 | * Based on: | ||
8 | * | ||
9 | * linux/arch/m68k/mm/memory.c | ||
10 | * | ||
11 | * Copyright (C) 1995 Hamish Macdonald | ||
12 | */ | ||
13 | |||
14 | #include <linux/mm.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/string.h> | ||
17 | #include <linux/types.h> | ||
18 | |||
19 | #include <asm/segment.h> | ||
20 | #include <asm/page.h> | ||
21 | #include <asm/pgtable.h> | ||
22 | #include <asm/system.h> | ||
23 | |||
24 | /* | ||
25 | * Map some physical address range into the kernel address space. | ||
26 | */ | ||
27 | |||
28 | unsigned long kernel_map(unsigned long paddr, unsigned long size, | ||
29 | int nocacheflag, unsigned long *memavailp ) | ||
30 | { | ||
31 | return paddr; | ||
32 | } | ||
33 | |||
diff --git a/arch/m68knommu/platform/548x/Makefile b/arch/m68knommu/platform/54xx/Makefile index e6035e7a2d3f..e6035e7a2d3f 100644 --- a/arch/m68knommu/platform/548x/Makefile +++ b/arch/m68knommu/platform/54xx/Makefile | |||
diff --git a/arch/m68knommu/platform/548x/config.c b/arch/m68knommu/platform/54xx/config.c index 9888846bd1cf..78130984db95 100644 --- a/arch/m68knommu/platform/548x/config.c +++ b/arch/m68knommu/platform/54xx/config.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /***************************************************************************/ | 1 | /***************************************************************************/ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * linux/arch/m68knommu/platform/548x/config.c | 4 | * linux/arch/m68knommu/platform/54xx/config.c |
5 | * | 5 | * |
6 | * Copyright (C) 2010, Philippe De Muyter <phdm@macqel.be> | 6 | * Copyright (C) 2010, Philippe De Muyter <phdm@macqel.be> |
7 | */ | 7 | */ |
@@ -15,13 +15,13 @@ | |||
15 | #include <linux/io.h> | 15 | #include <linux/io.h> |
16 | #include <asm/machdep.h> | 16 | #include <asm/machdep.h> |
17 | #include <asm/coldfire.h> | 17 | #include <asm/coldfire.h> |
18 | #include <asm/m548xsim.h> | 18 | #include <asm/m54xxsim.h> |
19 | #include <asm/mcfuart.h> | 19 | #include <asm/mcfuart.h> |
20 | #include <asm/m548xgpt.h> | 20 | #include <asm/m54xxgpt.h> |
21 | 21 | ||
22 | /***************************************************************************/ | 22 | /***************************************************************************/ |
23 | 23 | ||
24 | static struct mcf_platform_uart m548x_uart_platform[] = { | 24 | static struct mcf_platform_uart m54xx_uart_platform[] = { |
25 | { | 25 | { |
26 | .mapbase = MCF_MBAR + MCFUART_BASE1, | 26 | .mapbase = MCF_MBAR + MCFUART_BASE1, |
27 | .irq = 64 + 35, | 27 | .irq = 64 + 35, |
@@ -40,20 +40,20 @@ static struct mcf_platform_uart m548x_uart_platform[] = { | |||
40 | }, | 40 | }, |
41 | }; | 41 | }; |
42 | 42 | ||
43 | static struct platform_device m548x_uart = { | 43 | static struct platform_device m54xx_uart = { |
44 | .name = "mcfuart", | 44 | .name = "mcfuart", |
45 | .id = 0, | 45 | .id = 0, |
46 | .dev.platform_data = m548x_uart_platform, | 46 | .dev.platform_data = m54xx_uart_platform, |
47 | }; | 47 | }; |
48 | 48 | ||
49 | static struct platform_device *m548x_devices[] __initdata = { | 49 | static struct platform_device *m54xx_devices[] __initdata = { |
50 | &m548x_uart, | 50 | &m54xx_uart, |
51 | }; | 51 | }; |
52 | 52 | ||
53 | 53 | ||
54 | /***************************************************************************/ | 54 | /***************************************************************************/ |
55 | 55 | ||
56 | static void __init m548x_uart_init_line(int line, int irq) | 56 | static void __init m54xx_uart_init_line(int line, int irq) |
57 | { | 57 | { |
58 | int rts_cts; | 58 | int rts_cts; |
59 | 59 | ||
@@ -72,18 +72,18 @@ static void __init m548x_uart_init_line(int line, int irq) | |||
72 | MCF_MBAR + MCF_PAR_PSC(line)); | 72 | MCF_MBAR + MCF_PAR_PSC(line)); |
73 | } | 73 | } |
74 | 74 | ||
75 | static void __init m548x_uarts_init(void) | 75 | static void __init m54xx_uarts_init(void) |
76 | { | 76 | { |
77 | const int nrlines = ARRAY_SIZE(m548x_uart_platform); | 77 | const int nrlines = ARRAY_SIZE(m54xx_uart_platform); |
78 | int line; | 78 | int line; |
79 | 79 | ||
80 | for (line = 0; (line < nrlines); line++) | 80 | for (line = 0; (line < nrlines); line++) |
81 | m548x_uart_init_line(line, m548x_uart_platform[line].irq); | 81 | m54xx_uart_init_line(line, m54xx_uart_platform[line].irq); |
82 | } | 82 | } |
83 | 83 | ||
84 | /***************************************************************************/ | 84 | /***************************************************************************/ |
85 | 85 | ||
86 | static void mcf548x_reset(void) | 86 | static void mcf54xx_reset(void) |
87 | { | 87 | { |
88 | /* disable interrupts and enable the watchdog */ | 88 | /* disable interrupts and enable the watchdog */ |
89 | asm("movew #0x2700, %sr\n"); | 89 | asm("movew #0x2700, %sr\n"); |
@@ -97,8 +97,8 @@ static void mcf548x_reset(void) | |||
97 | 97 | ||
98 | void __init config_BSP(char *commandp, int size) | 98 | void __init config_BSP(char *commandp, int size) |
99 | { | 99 | { |
100 | mach_reset = mcf548x_reset; | 100 | mach_reset = mcf54xx_reset; |
101 | m548x_uarts_init(); | 101 | m54xx_uarts_init(); |
102 | } | 102 | } |
103 | 103 | ||
104 | /***************************************************************************/ | 104 | /***************************************************************************/ |
@@ -106,7 +106,7 @@ void __init config_BSP(char *commandp, int size) | |||
106 | static int __init init_BSP(void) | 106 | static int __init init_BSP(void) |
107 | { | 107 | { |
108 | 108 | ||
109 | platform_add_devices(m548x_devices, ARRAY_SIZE(m548x_devices)); | 109 | platform_add_devices(m54xx_devices, ARRAY_SIZE(m54xx_devices)); |
110 | return 0; | 110 | return 0; |
111 | } | 111 | } |
112 | 112 | ||
diff --git a/arch/m68knommu/platform/68328/ints.c b/arch/m68knommu/platform/68328/ints.c index 865852806a17..2a3af193ccd3 100644 --- a/arch/m68knommu/platform/68328/ints.c +++ b/arch/m68knommu/platform/68328/ints.c | |||
@@ -179,8 +179,8 @@ void __init init_IRQ(void) | |||
179 | IMR = ~0; | 179 | IMR = ~0; |
180 | 180 | ||
181 | for (i = 0; (i < NR_IRQS); i++) { | 181 | for (i = 0; (i < NR_IRQS); i++) { |
182 | set_irq_chip(irq, &intc_irq_chip); | 182 | set_irq_chip(i, &intc_irq_chip); |
183 | set_irq_handler(irq, handle_level_irq); | 183 | set_irq_handler(i, handle_level_irq); |
184 | } | 184 | } |
185 | } | 185 | } |
186 | 186 | ||
diff --git a/arch/m68knommu/platform/coldfire/Makefile b/arch/m68knommu/platform/coldfire/Makefile index 45f501fa4525..a8967baabd72 100644 --- a/arch/m68knommu/platform/coldfire/Makefile +++ b/arch/m68knommu/platform/coldfire/Makefile | |||
@@ -14,7 +14,7 @@ | |||
14 | 14 | ||
15 | asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1 | 15 | asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1 |
16 | 16 | ||
17 | obj-$(CONFIG_COLDFIRE) += clk.o dma.o entry.o vectors.o | 17 | obj-$(CONFIG_COLDFIRE) += cache.o clk.o dma.o entry.o vectors.o |
18 | obj-$(CONFIG_M5206) += timers.o intc.o | 18 | obj-$(CONFIG_M5206) += timers.o intc.o |
19 | obj-$(CONFIG_M5206e) += timers.o intc.o | 19 | obj-$(CONFIG_M5206e) += timers.o intc.o |
20 | obj-$(CONFIG_M520x) += pit.o intc-simr.o | 20 | obj-$(CONFIG_M520x) += pit.o intc-simr.o |
@@ -26,7 +26,7 @@ obj-$(CONFIG_M528x) += pit.o intc-2.o | |||
26 | obj-$(CONFIG_M5307) += timers.o intc.o | 26 | obj-$(CONFIG_M5307) += timers.o intc.o |
27 | obj-$(CONFIG_M532x) += timers.o intc-simr.o | 27 | obj-$(CONFIG_M532x) += timers.o intc-simr.o |
28 | obj-$(CONFIG_M5407) += timers.o intc.o | 28 | obj-$(CONFIG_M5407) += timers.o intc.o |
29 | obj-$(CONFIG_M548x) += sltimers.o intc-2.o | 29 | obj-$(CONFIG_M54xx) += sltimers.o intc-2.o |
30 | 30 | ||
31 | obj-y += pinmux.o gpio.o | 31 | obj-y += pinmux.o gpio.o |
32 | extra-y := head.o | 32 | extra-y := head.o |
diff --git a/arch/m68knommu/platform/coldfire/cache.c b/arch/m68knommu/platform/coldfire/cache.c new file mode 100644 index 000000000000..235d3c4f4f0f --- /dev/null +++ b/arch/m68knommu/platform/coldfire/cache.c | |||
@@ -0,0 +1,48 @@ | |||
1 | /***************************************************************************/ | ||
2 | |||
3 | /* | ||
4 | * cache.c -- general ColdFire Cache maintainence code | ||
5 | * | ||
6 | * Copyright (C) 2010, Greg Ungerer (gerg@snapgear.com) | ||
7 | */ | ||
8 | |||
9 | /***************************************************************************/ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <asm/coldfire.h> | ||
13 | #include <asm/mcfsim.h> | ||
14 | |||
15 | /***************************************************************************/ | ||
16 | #ifdef CACHE_PUSH | ||
17 | /***************************************************************************/ | ||
18 | |||
19 | /* | ||
20 | * Use cpushl to push all dirty cache lines back to memory. | ||
21 | * Older versions of GAS don't seem to know how to generate the | ||
22 | * ColdFire cpushl instruction... Oh well, bit stuff it for now. | ||
23 | */ | ||
24 | |||
25 | void mcf_cache_push(void) | ||
26 | { | ||
27 | __asm__ __volatile__ ( | ||
28 | "clrl %%d0\n\t" | ||
29 | "1:\n\t" | ||
30 | "movel %%d0,%%a0\n\t" | ||
31 | "2:\n\t" | ||
32 | ".word 0xf468\n\t" | ||
33 | "addl %0,%%a0\n\t" | ||
34 | "cmpl %1,%%a0\n\t" | ||
35 | "blt 2b\n\t" | ||
36 | "addql #1,%%d0\n\t" | ||
37 | "cmpil %2,%%d0\n\t" | ||
38 | "bne 1b\n\t" | ||
39 | : /* No output */ | ||
40 | : "i" (CACHE_LINE_SIZE), | ||
41 | "i" (DCACHE_SIZE / CACHE_WAYS), | ||
42 | "i" (CACHE_WAYS) | ||
43 | : "d0", "a0" ); | ||
44 | } | ||
45 | |||
46 | /***************************************************************************/ | ||
47 | #endif /* CACHE_PUSH */ | ||
48 | /***************************************************************************/ | ||
diff --git a/arch/m68knommu/platform/coldfire/entry.S b/arch/m68knommu/platform/coldfire/entry.S index e1debc8285ef..4ddfc3da70d8 100644 --- a/arch/m68knommu/platform/coldfire/entry.S +++ b/arch/m68knommu/platform/coldfire/entry.S | |||
@@ -36,13 +36,16 @@ | |||
36 | #include <asm/asm-offsets.h> | 36 | #include <asm/asm-offsets.h> |
37 | #include <asm/entry.h> | 37 | #include <asm/entry.h> |
38 | 38 | ||
39 | #ifdef CONFIG_COLDFIRE_SW_A7 | ||
40 | /* | ||
41 | * Define software copies of the supervisor and user stack pointers. | ||
42 | */ | ||
39 | .bss | 43 | .bss |
40 | |||
41 | sw_ksp: | 44 | sw_ksp: |
42 | .long 0 | 45 | .long 0 |
43 | |||
44 | sw_usp: | 46 | sw_usp: |
45 | .long 0 | 47 | .long 0 |
48 | #endif /* CONFIG_COLDFIRE_SW_A7 */ | ||
46 | 49 | ||
47 | .text | 50 | .text |
48 | 51 | ||
@@ -51,7 +54,6 @@ sw_usp: | |||
51 | .globl ret_from_exception | 54 | .globl ret_from_exception |
52 | .globl ret_from_signal | 55 | .globl ret_from_signal |
53 | .globl sys_call_table | 56 | .globl sys_call_table |
54 | .globl ret_from_interrupt | ||
55 | .globl inthandler | 57 | .globl inthandler |
56 | .globl fasthandler | 58 | .globl fasthandler |
57 | 59 | ||
@@ -140,20 +142,7 @@ Luser_return: | |||
140 | jne Lwork_to_do /* still work to do */ | 142 | jne Lwork_to_do /* still work to do */ |
141 | 143 | ||
142 | Lreturn: | 144 | Lreturn: |
143 | move #0x2700,%sr /* disable intrs */ | 145 | RESTORE_USER |
144 | movel sw_usp,%a0 /* get usp */ | ||
145 | movel %sp@(PT_OFF_PC),%a0@- /* copy exception program counter */ | ||
146 | movel %sp@(PT_OFF_FORMATVEC),%a0@- /* copy exception format/vector/sr */ | ||
147 | moveml %sp@,%d1-%d5/%a0-%a2 | ||
148 | lea %sp@(32),%sp /* space for 8 regs */ | ||
149 | movel %sp@+,%d0 | ||
150 | addql #4,%sp /* orig d0 */ | ||
151 | addl %sp@+,%sp /* stk adj */ | ||
152 | addql #8,%sp /* remove exception */ | ||
153 | movel %sp,sw_ksp /* save ksp */ | ||
154 | subql #8,sw_usp /* set exception */ | ||
155 | movel sw_usp,%sp /* restore usp */ | ||
156 | rte | ||
157 | 146 | ||
158 | Lwork_to_do: | 147 | Lwork_to_do: |
159 | movel %a0@(TI_FLAGS),%d1 /* get thread_info->flags */ | 148 | movel %a0@(TI_FLAGS),%d1 /* get thread_info->flags */ |
@@ -191,31 +180,7 @@ ENTRY(inthandler) | |||
191 | jbsr do_IRQ /* call high level irq handler */ | 180 | jbsr do_IRQ /* call high level irq handler */ |
192 | lea %sp@(8),%sp /* pop args off stack */ | 181 | lea %sp@(8),%sp /* pop args off stack */ |
193 | 182 | ||
194 | bra ret_from_interrupt /* this was fallthrough */ | 183 | bra ret_from_exception |
195 | |||
196 | /* | ||
197 | * This is the fast interrupt handler (for certain hardware interrupt | ||
198 | * sources). Unlike the normal interrupt handler it just uses the | ||
199 | * current stack (doesn't care if it is user or kernel). It also | ||
200 | * doesn't bother doing the bottom half handlers. | ||
201 | */ | ||
202 | ENTRY(fasthandler) | ||
203 | SAVE_LOCAL | ||
204 | |||
205 | movew %sp@(PT_OFF_FORMATVEC),%d0 | ||
206 | andl #0x03fc,%d0 /* mask out vector only */ | ||
207 | |||
208 | movel %sp,%sp@- /* push regs arg */ | ||
209 | lsrl #2,%d0 /* calculate real vector # */ | ||
210 | movel %d0,%sp@- /* push vector number */ | ||
211 | jbsr do_IRQ /* call high level irq handler */ | ||
212 | lea %sp@(8),%sp /* pop args off stack */ | ||
213 | |||
214 | RESTORE_LOCAL | ||
215 | |||
216 | ENTRY(ret_from_interrupt) | ||
217 | /* the fasthandler is confusing me, haven't seen any user */ | ||
218 | jmp ret_from_exception | ||
219 | 184 | ||
220 | /* | 185 | /* |
221 | * Beware - when entering resume, prev (the current task) is | 186 | * Beware - when entering resume, prev (the current task) is |
@@ -226,9 +191,8 @@ ENTRY(ret_from_interrupt) | |||
226 | */ | 191 | */ |
227 | ENTRY(resume) | 192 | ENTRY(resume) |
228 | movel %a0, %d1 /* get prev thread in d1 */ | 193 | movel %a0, %d1 /* get prev thread in d1 */ |
229 | 194 | RDUSP | |
230 | movel sw_usp,%d0 /* save usp */ | 195 | movel %a2,%a0@(TASK_THREAD+THREAD_USP) |
231 | movel %d0,%a0@(TASK_THREAD+THREAD_USP) | ||
232 | 196 | ||
233 | SAVE_SWITCH_STACK | 197 | SAVE_SWITCH_STACK |
234 | movel %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack pointer */ | 198 | movel %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack pointer */ |
@@ -236,5 +200,5 @@ ENTRY(resume) | |||
236 | RESTORE_SWITCH_STACK | 200 | RESTORE_SWITCH_STACK |
237 | 201 | ||
238 | movel %a1@(TASK_THREAD+THREAD_USP),%a0 /* restore thread user stack */ | 202 | movel %a1@(TASK_THREAD+THREAD_USP),%a0 /* restore thread user stack */ |
239 | movel %a0, sw_usp | 203 | WRUSP |
240 | rts | 204 | rts |
diff --git a/arch/m68knommu/platform/coldfire/head.S b/arch/m68knommu/platform/coldfire/head.S index 0b2d7c7adf79..d5977909ae5f 100644 --- a/arch/m68knommu/platform/coldfire/head.S +++ b/arch/m68knommu/platform/coldfire/head.S | |||
@@ -3,7 +3,7 @@ | |||
3 | /* | 3 | /* |
4 | * head.S -- common startup code for ColdFire CPUs. | 4 | * head.S -- common startup code for ColdFire CPUs. |
5 | * | 5 | * |
6 | * (C) Copyright 1999-2006, Greg Ungerer <gerg@snapgear.com>. | 6 | * (C) Copyright 1999-2010, Greg Ungerer <gerg@snapgear.com>. |
7 | */ | 7 | */ |
8 | 8 | ||
9 | /*****************************************************************************/ | 9 | /*****************************************************************************/ |
@@ -13,7 +13,6 @@ | |||
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <asm/asm-offsets.h> | 14 | #include <asm/asm-offsets.h> |
15 | #include <asm/coldfire.h> | 15 | #include <asm/coldfire.h> |
16 | #include <asm/mcfcache.h> | ||
17 | #include <asm/mcfsim.h> | 16 | #include <asm/mcfsim.h> |
18 | #include <asm/thread_info.h> | 17 | #include <asm/thread_info.h> |
19 | 18 | ||
@@ -173,10 +172,27 @@ _start: | |||
173 | 172 | ||
174 | /* | 173 | /* |
175 | * Now that we know what the memory is, lets enable cache | 174 | * Now that we know what the memory is, lets enable cache |
176 | * and get things moving. This is Coldfire CPU specific. | 175 | * and get things moving. This is Coldfire CPU specific. Not |
176 | * all version cores have identical cache register setup. But | ||
177 | * it is very similar. Define the exact settings in the headers | ||
178 | * then the code here is the same for all. | ||
177 | */ | 179 | */ |
178 | CACHE_ENABLE /* enable CPU cache */ | 180 | movel #CACHE_INIT,%d0 /* invalidate whole cache */ |
179 | 181 | movec %d0,%CACR | |
182 | nop | ||
183 | movel #ACR0_MODE,%d0 /* set RAM region for caching */ | ||
184 | movec %d0,%ACR0 | ||
185 | movel #ACR1_MODE,%d0 /* anything else to cache? */ | ||
186 | movec %d0,%ACR1 | ||
187 | #ifdef ACR2_MODE | ||
188 | movel #ACR2_MODE,%d0 | ||
189 | movec %d0,%ACR2 | ||
190 | movel #ACR3_MODE,%d0 | ||
191 | movec %d0,%ACR3 | ||
192 | #endif | ||
193 | movel #CACHE_MODE,%d0 /* enable cache */ | ||
194 | movec %d0,%CACR | ||
195 | nop | ||
180 | 196 | ||
181 | #ifdef CONFIG_ROMFS_FS | 197 | #ifdef CONFIG_ROMFS_FS |
182 | /* | 198 | /* |
diff --git a/arch/microblaze/include/asm/pgtable.h b/arch/microblaze/include/asm/pgtable.h index cae268c22ba2..b23f68075879 100644 --- a/arch/microblaze/include/asm/pgtable.h +++ b/arch/microblaze/include/asm/pgtable.h | |||
@@ -444,8 +444,9 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, | |||
444 | *ptep = pte; | 444 | *ptep = pte; |
445 | } | 445 | } |
446 | 446 | ||
447 | static inline int ptep_test_and_clear_young(struct mm_struct *mm, | 447 | #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG |
448 | unsigned long addr, pte_t *ptep) | 448 | static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, |
449 | unsigned long address, pte_t *ptep) | ||
449 | { | 450 | { |
450 | return (pte_update(ptep, _PAGE_ACCESSED, 0) & _PAGE_ACCESSED) != 0; | 451 | return (pte_update(ptep, _PAGE_ACCESSED, 0) & _PAGE_ACCESSED) != 0; |
451 | } | 452 | } |
@@ -457,6 +458,7 @@ static inline int ptep_test_and_clear_dirty(struct mm_struct *mm, | |||
457 | (_PAGE_DIRTY | _PAGE_HWWRITE), 0) & _PAGE_DIRTY) != 0; | 458 | (_PAGE_DIRTY | _PAGE_HWWRITE), 0) & _PAGE_DIRTY) != 0; |
458 | } | 459 | } |
459 | 460 | ||
461 | #define __HAVE_ARCH_PTEP_GET_AND_CLEAR | ||
460 | static inline pte_t ptep_get_and_clear(struct mm_struct *mm, | 462 | static inline pte_t ptep_get_and_clear(struct mm_struct *mm, |
461 | unsigned long addr, pte_t *ptep) | 463 | unsigned long addr, pte_t *ptep) |
462 | { | 464 | { |
diff --git a/arch/microblaze/include/asm/tlb.h b/arch/microblaze/include/asm/tlb.h index e8abd4a0349c..8aa97817cc8c 100644 --- a/arch/microblaze/include/asm/tlb.h +++ b/arch/microblaze/include/asm/tlb.h | |||
@@ -13,6 +13,7 @@ | |||
13 | 13 | ||
14 | #define tlb_flush(tlb) flush_tlb_mm((tlb)->mm) | 14 | #define tlb_flush(tlb) flush_tlb_mm((tlb)->mm) |
15 | 15 | ||
16 | #include <linux/pagemap.h> | ||
16 | #include <asm-generic/tlb.h> | 17 | #include <asm-generic/tlb.h> |
17 | 18 | ||
18 | #ifdef CONFIG_MMU | 19 | #ifdef CONFIG_MMU |
diff --git a/arch/mips/Kbuild.platforms b/arch/mips/Kbuild.platforms index 78439b8a83c4..7ff9b5492041 100644 --- a/arch/mips/Kbuild.platforms +++ b/arch/mips/Kbuild.platforms | |||
@@ -2,6 +2,7 @@ | |||
2 | 2 | ||
3 | platforms += alchemy | 3 | platforms += alchemy |
4 | platforms += ar7 | 4 | platforms += ar7 |
5 | platforms += ath79 | ||
5 | platforms += bcm47xx | 6 | platforms += bcm47xx |
6 | platforms += bcm63xx | 7 | platforms += bcm63xx |
7 | platforms += cavium-octeon | 8 | platforms += cavium-octeon |
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index f489ec30e071..548e6cc3bc28 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -21,6 +21,7 @@ config MIPS | |||
21 | select HAVE_DMA_API_DEBUG | 21 | select HAVE_DMA_API_DEBUG |
22 | select HAVE_GENERIC_HARDIRQS | 22 | select HAVE_GENERIC_HARDIRQS |
23 | select GENERIC_IRQ_PROBE | 23 | select GENERIC_IRQ_PROBE |
24 | select HAVE_ARCH_JUMP_LABEL | ||
24 | 25 | ||
25 | menu "Machine selection" | 26 | menu "Machine selection" |
26 | 27 | ||
@@ -65,6 +66,22 @@ config AR7 | |||
65 | Support for the Texas Instruments AR7 System-on-a-Chip | 66 | Support for the Texas Instruments AR7 System-on-a-Chip |
66 | family: TNETD7100, 7200 and 7300. | 67 | family: TNETD7100, 7200 and 7300. |
67 | 68 | ||
69 | config ATH79 | ||
70 | bool "Atheros AR71XX/AR724X/AR913X based boards" | ||
71 | select ARCH_REQUIRE_GPIOLIB | ||
72 | select BOOT_RAW | ||
73 | select CEVT_R4K | ||
74 | select CSRC_R4K | ||
75 | select DMA_NONCOHERENT | ||
76 | select IRQ_CPU | ||
77 | select MIPS_MACHINE | ||
78 | select SYS_HAS_CPU_MIPS32_R2 | ||
79 | select SYS_HAS_EARLY_PRINTK | ||
80 | select SYS_SUPPORTS_32BIT_KERNEL | ||
81 | select SYS_SUPPORTS_BIG_ENDIAN | ||
82 | help | ||
83 | Support for the Atheros AR71XX/AR724X/AR913X SoCs. | ||
84 | |||
68 | config BCM47XX | 85 | config BCM47XX |
69 | bool "Broadcom BCM47XX based boards" | 86 | bool "Broadcom BCM47XX based boards" |
70 | select CEVT_R4K | 87 | select CEVT_R4K |
@@ -717,6 +734,7 @@ config CAVIUM_OCTEON_REFERENCE_BOARD | |||
717 | endchoice | 734 | endchoice |
718 | 735 | ||
719 | source "arch/mips/alchemy/Kconfig" | 736 | source "arch/mips/alchemy/Kconfig" |
737 | source "arch/mips/ath79/Kconfig" | ||
720 | source "arch/mips/bcm63xx/Kconfig" | 738 | source "arch/mips/bcm63xx/Kconfig" |
721 | source "arch/mips/jazz/Kconfig" | 739 | source "arch/mips/jazz/Kconfig" |
722 | source "arch/mips/jz4740/Kconfig" | 740 | source "arch/mips/jz4740/Kconfig" |
@@ -883,6 +901,9 @@ config MIPS_DISABLE_OBSOLETE_IDE | |||
883 | config SYNC_R4K | 901 | config SYNC_R4K |
884 | bool | 902 | bool |
885 | 903 | ||
904 | config MIPS_MACHINE | ||
905 | def_bool n | ||
906 | |||
886 | config NO_IOPORT | 907 | config NO_IOPORT |
887 | def_bool n | 908 | def_bool n |
888 | 909 | ||
@@ -2400,4 +2421,20 @@ source "security/Kconfig" | |||
2400 | 2421 | ||
2401 | source "crypto/Kconfig" | 2422 | source "crypto/Kconfig" |
2402 | 2423 | ||
2424 | menuconfig VIRTUALIZATION | ||
2425 | bool "Virtualization" | ||
2426 | default n | ||
2427 | ---help--- | ||
2428 | Say Y here to get to see options for using your Linux host to run other | ||
2429 | operating systems inside virtual machines (guests). | ||
2430 | This option alone does not add any kernel code. | ||
2431 | |||
2432 | If you say N, all options in this submenu will be skipped and disabled. | ||
2433 | |||
2434 | if VIRTUALIZATION | ||
2435 | |||
2436 | source drivers/virtio/Kconfig | ||
2437 | |||
2438 | endif # VIRTUALIZATION | ||
2439 | |||
2403 | source "lib/Kconfig" | 2440 | source "lib/Kconfig" |
diff --git a/arch/mips/ath79/Kconfig b/arch/mips/ath79/Kconfig new file mode 100644 index 000000000000..b05828260f7f --- /dev/null +++ b/arch/mips/ath79/Kconfig | |||
@@ -0,0 +1,50 @@ | |||
1 | if ATH79 | ||
2 | |||
3 | menu "Atheros AR71XX/AR724X/AR913X machine selection" | ||
4 | |||
5 | config ATH79_MACH_AP81 | ||
6 | bool "Atheros AP81 reference board" | ||
7 | select SOC_AR913X | ||
8 | select ATH79_DEV_AR913X_WMAC | ||
9 | select ATH79_DEV_GPIO_BUTTONS | ||
10 | select ATH79_DEV_LEDS_GPIO | ||
11 | select ATH79_DEV_SPI | ||
12 | help | ||
13 | Say 'Y' here if you want your kernel to support the | ||
14 | Atheros AP81 reference board. | ||
15 | |||
16 | config ATH79_MACH_PB44 | ||
17 | bool "Atheros PB44 reference board" | ||
18 | select SOC_AR71XX | ||
19 | select ATH79_DEV_GPIO_BUTTONS | ||
20 | select ATH79_DEV_LEDS_GPIO | ||
21 | select ATH79_DEV_SPI | ||
22 | help | ||
23 | Say 'Y' here if you want your kernel to support the | ||
24 | Atheros PB44 reference board. | ||
25 | |||
26 | endmenu | ||
27 | |||
28 | config SOC_AR71XX | ||
29 | def_bool n | ||
30 | |||
31 | config SOC_AR724X | ||
32 | def_bool n | ||
33 | |||
34 | config SOC_AR913X | ||
35 | def_bool n | ||
36 | |||
37 | config ATH79_DEV_AR913X_WMAC | ||
38 | depends on SOC_AR913X | ||
39 | def_bool n | ||
40 | |||
41 | config ATH79_DEV_GPIO_BUTTONS | ||
42 | def_bool n | ||
43 | |||
44 | config ATH79_DEV_LEDS_GPIO | ||
45 | def_bool n | ||
46 | |||
47 | config ATH79_DEV_SPI | ||
48 | def_bool n | ||
49 | |||
50 | endif | ||
diff --git a/arch/mips/ath79/Makefile b/arch/mips/ath79/Makefile new file mode 100644 index 000000000000..c33d4653007c --- /dev/null +++ b/arch/mips/ath79/Makefile | |||
@@ -0,0 +1,28 @@ | |||
1 | # | ||
2 | # Makefile for the Atheros AR71XX/AR724X/AR913X specific parts of the kernel | ||
3 | # | ||
4 | # Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org> | ||
5 | # Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | # by the Free Software Foundation. | ||
10 | |||
11 | obj-y := prom.o setup.o irq.o common.o clock.o gpio.o | ||
12 | |||
13 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | ||
14 | |||
15 | # | ||
16 | # Devices | ||
17 | # | ||
18 | obj-y += dev-common.o | ||
19 | obj-$(CONFIG_ATH79_DEV_AR913X_WMAC) += dev-ar913x-wmac.o | ||
20 | obj-$(CONFIG_ATH79_DEV_GPIO_BUTTONS) += dev-gpio-buttons.o | ||
21 | obj-$(CONFIG_ATH79_DEV_LEDS_GPIO) += dev-leds-gpio.o | ||
22 | obj-$(CONFIG_ATH79_DEV_SPI) += dev-spi.o | ||
23 | |||
24 | # | ||
25 | # Machines | ||
26 | # | ||
27 | obj-$(CONFIG_ATH79_MACH_AP81) += mach-ap81.o | ||
28 | obj-$(CONFIG_ATH79_MACH_PB44) += mach-pb44.o | ||
diff --git a/arch/mips/ath79/Platform b/arch/mips/ath79/Platform new file mode 100644 index 000000000000..2bd663647d27 --- /dev/null +++ b/arch/mips/ath79/Platform | |||
@@ -0,0 +1,7 @@ | |||
1 | # | ||
2 | # Atheros AR71xx/AR724x/AR913x | ||
3 | # | ||
4 | |||
5 | platform-$(CONFIG_ATH79) += ath79/ | ||
6 | cflags-$(CONFIG_ATH79) += -I$(srctree)/arch/mips/include/asm/mach-ath79 | ||
7 | load-$(CONFIG_ATH79) = 0xffffffff80060000 | ||
diff --git a/arch/mips/ath79/clock.c b/arch/mips/ath79/clock.c new file mode 100644 index 000000000000..680bde99a26c --- /dev/null +++ b/arch/mips/ath79/clock.c | |||
@@ -0,0 +1,183 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X common routines | ||
3 | * | ||
4 | * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License version 2 as published | ||
8 | * by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/err.h> | ||
15 | #include <linux/clk.h> | ||
16 | |||
17 | #include <asm/mach-ath79/ath79.h> | ||
18 | #include <asm/mach-ath79/ar71xx_regs.h> | ||
19 | #include "common.h" | ||
20 | |||
21 | #define AR71XX_BASE_FREQ 40000000 | ||
22 | #define AR724X_BASE_FREQ 5000000 | ||
23 | #define AR913X_BASE_FREQ 5000000 | ||
24 | |||
25 | struct clk { | ||
26 | unsigned long rate; | ||
27 | }; | ||
28 | |||
29 | static struct clk ath79_ref_clk; | ||
30 | static struct clk ath79_cpu_clk; | ||
31 | static struct clk ath79_ddr_clk; | ||
32 | static struct clk ath79_ahb_clk; | ||
33 | static struct clk ath79_wdt_clk; | ||
34 | static struct clk ath79_uart_clk; | ||
35 | |||
36 | static void __init ar71xx_clocks_init(void) | ||
37 | { | ||
38 | u32 pll; | ||
39 | u32 freq; | ||
40 | u32 div; | ||
41 | |||
42 | ath79_ref_clk.rate = AR71XX_BASE_FREQ; | ||
43 | |||
44 | pll = ath79_pll_rr(AR71XX_PLL_REG_CPU_CONFIG); | ||
45 | |||
46 | div = ((pll >> AR71XX_PLL_DIV_SHIFT) & AR71XX_PLL_DIV_MASK) + 1; | ||
47 | freq = div * ath79_ref_clk.rate; | ||
48 | |||
49 | div = ((pll >> AR71XX_CPU_DIV_SHIFT) & AR71XX_CPU_DIV_MASK) + 1; | ||
50 | ath79_cpu_clk.rate = freq / div; | ||
51 | |||
52 | div = ((pll >> AR71XX_DDR_DIV_SHIFT) & AR71XX_DDR_DIV_MASK) + 1; | ||
53 | ath79_ddr_clk.rate = freq / div; | ||
54 | |||
55 | div = (((pll >> AR71XX_AHB_DIV_SHIFT) & AR71XX_AHB_DIV_MASK) + 1) * 2; | ||
56 | ath79_ahb_clk.rate = ath79_cpu_clk.rate / div; | ||
57 | |||
58 | ath79_wdt_clk.rate = ath79_ahb_clk.rate; | ||
59 | ath79_uart_clk.rate = ath79_ahb_clk.rate; | ||
60 | } | ||
61 | |||
62 | static void __init ar724x_clocks_init(void) | ||
63 | { | ||
64 | u32 pll; | ||
65 | u32 freq; | ||
66 | u32 div; | ||
67 | |||
68 | ath79_ref_clk.rate = AR724X_BASE_FREQ; | ||
69 | pll = ath79_pll_rr(AR724X_PLL_REG_CPU_CONFIG); | ||
70 | |||
71 | div = ((pll >> AR724X_PLL_DIV_SHIFT) & AR724X_PLL_DIV_MASK); | ||
72 | freq = div * ath79_ref_clk.rate; | ||
73 | |||
74 | div = ((pll >> AR724X_PLL_REF_DIV_SHIFT) & AR724X_PLL_REF_DIV_MASK); | ||
75 | freq *= div; | ||
76 | |||
77 | ath79_cpu_clk.rate = freq; | ||
78 | |||
79 | div = ((pll >> AR724X_DDR_DIV_SHIFT) & AR724X_DDR_DIV_MASK) + 1; | ||
80 | ath79_ddr_clk.rate = freq / div; | ||
81 | |||
82 | div = (((pll >> AR724X_AHB_DIV_SHIFT) & AR724X_AHB_DIV_MASK) + 1) * 2; | ||
83 | ath79_ahb_clk.rate = ath79_cpu_clk.rate / div; | ||
84 | |||
85 | ath79_wdt_clk.rate = ath79_ahb_clk.rate; | ||
86 | ath79_uart_clk.rate = ath79_ahb_clk.rate; | ||
87 | } | ||
88 | |||
89 | static void __init ar913x_clocks_init(void) | ||
90 | { | ||
91 | u32 pll; | ||
92 | u32 freq; | ||
93 | u32 div; | ||
94 | |||
95 | ath79_ref_clk.rate = AR913X_BASE_FREQ; | ||
96 | pll = ath79_pll_rr(AR913X_PLL_REG_CPU_CONFIG); | ||
97 | |||
98 | div = ((pll >> AR913X_PLL_DIV_SHIFT) & AR913X_PLL_DIV_MASK); | ||
99 | freq = div * ath79_ref_clk.rate; | ||
100 | |||
101 | ath79_cpu_clk.rate = freq; | ||
102 | |||
103 | div = ((pll >> AR913X_DDR_DIV_SHIFT) & AR913X_DDR_DIV_MASK) + 1; | ||
104 | ath79_ddr_clk.rate = freq / div; | ||
105 | |||
106 | div = (((pll >> AR913X_AHB_DIV_SHIFT) & AR913X_AHB_DIV_MASK) + 1) * 2; | ||
107 | ath79_ahb_clk.rate = ath79_cpu_clk.rate / div; | ||
108 | |||
109 | ath79_wdt_clk.rate = ath79_ahb_clk.rate; | ||
110 | ath79_uart_clk.rate = ath79_ahb_clk.rate; | ||
111 | } | ||
112 | |||
113 | void __init ath79_clocks_init(void) | ||
114 | { | ||
115 | if (soc_is_ar71xx()) | ||
116 | ar71xx_clocks_init(); | ||
117 | else if (soc_is_ar724x()) | ||
118 | ar724x_clocks_init(); | ||
119 | else if (soc_is_ar913x()) | ||
120 | ar913x_clocks_init(); | ||
121 | else | ||
122 | BUG(); | ||
123 | |||
124 | pr_info("Clocks: CPU:%lu.%03luMHz, DDR:%lu.%03luMHz, AHB:%lu.%03luMHz, " | ||
125 | "Ref:%lu.%03luMHz", | ||
126 | ath79_cpu_clk.rate / 1000000, | ||
127 | (ath79_cpu_clk.rate / 1000) % 1000, | ||
128 | ath79_ddr_clk.rate / 1000000, | ||
129 | (ath79_ddr_clk.rate / 1000) % 1000, | ||
130 | ath79_ahb_clk.rate / 1000000, | ||
131 | (ath79_ahb_clk.rate / 1000) % 1000, | ||
132 | ath79_ref_clk.rate / 1000000, | ||
133 | (ath79_ref_clk.rate / 1000) % 1000); | ||
134 | } | ||
135 | |||
136 | /* | ||
137 | * Linux clock API | ||
138 | */ | ||
139 | struct clk *clk_get(struct device *dev, const char *id) | ||
140 | { | ||
141 | if (!strcmp(id, "ref")) | ||
142 | return &ath79_ref_clk; | ||
143 | |||
144 | if (!strcmp(id, "cpu")) | ||
145 | return &ath79_cpu_clk; | ||
146 | |||
147 | if (!strcmp(id, "ddr")) | ||
148 | return &ath79_ddr_clk; | ||
149 | |||
150 | if (!strcmp(id, "ahb")) | ||
151 | return &ath79_ahb_clk; | ||
152 | |||
153 | if (!strcmp(id, "wdt")) | ||
154 | return &ath79_wdt_clk; | ||
155 | |||
156 | if (!strcmp(id, "uart")) | ||
157 | return &ath79_uart_clk; | ||
158 | |||
159 | return ERR_PTR(-ENOENT); | ||
160 | } | ||
161 | EXPORT_SYMBOL(clk_get); | ||
162 | |||
163 | int clk_enable(struct clk *clk) | ||
164 | { | ||
165 | return 0; | ||
166 | } | ||
167 | EXPORT_SYMBOL(clk_enable); | ||
168 | |||
169 | void clk_disable(struct clk *clk) | ||
170 | { | ||
171 | } | ||
172 | EXPORT_SYMBOL(clk_disable); | ||
173 | |||
174 | unsigned long clk_get_rate(struct clk *clk) | ||
175 | { | ||
176 | return clk->rate; | ||
177 | } | ||
178 | EXPORT_SYMBOL(clk_get_rate); | ||
179 | |||
180 | void clk_put(struct clk *clk) | ||
181 | { | ||
182 | } | ||
183 | EXPORT_SYMBOL(clk_put); | ||
diff --git a/arch/mips/ath79/common.c b/arch/mips/ath79/common.c new file mode 100644 index 000000000000..58f60e722a03 --- /dev/null +++ b/arch/mips/ath79/common.c | |||
@@ -0,0 +1,97 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X common routines | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/module.h> | ||
14 | #include <linux/types.h> | ||
15 | #include <linux/spinlock.h> | ||
16 | |||
17 | #include <asm/mach-ath79/ath79.h> | ||
18 | #include <asm/mach-ath79/ar71xx_regs.h> | ||
19 | #include "common.h" | ||
20 | |||
21 | static DEFINE_SPINLOCK(ath79_device_reset_lock); | ||
22 | |||
23 | u32 ath79_cpu_freq; | ||
24 | EXPORT_SYMBOL_GPL(ath79_cpu_freq); | ||
25 | |||
26 | u32 ath79_ahb_freq; | ||
27 | EXPORT_SYMBOL_GPL(ath79_ahb_freq); | ||
28 | |||
29 | u32 ath79_ddr_freq; | ||
30 | EXPORT_SYMBOL_GPL(ath79_ddr_freq); | ||
31 | |||
32 | enum ath79_soc_type ath79_soc; | ||
33 | |||
34 | void __iomem *ath79_pll_base; | ||
35 | void __iomem *ath79_reset_base; | ||
36 | EXPORT_SYMBOL_GPL(ath79_reset_base); | ||
37 | void __iomem *ath79_ddr_base; | ||
38 | |||
39 | void ath79_ddr_wb_flush(u32 reg) | ||
40 | { | ||
41 | void __iomem *flush_reg = ath79_ddr_base + reg; | ||
42 | |||
43 | /* Flush the DDR write buffer. */ | ||
44 | __raw_writel(0x1, flush_reg); | ||
45 | while (__raw_readl(flush_reg) & 0x1) | ||
46 | ; | ||
47 | |||
48 | /* It must be run twice. */ | ||
49 | __raw_writel(0x1, flush_reg); | ||
50 | while (__raw_readl(flush_reg) & 0x1) | ||
51 | ; | ||
52 | } | ||
53 | EXPORT_SYMBOL_GPL(ath79_ddr_wb_flush); | ||
54 | |||
55 | void ath79_device_reset_set(u32 mask) | ||
56 | { | ||
57 | unsigned long flags; | ||
58 | u32 reg; | ||
59 | u32 t; | ||
60 | |||
61 | if (soc_is_ar71xx()) | ||
62 | reg = AR71XX_RESET_REG_RESET_MODULE; | ||
63 | else if (soc_is_ar724x()) | ||
64 | reg = AR724X_RESET_REG_RESET_MODULE; | ||
65 | else if (soc_is_ar913x()) | ||
66 | reg = AR913X_RESET_REG_RESET_MODULE; | ||
67 | else | ||
68 | BUG(); | ||
69 | |||
70 | spin_lock_irqsave(&ath79_device_reset_lock, flags); | ||
71 | t = ath79_reset_rr(reg); | ||
72 | ath79_reset_wr(reg, t | mask); | ||
73 | spin_unlock_irqrestore(&ath79_device_reset_lock, flags); | ||
74 | } | ||
75 | EXPORT_SYMBOL_GPL(ath79_device_reset_set); | ||
76 | |||
77 | void ath79_device_reset_clear(u32 mask) | ||
78 | { | ||
79 | unsigned long flags; | ||
80 | u32 reg; | ||
81 | u32 t; | ||
82 | |||
83 | if (soc_is_ar71xx()) | ||
84 | reg = AR71XX_RESET_REG_RESET_MODULE; | ||
85 | else if (soc_is_ar724x()) | ||
86 | reg = AR724X_RESET_REG_RESET_MODULE; | ||
87 | else if (soc_is_ar913x()) | ||
88 | reg = AR913X_RESET_REG_RESET_MODULE; | ||
89 | else | ||
90 | BUG(); | ||
91 | |||
92 | spin_lock_irqsave(&ath79_device_reset_lock, flags); | ||
93 | t = ath79_reset_rr(reg); | ||
94 | ath79_reset_wr(reg, t & ~mask); | ||
95 | spin_unlock_irqrestore(&ath79_device_reset_lock, flags); | ||
96 | } | ||
97 | EXPORT_SYMBOL_GPL(ath79_device_reset_clear); | ||
diff --git a/arch/mips/ath79/common.h b/arch/mips/ath79/common.h new file mode 100644 index 000000000000..561906c2345e --- /dev/null +++ b/arch/mips/ath79/common.h | |||
@@ -0,0 +1,31 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X common definitions | ||
3 | * | ||
4 | * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
6 | * | ||
7 | * Parts of this file are based on Atheros' 2.6.15 BSP | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License version 2 as published | ||
11 | * by the Free Software Foundation. | ||
12 | */ | ||
13 | |||
14 | #ifndef __ATH79_COMMON_H | ||
15 | #define __ATH79_COMMON_H | ||
16 | |||
17 | #include <linux/types.h> | ||
18 | #include <linux/init.h> | ||
19 | |||
20 | #define ATH79_MEM_SIZE_MIN (2 * 1024 * 1024) | ||
21 | #define ATH79_MEM_SIZE_MAX (128 * 1024 * 1024) | ||
22 | |||
23 | void ath79_clocks_init(void); | ||
24 | void ath79_ddr_wb_flush(unsigned int reg); | ||
25 | |||
26 | void ath79_gpio_function_enable(u32 mask); | ||
27 | void ath79_gpio_function_disable(u32 mask); | ||
28 | void ath79_gpio_function_setup(u32 set, u32 clear); | ||
29 | void ath79_gpio_init(void); | ||
30 | |||
31 | #endif /* __ATH79_COMMON_H */ | ||
diff --git a/arch/mips/ath79/dev-ar913x-wmac.c b/arch/mips/ath79/dev-ar913x-wmac.c new file mode 100644 index 000000000000..48f425a5ba28 --- /dev/null +++ b/arch/mips/ath79/dev-ar913x-wmac.c | |||
@@ -0,0 +1,60 @@ | |||
1 | /* | ||
2 | * Atheros AR913X SoC built-in WMAC device support | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/init.h> | ||
13 | #include <linux/delay.h> | ||
14 | #include <linux/irq.h> | ||
15 | #include <linux/platform_device.h> | ||
16 | #include <linux/ath9k_platform.h> | ||
17 | |||
18 | #include <asm/mach-ath79/ath79.h> | ||
19 | #include <asm/mach-ath79/ar71xx_regs.h> | ||
20 | #include "dev-ar913x-wmac.h" | ||
21 | |||
22 | static struct ath9k_platform_data ar913x_wmac_data; | ||
23 | |||
24 | static struct resource ar913x_wmac_resources[] = { | ||
25 | { | ||
26 | .start = AR913X_WMAC_BASE, | ||
27 | .end = AR913X_WMAC_BASE + AR913X_WMAC_SIZE - 1, | ||
28 | .flags = IORESOURCE_MEM, | ||
29 | }, { | ||
30 | .start = ATH79_CPU_IRQ_IP2, | ||
31 | .end = ATH79_CPU_IRQ_IP2, | ||
32 | .flags = IORESOURCE_IRQ, | ||
33 | }, | ||
34 | }; | ||
35 | |||
36 | static struct platform_device ar913x_wmac_device = { | ||
37 | .name = "ath9k", | ||
38 | .id = -1, | ||
39 | .resource = ar913x_wmac_resources, | ||
40 | .num_resources = ARRAY_SIZE(ar913x_wmac_resources), | ||
41 | .dev = { | ||
42 | .platform_data = &ar913x_wmac_data, | ||
43 | }, | ||
44 | }; | ||
45 | |||
46 | void __init ath79_register_ar913x_wmac(u8 *cal_data) | ||
47 | { | ||
48 | if (cal_data) | ||
49 | memcpy(ar913x_wmac_data.eeprom_data, cal_data, | ||
50 | sizeof(ar913x_wmac_data.eeprom_data)); | ||
51 | |||
52 | /* reset the WMAC */ | ||
53 | ath79_device_reset_set(AR913X_RESET_AMBA2WMAC); | ||
54 | mdelay(10); | ||
55 | |||
56 | ath79_device_reset_clear(AR913X_RESET_AMBA2WMAC); | ||
57 | mdelay(10); | ||
58 | |||
59 | platform_device_register(&ar913x_wmac_device); | ||
60 | } | ||
diff --git a/arch/mips/ath79/dev-ar913x-wmac.h b/arch/mips/ath79/dev-ar913x-wmac.h new file mode 100644 index 000000000000..579d562bbda8 --- /dev/null +++ b/arch/mips/ath79/dev-ar913x-wmac.h | |||
@@ -0,0 +1,17 @@ | |||
1 | /* | ||
2 | * Atheros AR913X SoC built-in WMAC device support | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ATH79_DEV_AR913X_WMAC_H | ||
13 | #define _ATH79_DEV_AR913X_WMAC_H | ||
14 | |||
15 | void ath79_register_ar913x_wmac(u8 *cal_data); | ||
16 | |||
17 | #endif /* _ATH79_DEV_AR913X_WMAC_H */ | ||
diff --git a/arch/mips/ath79/dev-common.c b/arch/mips/ath79/dev-common.c new file mode 100644 index 000000000000..3b82e325bebf --- /dev/null +++ b/arch/mips/ath79/dev-common.c | |||
@@ -0,0 +1,77 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X common devices | ||
3 | * | ||
4 | * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
6 | * | ||
7 | * Parts of this file are based on Atheros' 2.6.15 BSP | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License version 2 as published | ||
11 | * by the Free Software Foundation. | ||
12 | */ | ||
13 | |||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/serial_8250.h> | ||
18 | #include <linux/clk.h> | ||
19 | #include <linux/err.h> | ||
20 | |||
21 | #include <asm/mach-ath79/ath79.h> | ||
22 | #include <asm/mach-ath79/ar71xx_regs.h> | ||
23 | #include "common.h" | ||
24 | #include "dev-common.h" | ||
25 | |||
26 | static struct resource ath79_uart_resources[] = { | ||
27 | { | ||
28 | .start = AR71XX_UART_BASE, | ||
29 | .end = AR71XX_UART_BASE + AR71XX_UART_SIZE - 1, | ||
30 | .flags = IORESOURCE_MEM, | ||
31 | }, | ||
32 | }; | ||
33 | |||
34 | #define AR71XX_UART_FLAGS (UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP) | ||
35 | static struct plat_serial8250_port ath79_uart_data[] = { | ||
36 | { | ||
37 | .mapbase = AR71XX_UART_BASE, | ||
38 | .irq = ATH79_MISC_IRQ_UART, | ||
39 | .flags = AR71XX_UART_FLAGS, | ||
40 | .iotype = UPIO_MEM32, | ||
41 | .regshift = 2, | ||
42 | }, { | ||
43 | /* terminating entry */ | ||
44 | } | ||
45 | }; | ||
46 | |||
47 | static struct platform_device ath79_uart_device = { | ||
48 | .name = "serial8250", | ||
49 | .id = PLAT8250_DEV_PLATFORM, | ||
50 | .resource = ath79_uart_resources, | ||
51 | .num_resources = ARRAY_SIZE(ath79_uart_resources), | ||
52 | .dev = { | ||
53 | .platform_data = ath79_uart_data | ||
54 | }, | ||
55 | }; | ||
56 | |||
57 | void __init ath79_register_uart(void) | ||
58 | { | ||
59 | struct clk *clk; | ||
60 | |||
61 | clk = clk_get(NULL, "uart"); | ||
62 | if (IS_ERR(clk)) | ||
63 | panic("unable to get UART clock, err=%ld", PTR_ERR(clk)); | ||
64 | |||
65 | ath79_uart_data[0].uartclk = clk_get_rate(clk); | ||
66 | platform_device_register(&ath79_uart_device); | ||
67 | } | ||
68 | |||
69 | static struct platform_device ath79_wdt_device = { | ||
70 | .name = "ath79-wdt", | ||
71 | .id = -1, | ||
72 | }; | ||
73 | |||
74 | void __init ath79_register_wdt(void) | ||
75 | { | ||
76 | platform_device_register(&ath79_wdt_device); | ||
77 | } | ||
diff --git a/arch/mips/ath79/dev-common.h b/arch/mips/ath79/dev-common.h new file mode 100644 index 000000000000..0f514e1affce --- /dev/null +++ b/arch/mips/ath79/dev-common.h | |||
@@ -0,0 +1,18 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X common devices | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ATH79_DEV_COMMON_H | ||
13 | #define _ATH79_DEV_COMMON_H | ||
14 | |||
15 | void ath79_register_uart(void); | ||
16 | void ath79_register_wdt(void); | ||
17 | |||
18 | #endif /* _ATH79_DEV_COMMON_H */ | ||
diff --git a/arch/mips/ath79/dev-gpio-buttons.c b/arch/mips/ath79/dev-gpio-buttons.c new file mode 100644 index 000000000000..4b0168a11c01 --- /dev/null +++ b/arch/mips/ath79/dev-gpio-buttons.c | |||
@@ -0,0 +1,58 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X GPIO button support | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include "linux/init.h" | ||
13 | #include "linux/slab.h" | ||
14 | #include <linux/platform_device.h> | ||
15 | |||
16 | #include "dev-gpio-buttons.h" | ||
17 | |||
18 | void __init ath79_register_gpio_keys_polled(int id, | ||
19 | unsigned poll_interval, | ||
20 | unsigned nbuttons, | ||
21 | struct gpio_keys_button *buttons) | ||
22 | { | ||
23 | struct platform_device *pdev; | ||
24 | struct gpio_keys_platform_data pdata; | ||
25 | struct gpio_keys_button *p; | ||
26 | int err; | ||
27 | |||
28 | p = kmalloc(nbuttons * sizeof(*p), GFP_KERNEL); | ||
29 | if (!p) | ||
30 | return; | ||
31 | |||
32 | memcpy(p, buttons, nbuttons * sizeof(*p)); | ||
33 | |||
34 | pdev = platform_device_alloc("gpio-keys-polled", id); | ||
35 | if (!pdev) | ||
36 | goto err_free_buttons; | ||
37 | |||
38 | memset(&pdata, 0, sizeof(pdata)); | ||
39 | pdata.poll_interval = poll_interval; | ||
40 | pdata.nbuttons = nbuttons; | ||
41 | pdata.buttons = p; | ||
42 | |||
43 | err = platform_device_add_data(pdev, &pdata, sizeof(pdata)); | ||
44 | if (err) | ||
45 | goto err_put_pdev; | ||
46 | |||
47 | err = platform_device_add(pdev); | ||
48 | if (err) | ||
49 | goto err_put_pdev; | ||
50 | |||
51 | return; | ||
52 | |||
53 | err_put_pdev: | ||
54 | platform_device_put(pdev); | ||
55 | |||
56 | err_free_buttons: | ||
57 | kfree(p); | ||
58 | } | ||
diff --git a/arch/mips/ath79/dev-gpio-buttons.h b/arch/mips/ath79/dev-gpio-buttons.h new file mode 100644 index 000000000000..481847ac1cba --- /dev/null +++ b/arch/mips/ath79/dev-gpio-buttons.h | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X GPIO button support | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ATH79_DEV_GPIO_BUTTONS_H | ||
13 | #define _ATH79_DEV_GPIO_BUTTONS_H | ||
14 | |||
15 | #include <linux/input.h> | ||
16 | #include <linux/gpio_keys.h> | ||
17 | |||
18 | void ath79_register_gpio_keys_polled(int id, | ||
19 | unsigned poll_interval, | ||
20 | unsigned nbuttons, | ||
21 | struct gpio_keys_button *buttons); | ||
22 | |||
23 | #endif /* _ATH79_DEV_GPIO_BUTTONS_H */ | ||
diff --git a/arch/mips/ath79/dev-leds-gpio.c b/arch/mips/ath79/dev-leds-gpio.c new file mode 100644 index 000000000000..cdade68dcd17 --- /dev/null +++ b/arch/mips/ath79/dev-leds-gpio.c | |||
@@ -0,0 +1,56 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X common GPIO LEDs support | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/init.h> | ||
13 | #include <linux/slab.h> | ||
14 | #include <linux/platform_device.h> | ||
15 | |||
16 | #include "dev-leds-gpio.h" | ||
17 | |||
18 | void __init ath79_register_leds_gpio(int id, | ||
19 | unsigned num_leds, | ||
20 | struct gpio_led *leds) | ||
21 | { | ||
22 | struct platform_device *pdev; | ||
23 | struct gpio_led_platform_data pdata; | ||
24 | struct gpio_led *p; | ||
25 | int err; | ||
26 | |||
27 | p = kmalloc(num_leds * sizeof(*p), GFP_KERNEL); | ||
28 | if (!p) | ||
29 | return; | ||
30 | |||
31 | memcpy(p, leds, num_leds * sizeof(*p)); | ||
32 | |||
33 | pdev = platform_device_alloc("leds-gpio", id); | ||
34 | if (!pdev) | ||
35 | goto err_free_leds; | ||
36 | |||
37 | memset(&pdata, 0, sizeof(pdata)); | ||
38 | pdata.num_leds = num_leds; | ||
39 | pdata.leds = p; | ||
40 | |||
41 | err = platform_device_add_data(pdev, &pdata, sizeof(pdata)); | ||
42 | if (err) | ||
43 | goto err_put_pdev; | ||
44 | |||
45 | err = platform_device_add(pdev); | ||
46 | if (err) | ||
47 | goto err_put_pdev; | ||
48 | |||
49 | return; | ||
50 | |||
51 | err_put_pdev: | ||
52 | platform_device_put(pdev); | ||
53 | |||
54 | err_free_leds: | ||
55 | kfree(p); | ||
56 | } | ||
diff --git a/arch/mips/ath79/dev-leds-gpio.h b/arch/mips/ath79/dev-leds-gpio.h new file mode 100644 index 000000000000..6e5d8851ebcf --- /dev/null +++ b/arch/mips/ath79/dev-leds-gpio.h | |||
@@ -0,0 +1,21 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X common GPIO LEDs support | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ATH79_DEV_LEDS_GPIO_H | ||
13 | #define _ATH79_DEV_LEDS_GPIO_H | ||
14 | |||
15 | #include <linux/leds.h> | ||
16 | |||
17 | void ath79_register_leds_gpio(int id, | ||
18 | unsigned num_leds, | ||
19 | struct gpio_led *leds); | ||
20 | |||
21 | #endif /* _ATH79_DEV_LEDS_GPIO_H */ | ||
diff --git a/arch/mips/ath79/dev-spi.c b/arch/mips/ath79/dev-spi.c new file mode 100644 index 000000000000..aa30163efbfd --- /dev/null +++ b/arch/mips/ath79/dev-spi.c | |||
@@ -0,0 +1,38 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X SPI controller device | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/platform_device.h> | ||
13 | #include <asm/mach-ath79/ar71xx_regs.h> | ||
14 | #include "dev-spi.h" | ||
15 | |||
16 | static struct resource ath79_spi_resources[] = { | ||
17 | { | ||
18 | .start = AR71XX_SPI_BASE, | ||
19 | .end = AR71XX_SPI_BASE + AR71XX_SPI_SIZE - 1, | ||
20 | .flags = IORESOURCE_MEM, | ||
21 | }, | ||
22 | }; | ||
23 | |||
24 | static struct platform_device ath79_spi_device = { | ||
25 | .name = "ath79-spi", | ||
26 | .id = -1, | ||
27 | .resource = ath79_spi_resources, | ||
28 | .num_resources = ARRAY_SIZE(ath79_spi_resources), | ||
29 | }; | ||
30 | |||
31 | void __init ath79_register_spi(struct ath79_spi_platform_data *pdata, | ||
32 | struct spi_board_info const *info, | ||
33 | unsigned n) | ||
34 | { | ||
35 | spi_register_board_info(info, n); | ||
36 | ath79_spi_device.dev.platform_data = pdata; | ||
37 | platform_device_register(&ath79_spi_device); | ||
38 | } | ||
diff --git a/arch/mips/ath79/dev-spi.h b/arch/mips/ath79/dev-spi.h new file mode 100644 index 000000000000..d732565ca736 --- /dev/null +++ b/arch/mips/ath79/dev-spi.h | |||
@@ -0,0 +1,22 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X SPI controller device | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ATH79_DEV_SPI_H | ||
13 | #define _ATH79_DEV_SPI_H | ||
14 | |||
15 | #include <linux/spi/spi.h> | ||
16 | #include <asm/mach-ath79/ath79_spi_platform.h> | ||
17 | |||
18 | void ath79_register_spi(struct ath79_spi_platform_data *pdata, | ||
19 | struct spi_board_info const *info, | ||
20 | unsigned n); | ||
21 | |||
22 | #endif /* _ATH79_DEV_SPI_H */ | ||
diff --git a/arch/mips/ath79/early_printk.c b/arch/mips/ath79/early_printk.c new file mode 100644 index 000000000000..7499b0e9df26 --- /dev/null +++ b/arch/mips/ath79/early_printk.c | |||
@@ -0,0 +1,36 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X SoC early printk support | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/io.h> | ||
13 | #include <linux/serial_reg.h> | ||
14 | #include <asm/addrspace.h> | ||
15 | |||
16 | #include <asm/mach-ath79/ar71xx_regs.h> | ||
17 | |||
18 | static inline void prom_wait_thre(void __iomem *base) | ||
19 | { | ||
20 | u32 lsr; | ||
21 | |||
22 | do { | ||
23 | lsr = __raw_readl(base + UART_LSR * 4); | ||
24 | if (lsr & UART_LSR_THRE) | ||
25 | break; | ||
26 | } while (1); | ||
27 | } | ||
28 | |||
29 | void prom_putchar(unsigned char ch) | ||
30 | { | ||
31 | void __iomem *base = (void __iomem *)(KSEG1ADDR(AR71XX_UART_BASE)); | ||
32 | |||
33 | prom_wait_thre(base); | ||
34 | __raw_writel(ch, base + UART_TX * 4); | ||
35 | prom_wait_thre(base); | ||
36 | } | ||
diff --git a/arch/mips/ath79/gpio.c b/arch/mips/ath79/gpio.c new file mode 100644 index 000000000000..a0c426b82123 --- /dev/null +++ b/arch/mips/ath79/gpio.c | |||
@@ -0,0 +1,197 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X GPIO API support | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/module.h> | ||
15 | #include <linux/types.h> | ||
16 | #include <linux/spinlock.h> | ||
17 | #include <linux/io.h> | ||
18 | #include <linux/ioport.h> | ||
19 | #include <linux/gpio.h> | ||
20 | |||
21 | #include <asm/mach-ath79/ar71xx_regs.h> | ||
22 | #include <asm/mach-ath79/ath79.h> | ||
23 | #include "common.h" | ||
24 | |||
25 | static void __iomem *ath79_gpio_base; | ||
26 | static unsigned long ath79_gpio_count; | ||
27 | static DEFINE_SPINLOCK(ath79_gpio_lock); | ||
28 | |||
29 | static void __ath79_gpio_set_value(unsigned gpio, int value) | ||
30 | { | ||
31 | void __iomem *base = ath79_gpio_base; | ||
32 | |||
33 | if (value) | ||
34 | __raw_writel(1 << gpio, base + AR71XX_GPIO_REG_SET); | ||
35 | else | ||
36 | __raw_writel(1 << gpio, base + AR71XX_GPIO_REG_CLEAR); | ||
37 | } | ||
38 | |||
39 | static int __ath79_gpio_get_value(unsigned gpio) | ||
40 | { | ||
41 | return (__raw_readl(ath79_gpio_base + AR71XX_GPIO_REG_IN) >> gpio) & 1; | ||
42 | } | ||
43 | |||
44 | static int ath79_gpio_get_value(struct gpio_chip *chip, unsigned offset) | ||
45 | { | ||
46 | return __ath79_gpio_get_value(offset); | ||
47 | } | ||
48 | |||
49 | static void ath79_gpio_set_value(struct gpio_chip *chip, | ||
50 | unsigned offset, int value) | ||
51 | { | ||
52 | __ath79_gpio_set_value(offset, value); | ||
53 | } | ||
54 | |||
55 | static int ath79_gpio_direction_input(struct gpio_chip *chip, | ||
56 | unsigned offset) | ||
57 | { | ||
58 | void __iomem *base = ath79_gpio_base; | ||
59 | unsigned long flags; | ||
60 | |||
61 | spin_lock_irqsave(&ath79_gpio_lock, flags); | ||
62 | |||
63 | __raw_writel(__raw_readl(base + AR71XX_GPIO_REG_OE) & ~(1 << offset), | ||
64 | base + AR71XX_GPIO_REG_OE); | ||
65 | |||
66 | spin_unlock_irqrestore(&ath79_gpio_lock, flags); | ||
67 | |||
68 | return 0; | ||
69 | } | ||
70 | |||
71 | static int ath79_gpio_direction_output(struct gpio_chip *chip, | ||
72 | unsigned offset, int value) | ||
73 | { | ||
74 | void __iomem *base = ath79_gpio_base; | ||
75 | unsigned long flags; | ||
76 | |||
77 | spin_lock_irqsave(&ath79_gpio_lock, flags); | ||
78 | |||
79 | if (value) | ||
80 | __raw_writel(1 << offset, base + AR71XX_GPIO_REG_SET); | ||
81 | else | ||
82 | __raw_writel(1 << offset, base + AR71XX_GPIO_REG_CLEAR); | ||
83 | |||
84 | __raw_writel(__raw_readl(base + AR71XX_GPIO_REG_OE) | (1 << offset), | ||
85 | base + AR71XX_GPIO_REG_OE); | ||
86 | |||
87 | spin_unlock_irqrestore(&ath79_gpio_lock, flags); | ||
88 | |||
89 | return 0; | ||
90 | } | ||
91 | |||
92 | static struct gpio_chip ath79_gpio_chip = { | ||
93 | .label = "ath79", | ||
94 | .get = ath79_gpio_get_value, | ||
95 | .set = ath79_gpio_set_value, | ||
96 | .direction_input = ath79_gpio_direction_input, | ||
97 | .direction_output = ath79_gpio_direction_output, | ||
98 | .base = 0, | ||
99 | }; | ||
100 | |||
101 | void ath79_gpio_function_enable(u32 mask) | ||
102 | { | ||
103 | void __iomem *base = ath79_gpio_base; | ||
104 | unsigned long flags; | ||
105 | |||
106 | spin_lock_irqsave(&ath79_gpio_lock, flags); | ||
107 | |||
108 | __raw_writel(__raw_readl(base + AR71XX_GPIO_REG_FUNC) | mask, | ||
109 | base + AR71XX_GPIO_REG_FUNC); | ||
110 | /* flush write */ | ||
111 | __raw_readl(base + AR71XX_GPIO_REG_FUNC); | ||
112 | |||
113 | spin_unlock_irqrestore(&ath79_gpio_lock, flags); | ||
114 | } | ||
115 | |||
116 | void ath79_gpio_function_disable(u32 mask) | ||
117 | { | ||
118 | void __iomem *base = ath79_gpio_base; | ||
119 | unsigned long flags; | ||
120 | |||
121 | spin_lock_irqsave(&ath79_gpio_lock, flags); | ||
122 | |||
123 | __raw_writel(__raw_readl(base + AR71XX_GPIO_REG_FUNC) & ~mask, | ||
124 | base + AR71XX_GPIO_REG_FUNC); | ||
125 | /* flush write */ | ||
126 | __raw_readl(base + AR71XX_GPIO_REG_FUNC); | ||
127 | |||
128 | spin_unlock_irqrestore(&ath79_gpio_lock, flags); | ||
129 | } | ||
130 | |||
131 | void ath79_gpio_function_setup(u32 set, u32 clear) | ||
132 | { | ||
133 | void __iomem *base = ath79_gpio_base; | ||
134 | unsigned long flags; | ||
135 | |||
136 | spin_lock_irqsave(&ath79_gpio_lock, flags); | ||
137 | |||
138 | __raw_writel((__raw_readl(base + AR71XX_GPIO_REG_FUNC) & ~clear) | set, | ||
139 | base + AR71XX_GPIO_REG_FUNC); | ||
140 | /* flush write */ | ||
141 | __raw_readl(base + AR71XX_GPIO_REG_FUNC); | ||
142 | |||
143 | spin_unlock_irqrestore(&ath79_gpio_lock, flags); | ||
144 | } | ||
145 | |||
146 | void __init ath79_gpio_init(void) | ||
147 | { | ||
148 | int err; | ||
149 | |||
150 | if (soc_is_ar71xx()) | ||
151 | ath79_gpio_count = AR71XX_GPIO_COUNT; | ||
152 | else if (soc_is_ar724x()) | ||
153 | ath79_gpio_count = AR724X_GPIO_COUNT; | ||
154 | else if (soc_is_ar913x()) | ||
155 | ath79_gpio_count = AR913X_GPIO_COUNT; | ||
156 | else | ||
157 | BUG(); | ||
158 | |||
159 | ath79_gpio_base = ioremap_nocache(AR71XX_GPIO_BASE, AR71XX_GPIO_SIZE); | ||
160 | ath79_gpio_chip.ngpio = ath79_gpio_count; | ||
161 | |||
162 | err = gpiochip_add(&ath79_gpio_chip); | ||
163 | if (err) | ||
164 | panic("cannot add AR71xx GPIO chip, error=%d", err); | ||
165 | } | ||
166 | |||
167 | int gpio_get_value(unsigned gpio) | ||
168 | { | ||
169 | if (gpio < ath79_gpio_count) | ||
170 | return __ath79_gpio_get_value(gpio); | ||
171 | |||
172 | return __gpio_get_value(gpio); | ||
173 | } | ||
174 | EXPORT_SYMBOL(gpio_get_value); | ||
175 | |||
176 | void gpio_set_value(unsigned gpio, int value) | ||
177 | { | ||
178 | if (gpio < ath79_gpio_count) | ||
179 | __ath79_gpio_set_value(gpio, value); | ||
180 | else | ||
181 | __gpio_set_value(gpio, value); | ||
182 | } | ||
183 | EXPORT_SYMBOL(gpio_set_value); | ||
184 | |||
185 | int gpio_to_irq(unsigned gpio) | ||
186 | { | ||
187 | /* FIXME */ | ||
188 | return -EINVAL; | ||
189 | } | ||
190 | EXPORT_SYMBOL(gpio_to_irq); | ||
191 | |||
192 | int irq_to_gpio(unsigned irq) | ||
193 | { | ||
194 | /* FIXME */ | ||
195 | return -EINVAL; | ||
196 | } | ||
197 | EXPORT_SYMBOL(irq_to_gpio); | ||
diff --git a/arch/mips/ath79/irq.c b/arch/mips/ath79/irq.c new file mode 100644 index 000000000000..1bf7f719ba53 --- /dev/null +++ b/arch/mips/ath79/irq.c | |||
@@ -0,0 +1,187 @@ | |||
1 | /* | ||
2 | * Atheros AR71xx/AR724x/AR913x specific interrupt handling | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
6 | * | ||
7 | * Parts of this file are based on Atheros' 2.6.15 BSP | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License version 2 as published | ||
11 | * by the Free Software Foundation. | ||
12 | */ | ||
13 | |||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/interrupt.h> | ||
17 | #include <linux/irq.h> | ||
18 | |||
19 | #include <asm/irq_cpu.h> | ||
20 | #include <asm/mipsregs.h> | ||
21 | |||
22 | #include <asm/mach-ath79/ath79.h> | ||
23 | #include <asm/mach-ath79/ar71xx_regs.h> | ||
24 | #include "common.h" | ||
25 | |||
26 | static unsigned int ath79_ip2_flush_reg; | ||
27 | static unsigned int ath79_ip3_flush_reg; | ||
28 | |||
29 | static void ath79_misc_irq_handler(unsigned int irq, struct irq_desc *desc) | ||
30 | { | ||
31 | void __iomem *base = ath79_reset_base; | ||
32 | u32 pending; | ||
33 | |||
34 | pending = __raw_readl(base + AR71XX_RESET_REG_MISC_INT_STATUS) & | ||
35 | __raw_readl(base + AR71XX_RESET_REG_MISC_INT_ENABLE); | ||
36 | |||
37 | if (pending & MISC_INT_UART) | ||
38 | generic_handle_irq(ATH79_MISC_IRQ_UART); | ||
39 | |||
40 | else if (pending & MISC_INT_DMA) | ||
41 | generic_handle_irq(ATH79_MISC_IRQ_DMA); | ||
42 | |||
43 | else if (pending & MISC_INT_PERFC) | ||
44 | generic_handle_irq(ATH79_MISC_IRQ_PERFC); | ||
45 | |||
46 | else if (pending & MISC_INT_TIMER) | ||
47 | generic_handle_irq(ATH79_MISC_IRQ_TIMER); | ||
48 | |||
49 | else if (pending & MISC_INT_OHCI) | ||
50 | generic_handle_irq(ATH79_MISC_IRQ_OHCI); | ||
51 | |||
52 | else if (pending & MISC_INT_ERROR) | ||
53 | generic_handle_irq(ATH79_MISC_IRQ_ERROR); | ||
54 | |||
55 | else if (pending & MISC_INT_GPIO) | ||
56 | generic_handle_irq(ATH79_MISC_IRQ_GPIO); | ||
57 | |||
58 | else if (pending & MISC_INT_WDOG) | ||
59 | generic_handle_irq(ATH79_MISC_IRQ_WDOG); | ||
60 | |||
61 | else | ||
62 | spurious_interrupt(); | ||
63 | } | ||
64 | |||
65 | static void ar71xx_misc_irq_unmask(unsigned int irq) | ||
66 | { | ||
67 | void __iomem *base = ath79_reset_base; | ||
68 | u32 t; | ||
69 | |||
70 | irq -= ATH79_MISC_IRQ_BASE; | ||
71 | |||
72 | t = __raw_readl(base + AR71XX_RESET_REG_MISC_INT_ENABLE); | ||
73 | __raw_writel(t | (1 << irq), base + AR71XX_RESET_REG_MISC_INT_ENABLE); | ||
74 | |||
75 | /* flush write */ | ||
76 | __raw_readl(base + AR71XX_RESET_REG_MISC_INT_ENABLE); | ||
77 | } | ||
78 | |||
79 | static void ar71xx_misc_irq_mask(unsigned int irq) | ||
80 | { | ||
81 | void __iomem *base = ath79_reset_base; | ||
82 | u32 t; | ||
83 | |||
84 | irq -= ATH79_MISC_IRQ_BASE; | ||
85 | |||
86 | t = __raw_readl(base + AR71XX_RESET_REG_MISC_INT_ENABLE); | ||
87 | __raw_writel(t & ~(1 << irq), base + AR71XX_RESET_REG_MISC_INT_ENABLE); | ||
88 | |||
89 | /* flush write */ | ||
90 | __raw_readl(base + AR71XX_RESET_REG_MISC_INT_ENABLE); | ||
91 | } | ||
92 | |||
93 | static void ar724x_misc_irq_ack(unsigned int irq) | ||
94 | { | ||
95 | void __iomem *base = ath79_reset_base; | ||
96 | u32 t; | ||
97 | |||
98 | irq -= ATH79_MISC_IRQ_BASE; | ||
99 | |||
100 | t = __raw_readl(base + AR71XX_RESET_REG_MISC_INT_STATUS); | ||
101 | __raw_writel(t & ~(1 << irq), base + AR71XX_RESET_REG_MISC_INT_STATUS); | ||
102 | |||
103 | /* flush write */ | ||
104 | __raw_readl(base + AR71XX_RESET_REG_MISC_INT_STATUS); | ||
105 | } | ||
106 | |||
107 | static struct irq_chip ath79_misc_irq_chip = { | ||
108 | .name = "MISC", | ||
109 | .unmask = ar71xx_misc_irq_unmask, | ||
110 | .mask = ar71xx_misc_irq_mask, | ||
111 | }; | ||
112 | |||
113 | static void __init ath79_misc_irq_init(void) | ||
114 | { | ||
115 | void __iomem *base = ath79_reset_base; | ||
116 | int i; | ||
117 | |||
118 | __raw_writel(0, base + AR71XX_RESET_REG_MISC_INT_ENABLE); | ||
119 | __raw_writel(0, base + AR71XX_RESET_REG_MISC_INT_STATUS); | ||
120 | |||
121 | if (soc_is_ar71xx() || soc_is_ar913x()) | ||
122 | ath79_misc_irq_chip.mask_ack = ar71xx_misc_irq_mask; | ||
123 | else if (soc_is_ar724x()) | ||
124 | ath79_misc_irq_chip.ack = ar724x_misc_irq_ack; | ||
125 | else | ||
126 | BUG(); | ||
127 | |||
128 | for (i = ATH79_MISC_IRQ_BASE; | ||
129 | i < ATH79_MISC_IRQ_BASE + ATH79_MISC_IRQ_COUNT; i++) { | ||
130 | irq_desc[i].status = IRQ_DISABLED; | ||
131 | set_irq_chip_and_handler(i, &ath79_misc_irq_chip, | ||
132 | handle_level_irq); | ||
133 | } | ||
134 | |||
135 | set_irq_chained_handler(ATH79_CPU_IRQ_MISC, ath79_misc_irq_handler); | ||
136 | } | ||
137 | |||
138 | asmlinkage void plat_irq_dispatch(void) | ||
139 | { | ||
140 | unsigned long pending; | ||
141 | |||
142 | pending = read_c0_status() & read_c0_cause() & ST0_IM; | ||
143 | |||
144 | if (pending & STATUSF_IP7) | ||
145 | do_IRQ(ATH79_CPU_IRQ_TIMER); | ||
146 | |||
147 | else if (pending & STATUSF_IP2) { | ||
148 | ath79_ddr_wb_flush(ath79_ip2_flush_reg); | ||
149 | do_IRQ(ATH79_CPU_IRQ_IP2); | ||
150 | } | ||
151 | |||
152 | else if (pending & STATUSF_IP4) | ||
153 | do_IRQ(ATH79_CPU_IRQ_GE0); | ||
154 | |||
155 | else if (pending & STATUSF_IP5) | ||
156 | do_IRQ(ATH79_CPU_IRQ_GE1); | ||
157 | |||
158 | else if (pending & STATUSF_IP3) { | ||
159 | ath79_ddr_wb_flush(ath79_ip3_flush_reg); | ||
160 | do_IRQ(ATH79_CPU_IRQ_USB); | ||
161 | } | ||
162 | |||
163 | else if (pending & STATUSF_IP6) | ||
164 | do_IRQ(ATH79_CPU_IRQ_MISC); | ||
165 | |||
166 | else | ||
167 | spurious_interrupt(); | ||
168 | } | ||
169 | |||
170 | void __init arch_init_irq(void) | ||
171 | { | ||
172 | if (soc_is_ar71xx()) { | ||
173 | ath79_ip2_flush_reg = AR71XX_DDR_REG_FLUSH_PCI; | ||
174 | ath79_ip3_flush_reg = AR71XX_DDR_REG_FLUSH_USB; | ||
175 | } else if (soc_is_ar724x()) { | ||
176 | ath79_ip2_flush_reg = AR724X_DDR_REG_FLUSH_PCIE; | ||
177 | ath79_ip3_flush_reg = AR724X_DDR_REG_FLUSH_USB; | ||
178 | } else if (soc_is_ar913x()) { | ||
179 | ath79_ip2_flush_reg = AR913X_DDR_REG_FLUSH_WMAC; | ||
180 | ath79_ip3_flush_reg = AR913X_DDR_REG_FLUSH_USB; | ||
181 | } else | ||
182 | BUG(); | ||
183 | |||
184 | cp0_perfcount_irq = ATH79_MISC_IRQ_PERFC; | ||
185 | mips_cpu_irq_init(); | ||
186 | ath79_misc_irq_init(); | ||
187 | } | ||
diff --git a/arch/mips/ath79/mach-ap81.c b/arch/mips/ath79/mach-ap81.c new file mode 100644 index 000000000000..eee4c121deb4 --- /dev/null +++ b/arch/mips/ath79/mach-ap81.c | |||
@@ -0,0 +1,98 @@ | |||
1 | /* | ||
2 | * Atheros AP81 board support | ||
3 | * | ||
4 | * Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2009 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include "machtypes.h" | ||
13 | #include "dev-ar913x-wmac.h" | ||
14 | #include "dev-gpio-buttons.h" | ||
15 | #include "dev-leds-gpio.h" | ||
16 | #include "dev-spi.h" | ||
17 | |||
18 | #define AP81_GPIO_LED_STATUS 1 | ||
19 | #define AP81_GPIO_LED_AOSS 3 | ||
20 | #define AP81_GPIO_LED_WLAN 6 | ||
21 | #define AP81_GPIO_LED_POWER 14 | ||
22 | |||
23 | #define AP81_GPIO_BTN_SW4 12 | ||
24 | #define AP81_GPIO_BTN_SW1 21 | ||
25 | |||
26 | #define AP81_KEYS_POLL_INTERVAL 20 /* msecs */ | ||
27 | #define AP81_KEYS_DEBOUNCE_INTERVAL (3 * AP81_KEYS_POLL_INTERVAL) | ||
28 | |||
29 | #define AP81_CAL_DATA_ADDR 0x1fff1000 | ||
30 | |||
31 | static struct gpio_led ap81_leds_gpio[] __initdata = { | ||
32 | { | ||
33 | .name = "ap81:green:status", | ||
34 | .gpio = AP81_GPIO_LED_STATUS, | ||
35 | .active_low = 1, | ||
36 | }, { | ||
37 | .name = "ap81:amber:aoss", | ||
38 | .gpio = AP81_GPIO_LED_AOSS, | ||
39 | .active_low = 1, | ||
40 | }, { | ||
41 | .name = "ap81:green:wlan", | ||
42 | .gpio = AP81_GPIO_LED_WLAN, | ||
43 | .active_low = 1, | ||
44 | }, { | ||
45 | .name = "ap81:green:power", | ||
46 | .gpio = AP81_GPIO_LED_POWER, | ||
47 | .active_low = 1, | ||
48 | } | ||
49 | }; | ||
50 | |||
51 | static struct gpio_keys_button ap81_gpio_keys[] __initdata = { | ||
52 | { | ||
53 | .desc = "sw1", | ||
54 | .type = EV_KEY, | ||
55 | .code = BTN_0, | ||
56 | .debounce_interval = AP81_KEYS_DEBOUNCE_INTERVAL, | ||
57 | .gpio = AP81_GPIO_BTN_SW1, | ||
58 | .active_low = 1, | ||
59 | } , { | ||
60 | .desc = "sw4", | ||
61 | .type = EV_KEY, | ||
62 | .code = BTN_1, | ||
63 | .debounce_interval = AP81_KEYS_DEBOUNCE_INTERVAL, | ||
64 | .gpio = AP81_GPIO_BTN_SW4, | ||
65 | .active_low = 1, | ||
66 | } | ||
67 | }; | ||
68 | |||
69 | static struct spi_board_info ap81_spi_info[] = { | ||
70 | { | ||
71 | .bus_num = 0, | ||
72 | .chip_select = 0, | ||
73 | .max_speed_hz = 25000000, | ||
74 | .modalias = "m25p64", | ||
75 | } | ||
76 | }; | ||
77 | |||
78 | static struct ath79_spi_platform_data ap81_spi_data = { | ||
79 | .bus_num = 0, | ||
80 | .num_chipselect = 1, | ||
81 | }; | ||
82 | |||
83 | static void __init ap81_setup(void) | ||
84 | { | ||
85 | u8 *cal_data = (u8 *) KSEG1ADDR(AP81_CAL_DATA_ADDR); | ||
86 | |||
87 | ath79_register_leds_gpio(-1, ARRAY_SIZE(ap81_leds_gpio), | ||
88 | ap81_leds_gpio); | ||
89 | ath79_register_gpio_keys_polled(-1, AP81_KEYS_POLL_INTERVAL, | ||
90 | ARRAY_SIZE(ap81_gpio_keys), | ||
91 | ap81_gpio_keys); | ||
92 | ath79_register_spi(&ap81_spi_data, ap81_spi_info, | ||
93 | ARRAY_SIZE(ap81_spi_info)); | ||
94 | ath79_register_ar913x_wmac(cal_data); | ||
95 | } | ||
96 | |||
97 | MIPS_MACHINE(ATH79_MACH_AP81, "AP81", "Atheros AP81 reference board", | ||
98 | ap81_setup); | ||
diff --git a/arch/mips/ath79/mach-pb44.c b/arch/mips/ath79/mach-pb44.c new file mode 100644 index 000000000000..ec7b7a135d53 --- /dev/null +++ b/arch/mips/ath79/mach-pb44.c | |||
@@ -0,0 +1,118 @@ | |||
1 | /* | ||
2 | * Atheros PB44 reference board support | ||
3 | * | ||
4 | * Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License version 2 as published | ||
8 | * by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/init.h> | ||
12 | #include <linux/platform_device.h> | ||
13 | #include <linux/i2c.h> | ||
14 | #include <linux/i2c-gpio.h> | ||
15 | #include <linux/i2c/pcf857x.h> | ||
16 | |||
17 | #include "machtypes.h" | ||
18 | #include "dev-gpio-buttons.h" | ||
19 | #include "dev-leds-gpio.h" | ||
20 | #include "dev-spi.h" | ||
21 | |||
22 | #define PB44_GPIO_I2C_SCL 0 | ||
23 | #define PB44_GPIO_I2C_SDA 1 | ||
24 | |||
25 | #define PB44_GPIO_EXP_BASE 16 | ||
26 | #define PB44_GPIO_SW_RESET (PB44_GPIO_EXP_BASE + 6) | ||
27 | #define PB44_GPIO_SW_JUMP (PB44_GPIO_EXP_BASE + 8) | ||
28 | #define PB44_GPIO_LED_JUMP1 (PB44_GPIO_EXP_BASE + 9) | ||
29 | #define PB44_GPIO_LED_JUMP2 (PB44_GPIO_EXP_BASE + 10) | ||
30 | |||
31 | #define PB44_KEYS_POLL_INTERVAL 20 /* msecs */ | ||
32 | #define PB44_KEYS_DEBOUNCE_INTERVAL (3 * PB44_KEYS_POLL_INTERVAL) | ||
33 | |||
34 | static struct i2c_gpio_platform_data pb44_i2c_gpio_data = { | ||
35 | .sda_pin = PB44_GPIO_I2C_SDA, | ||
36 | .scl_pin = PB44_GPIO_I2C_SCL, | ||
37 | }; | ||
38 | |||
39 | static struct platform_device pb44_i2c_gpio_device = { | ||
40 | .name = "i2c-gpio", | ||
41 | .id = 0, | ||
42 | .dev = { | ||
43 | .platform_data = &pb44_i2c_gpio_data, | ||
44 | } | ||
45 | }; | ||
46 | |||
47 | static struct pcf857x_platform_data pb44_pcf857x_data = { | ||
48 | .gpio_base = PB44_GPIO_EXP_BASE, | ||
49 | }; | ||
50 | |||
51 | static struct i2c_board_info pb44_i2c_board_info[] __initdata = { | ||
52 | { | ||
53 | I2C_BOARD_INFO("pcf8575", 0x20), | ||
54 | .platform_data = &pb44_pcf857x_data, | ||
55 | }, | ||
56 | }; | ||
57 | |||
58 | static struct gpio_led pb44_leds_gpio[] __initdata = { | ||
59 | { | ||
60 | .name = "pb44:amber:jump1", | ||
61 | .gpio = PB44_GPIO_LED_JUMP1, | ||
62 | .active_low = 1, | ||
63 | }, { | ||
64 | .name = "pb44:green:jump2", | ||
65 | .gpio = PB44_GPIO_LED_JUMP2, | ||
66 | .active_low = 1, | ||
67 | }, | ||
68 | }; | ||
69 | |||
70 | static struct gpio_keys_button pb44_gpio_keys[] __initdata = { | ||
71 | { | ||
72 | .desc = "soft_reset", | ||
73 | .type = EV_KEY, | ||
74 | .code = KEY_RESTART, | ||
75 | .debounce_interval = PB44_KEYS_DEBOUNCE_INTERVAL, | ||
76 | .gpio = PB44_GPIO_SW_RESET, | ||
77 | .active_low = 1, | ||
78 | } , { | ||
79 | .desc = "jumpstart", | ||
80 | .type = EV_KEY, | ||
81 | .code = KEY_WPS_BUTTON, | ||
82 | .debounce_interval = PB44_KEYS_DEBOUNCE_INTERVAL, | ||
83 | .gpio = PB44_GPIO_SW_JUMP, | ||
84 | .active_low = 1, | ||
85 | } | ||
86 | }; | ||
87 | |||
88 | static struct spi_board_info pb44_spi_info[] = { | ||
89 | { | ||
90 | .bus_num = 0, | ||
91 | .chip_select = 0, | ||
92 | .max_speed_hz = 25000000, | ||
93 | .modalias = "m25p64", | ||
94 | }, | ||
95 | }; | ||
96 | |||
97 | static struct ath79_spi_platform_data pb44_spi_data = { | ||
98 | .bus_num = 0, | ||
99 | .num_chipselect = 1, | ||
100 | }; | ||
101 | |||
102 | static void __init pb44_init(void) | ||
103 | { | ||
104 | i2c_register_board_info(0, pb44_i2c_board_info, | ||
105 | ARRAY_SIZE(pb44_i2c_board_info)); | ||
106 | platform_device_register(&pb44_i2c_gpio_device); | ||
107 | |||
108 | ath79_register_leds_gpio(-1, ARRAY_SIZE(pb44_leds_gpio), | ||
109 | pb44_leds_gpio); | ||
110 | ath79_register_gpio_keys_polled(-1, PB44_KEYS_POLL_INTERVAL, | ||
111 | ARRAY_SIZE(pb44_gpio_keys), | ||
112 | pb44_gpio_keys); | ||
113 | ath79_register_spi(&pb44_spi_data, pb44_spi_info, | ||
114 | ARRAY_SIZE(pb44_spi_info)); | ||
115 | } | ||
116 | |||
117 | MIPS_MACHINE(ATH79_MACH_PB44, "PB44", "Atheros PB44 reference board", | ||
118 | pb44_init); | ||
diff --git a/arch/mips/ath79/machtypes.h b/arch/mips/ath79/machtypes.h new file mode 100644 index 000000000000..3940fe470b2d --- /dev/null +++ b/arch/mips/ath79/machtypes.h | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X machine type definitions | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ATH79_MACHTYPE_H | ||
13 | #define _ATH79_MACHTYPE_H | ||
14 | |||
15 | #include <asm/mips_machine.h> | ||
16 | |||
17 | enum ath79_mach_type { | ||
18 | ATH79_MACH_GENERIC = 0, | ||
19 | ATH79_MACH_AP81, /* Atheros AP81 reference board */ | ||
20 | ATH79_MACH_PB44, /* Atheros PB44 reference board */ | ||
21 | }; | ||
22 | |||
23 | #endif /* _ATH79_MACHTYPE_H */ | ||
diff --git a/arch/mips/ath79/prom.c b/arch/mips/ath79/prom.c new file mode 100644 index 000000000000..e9cbd7c2918f --- /dev/null +++ b/arch/mips/ath79/prom.c | |||
@@ -0,0 +1,57 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X specific prom routines | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/io.h> | ||
15 | #include <linux/string.h> | ||
16 | |||
17 | #include <asm/bootinfo.h> | ||
18 | #include <asm/addrspace.h> | ||
19 | |||
20 | #include "common.h" | ||
21 | |||
22 | static inline int is_valid_ram_addr(void *addr) | ||
23 | { | ||
24 | if (((u32) addr > KSEG0) && | ||
25 | ((u32) addr < (KSEG0 + ATH79_MEM_SIZE_MAX))) | ||
26 | return 1; | ||
27 | |||
28 | if (((u32) addr > KSEG1) && | ||
29 | ((u32) addr < (KSEG1 + ATH79_MEM_SIZE_MAX))) | ||
30 | return 1; | ||
31 | |||
32 | return 0; | ||
33 | } | ||
34 | |||
35 | static __init void ath79_prom_init_cmdline(int argc, char **argv) | ||
36 | { | ||
37 | int i; | ||
38 | |||
39 | if (!is_valid_ram_addr(argv)) | ||
40 | return; | ||
41 | |||
42 | for (i = 0; i < argc; i++) | ||
43 | if (is_valid_ram_addr(argv[i])) { | ||
44 | strlcat(arcs_cmdline, " ", sizeof(arcs_cmdline)); | ||
45 | strlcat(arcs_cmdline, argv[i], sizeof(arcs_cmdline)); | ||
46 | } | ||
47 | } | ||
48 | |||
49 | void __init prom_init(void) | ||
50 | { | ||
51 | ath79_prom_init_cmdline(fw_arg0, (char **)fw_arg1); | ||
52 | } | ||
53 | |||
54 | void __init prom_free_prom_memory(void) | ||
55 | { | ||
56 | /* We do not have to prom memory to free */ | ||
57 | } | ||
diff --git a/arch/mips/ath79/setup.c b/arch/mips/ath79/setup.c new file mode 100644 index 000000000000..159b42f106b0 --- /dev/null +++ b/arch/mips/ath79/setup.c | |||
@@ -0,0 +1,206 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X specific setup | ||
3 | * | ||
4 | * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
6 | * | ||
7 | * Parts of this file are based on Atheros' 2.6.15 BSP | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License version 2 as published | ||
11 | * by the Free Software Foundation. | ||
12 | */ | ||
13 | |||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/bootmem.h> | ||
17 | #include <linux/err.h> | ||
18 | #include <linux/clk.h> | ||
19 | |||
20 | #include <asm/bootinfo.h> | ||
21 | #include <asm/time.h> /* for mips_hpt_frequency */ | ||
22 | #include <asm/reboot.h> /* for _machine_{restart,halt} */ | ||
23 | #include <asm/mips_machine.h> | ||
24 | |||
25 | #include <asm/mach-ath79/ath79.h> | ||
26 | #include <asm/mach-ath79/ar71xx_regs.h> | ||
27 | #include "common.h" | ||
28 | #include "dev-common.h" | ||
29 | #include "machtypes.h" | ||
30 | |||
31 | #define ATH79_SYS_TYPE_LEN 64 | ||
32 | |||
33 | #define AR71XX_BASE_FREQ 40000000 | ||
34 | #define AR724X_BASE_FREQ 5000000 | ||
35 | #define AR913X_BASE_FREQ 5000000 | ||
36 | |||
37 | static char ath79_sys_type[ATH79_SYS_TYPE_LEN]; | ||
38 | |||
39 | static void ath79_restart(char *command) | ||
40 | { | ||
41 | ath79_device_reset_set(AR71XX_RESET_FULL_CHIP); | ||
42 | for (;;) | ||
43 | if (cpu_wait) | ||
44 | cpu_wait(); | ||
45 | } | ||
46 | |||
47 | static void ath79_halt(void) | ||
48 | { | ||
49 | while (1) | ||
50 | cpu_wait(); | ||
51 | } | ||
52 | |||
53 | static void __init ath79_detect_mem_size(void) | ||
54 | { | ||
55 | unsigned long size; | ||
56 | |||
57 | for (size = ATH79_MEM_SIZE_MIN; size < ATH79_MEM_SIZE_MAX; | ||
58 | size <<= 1) { | ||
59 | if (!memcmp(ath79_detect_mem_size, | ||
60 | ath79_detect_mem_size + size, 1024)) | ||
61 | break; | ||
62 | } | ||
63 | |||
64 | add_memory_region(0, size, BOOT_MEM_RAM); | ||
65 | } | ||
66 | |||
67 | static void __init ath79_detect_sys_type(void) | ||
68 | { | ||
69 | char *chip = "????"; | ||
70 | u32 id; | ||
71 | u32 major; | ||
72 | u32 minor; | ||
73 | u32 rev = 0; | ||
74 | |||
75 | id = ath79_reset_rr(AR71XX_RESET_REG_REV_ID); | ||
76 | major = id & REV_ID_MAJOR_MASK; | ||
77 | |||
78 | switch (major) { | ||
79 | case REV_ID_MAJOR_AR71XX: | ||
80 | minor = id & AR71XX_REV_ID_MINOR_MASK; | ||
81 | rev = id >> AR71XX_REV_ID_REVISION_SHIFT; | ||
82 | rev &= AR71XX_REV_ID_REVISION_MASK; | ||
83 | switch (minor) { | ||
84 | case AR71XX_REV_ID_MINOR_AR7130: | ||
85 | ath79_soc = ATH79_SOC_AR7130; | ||
86 | chip = "7130"; | ||
87 | break; | ||
88 | |||
89 | case AR71XX_REV_ID_MINOR_AR7141: | ||
90 | ath79_soc = ATH79_SOC_AR7141; | ||
91 | chip = "7141"; | ||
92 | break; | ||
93 | |||
94 | case AR71XX_REV_ID_MINOR_AR7161: | ||
95 | ath79_soc = ATH79_SOC_AR7161; | ||
96 | chip = "7161"; | ||
97 | break; | ||
98 | } | ||
99 | break; | ||
100 | |||
101 | case REV_ID_MAJOR_AR7240: | ||
102 | ath79_soc = ATH79_SOC_AR7240; | ||
103 | chip = "7240"; | ||
104 | rev = (id & AR724X_REV_ID_REVISION_MASK); | ||
105 | break; | ||
106 | |||
107 | case REV_ID_MAJOR_AR7241: | ||
108 | ath79_soc = ATH79_SOC_AR7241; | ||
109 | chip = "7241"; | ||
110 | rev = (id & AR724X_REV_ID_REVISION_MASK); | ||
111 | break; | ||
112 | |||
113 | case REV_ID_MAJOR_AR7242: | ||
114 | ath79_soc = ATH79_SOC_AR7242; | ||
115 | chip = "7242"; | ||
116 | rev = (id & AR724X_REV_ID_REVISION_MASK); | ||
117 | break; | ||
118 | |||
119 | case REV_ID_MAJOR_AR913X: | ||
120 | minor = id & AR913X_REV_ID_MINOR_MASK; | ||
121 | rev = id >> AR913X_REV_ID_REVISION_SHIFT; | ||
122 | rev &= AR913X_REV_ID_REVISION_MASK; | ||
123 | switch (minor) { | ||
124 | case AR913X_REV_ID_MINOR_AR9130: | ||
125 | ath79_soc = ATH79_SOC_AR9130; | ||
126 | chip = "9130"; | ||
127 | break; | ||
128 | |||
129 | case AR913X_REV_ID_MINOR_AR9132: | ||
130 | ath79_soc = ATH79_SOC_AR9132; | ||
131 | chip = "9132"; | ||
132 | break; | ||
133 | } | ||
134 | break; | ||
135 | |||
136 | default: | ||
137 | panic("ath79: unknown SoC, id:0x%08x\n", id); | ||
138 | } | ||
139 | |||
140 | sprintf(ath79_sys_type, "Atheros AR%s rev %u", chip, rev); | ||
141 | pr_info("SoC: %s\n", ath79_sys_type); | ||
142 | } | ||
143 | |||
144 | const char *get_system_type(void) | ||
145 | { | ||
146 | return ath79_sys_type; | ||
147 | } | ||
148 | |||
149 | unsigned int __cpuinit get_c0_compare_int(void) | ||
150 | { | ||
151 | return CP0_LEGACY_COMPARE_IRQ; | ||
152 | } | ||
153 | |||
154 | void __init plat_mem_setup(void) | ||
155 | { | ||
156 | set_io_port_base(KSEG1); | ||
157 | |||
158 | ath79_reset_base = ioremap_nocache(AR71XX_RESET_BASE, | ||
159 | AR71XX_RESET_SIZE); | ||
160 | ath79_pll_base = ioremap_nocache(AR71XX_PLL_BASE, | ||
161 | AR71XX_PLL_SIZE); | ||
162 | ath79_ddr_base = ioremap_nocache(AR71XX_DDR_CTRL_BASE, | ||
163 | AR71XX_DDR_CTRL_SIZE); | ||
164 | |||
165 | ath79_detect_sys_type(); | ||
166 | ath79_detect_mem_size(); | ||
167 | ath79_clocks_init(); | ||
168 | |||
169 | _machine_restart = ath79_restart; | ||
170 | _machine_halt = ath79_halt; | ||
171 | pm_power_off = ath79_halt; | ||
172 | } | ||
173 | |||
174 | void __init plat_time_init(void) | ||
175 | { | ||
176 | struct clk *clk; | ||
177 | |||
178 | clk = clk_get(NULL, "cpu"); | ||
179 | if (IS_ERR(clk)) | ||
180 | panic("unable to get CPU clock, err=%ld", PTR_ERR(clk)); | ||
181 | |||
182 | mips_hpt_frequency = clk_get_rate(clk) / 2; | ||
183 | } | ||
184 | |||
185 | static int __init ath79_setup(void) | ||
186 | { | ||
187 | ath79_gpio_init(); | ||
188 | ath79_register_uart(); | ||
189 | ath79_register_wdt(); | ||
190 | |||
191 | mips_machine_setup(); | ||
192 | |||
193 | return 0; | ||
194 | } | ||
195 | |||
196 | arch_initcall(ath79_setup); | ||
197 | |||
198 | static void __init ath79_generic_init(void) | ||
199 | { | ||
200 | /* Nothing to do */ | ||
201 | } | ||
202 | |||
203 | MIPS_MACHINE(ATH79_MACH_GENERIC, | ||
204 | "Generic", | ||
205 | "Generic AR71XX/AR724X/AR913X based board", | ||
206 | ath79_generic_init); | ||
diff --git a/arch/mips/configs/malta_defconfig b/arch/mips/configs/malta_defconfig index b455d0f36486..9d03b68aece8 100644 --- a/arch/mips/configs/malta_defconfig +++ b/arch/mips/configs/malta_defconfig | |||
@@ -369,7 +369,10 @@ CONFIG_VT_HW_CONSOLE_BINDING=y | |||
369 | CONFIG_SERIAL_8250=y | 369 | CONFIG_SERIAL_8250=y |
370 | CONFIG_SERIAL_8250_CONSOLE=y | 370 | CONFIG_SERIAL_8250_CONSOLE=y |
371 | # CONFIG_HWMON is not set | 371 | # CONFIG_HWMON is not set |
372 | CONFIG_FB=y | ||
373 | CONFIG_FB_CIRRUS=y | ||
372 | # CONFIG_VGA_CONSOLE is not set | 374 | # CONFIG_VGA_CONSOLE is not set |
375 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
373 | CONFIG_HID=m | 376 | CONFIG_HID=m |
374 | CONFIG_LEDS_CLASS=m | 377 | CONFIG_LEDS_CLASS=m |
375 | CONFIG_LEDS_TRIGGER_TIMER=m | 378 | CONFIG_LEDS_TRIGGER_TIMER=m |
diff --git a/arch/mips/include/asm/cache.h b/arch/mips/include/asm/cache.h index 37f175c42bb5..650ac9ba734c 100644 --- a/arch/mips/include/asm/cache.h +++ b/arch/mips/include/asm/cache.h | |||
@@ -17,4 +17,6 @@ | |||
17 | #define SMP_CACHE_SHIFT L1_CACHE_SHIFT | 17 | #define SMP_CACHE_SHIFT L1_CACHE_SHIFT |
18 | #define SMP_CACHE_BYTES L1_CACHE_BYTES | 18 | #define SMP_CACHE_BYTES L1_CACHE_BYTES |
19 | 19 | ||
20 | #define __read_mostly __attribute__((__section__(".data.read_mostly"))) | ||
21 | |||
20 | #endif /* _ASM_CACHE_H */ | 22 | #endif /* _ASM_CACHE_H */ |
diff --git a/arch/mips/include/asm/cpu-info.h b/arch/mips/include/asm/cpu-info.h index b39def3f6e03..c454550eb0c0 100644 --- a/arch/mips/include/asm/cpu-info.h +++ b/arch/mips/include/asm/cpu-info.h | |||
@@ -78,6 +78,7 @@ struct cpuinfo_mips { | |||
78 | unsigned int watch_reg_use_cnt; /* Usable by ptrace */ | 78 | unsigned int watch_reg_use_cnt; /* Usable by ptrace */ |
79 | #define NUM_WATCH_REGS 4 | 79 | #define NUM_WATCH_REGS 4 |
80 | u16 watch_reg_masks[NUM_WATCH_REGS]; | 80 | u16 watch_reg_masks[NUM_WATCH_REGS]; |
81 | unsigned int kscratch_mask; /* Usable KScratch mask. */ | ||
81 | } __attribute__((aligned(SMP_CACHE_BYTES))); | 82 | } __attribute__((aligned(SMP_CACHE_BYTES))); |
82 | 83 | ||
83 | extern struct cpuinfo_mips cpu_data[]; | 84 | extern struct cpuinfo_mips cpu_data[]; |
diff --git a/arch/mips/include/asm/inst.h b/arch/mips/include/asm/inst.h index 444ff71aa0e8..7ebfc392e58d 100644 --- a/arch/mips/include/asm/inst.h +++ b/arch/mips/include/asm/inst.h | |||
@@ -72,6 +72,7 @@ enum spec2_op { | |||
72 | enum spec3_op { | 72 | enum spec3_op { |
73 | ext_op, dextm_op, dextu_op, dext_op, | 73 | ext_op, dextm_op, dextu_op, dext_op, |
74 | ins_op, dinsm_op, dinsu_op, dins_op, | 74 | ins_op, dinsm_op, dinsu_op, dins_op, |
75 | lx_op = 0x0a, | ||
75 | bshfl_op = 0x20, | 76 | bshfl_op = 0x20, |
76 | dbshfl_op = 0x24, | 77 | dbshfl_op = 0x24, |
77 | rdhwr_op = 0x3b | 78 | rdhwr_op = 0x3b |
@@ -179,6 +180,19 @@ enum mad_func { | |||
179 | }; | 180 | }; |
180 | 181 | ||
181 | /* | 182 | /* |
183 | * func field for special3 lx opcodes (Cavium Octeon). | ||
184 | */ | ||
185 | enum lx_func { | ||
186 | lwx_op = 0x00, | ||
187 | lhx_op = 0x04, | ||
188 | lbux_op = 0x06, | ||
189 | ldx_op = 0x08, | ||
190 | lwux_op = 0x10, | ||
191 | lhux_op = 0x14, | ||
192 | lbx_op = 0x16, | ||
193 | }; | ||
194 | |||
195 | /* | ||
182 | * Damn ... bitfields depend from byteorder :-( | 196 | * Damn ... bitfields depend from byteorder :-( |
183 | */ | 197 | */ |
184 | #ifdef __MIPSEB__ | 198 | #ifdef __MIPSEB__ |
diff --git a/arch/mips/include/asm/jump_label.h b/arch/mips/include/asm/jump_label.h new file mode 100644 index 000000000000..7622ccf75076 --- /dev/null +++ b/arch/mips/include/asm/jump_label.h | |||
@@ -0,0 +1,48 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Copyright (c) 2010 Cavium Networks, Inc. | ||
7 | */ | ||
8 | #ifndef _ASM_MIPS_JUMP_LABEL_H | ||
9 | #define _ASM_MIPS_JUMP_LABEL_H | ||
10 | |||
11 | #include <linux/types.h> | ||
12 | |||
13 | #ifdef __KERNEL__ | ||
14 | |||
15 | #define JUMP_LABEL_NOP_SIZE 4 | ||
16 | |||
17 | #ifdef CONFIG_64BIT | ||
18 | #define WORD_INSN ".dword" | ||
19 | #else | ||
20 | #define WORD_INSN ".word" | ||
21 | #endif | ||
22 | |||
23 | #define JUMP_LABEL(key, label) \ | ||
24 | do { \ | ||
25 | asm goto("1:\tnop\n\t" \ | ||
26 | "nop\n\t" \ | ||
27 | ".pushsection __jump_table, \"a\"\n\t" \ | ||
28 | WORD_INSN " 1b, %l[" #label "], %0\n\t" \ | ||
29 | ".popsection\n\t" \ | ||
30 | : : "i" (key) : : label); \ | ||
31 | } while (0) | ||
32 | |||
33 | |||
34 | #endif /* __KERNEL__ */ | ||
35 | |||
36 | #ifdef CONFIG_64BIT | ||
37 | typedef u64 jump_label_t; | ||
38 | #else | ||
39 | typedef u32 jump_label_t; | ||
40 | #endif | ||
41 | |||
42 | struct jump_entry { | ||
43 | jump_label_t code; | ||
44 | jump_label_t target; | ||
45 | jump_label_t key; | ||
46 | }; | ||
47 | |||
48 | #endif /* _ASM_MIPS_JUMP_LABEL_H */ | ||
diff --git a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h new file mode 100644 index 000000000000..cda1c8070b27 --- /dev/null +++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h | |||
@@ -0,0 +1,233 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X SoC register definitions | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
6 | * | ||
7 | * Parts of this file are based on Atheros' 2.6.15 BSP | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License version 2 as published | ||
11 | * by the Free Software Foundation. | ||
12 | */ | ||
13 | |||
14 | #ifndef __ASM_MACH_AR71XX_REGS_H | ||
15 | #define __ASM_MACH_AR71XX_REGS_H | ||
16 | |||
17 | #include <linux/types.h> | ||
18 | #include <linux/init.h> | ||
19 | #include <linux/io.h> | ||
20 | #include <linux/bitops.h> | ||
21 | |||
22 | #define AR71XX_APB_BASE 0x18000000 | ||
23 | #define AR71XX_SPI_BASE 0x1f000000 | ||
24 | #define AR71XX_SPI_SIZE 0x01000000 | ||
25 | |||
26 | #define AR71XX_DDR_CTRL_BASE (AR71XX_APB_BASE + 0x00000000) | ||
27 | #define AR71XX_DDR_CTRL_SIZE 0x100 | ||
28 | #define AR71XX_UART_BASE (AR71XX_APB_BASE + 0x00020000) | ||
29 | #define AR71XX_UART_SIZE 0x100 | ||
30 | #define AR71XX_GPIO_BASE (AR71XX_APB_BASE + 0x00040000) | ||
31 | #define AR71XX_GPIO_SIZE 0x100 | ||
32 | #define AR71XX_PLL_BASE (AR71XX_APB_BASE + 0x00050000) | ||
33 | #define AR71XX_PLL_SIZE 0x100 | ||
34 | #define AR71XX_RESET_BASE (AR71XX_APB_BASE + 0x00060000) | ||
35 | #define AR71XX_RESET_SIZE 0x100 | ||
36 | |||
37 | #define AR913X_WMAC_BASE (AR71XX_APB_BASE + 0x000C0000) | ||
38 | #define AR913X_WMAC_SIZE 0x30000 | ||
39 | |||
40 | /* | ||
41 | * DDR_CTRL block | ||
42 | */ | ||
43 | #define AR71XX_DDR_REG_PCI_WIN0 0x7c | ||
44 | #define AR71XX_DDR_REG_PCI_WIN1 0x80 | ||
45 | #define AR71XX_DDR_REG_PCI_WIN2 0x84 | ||
46 | #define AR71XX_DDR_REG_PCI_WIN3 0x88 | ||
47 | #define AR71XX_DDR_REG_PCI_WIN4 0x8c | ||
48 | #define AR71XX_DDR_REG_PCI_WIN5 0x90 | ||
49 | #define AR71XX_DDR_REG_PCI_WIN6 0x94 | ||
50 | #define AR71XX_DDR_REG_PCI_WIN7 0x98 | ||
51 | #define AR71XX_DDR_REG_FLUSH_GE0 0x9c | ||
52 | #define AR71XX_DDR_REG_FLUSH_GE1 0xa0 | ||
53 | #define AR71XX_DDR_REG_FLUSH_USB 0xa4 | ||
54 | #define AR71XX_DDR_REG_FLUSH_PCI 0xa8 | ||
55 | |||
56 | #define AR724X_DDR_REG_FLUSH_GE0 0x7c | ||
57 | #define AR724X_DDR_REG_FLUSH_GE1 0x80 | ||
58 | #define AR724X_DDR_REG_FLUSH_USB 0x84 | ||
59 | #define AR724X_DDR_REG_FLUSH_PCIE 0x88 | ||
60 | |||
61 | #define AR913X_DDR_REG_FLUSH_GE0 0x7c | ||
62 | #define AR913X_DDR_REG_FLUSH_GE1 0x80 | ||
63 | #define AR913X_DDR_REG_FLUSH_USB 0x84 | ||
64 | #define AR913X_DDR_REG_FLUSH_WMAC 0x88 | ||
65 | |||
66 | /* | ||
67 | * PLL block | ||
68 | */ | ||
69 | #define AR71XX_PLL_REG_CPU_CONFIG 0x00 | ||
70 | #define AR71XX_PLL_REG_SEC_CONFIG 0x04 | ||
71 | #define AR71XX_PLL_REG_ETH0_INT_CLOCK 0x10 | ||
72 | #define AR71XX_PLL_REG_ETH1_INT_CLOCK 0x14 | ||
73 | |||
74 | #define AR71XX_PLL_DIV_SHIFT 3 | ||
75 | #define AR71XX_PLL_DIV_MASK 0x1f | ||
76 | #define AR71XX_CPU_DIV_SHIFT 16 | ||
77 | #define AR71XX_CPU_DIV_MASK 0x3 | ||
78 | #define AR71XX_DDR_DIV_SHIFT 18 | ||
79 | #define AR71XX_DDR_DIV_MASK 0x3 | ||
80 | #define AR71XX_AHB_DIV_SHIFT 20 | ||
81 | #define AR71XX_AHB_DIV_MASK 0x7 | ||
82 | |||
83 | #define AR724X_PLL_REG_CPU_CONFIG 0x00 | ||
84 | #define AR724X_PLL_REG_PCIE_CONFIG 0x18 | ||
85 | |||
86 | #define AR724X_PLL_DIV_SHIFT 0 | ||
87 | #define AR724X_PLL_DIV_MASK 0x3ff | ||
88 | #define AR724X_PLL_REF_DIV_SHIFT 10 | ||
89 | #define AR724X_PLL_REF_DIV_MASK 0xf | ||
90 | #define AR724X_AHB_DIV_SHIFT 19 | ||
91 | #define AR724X_AHB_DIV_MASK 0x1 | ||
92 | #define AR724X_DDR_DIV_SHIFT 22 | ||
93 | #define AR724X_DDR_DIV_MASK 0x3 | ||
94 | |||
95 | #define AR913X_PLL_REG_CPU_CONFIG 0x00 | ||
96 | #define AR913X_PLL_REG_ETH_CONFIG 0x04 | ||
97 | #define AR913X_PLL_REG_ETH0_INT_CLOCK 0x14 | ||
98 | #define AR913X_PLL_REG_ETH1_INT_CLOCK 0x18 | ||
99 | |||
100 | #define AR913X_PLL_DIV_SHIFT 0 | ||
101 | #define AR913X_PLL_DIV_MASK 0x3ff | ||
102 | #define AR913X_DDR_DIV_SHIFT 22 | ||
103 | #define AR913X_DDR_DIV_MASK 0x3 | ||
104 | #define AR913X_AHB_DIV_SHIFT 19 | ||
105 | #define AR913X_AHB_DIV_MASK 0x1 | ||
106 | |||
107 | /* | ||
108 | * RESET block | ||
109 | */ | ||
110 | #define AR71XX_RESET_REG_TIMER 0x00 | ||
111 | #define AR71XX_RESET_REG_TIMER_RELOAD 0x04 | ||
112 | #define AR71XX_RESET_REG_WDOG_CTRL 0x08 | ||
113 | #define AR71XX_RESET_REG_WDOG 0x0c | ||
114 | #define AR71XX_RESET_REG_MISC_INT_STATUS 0x10 | ||
115 | #define AR71XX_RESET_REG_MISC_INT_ENABLE 0x14 | ||
116 | #define AR71XX_RESET_REG_PCI_INT_STATUS 0x18 | ||
117 | #define AR71XX_RESET_REG_PCI_INT_ENABLE 0x1c | ||
118 | #define AR71XX_RESET_REG_GLOBAL_INT_STATUS 0x20 | ||
119 | #define AR71XX_RESET_REG_RESET_MODULE 0x24 | ||
120 | #define AR71XX_RESET_REG_PERFC_CTRL 0x2c | ||
121 | #define AR71XX_RESET_REG_PERFC0 0x30 | ||
122 | #define AR71XX_RESET_REG_PERFC1 0x34 | ||
123 | #define AR71XX_RESET_REG_REV_ID 0x90 | ||
124 | |||
125 | #define AR913X_RESET_REG_GLOBAL_INT_STATUS 0x18 | ||
126 | #define AR913X_RESET_REG_RESET_MODULE 0x1c | ||
127 | #define AR913X_RESET_REG_PERF_CTRL 0x20 | ||
128 | #define AR913X_RESET_REG_PERFC0 0x24 | ||
129 | #define AR913X_RESET_REG_PERFC1 0x28 | ||
130 | |||
131 | #define AR724X_RESET_REG_RESET_MODULE 0x1c | ||
132 | |||
133 | #define MISC_INT_DMA BIT(7) | ||
134 | #define MISC_INT_OHCI BIT(6) | ||
135 | #define MISC_INT_PERFC BIT(5) | ||
136 | #define MISC_INT_WDOG BIT(4) | ||
137 | #define MISC_INT_UART BIT(3) | ||
138 | #define MISC_INT_GPIO BIT(2) | ||
139 | #define MISC_INT_ERROR BIT(1) | ||
140 | #define MISC_INT_TIMER BIT(0) | ||
141 | |||
142 | #define AR71XX_RESET_EXTERNAL BIT(28) | ||
143 | #define AR71XX_RESET_FULL_CHIP BIT(24) | ||
144 | #define AR71XX_RESET_CPU_NMI BIT(21) | ||
145 | #define AR71XX_RESET_CPU_COLD BIT(20) | ||
146 | #define AR71XX_RESET_DMA BIT(19) | ||
147 | #define AR71XX_RESET_SLIC BIT(18) | ||
148 | #define AR71XX_RESET_STEREO BIT(17) | ||
149 | #define AR71XX_RESET_DDR BIT(16) | ||
150 | #define AR71XX_RESET_GE1_MAC BIT(13) | ||
151 | #define AR71XX_RESET_GE1_PHY BIT(12) | ||
152 | #define AR71XX_RESET_USBSUS_OVERRIDE BIT(10) | ||
153 | #define AR71XX_RESET_GE0_MAC BIT(9) | ||
154 | #define AR71XX_RESET_GE0_PHY BIT(8) | ||
155 | #define AR71XX_RESET_USB_OHCI_DLL BIT(6) | ||
156 | #define AR71XX_RESET_USB_HOST BIT(5) | ||
157 | #define AR71XX_RESET_USB_PHY BIT(4) | ||
158 | #define AR71XX_RESET_PCI_BUS BIT(1) | ||
159 | #define AR71XX_RESET_PCI_CORE BIT(0) | ||
160 | |||
161 | #define AR724X_RESET_GE1_MDIO BIT(23) | ||
162 | #define AR724X_RESET_GE0_MDIO BIT(22) | ||
163 | #define AR724X_RESET_PCIE_PHY_SERIAL BIT(10) | ||
164 | #define AR724X_RESET_PCIE_PHY BIT(7) | ||
165 | #define AR724X_RESET_PCIE BIT(6) | ||
166 | #define AR724X_RESET_OHCI_DLL BIT(3) | ||
167 | |||
168 | #define AR913X_RESET_AMBA2WMAC BIT(22) | ||
169 | |||
170 | #define REV_ID_MAJOR_MASK 0xfff0 | ||
171 | #define REV_ID_MAJOR_AR71XX 0x00a0 | ||
172 | #define REV_ID_MAJOR_AR913X 0x00b0 | ||
173 | #define REV_ID_MAJOR_AR7240 0x00c0 | ||
174 | #define REV_ID_MAJOR_AR7241 0x0100 | ||
175 | #define REV_ID_MAJOR_AR7242 0x1100 | ||
176 | |||
177 | #define AR71XX_REV_ID_MINOR_MASK 0x3 | ||
178 | #define AR71XX_REV_ID_MINOR_AR7130 0x0 | ||
179 | #define AR71XX_REV_ID_MINOR_AR7141 0x1 | ||
180 | #define AR71XX_REV_ID_MINOR_AR7161 0x2 | ||
181 | #define AR71XX_REV_ID_REVISION_MASK 0x3 | ||
182 | #define AR71XX_REV_ID_REVISION_SHIFT 2 | ||
183 | |||
184 | #define AR913X_REV_ID_MINOR_MASK 0x3 | ||
185 | #define AR913X_REV_ID_MINOR_AR9130 0x0 | ||
186 | #define AR913X_REV_ID_MINOR_AR9132 0x1 | ||
187 | #define AR913X_REV_ID_REVISION_MASK 0x3 | ||
188 | #define AR913X_REV_ID_REVISION_SHIFT 2 | ||
189 | |||
190 | #define AR724X_REV_ID_REVISION_MASK 0x3 | ||
191 | |||
192 | /* | ||
193 | * SPI block | ||
194 | */ | ||
195 | #define AR71XX_SPI_REG_FS 0x00 /* Function Select */ | ||
196 | #define AR71XX_SPI_REG_CTRL 0x04 /* SPI Control */ | ||
197 | #define AR71XX_SPI_REG_IOC 0x08 /* SPI I/O Control */ | ||
198 | #define AR71XX_SPI_REG_RDS 0x0c /* Read Data Shift */ | ||
199 | |||
200 | #define AR71XX_SPI_FS_GPIO BIT(0) /* Enable GPIO mode */ | ||
201 | |||
202 | #define AR71XX_SPI_CTRL_RD BIT(6) /* Remap Disable */ | ||
203 | #define AR71XX_SPI_CTRL_DIV_MASK 0x3f | ||
204 | |||
205 | #define AR71XX_SPI_IOC_DO BIT(0) /* Data Out pin */ | ||
206 | #define AR71XX_SPI_IOC_CLK BIT(8) /* CLK pin */ | ||
207 | #define AR71XX_SPI_IOC_CS(n) BIT(16 + (n)) | ||
208 | #define AR71XX_SPI_IOC_CS0 AR71XX_SPI_IOC_CS(0) | ||
209 | #define AR71XX_SPI_IOC_CS1 AR71XX_SPI_IOC_CS(1) | ||
210 | #define AR71XX_SPI_IOC_CS2 AR71XX_SPI_IOC_CS(2) | ||
211 | #define AR71XX_SPI_IOC_CS_ALL (AR71XX_SPI_IOC_CS0 | AR71XX_SPI_IOC_CS1 | \ | ||
212 | AR71XX_SPI_IOC_CS2) | ||
213 | |||
214 | /* | ||
215 | * GPIO block | ||
216 | */ | ||
217 | #define AR71XX_GPIO_REG_OE 0x00 | ||
218 | #define AR71XX_GPIO_REG_IN 0x04 | ||
219 | #define AR71XX_GPIO_REG_OUT 0x08 | ||
220 | #define AR71XX_GPIO_REG_SET 0x0c | ||
221 | #define AR71XX_GPIO_REG_CLEAR 0x10 | ||
222 | #define AR71XX_GPIO_REG_INT_MODE 0x14 | ||
223 | #define AR71XX_GPIO_REG_INT_TYPE 0x18 | ||
224 | #define AR71XX_GPIO_REG_INT_POLARITY 0x1c | ||
225 | #define AR71XX_GPIO_REG_INT_PENDING 0x20 | ||
226 | #define AR71XX_GPIO_REG_INT_ENABLE 0x24 | ||
227 | #define AR71XX_GPIO_REG_FUNC 0x28 | ||
228 | |||
229 | #define AR71XX_GPIO_COUNT 16 | ||
230 | #define AR724X_GPIO_COUNT 18 | ||
231 | #define AR913X_GPIO_COUNT 22 | ||
232 | |||
233 | #endif /* __ASM_MACH_AR71XX_REGS_H */ | ||
diff --git a/arch/mips/include/asm/mach-ath79/ath79.h b/arch/mips/include/asm/mach-ath79/ath79.h new file mode 100644 index 000000000000..6a9f168506fe --- /dev/null +++ b/arch/mips/include/asm/mach-ath79/ath79.h | |||
@@ -0,0 +1,96 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X common definitions | ||
3 | * | ||
4 | * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
6 | * | ||
7 | * Parts of this file are based on Atheros' 2.6.15 BSP | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License version 2 as published | ||
11 | * by the Free Software Foundation. | ||
12 | */ | ||
13 | |||
14 | #ifndef __ASM_MACH_ATH79_H | ||
15 | #define __ASM_MACH_ATH79_H | ||
16 | |||
17 | #include <linux/types.h> | ||
18 | #include <linux/io.h> | ||
19 | |||
20 | enum ath79_soc_type { | ||
21 | ATH79_SOC_UNKNOWN, | ||
22 | ATH79_SOC_AR7130, | ||
23 | ATH79_SOC_AR7141, | ||
24 | ATH79_SOC_AR7161, | ||
25 | ATH79_SOC_AR7240, | ||
26 | ATH79_SOC_AR7241, | ||
27 | ATH79_SOC_AR7242, | ||
28 | ATH79_SOC_AR9130, | ||
29 | ATH79_SOC_AR9132 | ||
30 | }; | ||
31 | |||
32 | extern enum ath79_soc_type ath79_soc; | ||
33 | |||
34 | static inline int soc_is_ar71xx(void) | ||
35 | { | ||
36 | return (ath79_soc == ATH79_SOC_AR7130 || | ||
37 | ath79_soc == ATH79_SOC_AR7141 || | ||
38 | ath79_soc == ATH79_SOC_AR7161); | ||
39 | } | ||
40 | |||
41 | static inline int soc_is_ar724x(void) | ||
42 | { | ||
43 | return (ath79_soc == ATH79_SOC_AR7240 || | ||
44 | ath79_soc == ATH79_SOC_AR7241 || | ||
45 | ath79_soc == ATH79_SOC_AR7242); | ||
46 | } | ||
47 | |||
48 | static inline int soc_is_ar7240(void) | ||
49 | { | ||
50 | return (ath79_soc == ATH79_SOC_AR7240); | ||
51 | } | ||
52 | |||
53 | static inline int soc_is_ar7241(void) | ||
54 | { | ||
55 | return (ath79_soc == ATH79_SOC_AR7241); | ||
56 | } | ||
57 | |||
58 | static inline int soc_is_ar7242(void) | ||
59 | { | ||
60 | return (ath79_soc == ATH79_SOC_AR7242); | ||
61 | } | ||
62 | |||
63 | static inline int soc_is_ar913x(void) | ||
64 | { | ||
65 | return (ath79_soc == ATH79_SOC_AR9130 || | ||
66 | ath79_soc == ATH79_SOC_AR9132); | ||
67 | } | ||
68 | |||
69 | extern void __iomem *ath79_ddr_base; | ||
70 | extern void __iomem *ath79_pll_base; | ||
71 | extern void __iomem *ath79_reset_base; | ||
72 | |||
73 | static inline void ath79_pll_wr(unsigned reg, u32 val) | ||
74 | { | ||
75 | __raw_writel(val, ath79_pll_base + reg); | ||
76 | } | ||
77 | |||
78 | static inline u32 ath79_pll_rr(unsigned reg) | ||
79 | { | ||
80 | return __raw_readl(ath79_pll_base + reg); | ||
81 | } | ||
82 | |||
83 | static inline void ath79_reset_wr(unsigned reg, u32 val) | ||
84 | { | ||
85 | __raw_writel(val, ath79_reset_base + reg); | ||
86 | } | ||
87 | |||
88 | static inline u32 ath79_reset_rr(unsigned reg) | ||
89 | { | ||
90 | return __raw_readl(ath79_reset_base + reg); | ||
91 | } | ||
92 | |||
93 | void ath79_device_reset_set(u32 mask); | ||
94 | void ath79_device_reset_clear(u32 mask); | ||
95 | |||
96 | #endif /* __ASM_MACH_ATH79_H */ | ||
diff --git a/arch/mips/include/asm/mach-ath79/ath79_spi_platform.h b/arch/mips/include/asm/mach-ath79/ath79_spi_platform.h new file mode 100644 index 000000000000..aa2283e602fc --- /dev/null +++ b/arch/mips/include/asm/mach-ath79/ath79_spi_platform.h | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * Platform data definition for Atheros AR71XX/AR724X/AR913X SPI controller | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License version 2 as published | ||
8 | * by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #ifndef _ATH79_SPI_PLATFORM_H | ||
12 | #define _ATH79_SPI_PLATFORM_H | ||
13 | |||
14 | struct ath79_spi_platform_data { | ||
15 | unsigned bus_num; | ||
16 | unsigned num_chipselect; | ||
17 | }; | ||
18 | |||
19 | struct ath79_spi_controller_data { | ||
20 | unsigned gpio; | ||
21 | }; | ||
22 | |||
23 | #endif /* _ATH79_SPI_PLATFORM_H */ | ||
diff --git a/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h b/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h new file mode 100644 index 000000000000..4476fa03bf36 --- /dev/null +++ b/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h | |||
@@ -0,0 +1,56 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X specific CPU feature overrides | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
6 | * | ||
7 | * This file was derived from: include/asm-mips/cpu-features.h | ||
8 | * Copyright (C) 2003, 2004 Ralf Baechle | ||
9 | * Copyright (C) 2004 Maciej W. Rozycki | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify it | ||
12 | * under the terms of the GNU General Public License version 2 as published | ||
13 | * by the Free Software Foundation. | ||
14 | * | ||
15 | */ | ||
16 | #ifndef __ASM_MACH_ATH79_CPU_FEATURE_OVERRIDES_H | ||
17 | #define __ASM_MACH_ATH79_CPU_FEATURE_OVERRIDES_H | ||
18 | |||
19 | #define cpu_has_tlb 1 | ||
20 | #define cpu_has_4kex 1 | ||
21 | #define cpu_has_3k_cache 0 | ||
22 | #define cpu_has_4k_cache 1 | ||
23 | #define cpu_has_tx39_cache 0 | ||
24 | #define cpu_has_sb1_cache 0 | ||
25 | #define cpu_has_fpu 0 | ||
26 | #define cpu_has_32fpr 0 | ||
27 | #define cpu_has_counter 1 | ||
28 | #define cpu_has_watch 1 | ||
29 | #define cpu_has_divec 1 | ||
30 | |||
31 | #define cpu_has_prefetch 1 | ||
32 | #define cpu_has_ejtag 1 | ||
33 | #define cpu_has_llsc 1 | ||
34 | |||
35 | #define cpu_has_mips16 1 | ||
36 | #define cpu_has_mdmx 0 | ||
37 | #define cpu_has_mips3d 0 | ||
38 | #define cpu_has_smartmips 0 | ||
39 | |||
40 | #define cpu_has_mips32r1 1 | ||
41 | #define cpu_has_mips32r2 1 | ||
42 | #define cpu_has_mips64r1 0 | ||
43 | #define cpu_has_mips64r2 0 | ||
44 | |||
45 | #define cpu_has_dsp 0 | ||
46 | #define cpu_has_mipsmt 0 | ||
47 | |||
48 | #define cpu_has_64bits 0 | ||
49 | #define cpu_has_64bit_zero_reg 0 | ||
50 | #define cpu_has_64bit_gp_regs 0 | ||
51 | #define cpu_has_64bit_addresses 0 | ||
52 | |||
53 | #define cpu_dcache_line_size() 32 | ||
54 | #define cpu_icache_line_size() 32 | ||
55 | |||
56 | #endif /* __ASM_MACH_ATH79_CPU_FEATURE_OVERRIDES_H */ | ||
diff --git a/arch/mips/include/asm/mach-ath79/gpio.h b/arch/mips/include/asm/mach-ath79/gpio.h new file mode 100644 index 000000000000..60dcb62785b4 --- /dev/null +++ b/arch/mips/include/asm/mach-ath79/gpio.h | |||
@@ -0,0 +1,26 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X GPIO API definitions | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
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 version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_MACH_ATH79_GPIO_H | ||
14 | #define __ASM_MACH_ATH79_GPIO_H | ||
15 | |||
16 | #define ARCH_NR_GPIOS 64 | ||
17 | #include <asm-generic/gpio.h> | ||
18 | |||
19 | int gpio_to_irq(unsigned gpio); | ||
20 | int irq_to_gpio(unsigned irq); | ||
21 | int gpio_get_value(unsigned gpio); | ||
22 | void gpio_set_value(unsigned gpio, int value); | ||
23 | |||
24 | #define gpio_cansleep __gpio_cansleep | ||
25 | |||
26 | #endif /* __ASM_MACH_ATH79_GPIO_H */ | ||
diff --git a/arch/mips/include/asm/mach-ath79/irq.h b/arch/mips/include/asm/mach-ath79/irq.h new file mode 100644 index 000000000000..189bc6eb9c10 --- /dev/null +++ b/arch/mips/include/asm/mach-ath79/irq.h | |||
@@ -0,0 +1,36 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
3 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License version 2 as published | ||
7 | * by the Free Software Foundation. | ||
8 | */ | ||
9 | #ifndef __ASM_MACH_ATH79_IRQ_H | ||
10 | #define __ASM_MACH_ATH79_IRQ_H | ||
11 | |||
12 | #define MIPS_CPU_IRQ_BASE 0 | ||
13 | #define NR_IRQS 16 | ||
14 | |||
15 | #define ATH79_MISC_IRQ_BASE 8 | ||
16 | #define ATH79_MISC_IRQ_COUNT 8 | ||
17 | |||
18 | #define ATH79_CPU_IRQ_IP2 (MIPS_CPU_IRQ_BASE + 2) | ||
19 | #define ATH79_CPU_IRQ_USB (MIPS_CPU_IRQ_BASE + 3) | ||
20 | #define ATH79_CPU_IRQ_GE0 (MIPS_CPU_IRQ_BASE + 4) | ||
21 | #define ATH79_CPU_IRQ_GE1 (MIPS_CPU_IRQ_BASE + 5) | ||
22 | #define ATH79_CPU_IRQ_MISC (MIPS_CPU_IRQ_BASE + 6) | ||
23 | #define ATH79_CPU_IRQ_TIMER (MIPS_CPU_IRQ_BASE + 7) | ||
24 | |||
25 | #define ATH79_MISC_IRQ_TIMER (ATH79_MISC_IRQ_BASE + 0) | ||
26 | #define ATH79_MISC_IRQ_ERROR (ATH79_MISC_IRQ_BASE + 1) | ||
27 | #define ATH79_MISC_IRQ_GPIO (ATH79_MISC_IRQ_BASE + 2) | ||
28 | #define ATH79_MISC_IRQ_UART (ATH79_MISC_IRQ_BASE + 3) | ||
29 | #define ATH79_MISC_IRQ_WDOG (ATH79_MISC_IRQ_BASE + 4) | ||
30 | #define ATH79_MISC_IRQ_PERFC (ATH79_MISC_IRQ_BASE + 5) | ||
31 | #define ATH79_MISC_IRQ_OHCI (ATH79_MISC_IRQ_BASE + 6) | ||
32 | #define ATH79_MISC_IRQ_DMA (ATH79_MISC_IRQ_BASE + 7) | ||
33 | |||
34 | #include_next <irq.h> | ||
35 | |||
36 | #endif /* __ASM_MACH_ATH79_IRQ_H */ | ||
diff --git a/arch/mips/include/asm/mach-ath79/kernel-entry-init.h b/arch/mips/include/asm/mach-ath79/kernel-entry-init.h new file mode 100644 index 000000000000..d8d046bccc8e --- /dev/null +++ b/arch/mips/include/asm/mach-ath79/kernel-entry-init.h | |||
@@ -0,0 +1,32 @@ | |||
1 | /* | ||
2 | * Atheros AR71XX/AR724X/AR913X specific kernel entry setup | ||
3 | * | ||
4 | * Copyright (C) 2009 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License version 2 as published | ||
8 | * by the Free Software Foundation. | ||
9 | * | ||
10 | */ | ||
11 | #ifndef __ASM_MACH_ATH79_KERNEL_ENTRY_H | ||
12 | #define __ASM_MACH_ATH79_KERNEL_ENTRY_H | ||
13 | |||
14 | /* | ||
15 | * Some bootloaders set the 'Kseg0 coherency algorithm' to | ||
16 | * 'Cacheable, noncoherent, write-through, no write allocate' | ||
17 | * and this cause performance issues. Let's go and change it to | ||
18 | * 'Cacheable, noncoherent, write-back, write allocate' | ||
19 | */ | ||
20 | .macro kernel_entry_setup | ||
21 | mfc0 t0, CP0_CONFIG | ||
22 | li t1, ~CONF_CM_CMASK | ||
23 | and t0, t1 | ||
24 | ori t0, CONF_CM_CACHABLE_NONCOHERENT | ||
25 | mtc0 t0, CP0_CONFIG | ||
26 | nop | ||
27 | .endm | ||
28 | |||
29 | .macro smp_slave_setup | ||
30 | .endm | ||
31 | |||
32 | #endif /* __ASM_MACH_ATH79_KERNEL_ENTRY_H */ | ||
diff --git a/arch/mips/include/asm/mach-ath79/war.h b/arch/mips/include/asm/mach-ath79/war.h new file mode 100644 index 000000000000..323d9f1d8c45 --- /dev/null +++ b/arch/mips/include/asm/mach-ath79/war.h | |||
@@ -0,0 +1,25 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Copyright (C) 2002, 2004, 2007 by Ralf Baechle <ralf@linux-mips.org> | ||
7 | */ | ||
8 | #ifndef __ASM_MACH_ATH79_WAR_H | ||
9 | #define __ASM_MACH_ATH79_WAR_H | ||
10 | |||
11 | #define R4600_V1_INDEX_ICACHEOP_WAR 0 | ||
12 | #define R4600_V1_HIT_CACHEOP_WAR 0 | ||
13 | #define R4600_V2_HIT_CACHEOP_WAR 0 | ||
14 | #define R5432_CP0_INTERRUPT_WAR 0 | ||
15 | #define BCM1250_M3_WAR 0 | ||
16 | #define SIBYTE_1956_WAR 0 | ||
17 | #define MIPS4K_ICACHE_REFILL_WAR 0 | ||
18 | #define MIPS_CACHE_SYNC_WAR 0 | ||
19 | #define TX49XX_ICACHE_INDEX_INV_WAR 0 | ||
20 | #define RM9000_CDEX_SMP_WAR 0 | ||
21 | #define ICACHE_REFILLS_WORKAROUND_WAR 0 | ||
22 | #define R10000_LLSC_WAR 0 | ||
23 | #define MIPS34K_MISSED_ITLB_WAR 0 | ||
24 | |||
25 | #endif /* __ASM_MACH_ATH79_WAR_H */ | ||
diff --git a/arch/mips/include/asm/mips_machine.h b/arch/mips/include/asm/mips_machine.h new file mode 100644 index 000000000000..363bb352c7f7 --- /dev/null +++ b/arch/mips/include/asm/mips_machine.h | |||
@@ -0,0 +1,54 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms of the GNU General Public License version 2 as published | ||
6 | * by the Free Software Foundation. | ||
7 | * | ||
8 | */ | ||
9 | |||
10 | #ifndef __ASM_MIPS_MACHINE_H | ||
11 | #define __ASM_MIPS_MACHINE_H | ||
12 | |||
13 | #include <linux/init.h> | ||
14 | #include <linux/stddef.h> | ||
15 | |||
16 | #include <asm/bootinfo.h> | ||
17 | |||
18 | struct mips_machine { | ||
19 | unsigned long mach_type; | ||
20 | const char *mach_id; | ||
21 | const char *mach_name; | ||
22 | void (*mach_setup)(void); | ||
23 | }; | ||
24 | |||
25 | #define MIPS_MACHINE(_type, _id, _name, _setup) \ | ||
26 | static const char machine_name_##_type[] __initconst \ | ||
27 | __aligned(1) = _name; \ | ||
28 | static const char machine_id_##_type[] __initconst \ | ||
29 | __aligned(1) = _id; \ | ||
30 | static struct mips_machine machine_##_type \ | ||
31 | __used __section(.mips.machines.init) = \ | ||
32 | { \ | ||
33 | .mach_type = _type, \ | ||
34 | .mach_id = machine_id_##_type, \ | ||
35 | .mach_name = machine_name_##_type, \ | ||
36 | .mach_setup = _setup, \ | ||
37 | }; | ||
38 | |||
39 | extern long __mips_machines_start; | ||
40 | extern long __mips_machines_end; | ||
41 | |||
42 | #ifdef CONFIG_MIPS_MACHINE | ||
43 | int mips_machtype_setup(char *id) __init; | ||
44 | void mips_machine_setup(void) __init; | ||
45 | void mips_set_machine_name(const char *name) __init; | ||
46 | char *mips_get_machine_name(void); | ||
47 | #else | ||
48 | static inline int mips_machtype_setup(char *id) { return 1; } | ||
49 | static inline void mips_machine_setup(void) { } | ||
50 | static inline void mips_set_machine_name(const char *name) { } | ||
51 | static inline char *mips_get_machine_name(void) { return NULL; } | ||
52 | #endif /* CONFIG_MIPS_MACHINE */ | ||
53 | |||
54 | #endif /* __ASM_MIPS_MACHINE_H */ | ||
diff --git a/arch/mips/include/asm/mmu_context.h b/arch/mips/include/asm/mmu_context.h index d9592733a7ba..73c0d45798de 100644 --- a/arch/mips/include/asm/mmu_context.h +++ b/arch/mips/include/asm/mmu_context.h | |||
@@ -29,13 +29,7 @@ | |||
29 | #define TLBMISS_HANDLER_SETUP_PGD(pgd) \ | 29 | #define TLBMISS_HANDLER_SETUP_PGD(pgd) \ |
30 | tlbmiss_handler_setup_pgd((unsigned long)(pgd)) | 30 | tlbmiss_handler_setup_pgd((unsigned long)(pgd)) |
31 | 31 | ||
32 | static inline void tlbmiss_handler_setup_pgd(unsigned long pgd) | 32 | extern void tlbmiss_handler_setup_pgd(unsigned long pgd); |
33 | { | ||
34 | /* Check for swapper_pg_dir and convert to physical address. */ | ||
35 | if ((pgd & CKSEG3) == CKSEG0) | ||
36 | pgd = CPHYSADDR(pgd); | ||
37 | write_c0_context(pgd << 11); | ||
38 | } | ||
39 | 33 | ||
40 | #define TLBMISS_HANDLER_SETUP() \ | 34 | #define TLBMISS_HANDLER_SETUP() \ |
41 | do { \ | 35 | do { \ |
diff --git a/arch/mips/include/asm/uasm.h b/arch/mips/include/asm/uasm.h index 892062d6d748..dcbd4bb417ec 100644 --- a/arch/mips/include/asm/uasm.h +++ b/arch/mips/include/asm/uasm.h | |||
@@ -115,7 +115,12 @@ Ip_0(_tlbwr); | |||
115 | Ip_u3u1u2(_xor); | 115 | Ip_u3u1u2(_xor); |
116 | Ip_u2u1u3(_xori); | 116 | Ip_u2u1u3(_xori); |
117 | Ip_u2u1msbu3(_dins); | 117 | Ip_u2u1msbu3(_dins); |
118 | Ip_u2u1msbu3(_dinsm); | ||
118 | Ip_u1(_syscall); | 119 | Ip_u1(_syscall); |
120 | Ip_u1u2s3(_bbit0); | ||
121 | Ip_u1u2s3(_bbit1); | ||
122 | Ip_u3u1u2(_lwx); | ||
123 | Ip_u3u1u2(_ldx); | ||
119 | 124 | ||
120 | /* Handle labels. */ | 125 | /* Handle labels. */ |
121 | struct uasm_label { | 126 | struct uasm_label { |
@@ -153,6 +158,7 @@ static inline void __uasminit uasm_l##lb(struct uasm_label **lab, u32 *addr) \ | |||
153 | # define UASM_i_SUBU(buf, rs, rt, rd) uasm_i_dsubu(buf, rs, rt, rd) | 158 | # define UASM_i_SUBU(buf, rs, rt, rd) uasm_i_dsubu(buf, rs, rt, rd) |
154 | # define UASM_i_LL(buf, rs, rt, off) uasm_i_lld(buf, rs, rt, off) | 159 | # define UASM_i_LL(buf, rs, rt, off) uasm_i_lld(buf, rs, rt, off) |
155 | # define UASM_i_SC(buf, rs, rt, off) uasm_i_scd(buf, rs, rt, off) | 160 | # define UASM_i_SC(buf, rs, rt, off) uasm_i_scd(buf, rs, rt, off) |
161 | # define UASM_i_LWX(buf, rs, rt, rd) uasm_i_ldx(buf, rs, rt, rd) | ||
156 | #else | 162 | #else |
157 | # define UASM_i_LW(buf, rs, rt, off) uasm_i_lw(buf, rs, rt, off) | 163 | # define UASM_i_LW(buf, rs, rt, off) uasm_i_lw(buf, rs, rt, off) |
158 | # define UASM_i_SW(buf, rs, rt, off) uasm_i_sw(buf, rs, rt, off) | 164 | # define UASM_i_SW(buf, rs, rt, off) uasm_i_sw(buf, rs, rt, off) |
@@ -167,6 +173,7 @@ static inline void __uasminit uasm_l##lb(struct uasm_label **lab, u32 *addr) \ | |||
167 | # define UASM_i_SUBU(buf, rs, rt, rd) uasm_i_subu(buf, rs, rt, rd) | 173 | # define UASM_i_SUBU(buf, rs, rt, rd) uasm_i_subu(buf, rs, rt, rd) |
168 | # define UASM_i_LL(buf, rs, rt, off) uasm_i_ll(buf, rs, rt, off) | 174 | # define UASM_i_LL(buf, rs, rt, off) uasm_i_ll(buf, rs, rt, off) |
169 | # define UASM_i_SC(buf, rs, rt, off) uasm_i_sc(buf, rs, rt, off) | 175 | # define UASM_i_SC(buf, rs, rt, off) uasm_i_sc(buf, rs, rt, off) |
176 | # define UASM_i_LWX(buf, rs, rt, rd) uasm_i_lwx(buf, rs, rt, rd) | ||
170 | #endif | 177 | #endif |
171 | 178 | ||
172 | #define uasm_i_b(buf, off) uasm_i_beq(buf, 0, 0, off) | 179 | #define uasm_i_b(buf, off) uasm_i_beq(buf, 0, 0, off) |
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile index 22b2e0e38617..cedee2bcbd18 100644 --- a/arch/mips/kernel/Makefile +++ b/arch/mips/kernel/Makefile | |||
@@ -95,6 +95,7 @@ obj-$(CONFIG_GPIO_TXX9) += gpio_txx9.o | |||
95 | obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o | 95 | obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o |
96 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | 96 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o |
97 | obj-$(CONFIG_SPINLOCK_TEST) += spinlock_test.o | 97 | obj-$(CONFIG_SPINLOCK_TEST) += spinlock_test.o |
98 | obj-$(CONFIG_MIPS_MACHINE) += mips_machine.o | ||
98 | 99 | ||
99 | obj-$(CONFIG_OF) += prom.o | 100 | obj-$(CONFIG_OF) += prom.o |
100 | 101 | ||
@@ -106,4 +107,6 @@ obj-$(CONFIG_MIPS_CPUFREQ) += cpufreq/ | |||
106 | 107 | ||
107 | obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o | 108 | obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o |
108 | 109 | ||
110 | obj-$(CONFIG_JUMP_LABEL) += jump_label.o | ||
111 | |||
109 | CPPFLAGS_vmlinux.lds := $(KBUILD_CFLAGS) | 112 | CPPFLAGS_vmlinux.lds := $(KBUILD_CFLAGS) |
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index 68dae7b6b5db..f65d4c8c65a6 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
@@ -739,6 +739,8 @@ static inline unsigned int decode_config4(struct cpuinfo_mips *c) | |||
739 | && cpu_has_tlb) | 739 | && cpu_has_tlb) |
740 | c->tlbsize += (config4 & MIPS_CONF4_MMUSIZEEXT) * 0x40; | 740 | c->tlbsize += (config4 & MIPS_CONF4_MMUSIZEEXT) * 0x40; |
741 | 741 | ||
742 | c->kscratch_mask = (config4 >> 16) & 0xff; | ||
743 | |||
742 | return config4 & MIPS_CONF_M; | 744 | return config4 & MIPS_CONF_M; |
743 | } | 745 | } |
744 | 746 | ||
diff --git a/arch/mips/kernel/jump_label.c b/arch/mips/kernel/jump_label.c new file mode 100644 index 000000000000..6001610cfe55 --- /dev/null +++ b/arch/mips/kernel/jump_label.c | |||
@@ -0,0 +1,54 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Copyright (c) 2010 Cavium Networks, Inc. | ||
7 | */ | ||
8 | |||
9 | #include <linux/jump_label.h> | ||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/memory.h> | ||
12 | #include <linux/mutex.h> | ||
13 | #include <linux/types.h> | ||
14 | #include <linux/cpu.h> | ||
15 | |||
16 | #include <asm/cacheflush.h> | ||
17 | #include <asm/inst.h> | ||
18 | |||
19 | #ifdef HAVE_JUMP_LABEL | ||
20 | |||
21 | #define J_RANGE_MASK ((1ul << 28) - 1) | ||
22 | |||
23 | void arch_jump_label_transform(struct jump_entry *e, | ||
24 | enum jump_label_type type) | ||
25 | { | ||
26 | union mips_instruction insn; | ||
27 | union mips_instruction *insn_p = | ||
28 | (union mips_instruction *)(unsigned long)e->code; | ||
29 | |||
30 | /* Jump only works within a 256MB aligned region. */ | ||
31 | BUG_ON((e->target & ~J_RANGE_MASK) != (e->code & ~J_RANGE_MASK)); | ||
32 | |||
33 | /* Target must have 4 byte alignment. */ | ||
34 | BUG_ON((e->target & 3) != 0); | ||
35 | |||
36 | if (type == JUMP_LABEL_ENABLE) { | ||
37 | insn.j_format.opcode = j_op; | ||
38 | insn.j_format.target = (e->target & J_RANGE_MASK) >> 2; | ||
39 | } else { | ||
40 | insn.word = 0; /* nop */ | ||
41 | } | ||
42 | |||
43 | get_online_cpus(); | ||
44 | mutex_lock(&text_mutex); | ||
45 | *insn_p = insn; | ||
46 | |||
47 | flush_icache_range((unsigned long)insn_p, | ||
48 | (unsigned long)insn_p + sizeof(*insn_p)); | ||
49 | |||
50 | mutex_unlock(&text_mutex); | ||
51 | put_online_cpus(); | ||
52 | } | ||
53 | |||
54 | #endif /* HAVE_JUMP_LABEL */ | ||
diff --git a/arch/mips/kernel/mips_machine.c b/arch/mips/kernel/mips_machine.c new file mode 100644 index 000000000000..411a058d2c53 --- /dev/null +++ b/arch/mips/kernel/mips_machine.c | |||
@@ -0,0 +1,86 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms of the GNU General Public License version 2 as published | ||
6 | * by the Free Software Foundation. | ||
7 | * | ||
8 | */ | ||
9 | #include <linux/mm.h> | ||
10 | #include <linux/string.h> | ||
11 | #include <linux/slab.h> | ||
12 | |||
13 | #include <asm/mips_machine.h> | ||
14 | |||
15 | static struct mips_machine *mips_machine __initdata; | ||
16 | static char *mips_machine_name = "Unknown"; | ||
17 | |||
18 | #define for_each_machine(mach) \ | ||
19 | for ((mach) = (struct mips_machine *)&__mips_machines_start; \ | ||
20 | (mach) && \ | ||
21 | (unsigned long)(mach) < (unsigned long)&__mips_machines_end; \ | ||
22 | (mach)++) | ||
23 | |||
24 | __init void mips_set_machine_name(const char *name) | ||
25 | { | ||
26 | char *p; | ||
27 | |||
28 | if (name == NULL) | ||
29 | return; | ||
30 | |||
31 | p = kstrdup(name, GFP_KERNEL); | ||
32 | if (!p) | ||
33 | pr_err("MIPS: no memory for machine_name\n"); | ||
34 | |||
35 | mips_machine_name = p; | ||
36 | } | ||
37 | |||
38 | char *mips_get_machine_name(void) | ||
39 | { | ||
40 | return mips_machine_name; | ||
41 | } | ||
42 | |||
43 | __init int mips_machtype_setup(char *id) | ||
44 | { | ||
45 | struct mips_machine *mach; | ||
46 | |||
47 | for_each_machine(mach) { | ||
48 | if (mach->mach_id == NULL) | ||
49 | continue; | ||
50 | |||
51 | if (strcmp(mach->mach_id, id) == 0) { | ||
52 | mips_machtype = mach->mach_type; | ||
53 | return 0; | ||
54 | } | ||
55 | } | ||
56 | |||
57 | pr_err("MIPS: no machine found for id '%s', supported machines:\n", id); | ||
58 | pr_err("%-24s %s\n", "id", "name"); | ||
59 | for_each_machine(mach) | ||
60 | pr_err("%-24s %s\n", mach->mach_id, mach->mach_name); | ||
61 | |||
62 | return 1; | ||
63 | } | ||
64 | |||
65 | __setup("machtype=", mips_machtype_setup); | ||
66 | |||
67 | __init void mips_machine_setup(void) | ||
68 | { | ||
69 | struct mips_machine *mach; | ||
70 | |||
71 | for_each_machine(mach) { | ||
72 | if (mips_machtype == mach->mach_type) { | ||
73 | mips_machine = mach; | ||
74 | break; | ||
75 | } | ||
76 | } | ||
77 | |||
78 | if (!mips_machine) | ||
79 | return; | ||
80 | |||
81 | mips_set_machine_name(mips_machine->mach_name); | ||
82 | pr_info("MIPS: machine is %s\n", mips_machine_name); | ||
83 | |||
84 | if (mips_machine->mach_setup) | ||
85 | mips_machine->mach_setup(); | ||
86 | } | ||
diff --git a/arch/mips/kernel/module.c b/arch/mips/kernel/module.c index d87a72e9fac7..dd940b701963 100644 --- a/arch/mips/kernel/module.c +++ b/arch/mips/kernel/module.c | |||
@@ -30,6 +30,8 @@ | |||
30 | #include <linux/kernel.h> | 30 | #include <linux/kernel.h> |
31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
32 | #include <linux/spinlock.h> | 32 | #include <linux/spinlock.h> |
33 | #include <linux/jump_label.h> | ||
34 | |||
33 | #include <asm/pgtable.h> /* MODULE_START */ | 35 | #include <asm/pgtable.h> /* MODULE_START */ |
34 | 36 | ||
35 | struct mips_hi16 { | 37 | struct mips_hi16 { |
@@ -382,6 +384,9 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
382 | const Elf_Shdr *s; | 384 | const Elf_Shdr *s; |
383 | char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | 385 | char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; |
384 | 386 | ||
387 | /* Make jump label nops. */ | ||
388 | jump_label_apply_nops(me); | ||
389 | |||
385 | INIT_LIST_HEAD(&me->arch.dbe_list); | 390 | INIT_LIST_HEAD(&me->arch.dbe_list); |
386 | for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) { | 391 | for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) { |
387 | if (strcmp("__dbe_table", secstrings + s->sh_name) != 0) | 392 | if (strcmp("__dbe_table", secstrings + s->sh_name) != 0) |
diff --git a/arch/mips/kernel/proc.c b/arch/mips/kernel/proc.c index 26109c4d5170..e309665b6c81 100644 --- a/arch/mips/kernel/proc.c +++ b/arch/mips/kernel/proc.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <asm/cpu-features.h> | 12 | #include <asm/cpu-features.h> |
13 | #include <asm/mipsregs.h> | 13 | #include <asm/mipsregs.h> |
14 | #include <asm/processor.h> | 14 | #include <asm/processor.h> |
15 | #include <asm/mips_machine.h> | ||
15 | 16 | ||
16 | unsigned int vced_count, vcei_count; | 17 | unsigned int vced_count, vcei_count; |
17 | 18 | ||
@@ -31,8 +32,12 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
31 | /* | 32 | /* |
32 | * For the first processor also print the system type | 33 | * For the first processor also print the system type |
33 | */ | 34 | */ |
34 | if (n == 0) | 35 | if (n == 0) { |
35 | seq_printf(m, "system type\t\t: %s\n", get_system_type()); | 36 | seq_printf(m, "system type\t\t: %s\n", get_system_type()); |
37 | if (mips_get_machine_name()) | ||
38 | seq_printf(m, "machine\t\t\t: %s\n", | ||
39 | mips_get_machine_name()); | ||
40 | } | ||
36 | 41 | ||
37 | seq_printf(m, "processor\t\t: %ld\n", n); | 42 | seq_printf(m, "processor\t\t: %ld\n", n); |
38 | sprintf(fmt, "cpu model\t\t: %%s V%%d.%%d%s\n", | 43 | sprintf(fmt, "cpu model\t\t: %%s V%%d.%%d%s\n", |
@@ -69,6 +74,8 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
69 | ); | 74 | ); |
70 | seq_printf(m, "shadow register sets\t: %d\n", | 75 | seq_printf(m, "shadow register sets\t: %d\n", |
71 | cpu_data[n].srsets); | 76 | cpu_data[n].srsets); |
77 | seq_printf(m, "kscratch registers\t: %d\n", | ||
78 | hweight8(cpu_data[n].kscratch_mask)); | ||
72 | seq_printf(m, "core\t\t\t: %d\n", cpu_data[n].core); | 79 | seq_printf(m, "core\t\t\t: %d\n", cpu_data[n].core); |
73 | 80 | ||
74 | sprintf(fmt, "VCE%%c exceptions\t\t: %s\n", | 81 | sprintf(fmt, "VCE%%c exceptions\t\t: %s\n", |
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index acd3f2c49c06..8ad1d5679f14 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c | |||
@@ -70,7 +70,7 @@ static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; | |||
70 | * mips_io_port_base is the begin of the address space to which x86 style | 70 | * mips_io_port_base is the begin of the address space to which x86 style |
71 | * I/O ports are mapped. | 71 | * I/O ports are mapped. |
72 | */ | 72 | */ |
73 | const unsigned long mips_io_port_base __read_mostly = -1; | 73 | const unsigned long mips_io_port_base = -1; |
74 | EXPORT_SYMBOL(mips_io_port_base); | 74 | EXPORT_SYMBOL(mips_io_port_base); |
75 | 75 | ||
76 | static struct resource code_resource = { .name = "Kernel code", }; | 76 | static struct resource code_resource = { .name = "Kernel code", }; |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index e97104302541..71350f7f2d88 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -1592,7 +1592,6 @@ void __cpuinit per_cpu_trap_init(void) | |||
1592 | #endif /* CONFIG_MIPS_MT_SMTC */ | 1592 | #endif /* CONFIG_MIPS_MT_SMTC */ |
1593 | 1593 | ||
1594 | cpu_data[cpu].asid_cache = ASID_FIRST_VERSION; | 1594 | cpu_data[cpu].asid_cache = ASID_FIRST_VERSION; |
1595 | TLBMISS_HANDLER_SETUP(); | ||
1596 | 1595 | ||
1597 | atomic_inc(&init_mm.mm_count); | 1596 | atomic_inc(&init_mm.mm_count); |
1598 | current->active_mm = &init_mm; | 1597 | current->active_mm = &init_mm; |
@@ -1614,6 +1613,7 @@ void __cpuinit per_cpu_trap_init(void) | |||
1614 | write_c0_wired(0); | 1613 | write_c0_wired(0); |
1615 | } | 1614 | } |
1616 | #endif /* CONFIG_MIPS_MT_SMTC */ | 1615 | #endif /* CONFIG_MIPS_MT_SMTC */ |
1616 | TLBMISS_HANDLER_SETUP(); | ||
1617 | } | 1617 | } |
1618 | 1618 | ||
1619 | /* Install CPU exception handler */ | 1619 | /* Install CPU exception handler */ |
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index f25df73db923..570607b376b5 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S | |||
@@ -98,6 +98,13 @@ SECTIONS | |||
98 | INIT_TEXT_SECTION(PAGE_SIZE) | 98 | INIT_TEXT_SECTION(PAGE_SIZE) |
99 | INIT_DATA_SECTION(16) | 99 | INIT_DATA_SECTION(16) |
100 | 100 | ||
101 | . = ALIGN(4); | ||
102 | .mips.machines.init : AT(ADDR(.mips.machines.init) - LOAD_OFFSET) { | ||
103 | __mips_machines_start = .; | ||
104 | *(.mips.machines.init) | ||
105 | __mips_machines_end = .; | ||
106 | } | ||
107 | |||
101 | /* .exit.text is discarded at runtime, not link time, to deal with | 108 | /* .exit.text is discarded at runtime, not link time, to deal with |
102 | * references from .rodata | 109 | * references from .rodata |
103 | */ | 110 | */ |
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index 93816f3bca67..083d3412d0bc 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c | |||
@@ -26,8 +26,10 @@ | |||
26 | #include <linux/smp.h> | 26 | #include <linux/smp.h> |
27 | #include <linux/string.h> | 27 | #include <linux/string.h> |
28 | #include <linux/init.h> | 28 | #include <linux/init.h> |
29 | #include <linux/cache.h> | ||
29 | 30 | ||
30 | #include <asm/mmu_context.h> | 31 | #include <asm/cacheflush.h> |
32 | #include <asm/pgtable.h> | ||
31 | #include <asm/war.h> | 33 | #include <asm/war.h> |
32 | #include <asm/uasm.h> | 34 | #include <asm/uasm.h> |
33 | 35 | ||
@@ -63,6 +65,52 @@ static inline int __maybe_unused r10000_llsc_war(void) | |||
63 | return R10000_LLSC_WAR; | 65 | return R10000_LLSC_WAR; |
64 | } | 66 | } |
65 | 67 | ||
68 | static int use_bbit_insns(void) | ||
69 | { | ||
70 | switch (current_cpu_type()) { | ||
71 | case CPU_CAVIUM_OCTEON: | ||
72 | case CPU_CAVIUM_OCTEON_PLUS: | ||
73 | case CPU_CAVIUM_OCTEON2: | ||
74 | return 1; | ||
75 | default: | ||
76 | return 0; | ||
77 | } | ||
78 | } | ||
79 | |||
80 | static int use_lwx_insns(void) | ||
81 | { | ||
82 | switch (current_cpu_type()) { | ||
83 | case CPU_CAVIUM_OCTEON2: | ||
84 | return 1; | ||
85 | default: | ||
86 | return 0; | ||
87 | } | ||
88 | } | ||
89 | #if defined(CONFIG_CAVIUM_OCTEON_CVMSEG_SIZE) && \ | ||
90 | CONFIG_CAVIUM_OCTEON_CVMSEG_SIZE > 0 | ||
91 | static bool scratchpad_available(void) | ||
92 | { | ||
93 | return true; | ||
94 | } | ||
95 | static int scratchpad_offset(int i) | ||
96 | { | ||
97 | /* | ||
98 | * CVMSEG starts at address -32768 and extends for | ||
99 | * CAVIUM_OCTEON_CVMSEG_SIZE 128 byte cache lines. | ||
100 | */ | ||
101 | i += 1; /* Kernel use starts at the top and works down. */ | ||
102 | return CONFIG_CAVIUM_OCTEON_CVMSEG_SIZE * 128 - (8 * i) - 32768; | ||
103 | } | ||
104 | #else | ||
105 | static bool scratchpad_available(void) | ||
106 | { | ||
107 | return false; | ||
108 | } | ||
109 | static int scratchpad_offset(int i) | ||
110 | { | ||
111 | BUG(); | ||
112 | } | ||
113 | #endif | ||
66 | /* | 114 | /* |
67 | * Found by experiment: At least some revisions of the 4kc throw under | 115 | * Found by experiment: At least some revisions of the 4kc throw under |
68 | * some circumstances a machine check exception, triggered by invalid | 116 | * some circumstances a machine check exception, triggered by invalid |
@@ -173,11 +221,41 @@ static struct uasm_reloc relocs[128] __cpuinitdata; | |||
173 | static int check_for_high_segbits __cpuinitdata; | 221 | static int check_for_high_segbits __cpuinitdata; |
174 | #endif | 222 | #endif |
175 | 223 | ||
224 | static int check_for_high_segbits __cpuinitdata; | ||
225 | |||
226 | static unsigned int kscratch_used_mask __cpuinitdata; | ||
227 | |||
228 | static int __cpuinit allocate_kscratch(void) | ||
229 | { | ||
230 | int r; | ||
231 | unsigned int a = cpu_data[0].kscratch_mask & ~kscratch_used_mask; | ||
232 | |||
233 | r = ffs(a); | ||
234 | |||
235 | if (r == 0) | ||
236 | return -1; | ||
237 | |||
238 | r--; /* make it zero based */ | ||
239 | |||
240 | kscratch_used_mask |= (1 << r); | ||
241 | |||
242 | return r; | ||
243 | } | ||
244 | |||
245 | static int scratch_reg __cpuinitdata; | ||
246 | static int pgd_reg __cpuinitdata; | ||
247 | enum vmalloc64_mode {not_refill, refill_scratch, refill_noscratch}; | ||
248 | |||
176 | #ifndef CONFIG_MIPS_PGD_C0_CONTEXT | 249 | #ifndef CONFIG_MIPS_PGD_C0_CONTEXT |
250 | |||
177 | /* | 251 | /* |
178 | * CONFIG_MIPS_PGD_C0_CONTEXT implies 64 bit and lack of pgd_current, | 252 | * CONFIG_MIPS_PGD_C0_CONTEXT implies 64 bit and lack of pgd_current, |
179 | * we cannot do r3000 under these circumstances. | 253 | * we cannot do r3000 under these circumstances. |
254 | * | ||
255 | * Declare pgd_current here instead of including mmu_context.h to avoid type | ||
256 | * conflicts for tlbmiss_handler_setup_pgd | ||
180 | */ | 257 | */ |
258 | extern unsigned long pgd_current[]; | ||
181 | 259 | ||
182 | /* | 260 | /* |
183 | * The R3000 TLB handler is simple. | 261 | * The R3000 TLB handler is simple. |
@@ -440,21 +518,43 @@ static __cpuinit __maybe_unused void build_convert_pte_to_entrylo(u32 **p, | |||
440 | static __cpuinit void build_restore_pagemask(u32 **p, | 518 | static __cpuinit void build_restore_pagemask(u32 **p, |
441 | struct uasm_reloc **r, | 519 | struct uasm_reloc **r, |
442 | unsigned int tmp, | 520 | unsigned int tmp, |
443 | enum label_id lid) | 521 | enum label_id lid, |
522 | int restore_scratch) | ||
444 | { | 523 | { |
445 | /* Reset default page size */ | 524 | if (restore_scratch) { |
446 | if (PM_DEFAULT_MASK >> 16) { | 525 | /* Reset default page size */ |
447 | uasm_i_lui(p, tmp, PM_DEFAULT_MASK >> 16); | 526 | if (PM_DEFAULT_MASK >> 16) { |
448 | uasm_i_ori(p, tmp, tmp, PM_DEFAULT_MASK & 0xffff); | 527 | uasm_i_lui(p, tmp, PM_DEFAULT_MASK >> 16); |
449 | uasm_il_b(p, r, lid); | 528 | uasm_i_ori(p, tmp, tmp, PM_DEFAULT_MASK & 0xffff); |
450 | uasm_i_mtc0(p, tmp, C0_PAGEMASK); | 529 | uasm_i_mtc0(p, tmp, C0_PAGEMASK); |
451 | } else if (PM_DEFAULT_MASK) { | 530 | uasm_il_b(p, r, lid); |
452 | uasm_i_ori(p, tmp, 0, PM_DEFAULT_MASK); | 531 | } else if (PM_DEFAULT_MASK) { |
453 | uasm_il_b(p, r, lid); | 532 | uasm_i_ori(p, tmp, 0, PM_DEFAULT_MASK); |
454 | uasm_i_mtc0(p, tmp, C0_PAGEMASK); | 533 | uasm_i_mtc0(p, tmp, C0_PAGEMASK); |
534 | uasm_il_b(p, r, lid); | ||
535 | } else { | ||
536 | uasm_i_mtc0(p, 0, C0_PAGEMASK); | ||
537 | uasm_il_b(p, r, lid); | ||
538 | } | ||
539 | if (scratch_reg > 0) | ||
540 | UASM_i_MFC0(p, 1, 31, scratch_reg); | ||
541 | else | ||
542 | UASM_i_LW(p, 1, scratchpad_offset(0), 0); | ||
455 | } else { | 543 | } else { |
456 | uasm_il_b(p, r, lid); | 544 | /* Reset default page size */ |
457 | uasm_i_mtc0(p, 0, C0_PAGEMASK); | 545 | if (PM_DEFAULT_MASK >> 16) { |
546 | uasm_i_lui(p, tmp, PM_DEFAULT_MASK >> 16); | ||
547 | uasm_i_ori(p, tmp, tmp, PM_DEFAULT_MASK & 0xffff); | ||
548 | uasm_il_b(p, r, lid); | ||
549 | uasm_i_mtc0(p, tmp, C0_PAGEMASK); | ||
550 | } else if (PM_DEFAULT_MASK) { | ||
551 | uasm_i_ori(p, tmp, 0, PM_DEFAULT_MASK); | ||
552 | uasm_il_b(p, r, lid); | ||
553 | uasm_i_mtc0(p, tmp, C0_PAGEMASK); | ||
554 | } else { | ||
555 | uasm_il_b(p, r, lid); | ||
556 | uasm_i_mtc0(p, 0, C0_PAGEMASK); | ||
557 | } | ||
458 | } | 558 | } |
459 | } | 559 | } |
460 | 560 | ||
@@ -462,7 +562,8 @@ static __cpuinit void build_huge_tlb_write_entry(u32 **p, | |||
462 | struct uasm_label **l, | 562 | struct uasm_label **l, |
463 | struct uasm_reloc **r, | 563 | struct uasm_reloc **r, |
464 | unsigned int tmp, | 564 | unsigned int tmp, |
465 | enum tlb_write_entry wmode) | 565 | enum tlb_write_entry wmode, |
566 | int restore_scratch) | ||
466 | { | 567 | { |
467 | /* Set huge page tlb entry size */ | 568 | /* Set huge page tlb entry size */ |
468 | uasm_i_lui(p, tmp, PM_HUGE_MASK >> 16); | 569 | uasm_i_lui(p, tmp, PM_HUGE_MASK >> 16); |
@@ -471,7 +572,7 @@ static __cpuinit void build_huge_tlb_write_entry(u32 **p, | |||
471 | 572 | ||
472 | build_tlb_write_entry(p, l, r, wmode); | 573 | build_tlb_write_entry(p, l, r, wmode); |
473 | 574 | ||
474 | build_restore_pagemask(p, r, tmp, label_leave); | 575 | build_restore_pagemask(p, r, tmp, label_leave, restore_scratch); |
475 | } | 576 | } |
476 | 577 | ||
477 | /* | 578 | /* |
@@ -482,8 +583,12 @@ build_is_huge_pte(u32 **p, struct uasm_reloc **r, unsigned int tmp, | |||
482 | unsigned int pmd, int lid) | 583 | unsigned int pmd, int lid) |
483 | { | 584 | { |
484 | UASM_i_LW(p, tmp, 0, pmd); | 585 | UASM_i_LW(p, tmp, 0, pmd); |
485 | uasm_i_andi(p, tmp, tmp, _PAGE_HUGE); | 586 | if (use_bbit_insns()) { |
486 | uasm_il_bnez(p, r, tmp, lid); | 587 | uasm_il_bbit1(p, r, tmp, ilog2(_PAGE_HUGE), lid); |
588 | } else { | ||
589 | uasm_i_andi(p, tmp, tmp, _PAGE_HUGE); | ||
590 | uasm_il_bnez(p, r, tmp, lid); | ||
591 | } | ||
487 | } | 592 | } |
488 | 593 | ||
489 | static __cpuinit void build_huge_update_entries(u32 **p, | 594 | static __cpuinit void build_huge_update_entries(u32 **p, |
@@ -532,7 +637,7 @@ static __cpuinit void build_huge_handler_tail(u32 **p, | |||
532 | UASM_i_SW(p, pte, 0, ptr); | 637 | UASM_i_SW(p, pte, 0, ptr); |
533 | #endif | 638 | #endif |
534 | build_huge_update_entries(p, pte, ptr); | 639 | build_huge_update_entries(p, pte, ptr); |
535 | build_huge_tlb_write_entry(p, l, r, pte, tlb_indexed); | 640 | build_huge_tlb_write_entry(p, l, r, pte, tlb_indexed, 0); |
536 | } | 641 | } |
537 | #endif /* CONFIG_HUGETLB_PAGE */ | 642 | #endif /* CONFIG_HUGETLB_PAGE */ |
538 | 643 | ||
@@ -573,13 +678,22 @@ build_get_pmde64(u32 **p, struct uasm_label **l, struct uasm_reloc **r, | |||
573 | /* No uasm_i_nop needed here, since the next insn doesn't touch TMP. */ | 678 | /* No uasm_i_nop needed here, since the next insn doesn't touch TMP. */ |
574 | 679 | ||
575 | #ifdef CONFIG_MIPS_PGD_C0_CONTEXT | 680 | #ifdef CONFIG_MIPS_PGD_C0_CONTEXT |
576 | /* | 681 | if (pgd_reg != -1) { |
577 | * &pgd << 11 stored in CONTEXT [23..63]. | 682 | /* pgd is in pgd_reg */ |
578 | */ | 683 | UASM_i_MFC0(p, ptr, 31, pgd_reg); |
579 | UASM_i_MFC0(p, ptr, C0_CONTEXT); | 684 | } else { |
580 | uasm_i_dins(p, ptr, 0, 0, 23); /* Clear lower 23 bits of context. */ | 685 | /* |
581 | uasm_i_ori(p, ptr, ptr, 0x540); /* 1 0 1 0 1 << 6 xkphys cached */ | 686 | * &pgd << 11 stored in CONTEXT [23..63]. |
582 | uasm_i_drotr(p, ptr, ptr, 11); | 687 | */ |
688 | UASM_i_MFC0(p, ptr, C0_CONTEXT); | ||
689 | |||
690 | /* Clear lower 23 bits of context. */ | ||
691 | uasm_i_dins(p, ptr, 0, 0, 23); | ||
692 | |||
693 | /* 1 0 1 0 1 << 6 xkphys cached */ | ||
694 | uasm_i_ori(p, ptr, ptr, 0x540); | ||
695 | uasm_i_drotr(p, ptr, ptr, 11); | ||
696 | } | ||
583 | #elif defined(CONFIG_SMP) | 697 | #elif defined(CONFIG_SMP) |
584 | # ifdef CONFIG_MIPS_MT_SMTC | 698 | # ifdef CONFIG_MIPS_MT_SMTC |
585 | /* | 699 | /* |
@@ -620,7 +734,6 @@ build_get_pmde64(u32 **p, struct uasm_label **l, struct uasm_reloc **r, | |||
620 | #endif | 734 | #endif |
621 | } | 735 | } |
622 | 736 | ||
623 | enum vmalloc64_mode {not_refill, refill}; | ||
624 | /* | 737 | /* |
625 | * BVADDR is the faulting address, PTR is scratch. | 738 | * BVADDR is the faulting address, PTR is scratch. |
626 | * PTR will hold the pgd for vmalloc. | 739 | * PTR will hold the pgd for vmalloc. |
@@ -638,7 +751,7 @@ build_get_pgd_vmalloc64(u32 **p, struct uasm_label **l, struct uasm_reloc **r, | |||
638 | 751 | ||
639 | uasm_l_vmalloc(l, *p); | 752 | uasm_l_vmalloc(l, *p); |
640 | 753 | ||
641 | if (mode == refill && check_for_high_segbits) { | 754 | if (mode != not_refill && check_for_high_segbits) { |
642 | if (single_insn_swpd) { | 755 | if (single_insn_swpd) { |
643 | uasm_il_bltz(p, r, bvaddr, label_vmalloc_done); | 756 | uasm_il_bltz(p, r, bvaddr, label_vmalloc_done); |
644 | uasm_i_lui(p, ptr, uasm_rel_hi(swpd)); | 757 | uasm_i_lui(p, ptr, uasm_rel_hi(swpd)); |
@@ -661,7 +774,7 @@ build_get_pgd_vmalloc64(u32 **p, struct uasm_label **l, struct uasm_reloc **r, | |||
661 | uasm_i_daddiu(p, ptr, ptr, uasm_rel_lo(swpd)); | 774 | uasm_i_daddiu(p, ptr, ptr, uasm_rel_lo(swpd)); |
662 | } | 775 | } |
663 | } | 776 | } |
664 | if (mode == refill && check_for_high_segbits) { | 777 | if (mode != not_refill && check_for_high_segbits) { |
665 | uasm_l_large_segbits_fault(l, *p); | 778 | uasm_l_large_segbits_fault(l, *p); |
666 | /* | 779 | /* |
667 | * We get here if we are an xsseg address, or if we are | 780 | * We get here if we are an xsseg address, or if we are |
@@ -677,7 +790,15 @@ build_get_pgd_vmalloc64(u32 **p, struct uasm_label **l, struct uasm_reloc **r, | |||
677 | */ | 790 | */ |
678 | UASM_i_LA(p, ptr, (unsigned long)tlb_do_page_fault_0); | 791 | UASM_i_LA(p, ptr, (unsigned long)tlb_do_page_fault_0); |
679 | uasm_i_jr(p, ptr); | 792 | uasm_i_jr(p, ptr); |
680 | uasm_i_nop(p); | 793 | |
794 | if (mode == refill_scratch) { | ||
795 | if (scratch_reg > 0) | ||
796 | UASM_i_MFC0(p, 1, 31, scratch_reg); | ||
797 | else | ||
798 | UASM_i_LW(p, 1, scratchpad_offset(0), 0); | ||
799 | } else { | ||
800 | uasm_i_nop(p); | ||
801 | } | ||
681 | } | 802 | } |
682 | } | 803 | } |
683 | 804 | ||
@@ -834,6 +955,185 @@ static void __cpuinit build_update_entries(u32 **p, unsigned int tmp, | |||
834 | #endif | 955 | #endif |
835 | } | 956 | } |
836 | 957 | ||
958 | struct mips_huge_tlb_info { | ||
959 | int huge_pte; | ||
960 | int restore_scratch; | ||
961 | }; | ||
962 | |||
963 | static struct mips_huge_tlb_info __cpuinit | ||
964 | build_fast_tlb_refill_handler (u32 **p, struct uasm_label **l, | ||
965 | struct uasm_reloc **r, unsigned int tmp, | ||
966 | unsigned int ptr, int c0_scratch) | ||
967 | { | ||
968 | struct mips_huge_tlb_info rv; | ||
969 | unsigned int even, odd; | ||
970 | int vmalloc_branch_delay_filled = 0; | ||
971 | const int scratch = 1; /* Our extra working register */ | ||
972 | |||
973 | rv.huge_pte = scratch; | ||
974 | rv.restore_scratch = 0; | ||
975 | |||
976 | if (check_for_high_segbits) { | ||
977 | UASM_i_MFC0(p, tmp, C0_BADVADDR); | ||
978 | |||
979 | if (pgd_reg != -1) | ||
980 | UASM_i_MFC0(p, ptr, 31, pgd_reg); | ||
981 | else | ||
982 | UASM_i_MFC0(p, ptr, C0_CONTEXT); | ||
983 | |||
984 | if (c0_scratch >= 0) | ||
985 | UASM_i_MTC0(p, scratch, 31, c0_scratch); | ||
986 | else | ||
987 | UASM_i_SW(p, scratch, scratchpad_offset(0), 0); | ||
988 | |||
989 | uasm_i_dsrl_safe(p, scratch, tmp, | ||
990 | PGDIR_SHIFT + PGD_ORDER + PAGE_SHIFT - 3); | ||
991 | uasm_il_bnez(p, r, scratch, label_vmalloc); | ||
992 | |||
993 | if (pgd_reg == -1) { | ||
994 | vmalloc_branch_delay_filled = 1; | ||
995 | /* Clear lower 23 bits of context. */ | ||
996 | uasm_i_dins(p, ptr, 0, 0, 23); | ||
997 | } | ||
998 | } else { | ||
999 | if (pgd_reg != -1) | ||
1000 | UASM_i_MFC0(p, ptr, 31, pgd_reg); | ||
1001 | else | ||
1002 | UASM_i_MFC0(p, ptr, C0_CONTEXT); | ||
1003 | |||
1004 | UASM_i_MFC0(p, tmp, C0_BADVADDR); | ||
1005 | |||
1006 | if (c0_scratch >= 0) | ||
1007 | UASM_i_MTC0(p, scratch, 31, c0_scratch); | ||
1008 | else | ||
1009 | UASM_i_SW(p, scratch, scratchpad_offset(0), 0); | ||
1010 | |||
1011 | if (pgd_reg == -1) | ||
1012 | /* Clear lower 23 bits of context. */ | ||
1013 | uasm_i_dins(p, ptr, 0, 0, 23); | ||
1014 | |||
1015 | uasm_il_bltz(p, r, tmp, label_vmalloc); | ||
1016 | } | ||
1017 | |||
1018 | if (pgd_reg == -1) { | ||
1019 | vmalloc_branch_delay_filled = 1; | ||
1020 | /* 1 0 1 0 1 << 6 xkphys cached */ | ||
1021 | uasm_i_ori(p, ptr, ptr, 0x540); | ||
1022 | uasm_i_drotr(p, ptr, ptr, 11); | ||
1023 | } | ||
1024 | |||
1025 | #ifdef __PAGETABLE_PMD_FOLDED | ||
1026 | #define LOC_PTEP scratch | ||
1027 | #else | ||
1028 | #define LOC_PTEP ptr | ||
1029 | #endif | ||
1030 | |||
1031 | if (!vmalloc_branch_delay_filled) | ||
1032 | /* get pgd offset in bytes */ | ||
1033 | uasm_i_dsrl_safe(p, scratch, tmp, PGDIR_SHIFT - 3); | ||
1034 | |||
1035 | uasm_l_vmalloc_done(l, *p); | ||
1036 | |||
1037 | /* | ||
1038 | * tmp ptr | ||
1039 | * fall-through case = badvaddr *pgd_current | ||
1040 | * vmalloc case = badvaddr swapper_pg_dir | ||
1041 | */ | ||
1042 | |||
1043 | if (vmalloc_branch_delay_filled) | ||
1044 | /* get pgd offset in bytes */ | ||
1045 | uasm_i_dsrl_safe(p, scratch, tmp, PGDIR_SHIFT - 3); | ||
1046 | |||
1047 | #ifdef __PAGETABLE_PMD_FOLDED | ||
1048 | GET_CONTEXT(p, tmp); /* get context reg */ | ||
1049 | #endif | ||
1050 | uasm_i_andi(p, scratch, scratch, (PTRS_PER_PGD - 1) << 3); | ||
1051 | |||
1052 | if (use_lwx_insns()) { | ||
1053 | UASM_i_LWX(p, LOC_PTEP, scratch, ptr); | ||
1054 | } else { | ||
1055 | uasm_i_daddu(p, ptr, ptr, scratch); /* add in pgd offset */ | ||
1056 | uasm_i_ld(p, LOC_PTEP, 0, ptr); /* get pmd pointer */ | ||
1057 | } | ||
1058 | |||
1059 | #ifndef __PAGETABLE_PMD_FOLDED | ||
1060 | /* get pmd offset in bytes */ | ||
1061 | uasm_i_dsrl_safe(p, scratch, tmp, PMD_SHIFT - 3); | ||
1062 | uasm_i_andi(p, scratch, scratch, (PTRS_PER_PMD - 1) << 3); | ||
1063 | GET_CONTEXT(p, tmp); /* get context reg */ | ||
1064 | |||
1065 | if (use_lwx_insns()) { | ||
1066 | UASM_i_LWX(p, scratch, scratch, ptr); | ||
1067 | } else { | ||
1068 | uasm_i_daddu(p, ptr, ptr, scratch); /* add in pmd offset */ | ||
1069 | UASM_i_LW(p, scratch, 0, ptr); | ||
1070 | } | ||
1071 | #endif | ||
1072 | /* Adjust the context during the load latency. */ | ||
1073 | build_adjust_context(p, tmp); | ||
1074 | |||
1075 | #ifdef CONFIG_HUGETLB_PAGE | ||
1076 | uasm_il_bbit1(p, r, scratch, ilog2(_PAGE_HUGE), label_tlb_huge_update); | ||
1077 | /* | ||
1078 | * The in the LWX case we don't want to do the load in the | ||
1079 | * delay slot. It cannot issue in the same cycle and may be | ||
1080 | * speculative and unneeded. | ||
1081 | */ | ||
1082 | if (use_lwx_insns()) | ||
1083 | uasm_i_nop(p); | ||
1084 | #endif /* CONFIG_HUGETLB_PAGE */ | ||
1085 | |||
1086 | |||
1087 | /* build_update_entries */ | ||
1088 | if (use_lwx_insns()) { | ||
1089 | even = ptr; | ||
1090 | odd = tmp; | ||
1091 | UASM_i_LWX(p, even, scratch, tmp); | ||
1092 | UASM_i_ADDIU(p, tmp, tmp, sizeof(pte_t)); | ||
1093 | UASM_i_LWX(p, odd, scratch, tmp); | ||
1094 | } else { | ||
1095 | UASM_i_ADDU(p, ptr, scratch, tmp); /* add in offset */ | ||
1096 | even = tmp; | ||
1097 | odd = ptr; | ||
1098 | UASM_i_LW(p, even, 0, ptr); /* get even pte */ | ||
1099 | UASM_i_LW(p, odd, sizeof(pte_t), ptr); /* get odd pte */ | ||
1100 | } | ||
1101 | if (kernel_uses_smartmips_rixi) { | ||
1102 | uasm_i_dsrl_safe(p, even, even, ilog2(_PAGE_NO_EXEC)); | ||
1103 | uasm_i_dsrl_safe(p, odd, odd, ilog2(_PAGE_NO_EXEC)); | ||
1104 | uasm_i_drotr(p, even, even, | ||
1105 | ilog2(_PAGE_GLOBAL) - ilog2(_PAGE_NO_EXEC)); | ||
1106 | UASM_i_MTC0(p, even, C0_ENTRYLO0); /* load it */ | ||
1107 | uasm_i_drotr(p, odd, odd, | ||
1108 | ilog2(_PAGE_GLOBAL) - ilog2(_PAGE_NO_EXEC)); | ||
1109 | } else { | ||
1110 | uasm_i_dsrl_safe(p, even, even, ilog2(_PAGE_GLOBAL)); | ||
1111 | UASM_i_MTC0(p, even, C0_ENTRYLO0); /* load it */ | ||
1112 | uasm_i_dsrl_safe(p, odd, odd, ilog2(_PAGE_GLOBAL)); | ||
1113 | } | ||
1114 | UASM_i_MTC0(p, odd, C0_ENTRYLO1); /* load it */ | ||
1115 | |||
1116 | if (c0_scratch >= 0) { | ||
1117 | UASM_i_MFC0(p, scratch, 31, c0_scratch); | ||
1118 | build_tlb_write_entry(p, l, r, tlb_random); | ||
1119 | uasm_l_leave(l, *p); | ||
1120 | rv.restore_scratch = 1; | ||
1121 | } else if (PAGE_SHIFT == 14 || PAGE_SHIFT == 13) { | ||
1122 | build_tlb_write_entry(p, l, r, tlb_random); | ||
1123 | uasm_l_leave(l, *p); | ||
1124 | UASM_i_LW(p, scratch, scratchpad_offset(0), 0); | ||
1125 | } else { | ||
1126 | UASM_i_LW(p, scratch, scratchpad_offset(0), 0); | ||
1127 | build_tlb_write_entry(p, l, r, tlb_random); | ||
1128 | uasm_l_leave(l, *p); | ||
1129 | rv.restore_scratch = 1; | ||
1130 | } | ||
1131 | |||
1132 | uasm_i_eret(p); /* return from trap */ | ||
1133 | |||
1134 | return rv; | ||
1135 | } | ||
1136 | |||
837 | /* | 1137 | /* |
838 | * For a 64-bit kernel, we are using the 64-bit XTLB refill exception | 1138 | * For a 64-bit kernel, we are using the 64-bit XTLB refill exception |
839 | * because EXL == 0. If we wrap, we can also use the 32 instruction | 1139 | * because EXL == 0. If we wrap, we can also use the 32 instruction |
@@ -849,54 +1149,67 @@ static void __cpuinit build_r4000_tlb_refill_handler(void) | |||
849 | struct uasm_reloc *r = relocs; | 1149 | struct uasm_reloc *r = relocs; |
850 | u32 *f; | 1150 | u32 *f; |
851 | unsigned int final_len; | 1151 | unsigned int final_len; |
1152 | struct mips_huge_tlb_info htlb_info; | ||
1153 | enum vmalloc64_mode vmalloc_mode; | ||
852 | 1154 | ||
853 | memset(tlb_handler, 0, sizeof(tlb_handler)); | 1155 | memset(tlb_handler, 0, sizeof(tlb_handler)); |
854 | memset(labels, 0, sizeof(labels)); | 1156 | memset(labels, 0, sizeof(labels)); |
855 | memset(relocs, 0, sizeof(relocs)); | 1157 | memset(relocs, 0, sizeof(relocs)); |
856 | memset(final_handler, 0, sizeof(final_handler)); | 1158 | memset(final_handler, 0, sizeof(final_handler)); |
857 | 1159 | ||
858 | /* | 1160 | if (scratch_reg == 0) |
859 | * create the plain linear handler | 1161 | scratch_reg = allocate_kscratch(); |
860 | */ | ||
861 | if (bcm1250_m3_war()) { | ||
862 | unsigned int segbits = 44; | ||
863 | 1162 | ||
864 | uasm_i_dmfc0(&p, K0, C0_BADVADDR); | 1163 | if ((scratch_reg > 0 || scratchpad_available()) && use_bbit_insns()) { |
865 | uasm_i_dmfc0(&p, K1, C0_ENTRYHI); | 1164 | htlb_info = build_fast_tlb_refill_handler(&p, &l, &r, K0, K1, |
866 | uasm_i_xor(&p, K0, K0, K1); | 1165 | scratch_reg); |
867 | uasm_i_dsrl_safe(&p, K1, K0, 62); | 1166 | vmalloc_mode = refill_scratch; |
868 | uasm_i_dsrl_safe(&p, K0, K0, 12 + 1); | 1167 | } else { |
869 | uasm_i_dsll_safe(&p, K0, K0, 64 + 12 + 1 - segbits); | 1168 | htlb_info.huge_pte = K0; |
870 | uasm_i_or(&p, K0, K0, K1); | 1169 | htlb_info.restore_scratch = 0; |
871 | uasm_il_bnez(&p, &r, K0, label_leave); | 1170 | vmalloc_mode = refill_noscratch; |
872 | /* No need for uasm_i_nop */ | 1171 | /* |
873 | } | 1172 | * create the plain linear handler |
1173 | */ | ||
1174 | if (bcm1250_m3_war()) { | ||
1175 | unsigned int segbits = 44; | ||
1176 | |||
1177 | uasm_i_dmfc0(&p, K0, C0_BADVADDR); | ||
1178 | uasm_i_dmfc0(&p, K1, C0_ENTRYHI); | ||
1179 | uasm_i_xor(&p, K0, K0, K1); | ||
1180 | uasm_i_dsrl_safe(&p, K1, K0, 62); | ||
1181 | uasm_i_dsrl_safe(&p, K0, K0, 12 + 1); | ||
1182 | uasm_i_dsll_safe(&p, K0, K0, 64 + 12 + 1 - segbits); | ||
1183 | uasm_i_or(&p, K0, K0, K1); | ||
1184 | uasm_il_bnez(&p, &r, K0, label_leave); | ||
1185 | /* No need for uasm_i_nop */ | ||
1186 | } | ||
874 | 1187 | ||
875 | #ifdef CONFIG_64BIT | 1188 | #ifdef CONFIG_64BIT |
876 | build_get_pmde64(&p, &l, &r, K0, K1); /* get pmd in K1 */ | 1189 | build_get_pmde64(&p, &l, &r, K0, K1); /* get pmd in K1 */ |
877 | #else | 1190 | #else |
878 | build_get_pgde32(&p, K0, K1); /* get pgd in K1 */ | 1191 | build_get_pgde32(&p, K0, K1); /* get pgd in K1 */ |
879 | #endif | 1192 | #endif |
880 | 1193 | ||
881 | #ifdef CONFIG_HUGETLB_PAGE | 1194 | #ifdef CONFIG_HUGETLB_PAGE |
882 | build_is_huge_pte(&p, &r, K0, K1, label_tlb_huge_update); | 1195 | build_is_huge_pte(&p, &r, K0, K1, label_tlb_huge_update); |
883 | #endif | 1196 | #endif |
884 | 1197 | ||
885 | build_get_ptep(&p, K0, K1); | 1198 | build_get_ptep(&p, K0, K1); |
886 | build_update_entries(&p, K0, K1); | 1199 | build_update_entries(&p, K0, K1); |
887 | build_tlb_write_entry(&p, &l, &r, tlb_random); | 1200 | build_tlb_write_entry(&p, &l, &r, tlb_random); |
888 | uasm_l_leave(&l, p); | 1201 | uasm_l_leave(&l, p); |
889 | uasm_i_eret(&p); /* return from trap */ | 1202 | uasm_i_eret(&p); /* return from trap */ |
890 | 1203 | } | |
891 | #ifdef CONFIG_HUGETLB_PAGE | 1204 | #ifdef CONFIG_HUGETLB_PAGE |
892 | uasm_l_tlb_huge_update(&l, p); | 1205 | uasm_l_tlb_huge_update(&l, p); |
893 | UASM_i_LW(&p, K0, 0, K1); | 1206 | build_huge_update_entries(&p, htlb_info.huge_pte, K1); |
894 | build_huge_update_entries(&p, K0, K1); | 1207 | build_huge_tlb_write_entry(&p, &l, &r, K0, tlb_random, |
895 | build_huge_tlb_write_entry(&p, &l, &r, K0, tlb_random); | 1208 | htlb_info.restore_scratch); |
896 | #endif | 1209 | #endif |
897 | 1210 | ||
898 | #ifdef CONFIG_64BIT | 1211 | #ifdef CONFIG_64BIT |
899 | build_get_pgd_vmalloc64(&p, &l, &r, K0, K1, refill); | 1212 | build_get_pgd_vmalloc64(&p, &l, &r, K0, K1, vmalloc_mode); |
900 | #endif | 1213 | #endif |
901 | 1214 | ||
902 | /* | 1215 | /* |
@@ -1014,6 +1327,55 @@ static void __cpuinit build_r4000_tlb_refill_handler(void) | |||
1014 | u32 handle_tlbl[FASTPATH_SIZE] __cacheline_aligned; | 1327 | u32 handle_tlbl[FASTPATH_SIZE] __cacheline_aligned; |
1015 | u32 handle_tlbs[FASTPATH_SIZE] __cacheline_aligned; | 1328 | u32 handle_tlbs[FASTPATH_SIZE] __cacheline_aligned; |
1016 | u32 handle_tlbm[FASTPATH_SIZE] __cacheline_aligned; | 1329 | u32 handle_tlbm[FASTPATH_SIZE] __cacheline_aligned; |
1330 | #ifdef CONFIG_MIPS_PGD_C0_CONTEXT | ||
1331 | u32 tlbmiss_handler_setup_pgd[16] __cacheline_aligned; | ||
1332 | |||
1333 | static void __cpuinit build_r4000_setup_pgd(void) | ||
1334 | { | ||
1335 | const int a0 = 4; | ||
1336 | const int a1 = 5; | ||
1337 | u32 *p = tlbmiss_handler_setup_pgd; | ||
1338 | struct uasm_label *l = labels; | ||
1339 | struct uasm_reloc *r = relocs; | ||
1340 | |||
1341 | memset(tlbmiss_handler_setup_pgd, 0, sizeof(tlbmiss_handler_setup_pgd)); | ||
1342 | memset(labels, 0, sizeof(labels)); | ||
1343 | memset(relocs, 0, sizeof(relocs)); | ||
1344 | |||
1345 | pgd_reg = allocate_kscratch(); | ||
1346 | |||
1347 | if (pgd_reg == -1) { | ||
1348 | /* PGD << 11 in c0_Context */ | ||
1349 | /* | ||
1350 | * If it is a ckseg0 address, convert to a physical | ||
1351 | * address. Shifting right by 29 and adding 4 will | ||
1352 | * result in zero for these addresses. | ||
1353 | * | ||
1354 | */ | ||
1355 | UASM_i_SRA(&p, a1, a0, 29); | ||
1356 | UASM_i_ADDIU(&p, a1, a1, 4); | ||
1357 | uasm_il_bnez(&p, &r, a1, label_tlbl_goaround1); | ||
1358 | uasm_i_nop(&p); | ||
1359 | uasm_i_dinsm(&p, a0, 0, 29, 64 - 29); | ||
1360 | uasm_l_tlbl_goaround1(&l, p); | ||
1361 | UASM_i_SLL(&p, a0, a0, 11); | ||
1362 | uasm_i_jr(&p, 31); | ||
1363 | UASM_i_MTC0(&p, a0, C0_CONTEXT); | ||
1364 | } else { | ||
1365 | /* PGD in c0_KScratch */ | ||
1366 | uasm_i_jr(&p, 31); | ||
1367 | UASM_i_MTC0(&p, a0, 31, pgd_reg); | ||
1368 | } | ||
1369 | if (p - tlbmiss_handler_setup_pgd > ARRAY_SIZE(tlbmiss_handler_setup_pgd)) | ||
1370 | panic("tlbmiss_handler_setup_pgd space exceeded"); | ||
1371 | uasm_resolve_relocs(relocs, labels); | ||
1372 | pr_debug("Wrote tlbmiss_handler_setup_pgd (%u instructions).\n", | ||
1373 | (unsigned int)(p - tlbmiss_handler_setup_pgd)); | ||
1374 | |||
1375 | dump_handler(tlbmiss_handler_setup_pgd, | ||
1376 | ARRAY_SIZE(tlbmiss_handler_setup_pgd)); | ||
1377 | } | ||
1378 | #endif | ||
1017 | 1379 | ||
1018 | static void __cpuinit | 1380 | static void __cpuinit |
1019 | iPTE_LW(u32 **p, unsigned int pte, unsigned int ptr) | 1381 | iPTE_LW(u32 **p, unsigned int pte, unsigned int ptr) |
@@ -1100,14 +1462,20 @@ build_pte_present(u32 **p, struct uasm_reloc **r, | |||
1100 | unsigned int pte, unsigned int ptr, enum label_id lid) | 1462 | unsigned int pte, unsigned int ptr, enum label_id lid) |
1101 | { | 1463 | { |
1102 | if (kernel_uses_smartmips_rixi) { | 1464 | if (kernel_uses_smartmips_rixi) { |
1103 | uasm_i_andi(p, pte, pte, _PAGE_PRESENT); | 1465 | if (use_bbit_insns()) { |
1104 | uasm_il_beqz(p, r, pte, lid); | 1466 | uasm_il_bbit0(p, r, pte, ilog2(_PAGE_PRESENT), lid); |
1467 | uasm_i_nop(p); | ||
1468 | } else { | ||
1469 | uasm_i_andi(p, pte, pte, _PAGE_PRESENT); | ||
1470 | uasm_il_beqz(p, r, pte, lid); | ||
1471 | iPTE_LW(p, pte, ptr); | ||
1472 | } | ||
1105 | } else { | 1473 | } else { |
1106 | uasm_i_andi(p, pte, pte, _PAGE_PRESENT | _PAGE_READ); | 1474 | uasm_i_andi(p, pte, pte, _PAGE_PRESENT | _PAGE_READ); |
1107 | uasm_i_xori(p, pte, pte, _PAGE_PRESENT | _PAGE_READ); | 1475 | uasm_i_xori(p, pte, pte, _PAGE_PRESENT | _PAGE_READ); |
1108 | uasm_il_bnez(p, r, pte, lid); | 1476 | uasm_il_bnez(p, r, pte, lid); |
1477 | iPTE_LW(p, pte, ptr); | ||
1109 | } | 1478 | } |
1110 | iPTE_LW(p, pte, ptr); | ||
1111 | } | 1479 | } |
1112 | 1480 | ||
1113 | /* Make PTE valid, store result in PTR. */ | 1481 | /* Make PTE valid, store result in PTR. */ |
@@ -1128,10 +1496,17 @@ static void __cpuinit | |||
1128 | build_pte_writable(u32 **p, struct uasm_reloc **r, | 1496 | build_pte_writable(u32 **p, struct uasm_reloc **r, |
1129 | unsigned int pte, unsigned int ptr, enum label_id lid) | 1497 | unsigned int pte, unsigned int ptr, enum label_id lid) |
1130 | { | 1498 | { |
1131 | uasm_i_andi(p, pte, pte, _PAGE_PRESENT | _PAGE_WRITE); | 1499 | if (use_bbit_insns()) { |
1132 | uasm_i_xori(p, pte, pte, _PAGE_PRESENT | _PAGE_WRITE); | 1500 | uasm_il_bbit0(p, r, pte, ilog2(_PAGE_PRESENT), lid); |
1133 | uasm_il_bnez(p, r, pte, lid); | 1501 | uasm_i_nop(p); |
1134 | iPTE_LW(p, pte, ptr); | 1502 | uasm_il_bbit0(p, r, pte, ilog2(_PAGE_WRITE), lid); |
1503 | uasm_i_nop(p); | ||
1504 | } else { | ||
1505 | uasm_i_andi(p, pte, pte, _PAGE_PRESENT | _PAGE_WRITE); | ||
1506 | uasm_i_xori(p, pte, pte, _PAGE_PRESENT | _PAGE_WRITE); | ||
1507 | uasm_il_bnez(p, r, pte, lid); | ||
1508 | iPTE_LW(p, pte, ptr); | ||
1509 | } | ||
1135 | } | 1510 | } |
1136 | 1511 | ||
1137 | /* Make PTE writable, update software status bits as well, then store | 1512 | /* Make PTE writable, update software status bits as well, then store |
@@ -1155,12 +1530,19 @@ static void __cpuinit | |||
1155 | build_pte_modifiable(u32 **p, struct uasm_reloc **r, | 1530 | build_pte_modifiable(u32 **p, struct uasm_reloc **r, |
1156 | unsigned int pte, unsigned int ptr, enum label_id lid) | 1531 | unsigned int pte, unsigned int ptr, enum label_id lid) |
1157 | { | 1532 | { |
1158 | uasm_i_andi(p, pte, pte, _PAGE_WRITE); | 1533 | if (use_bbit_insns()) { |
1159 | uasm_il_beqz(p, r, pte, lid); | 1534 | uasm_il_bbit0(p, r, pte, ilog2(_PAGE_WRITE), lid); |
1160 | iPTE_LW(p, pte, ptr); | 1535 | uasm_i_nop(p); |
1536 | } else { | ||
1537 | uasm_i_andi(p, pte, pte, _PAGE_WRITE); | ||
1538 | uasm_il_beqz(p, r, pte, lid); | ||
1539 | iPTE_LW(p, pte, ptr); | ||
1540 | } | ||
1161 | } | 1541 | } |
1162 | 1542 | ||
1163 | #ifndef CONFIG_MIPS_PGD_C0_CONTEXT | 1543 | #ifndef CONFIG_MIPS_PGD_C0_CONTEXT |
1544 | |||
1545 | |||
1164 | /* | 1546 | /* |
1165 | * R3000 style TLB load/store/modify handlers. | 1547 | * R3000 style TLB load/store/modify handlers. |
1166 | */ | 1548 | */ |
@@ -1402,14 +1784,23 @@ static void __cpuinit build_r4000_tlb_load_handler(void) | |||
1402 | * If the page is not _PAGE_VALID, RI or XI could not | 1784 | * If the page is not _PAGE_VALID, RI or XI could not |
1403 | * have triggered it. Skip the expensive test.. | 1785 | * have triggered it. Skip the expensive test.. |
1404 | */ | 1786 | */ |
1405 | uasm_i_andi(&p, K0, K0, _PAGE_VALID); | 1787 | if (use_bbit_insns()) { |
1406 | uasm_il_beqz(&p, &r, K0, label_tlbl_goaround1); | 1788 | uasm_il_bbit0(&p, &r, K0, ilog2(_PAGE_VALID), |
1789 | label_tlbl_goaround1); | ||
1790 | } else { | ||
1791 | uasm_i_andi(&p, K0, K0, _PAGE_VALID); | ||
1792 | uasm_il_beqz(&p, &r, K0, label_tlbl_goaround1); | ||
1793 | } | ||
1407 | uasm_i_nop(&p); | 1794 | uasm_i_nop(&p); |
1408 | 1795 | ||
1409 | uasm_i_tlbr(&p); | 1796 | uasm_i_tlbr(&p); |
1410 | /* Examine entrylo 0 or 1 based on ptr. */ | 1797 | /* Examine entrylo 0 or 1 based on ptr. */ |
1411 | uasm_i_andi(&p, K0, K1, sizeof(pte_t)); | 1798 | if (use_bbit_insns()) { |
1412 | uasm_i_beqz(&p, K0, 8); | 1799 | uasm_i_bbit0(&p, K1, ilog2(sizeof(pte_t)), 8); |
1800 | } else { | ||
1801 | uasm_i_andi(&p, K0, K1, sizeof(pte_t)); | ||
1802 | uasm_i_beqz(&p, K0, 8); | ||
1803 | } | ||
1413 | 1804 | ||
1414 | UASM_i_MFC0(&p, K0, C0_ENTRYLO0); /* load it in the delay slot*/ | 1805 | UASM_i_MFC0(&p, K0, C0_ENTRYLO0); /* load it in the delay slot*/ |
1415 | UASM_i_MFC0(&p, K0, C0_ENTRYLO1); /* load it if ptr is odd */ | 1806 | UASM_i_MFC0(&p, K0, C0_ENTRYLO1); /* load it if ptr is odd */ |
@@ -1417,12 +1808,18 @@ static void __cpuinit build_r4000_tlb_load_handler(void) | |||
1417 | * If the entryLo (now in K0) is valid (bit 1), RI or | 1808 | * If the entryLo (now in K0) is valid (bit 1), RI or |
1418 | * XI must have triggered it. | 1809 | * XI must have triggered it. |
1419 | */ | 1810 | */ |
1420 | uasm_i_andi(&p, K0, K0, 2); | 1811 | if (use_bbit_insns()) { |
1421 | uasm_il_bnez(&p, &r, K0, label_nopage_tlbl); | 1812 | uasm_il_bbit1(&p, &r, K0, 1, label_nopage_tlbl); |
1422 | 1813 | /* Reload the PTE value */ | |
1423 | uasm_l_tlbl_goaround1(&l, p); | 1814 | iPTE_LW(&p, K0, K1); |
1424 | /* Reload the PTE value */ | 1815 | uasm_l_tlbl_goaround1(&l, p); |
1425 | iPTE_LW(&p, K0, K1); | 1816 | } else { |
1817 | uasm_i_andi(&p, K0, K0, 2); | ||
1818 | uasm_il_bnez(&p, &r, K0, label_nopage_tlbl); | ||
1819 | uasm_l_tlbl_goaround1(&l, p); | ||
1820 | /* Reload the PTE value */ | ||
1821 | iPTE_LW(&p, K0, K1); | ||
1822 | } | ||
1426 | } | 1823 | } |
1427 | build_make_valid(&p, &r, K0, K1); | 1824 | build_make_valid(&p, &r, K0, K1); |
1428 | build_r4000_tlbchange_handler_tail(&p, &l, &r, K0, K1); | 1825 | build_r4000_tlbchange_handler_tail(&p, &l, &r, K0, K1); |
@@ -1442,23 +1839,35 @@ static void __cpuinit build_r4000_tlb_load_handler(void) | |||
1442 | * If the page is not _PAGE_VALID, RI or XI could not | 1839 | * If the page is not _PAGE_VALID, RI or XI could not |
1443 | * have triggered it. Skip the expensive test.. | 1840 | * have triggered it. Skip the expensive test.. |
1444 | */ | 1841 | */ |
1445 | uasm_i_andi(&p, K0, K0, _PAGE_VALID); | 1842 | if (use_bbit_insns()) { |
1446 | uasm_il_beqz(&p, &r, K0, label_tlbl_goaround2); | 1843 | uasm_il_bbit0(&p, &r, K0, ilog2(_PAGE_VALID), |
1844 | label_tlbl_goaround2); | ||
1845 | } else { | ||
1846 | uasm_i_andi(&p, K0, K0, _PAGE_VALID); | ||
1847 | uasm_il_beqz(&p, &r, K0, label_tlbl_goaround2); | ||
1848 | } | ||
1447 | uasm_i_nop(&p); | 1849 | uasm_i_nop(&p); |
1448 | 1850 | ||
1449 | uasm_i_tlbr(&p); | 1851 | uasm_i_tlbr(&p); |
1450 | /* Examine entrylo 0 or 1 based on ptr. */ | 1852 | /* Examine entrylo 0 or 1 based on ptr. */ |
1451 | uasm_i_andi(&p, K0, K1, sizeof(pte_t)); | 1853 | if (use_bbit_insns()) { |
1452 | uasm_i_beqz(&p, K0, 8); | 1854 | uasm_i_bbit0(&p, K1, ilog2(sizeof(pte_t)), 8); |
1453 | 1855 | } else { | |
1856 | uasm_i_andi(&p, K0, K1, sizeof(pte_t)); | ||
1857 | uasm_i_beqz(&p, K0, 8); | ||
1858 | } | ||
1454 | UASM_i_MFC0(&p, K0, C0_ENTRYLO0); /* load it in the delay slot*/ | 1859 | UASM_i_MFC0(&p, K0, C0_ENTRYLO0); /* load it in the delay slot*/ |
1455 | UASM_i_MFC0(&p, K0, C0_ENTRYLO1); /* load it if ptr is odd */ | 1860 | UASM_i_MFC0(&p, K0, C0_ENTRYLO1); /* load it if ptr is odd */ |
1456 | /* | 1861 | /* |
1457 | * If the entryLo (now in K0) is valid (bit 1), RI or | 1862 | * If the entryLo (now in K0) is valid (bit 1), RI or |
1458 | * XI must have triggered it. | 1863 | * XI must have triggered it. |
1459 | */ | 1864 | */ |
1460 | uasm_i_andi(&p, K0, K0, 2); | 1865 | if (use_bbit_insns()) { |
1461 | uasm_il_beqz(&p, &r, K0, label_tlbl_goaround2); | 1866 | uasm_il_bbit0(&p, &r, K0, 1, label_tlbl_goaround2); |
1867 | } else { | ||
1868 | uasm_i_andi(&p, K0, K0, 2); | ||
1869 | uasm_il_beqz(&p, &r, K0, label_tlbl_goaround2); | ||
1870 | } | ||
1462 | /* Reload the PTE value */ | 1871 | /* Reload the PTE value */ |
1463 | iPTE_LW(&p, K0, K1); | 1872 | iPTE_LW(&p, K0, K1); |
1464 | 1873 | ||
@@ -1466,7 +1875,7 @@ static void __cpuinit build_r4000_tlb_load_handler(void) | |||
1466 | * We clobbered C0_PAGEMASK, restore it. On the other branch | 1875 | * We clobbered C0_PAGEMASK, restore it. On the other branch |
1467 | * it is restored in build_huge_tlb_write_entry. | 1876 | * it is restored in build_huge_tlb_write_entry. |
1468 | */ | 1877 | */ |
1469 | build_restore_pagemask(&p, &r, K0, label_nopage_tlbl); | 1878 | build_restore_pagemask(&p, &r, K0, label_nopage_tlbl, 0); |
1470 | 1879 | ||
1471 | uasm_l_tlbl_goaround2(&l, p); | 1880 | uasm_l_tlbl_goaround2(&l, p); |
1472 | } | 1881 | } |
@@ -1623,13 +2032,16 @@ void __cpuinit build_tlb_refill_handler(void) | |||
1623 | break; | 2032 | break; |
1624 | 2033 | ||
1625 | default: | 2034 | default: |
1626 | build_r4000_tlb_refill_handler(); | ||
1627 | if (!run_once) { | 2035 | if (!run_once) { |
2036 | #ifdef CONFIG_MIPS_PGD_C0_CONTEXT | ||
2037 | build_r4000_setup_pgd(); | ||
2038 | #endif | ||
1628 | build_r4000_tlb_load_handler(); | 2039 | build_r4000_tlb_load_handler(); |
1629 | build_r4000_tlb_store_handler(); | 2040 | build_r4000_tlb_store_handler(); |
1630 | build_r4000_tlb_modify_handler(); | 2041 | build_r4000_tlb_modify_handler(); |
1631 | run_once++; | 2042 | run_once++; |
1632 | } | 2043 | } |
2044 | build_r4000_tlb_refill_handler(); | ||
1633 | } | 2045 | } |
1634 | } | 2046 | } |
1635 | 2047 | ||
@@ -1641,4 +2053,8 @@ void __cpuinit flush_tlb_handlers(void) | |||
1641 | (unsigned long)handle_tlbs + sizeof(handle_tlbs)); | 2053 | (unsigned long)handle_tlbs + sizeof(handle_tlbs)); |
1642 | local_flush_icache_range((unsigned long)handle_tlbm, | 2054 | local_flush_icache_range((unsigned long)handle_tlbm, |
1643 | (unsigned long)handle_tlbm + sizeof(handle_tlbm)); | 2055 | (unsigned long)handle_tlbm + sizeof(handle_tlbm)); |
2056 | #ifdef CONFIG_MIPS_PGD_C0_CONTEXT | ||
2057 | local_flush_icache_range((unsigned long)tlbmiss_handler_setup_pgd, | ||
2058 | (unsigned long)tlbmiss_handler_setup_pgd + sizeof(handle_tlbm)); | ||
2059 | #endif | ||
1644 | } | 2060 | } |
diff --git a/arch/mips/mm/uasm.c b/arch/mips/mm/uasm.c index 23afdebc8e5c..5fa185151fc8 100644 --- a/arch/mips/mm/uasm.c +++ b/arch/mips/mm/uasm.c | |||
@@ -68,7 +68,8 @@ enum opcode { | |||
68 | insn_pref, insn_rfe, insn_sc, insn_scd, insn_sd, insn_sll, | 68 | insn_pref, insn_rfe, insn_sc, insn_scd, insn_sd, insn_sll, |
69 | insn_sra, insn_srl, insn_rotr, insn_subu, insn_sw, insn_tlbp, | 69 | insn_sra, insn_srl, insn_rotr, insn_subu, insn_sw, insn_tlbp, |
70 | insn_tlbr, insn_tlbwi, insn_tlbwr, insn_xor, insn_xori, | 70 | insn_tlbr, insn_tlbwi, insn_tlbwr, insn_xor, insn_xori, |
71 | insn_dins, insn_syscall, insn_bbit0, insn_bbit1 | 71 | insn_dins, insn_dinsm, insn_syscall, insn_bbit0, insn_bbit1, |
72 | insn_lwx, insn_ldx | ||
72 | }; | 73 | }; |
73 | 74 | ||
74 | struct insn { | 75 | struct insn { |
@@ -142,9 +143,12 @@ static struct insn insn_table[] __uasminitdata = { | |||
142 | { insn_xor, M(spec_op, 0, 0, 0, 0, xor_op), RS | RT | RD }, | 143 | { insn_xor, M(spec_op, 0, 0, 0, 0, xor_op), RS | RT | RD }, |
143 | { insn_xori, M(xori_op, 0, 0, 0, 0, 0), RS | RT | UIMM }, | 144 | { insn_xori, M(xori_op, 0, 0, 0, 0, 0), RS | RT | UIMM }, |
144 | { insn_dins, M(spec3_op, 0, 0, 0, 0, dins_op), RS | RT | RD | RE }, | 145 | { insn_dins, M(spec3_op, 0, 0, 0, 0, dins_op), RS | RT | RD | RE }, |
146 | { insn_dinsm, M(spec3_op, 0, 0, 0, 0, dinsm_op), RS | RT | RD | RE }, | ||
145 | { insn_syscall, M(spec_op, 0, 0, 0, 0, syscall_op), SCIMM}, | 147 | { insn_syscall, M(spec_op, 0, 0, 0, 0, syscall_op), SCIMM}, |
146 | { insn_bbit0, M(lwc2_op, 0, 0, 0, 0, 0), RS | RT | BIMM }, | 148 | { insn_bbit0, M(lwc2_op, 0, 0, 0, 0, 0), RS | RT | BIMM }, |
147 | { insn_bbit1, M(swc2_op, 0, 0, 0, 0, 0), RS | RT | BIMM }, | 149 | { insn_bbit1, M(swc2_op, 0, 0, 0, 0, 0), RS | RT | BIMM }, |
150 | { insn_lwx, M(spec3_op, 0, 0, 0, lwx_op, lx_op), RS | RT | RD }, | ||
151 | { insn_ldx, M(spec3_op, 0, 0, 0, ldx_op, lx_op), RS | RT | RD }, | ||
148 | { insn_invalid, 0, 0 } | 152 | { insn_invalid, 0, 0 } |
149 | }; | 153 | }; |
150 | 154 | ||
@@ -152,91 +156,83 @@ static struct insn insn_table[] __uasminitdata = { | |||
152 | 156 | ||
153 | static inline __uasminit u32 build_rs(u32 arg) | 157 | static inline __uasminit u32 build_rs(u32 arg) |
154 | { | 158 | { |
155 | if (arg & ~RS_MASK) | 159 | WARN(arg & ~RS_MASK, KERN_WARNING "Micro-assembler field overflow\n"); |
156 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | ||
157 | 160 | ||
158 | return (arg & RS_MASK) << RS_SH; | 161 | return (arg & RS_MASK) << RS_SH; |
159 | } | 162 | } |
160 | 163 | ||
161 | static inline __uasminit u32 build_rt(u32 arg) | 164 | static inline __uasminit u32 build_rt(u32 arg) |
162 | { | 165 | { |
163 | if (arg & ~RT_MASK) | 166 | WARN(arg & ~RT_MASK, KERN_WARNING "Micro-assembler field overflow\n"); |
164 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | ||
165 | 167 | ||
166 | return (arg & RT_MASK) << RT_SH; | 168 | return (arg & RT_MASK) << RT_SH; |
167 | } | 169 | } |
168 | 170 | ||
169 | static inline __uasminit u32 build_rd(u32 arg) | 171 | static inline __uasminit u32 build_rd(u32 arg) |
170 | { | 172 | { |
171 | if (arg & ~RD_MASK) | 173 | WARN(arg & ~RD_MASK, KERN_WARNING "Micro-assembler field overflow\n"); |
172 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | ||
173 | 174 | ||
174 | return (arg & RD_MASK) << RD_SH; | 175 | return (arg & RD_MASK) << RD_SH; |
175 | } | 176 | } |
176 | 177 | ||
177 | static inline __uasminit u32 build_re(u32 arg) | 178 | static inline __uasminit u32 build_re(u32 arg) |
178 | { | 179 | { |
179 | if (arg & ~RE_MASK) | 180 | WARN(arg & ~RE_MASK, KERN_WARNING "Micro-assembler field overflow\n"); |
180 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | ||
181 | 181 | ||
182 | return (arg & RE_MASK) << RE_SH; | 182 | return (arg & RE_MASK) << RE_SH; |
183 | } | 183 | } |
184 | 184 | ||
185 | static inline __uasminit u32 build_simm(s32 arg) | 185 | static inline __uasminit u32 build_simm(s32 arg) |
186 | { | 186 | { |
187 | if (arg > 0x7fff || arg < -0x8000) | 187 | WARN(arg > 0x7fff || arg < -0x8000, |
188 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | 188 | KERN_WARNING "Micro-assembler field overflow\n"); |
189 | 189 | ||
190 | return arg & 0xffff; | 190 | return arg & 0xffff; |
191 | } | 191 | } |
192 | 192 | ||
193 | static inline __uasminit u32 build_uimm(u32 arg) | 193 | static inline __uasminit u32 build_uimm(u32 arg) |
194 | { | 194 | { |
195 | if (arg & ~IMM_MASK) | 195 | WARN(arg & ~IMM_MASK, KERN_WARNING "Micro-assembler field overflow\n"); |
196 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | ||
197 | 196 | ||
198 | return arg & IMM_MASK; | 197 | return arg & IMM_MASK; |
199 | } | 198 | } |
200 | 199 | ||
201 | static inline __uasminit u32 build_bimm(s32 arg) | 200 | static inline __uasminit u32 build_bimm(s32 arg) |
202 | { | 201 | { |
203 | if (arg > 0x1ffff || arg < -0x20000) | 202 | WARN(arg > 0x1ffff || arg < -0x20000, |
204 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | 203 | KERN_WARNING "Micro-assembler field overflow\n"); |
205 | 204 | ||
206 | if (arg & 0x3) | 205 | WARN(arg & 0x3, KERN_WARNING "Invalid micro-assembler branch target\n"); |
207 | printk(KERN_WARNING "Invalid micro-assembler branch target\n"); | ||
208 | 206 | ||
209 | return ((arg < 0) ? (1 << 15) : 0) | ((arg >> 2) & 0x7fff); | 207 | return ((arg < 0) ? (1 << 15) : 0) | ((arg >> 2) & 0x7fff); |
210 | } | 208 | } |
211 | 209 | ||
212 | static inline __uasminit u32 build_jimm(u32 arg) | 210 | static inline __uasminit u32 build_jimm(u32 arg) |
213 | { | 211 | { |
214 | if (arg & ~((JIMM_MASK) << 2)) | 212 | WARN(arg & ~(JIMM_MASK << 2), |
215 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | 213 | KERN_WARNING "Micro-assembler field overflow\n"); |
216 | 214 | ||
217 | return (arg >> 2) & JIMM_MASK; | 215 | return (arg >> 2) & JIMM_MASK; |
218 | } | 216 | } |
219 | 217 | ||
220 | static inline __uasminit u32 build_scimm(u32 arg) | 218 | static inline __uasminit u32 build_scimm(u32 arg) |
221 | { | 219 | { |
222 | if (arg & ~SCIMM_MASK) | 220 | WARN(arg & ~SCIMM_MASK, |
223 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | 221 | KERN_WARNING "Micro-assembler field overflow\n"); |
224 | 222 | ||
225 | return (arg & SCIMM_MASK) << SCIMM_SH; | 223 | return (arg & SCIMM_MASK) << SCIMM_SH; |
226 | } | 224 | } |
227 | 225 | ||
228 | static inline __uasminit u32 build_func(u32 arg) | 226 | static inline __uasminit u32 build_func(u32 arg) |
229 | { | 227 | { |
230 | if (arg & ~FUNC_MASK) | 228 | WARN(arg & ~FUNC_MASK, KERN_WARNING "Micro-assembler field overflow\n"); |
231 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | ||
232 | 229 | ||
233 | return arg & FUNC_MASK; | 230 | return arg & FUNC_MASK; |
234 | } | 231 | } |
235 | 232 | ||
236 | static inline __uasminit u32 build_set(u32 arg) | 233 | static inline __uasminit u32 build_set(u32 arg) |
237 | { | 234 | { |
238 | if (arg & ~SET_MASK) | 235 | WARN(arg & ~SET_MASK, KERN_WARNING "Micro-assembler field overflow\n"); |
239 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | ||
240 | 236 | ||
241 | return arg & SET_MASK; | 237 | return arg & SET_MASK; |
242 | } | 238 | } |
@@ -340,6 +336,13 @@ Ip_u2u1msbu3(op) \ | |||
340 | } \ | 336 | } \ |
341 | UASM_EXPORT_SYMBOL(uasm_i##op); | 337 | UASM_EXPORT_SYMBOL(uasm_i##op); |
342 | 338 | ||
339 | #define I_u2u1msb32u3(op) \ | ||
340 | Ip_u2u1msbu3(op) \ | ||
341 | { \ | ||
342 | build_insn(buf, insn##op, b, a, c+d-33, c); \ | ||
343 | } \ | ||
344 | UASM_EXPORT_SYMBOL(uasm_i##op); | ||
345 | |||
343 | #define I_u1u2(op) \ | 346 | #define I_u1u2(op) \ |
344 | Ip_u1u2(op) \ | 347 | Ip_u1u2(op) \ |
345 | { \ | 348 | { \ |
@@ -422,9 +425,12 @@ I_0(_tlbwr) | |||
422 | I_u3u1u2(_xor) | 425 | I_u3u1u2(_xor) |
423 | I_u2u1u3(_xori) | 426 | I_u2u1u3(_xori) |
424 | I_u2u1msbu3(_dins); | 427 | I_u2u1msbu3(_dins); |
428 | I_u2u1msb32u3(_dinsm); | ||
425 | I_u1(_syscall); | 429 | I_u1(_syscall); |
426 | I_u1u2s3(_bbit0); | 430 | I_u1u2s3(_bbit0); |
427 | I_u1u2s3(_bbit1); | 431 | I_u1u2s3(_bbit1); |
432 | I_u3u1u2(_lwx) | ||
433 | I_u3u1u2(_ldx) | ||
428 | 434 | ||
429 | #ifdef CONFIG_CPU_CAVIUM_OCTEON | 435 | #ifdef CONFIG_CPU_CAVIUM_OCTEON |
430 | #include <asm/octeon/octeon.h> | 436 | #include <asm/octeon/octeon.h> |
diff --git a/arch/mips/sibyte/common/sb_tbprof.c b/arch/mips/sibyte/common/sb_tbprof.c index 87ccdb4b5ac9..48853ab5bcf0 100644 --- a/arch/mips/sibyte/common/sb_tbprof.c +++ b/arch/mips/sibyte/common/sb_tbprof.c | |||
@@ -410,14 +410,13 @@ static int sbprof_tb_open(struct inode *inode, struct file *filp) | |||
410 | return -EBUSY; | 410 | return -EBUSY; |
411 | 411 | ||
412 | memset(&sbp, 0, sizeof(struct sbprof_tb)); | 412 | memset(&sbp, 0, sizeof(struct sbprof_tb)); |
413 | sbp.sbprof_tbbuf = vmalloc(MAX_TBSAMPLE_BYTES); | 413 | sbp.sbprof_tbbuf = vzalloc(MAX_TBSAMPLE_BYTES); |
414 | if (!sbp.sbprof_tbbuf) { | 414 | if (!sbp.sbprof_tbbuf) { |
415 | sbp.open = SB_CLOSED; | 415 | sbp.open = SB_CLOSED; |
416 | wmb(); | 416 | wmb(); |
417 | return -ENOMEM; | 417 | return -ENOMEM; |
418 | } | 418 | } |
419 | 419 | ||
420 | memset(sbp.sbprof_tbbuf, 0, MAX_TBSAMPLE_BYTES); | ||
421 | init_waitqueue_head(&sbp.tb_sync); | 420 | init_waitqueue_head(&sbp.tb_sync); |
422 | init_waitqueue_head(&sbp.tb_read); | 421 | init_waitqueue_head(&sbp.tb_read); |
423 | mutex_init(&sbp.lock); | 422 | mutex_init(&sbp.lock); |
diff --git a/arch/mips/txx9/generic/pci.c b/arch/mips/txx9/generic/pci.c index 96e69a00ffc8..85a87de17eb4 100644 --- a/arch/mips/txx9/generic/pci.c +++ b/arch/mips/txx9/generic/pci.c | |||
@@ -213,11 +213,8 @@ txx9_alloc_pci_controller(struct pci_controller *pcic, | |||
213 | 213 | ||
214 | pcic->mem_offset = 0; /* busaddr == physaddr */ | 214 | pcic->mem_offset = 0; /* busaddr == physaddr */ |
215 | 215 | ||
216 | printk(KERN_INFO "PCI: IO 0x%08llx-0x%08llx MEM 0x%08llx-0x%08llx\n", | 216 | printk(KERN_INFO "PCI: IO %pR MEM %pR\n", |
217 | (unsigned long long)pcic->mem_resource[1].start, | 217 | &pcic->mem_resource[1], &pcic->mem_resource[0]); |
218 | (unsigned long long)pcic->mem_resource[1].end, | ||
219 | (unsigned long long)pcic->mem_resource[0].start, | ||
220 | (unsigned long long)pcic->mem_resource[0].end); | ||
221 | 218 | ||
222 | /* register_pci_controller() will request MEM resource */ | 219 | /* register_pci_controller() will request MEM resource */ |
223 | release_resource(&pcic->mem_resource[0]); | 220 | release_resource(&pcic->mem_resource[0]); |
diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c index df971fa0c32f..4896ed090585 100644 --- a/arch/parisc/kernel/firmware.c +++ b/arch/parisc/kernel/firmware.c | |||
@@ -1126,15 +1126,13 @@ int pdc_iodc_print(const unsigned char *str, unsigned count) | |||
1126 | unsigned int i; | 1126 | unsigned int i; |
1127 | unsigned long flags; | 1127 | unsigned long flags; |
1128 | 1128 | ||
1129 | for (i = 0; i < count && i < 79;) { | 1129 | for (i = 0; i < count;) { |
1130 | switch(str[i]) { | 1130 | switch(str[i]) { |
1131 | case '\n': | 1131 | case '\n': |
1132 | iodc_dbuf[i+0] = '\r'; | 1132 | iodc_dbuf[i+0] = '\r'; |
1133 | iodc_dbuf[i+1] = '\n'; | 1133 | iodc_dbuf[i+1] = '\n'; |
1134 | i += 2; | 1134 | i += 2; |
1135 | goto print; | 1135 | goto print; |
1136 | case '\b': /* BS */ | ||
1137 | i--; /* overwrite last */ | ||
1138 | default: | 1136 | default: |
1139 | iodc_dbuf[i] = str[i]; | 1137 | iodc_dbuf[i] = str[i]; |
1140 | i++; | 1138 | i++; |
@@ -1142,15 +1140,6 @@ int pdc_iodc_print(const unsigned char *str, unsigned count) | |||
1142 | } | 1140 | } |
1143 | } | 1141 | } |
1144 | 1142 | ||
1145 | /* if we're at the end of line, and not already inserting a newline, | ||
1146 | * insert one anyway. iodc console doesn't claim to support >79 char | ||
1147 | * lines. don't account for this in the return value. | ||
1148 | */ | ||
1149 | if (i == 79 && iodc_dbuf[i-1] != '\n') { | ||
1150 | iodc_dbuf[i+0] = '\r'; | ||
1151 | iodc_dbuf[i+1] = '\n'; | ||
1152 | } | ||
1153 | |||
1154 | print: | 1143 | print: |
1155 | spin_lock_irqsave(&pdc_lock, flags); | 1144 | spin_lock_irqsave(&pdc_lock, flags); |
1156 | real32_call(PAGE0->mem_cons.iodc_io, | 1145 | real32_call(PAGE0->mem_cons.iodc_io, |
diff --git a/arch/powerpc/kernel/perf_event.c b/arch/powerpc/kernel/perf_event.c index 567480705789..ab6f6beadb57 100644 --- a/arch/powerpc/kernel/perf_event.c +++ b/arch/powerpc/kernel/perf_event.c | |||
@@ -1212,6 +1212,7 @@ static void record_and_restart(struct perf_event *event, unsigned long val, | |||
1212 | if (left <= 0) | 1212 | if (left <= 0) |
1213 | left = period; | 1213 | left = period; |
1214 | record = 1; | 1214 | record = 1; |
1215 | event->hw.last_period = event->hw.sample_period; | ||
1215 | } | 1216 | } |
1216 | if (left < 0x80000000LL) | 1217 | if (left < 0x80000000LL) |
1217 | val = 0x80000000LL - left; | 1218 | val = 0x80000000LL - left; |
diff --git a/arch/x86/include/asm/numa_32.h b/arch/x86/include/asm/numa_32.h index a37229011b56..b0ef2b449a9d 100644 --- a/arch/x86/include/asm/numa_32.h +++ b/arch/x86/include/asm/numa_32.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _ASM_X86_NUMA_32_H | 1 | #ifndef _ASM_X86_NUMA_32_H |
2 | #define _ASM_X86_NUMA_32_H | 2 | #define _ASM_X86_NUMA_32_H |
3 | 3 | ||
4 | extern int numa_off; | ||
5 | |||
4 | extern int pxm_to_nid(int pxm); | 6 | extern int pxm_to_nid(int pxm); |
5 | extern void numa_remove_cpu(int cpu); | 7 | extern void numa_remove_cpu(int cpu); |
6 | 8 | ||
diff --git a/arch/x86/include/asm/numa_64.h b/arch/x86/include/asm/numa_64.h index 5ae87285a502..0493be39607c 100644 --- a/arch/x86/include/asm/numa_64.h +++ b/arch/x86/include/asm/numa_64.h | |||
@@ -40,6 +40,7 @@ extern void __cpuinit numa_remove_cpu(int cpu); | |||
40 | #ifdef CONFIG_NUMA_EMU | 40 | #ifdef CONFIG_NUMA_EMU |
41 | #define FAKE_NODE_MIN_SIZE ((u64)32 << 20) | 41 | #define FAKE_NODE_MIN_SIZE ((u64)32 << 20) |
42 | #define FAKE_NODE_MIN_HASH_MASK (~(FAKE_NODE_MIN_SIZE - 1UL)) | 42 | #define FAKE_NODE_MIN_HASH_MASK (~(FAKE_NODE_MIN_SIZE - 1UL)) |
43 | void numa_emu_cmdline(char *); | ||
43 | #endif /* CONFIG_NUMA_EMU */ | 44 | #endif /* CONFIG_NUMA_EMU */ |
44 | #else | 45 | #else |
45 | static inline void init_cpu_to_node(void) { } | 46 | static inline void init_cpu_to_node(void) { } |
diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c index 48ff6dcffa02..9974d21048fd 100644 --- a/arch/x86/kernel/irq_32.c +++ b/arch/x86/kernel/irq_32.c | |||
@@ -129,8 +129,7 @@ void __cpuinit irq_ctx_init(int cpu) | |||
129 | irqctx = page_address(alloc_pages_node(cpu_to_node(cpu), | 129 | irqctx = page_address(alloc_pages_node(cpu_to_node(cpu), |
130 | THREAD_FLAGS, | 130 | THREAD_FLAGS, |
131 | THREAD_ORDER)); | 131 | THREAD_ORDER)); |
132 | irqctx->tinfo.task = NULL; | 132 | memset(&irqctx->tinfo, 0, sizeof(struct thread_info)); |
133 | irqctx->tinfo.exec_domain = NULL; | ||
134 | irqctx->tinfo.cpu = cpu; | 133 | irqctx->tinfo.cpu = cpu; |
135 | irqctx->tinfo.preempt_count = HARDIRQ_OFFSET; | 134 | irqctx->tinfo.preempt_count = HARDIRQ_OFFSET; |
136 | irqctx->tinfo.addr_limit = MAKE_MM_SEG(0); | 135 | irqctx->tinfo.addr_limit = MAKE_MM_SEG(0); |
@@ -140,10 +139,8 @@ void __cpuinit irq_ctx_init(int cpu) | |||
140 | irqctx = page_address(alloc_pages_node(cpu_to_node(cpu), | 139 | irqctx = page_address(alloc_pages_node(cpu_to_node(cpu), |
141 | THREAD_FLAGS, | 140 | THREAD_FLAGS, |
142 | THREAD_ORDER)); | 141 | THREAD_ORDER)); |
143 | irqctx->tinfo.task = NULL; | 142 | memset(&irqctx->tinfo, 0, sizeof(struct thread_info)); |
144 | irqctx->tinfo.exec_domain = NULL; | ||
145 | irqctx->tinfo.cpu = cpu; | 143 | irqctx->tinfo.cpu = cpu; |
146 | irqctx->tinfo.preempt_count = 0; | ||
147 | irqctx->tinfo.addr_limit = MAKE_MM_SEG(0); | 144 | irqctx->tinfo.addr_limit = MAKE_MM_SEG(0); |
148 | 145 | ||
149 | per_cpu(softirq_ctx, cpu) = irqctx; | 146 | per_cpu(softirq_ctx, cpu) = irqctx; |
diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c index 787c52ca49c3..ebf6d7887a38 100644 --- a/arch/x86/mm/numa.c +++ b/arch/x86/mm/numa.c | |||
@@ -2,6 +2,28 @@ | |||
2 | #include <linux/topology.h> | 2 | #include <linux/topology.h> |
3 | #include <linux/module.h> | 3 | #include <linux/module.h> |
4 | #include <linux/bootmem.h> | 4 | #include <linux/bootmem.h> |
5 | #include <asm/numa.h> | ||
6 | #include <asm/acpi.h> | ||
7 | |||
8 | int __initdata numa_off; | ||
9 | |||
10 | static __init int numa_setup(char *opt) | ||
11 | { | ||
12 | if (!opt) | ||
13 | return -EINVAL; | ||
14 | if (!strncmp(opt, "off", 3)) | ||
15 | numa_off = 1; | ||
16 | #ifdef CONFIG_NUMA_EMU | ||
17 | if (!strncmp(opt, "fake=", 5)) | ||
18 | numa_emu_cmdline(opt + 5); | ||
19 | #endif | ||
20 | #ifdef CONFIG_ACPI_NUMA | ||
21 | if (!strncmp(opt, "noacpi", 6)) | ||
22 | acpi_numa = -1; | ||
23 | #endif | ||
24 | return 0; | ||
25 | } | ||
26 | early_param("numa", numa_setup); | ||
5 | 27 | ||
6 | /* | 28 | /* |
7 | * Which logical CPUs are on which nodes | 29 | * Which logical CPUs are on which nodes |
diff --git a/arch/x86/mm/numa_64.c b/arch/x86/mm/numa_64.c index 1e72102e80c9..95ea1551eebc 100644 --- a/arch/x86/mm/numa_64.c +++ b/arch/x86/mm/numa_64.c | |||
@@ -30,7 +30,6 @@ s16 apicid_to_node[MAX_LOCAL_APIC] __cpuinitdata = { | |||
30 | [0 ... MAX_LOCAL_APIC-1] = NUMA_NO_NODE | 30 | [0 ... MAX_LOCAL_APIC-1] = NUMA_NO_NODE |
31 | }; | 31 | }; |
32 | 32 | ||
33 | int numa_off __initdata; | ||
34 | static unsigned long __initdata nodemap_addr; | 33 | static unsigned long __initdata nodemap_addr; |
35 | static unsigned long __initdata nodemap_size; | 34 | static unsigned long __initdata nodemap_size; |
36 | 35 | ||
@@ -263,6 +262,11 @@ static struct bootnode nodes[MAX_NUMNODES] __initdata; | |||
263 | static struct bootnode physnodes[MAX_NUMNODES] __cpuinitdata; | 262 | static struct bootnode physnodes[MAX_NUMNODES] __cpuinitdata; |
264 | static char *cmdline __initdata; | 263 | static char *cmdline __initdata; |
265 | 264 | ||
265 | void __init numa_emu_cmdline(char *str) | ||
266 | { | ||
267 | cmdline = str; | ||
268 | } | ||
269 | |||
266 | static int __init setup_physnodes(unsigned long start, unsigned long end, | 270 | static int __init setup_physnodes(unsigned long start, unsigned long end, |
267 | int acpi, int amd) | 271 | int acpi, int amd) |
268 | { | 272 | { |
@@ -670,24 +674,6 @@ unsigned long __init numa_free_all_bootmem(void) | |||
670 | return pages; | 674 | return pages; |
671 | } | 675 | } |
672 | 676 | ||
673 | static __init int numa_setup(char *opt) | ||
674 | { | ||
675 | if (!opt) | ||
676 | return -EINVAL; | ||
677 | if (!strncmp(opt, "off", 3)) | ||
678 | numa_off = 1; | ||
679 | #ifdef CONFIG_NUMA_EMU | ||
680 | if (!strncmp(opt, "fake=", 5)) | ||
681 | cmdline = opt + 5; | ||
682 | #endif | ||
683 | #ifdef CONFIG_ACPI_NUMA | ||
684 | if (!strncmp(opt, "noacpi", 6)) | ||
685 | acpi_numa = -1; | ||
686 | #endif | ||
687 | return 0; | ||
688 | } | ||
689 | early_param("numa", numa_setup); | ||
690 | |||
691 | #ifdef CONFIG_NUMA | 677 | #ifdef CONFIG_NUMA |
692 | 678 | ||
693 | static __init int find_near_online_node(int node) | 679 | static __init int find_near_online_node(int node) |
diff --git a/arch/x86/mm/srat_32.c b/arch/x86/mm/srat_32.c index f16434568a51..ae96e7b8051d 100644 --- a/arch/x86/mm/srat_32.c +++ b/arch/x86/mm/srat_32.c | |||
@@ -59,7 +59,6 @@ static struct node_memory_chunk_s __initdata node_memory_chunk[MAXCHUNKS]; | |||
59 | static int __initdata num_memory_chunks; /* total number of memory chunks */ | 59 | static int __initdata num_memory_chunks; /* total number of memory chunks */ |
60 | static u8 __initdata apicid_to_pxm[MAX_APICID]; | 60 | static u8 __initdata apicid_to_pxm[MAX_APICID]; |
61 | 61 | ||
62 | int numa_off __initdata; | ||
63 | int acpi_numa __initdata; | 62 | int acpi_numa __initdata; |
64 | 63 | ||
65 | static __init void bad_srat(void) | 64 | static __init void bad_srat(void) |
diff --git a/drivers/acpi/acpica/accommon.h b/drivers/acpi/acpica/accommon.h index 3e50c74ed4a1..e0ba17f0a7c8 100644 --- a/drivers/acpi/acpica/accommon.h +++ b/drivers/acpi/acpica/accommon.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acconfig.h b/drivers/acpi/acpica/acconfig.h index b17d8de9f6ff..ab87396c2c07 100644 --- a/drivers/acpi/acpica/acconfig.h +++ b/drivers/acpi/acpica/acconfig.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acdebug.h b/drivers/acpi/acpica/acdebug.h index 72e9d5eb083c..eb0b1f8dee6d 100644 --- a/drivers/acpi/acpica/acdebug.h +++ b/drivers/acpi/acpica/acdebug.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acdispat.h b/drivers/acpi/acpica/acdispat.h index 894a0ff2a946..666271b65418 100644 --- a/drivers/acpi/acpica/acdispat.h +++ b/drivers/acpi/acpica/acdispat.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acevents.h b/drivers/acpi/acpica/acevents.h index 70e0b28801aa..41d247daf461 100644 --- a/drivers/acpi/acpica/acevents.h +++ b/drivers/acpi/acpica/acevents.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h index 0e4dba0d0325..82a1bd283db8 100644 --- a/drivers/acpi/acpica/acglobal.h +++ b/drivers/acpi/acpica/acglobal.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/achware.h b/drivers/acpi/acpica/achware.h index 258d628793ea..e7213beaafc7 100644 --- a/drivers/acpi/acpica/achware.h +++ b/drivers/acpi/acpica/achware.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acinterp.h b/drivers/acpi/acpica/acinterp.h index 049e203bd621..3731e1c34b83 100644 --- a/drivers/acpi/acpica/acinterp.h +++ b/drivers/acpi/acpica/acinterp.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/aclocal.h b/drivers/acpi/acpica/aclocal.h index 74000f5b7dab..54784bb42cec 100644 --- a/drivers/acpi/acpica/aclocal.h +++ b/drivers/acpi/acpica/aclocal.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acmacros.h b/drivers/acpi/acpica/acmacros.h index 8d5c9e0a495f..b7491ee1fba6 100644 --- a/drivers/acpi/acpica/acmacros.h +++ b/drivers/acpi/acpica/acmacros.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acnamesp.h b/drivers/acpi/acpica/acnamesp.h index d44d3bc5b847..79a598c67fe3 100644 --- a/drivers/acpi/acpica/acnamesp.h +++ b/drivers/acpi/acpica/acnamesp.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acobject.h b/drivers/acpi/acpica/acobject.h index 962a3ccff6fd..1055769f2f01 100644 --- a/drivers/acpi/acpica/acobject.h +++ b/drivers/acpi/acpica/acobject.h | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
@@ -97,8 +97,6 @@ | |||
97 | #define AOPOBJ_OBJECT_INITIALIZED 0x08 /* Region is initialized, _REG was run */ | 97 | #define AOPOBJ_OBJECT_INITIALIZED 0x08 /* Region is initialized, _REG was run */ |
98 | #define AOPOBJ_SETUP_COMPLETE 0x10 /* Region setup is complete */ | 98 | #define AOPOBJ_SETUP_COMPLETE 0x10 /* Region setup is complete */ |
99 | #define AOPOBJ_INVALID 0x20 /* Host OS won't allow a Region address */ | 99 | #define AOPOBJ_INVALID 0x20 /* Host OS won't allow a Region address */ |
100 | #define AOPOBJ_MODULE_LEVEL 0x40 /* Method is actually module-level code */ | ||
101 | #define AOPOBJ_MODIFIED_NAMESPACE 0x80 /* Method modified the namespace */ | ||
102 | 100 | ||
103 | /****************************************************************************** | 101 | /****************************************************************************** |
104 | * | 102 | * |
@@ -175,7 +173,7 @@ struct acpi_object_region { | |||
175 | }; | 173 | }; |
176 | 174 | ||
177 | struct acpi_object_method { | 175 | struct acpi_object_method { |
178 | ACPI_OBJECT_COMMON_HEADER u8 method_flags; | 176 | ACPI_OBJECT_COMMON_HEADER u8 info_flags; |
179 | u8 param_count; | 177 | u8 param_count; |
180 | u8 sync_level; | 178 | u8 sync_level; |
181 | union acpi_operand_object *mutex; | 179 | union acpi_operand_object *mutex; |
@@ -183,13 +181,21 @@ struct acpi_object_method { | |||
183 | union { | 181 | union { |
184 | ACPI_INTERNAL_METHOD implementation; | 182 | ACPI_INTERNAL_METHOD implementation; |
185 | union acpi_operand_object *handler; | 183 | union acpi_operand_object *handler; |
186 | } extra; | 184 | } dispatch; |
187 | 185 | ||
188 | u32 aml_length; | 186 | u32 aml_length; |
189 | u8 thread_count; | 187 | u8 thread_count; |
190 | acpi_owner_id owner_id; | 188 | acpi_owner_id owner_id; |
191 | }; | 189 | }; |
192 | 190 | ||
191 | /* Flags for info_flags field above */ | ||
192 | |||
193 | #define ACPI_METHOD_MODULE_LEVEL 0x01 /* Method is actually module-level code */ | ||
194 | #define ACPI_METHOD_INTERNAL_ONLY 0x02 /* Method is implemented internally (_OSI) */ | ||
195 | #define ACPI_METHOD_SERIALIZED 0x04 /* Method is serialized */ | ||
196 | #define ACPI_METHOD_SERIALIZED_PENDING 0x08 /* Method is to be marked serialized */ | ||
197 | #define ACPI_METHOD_MODIFIED_NAMESPACE 0x10 /* Method modified the namespace */ | ||
198 | |||
193 | /****************************************************************************** | 199 | /****************************************************************************** |
194 | * | 200 | * |
195 | * Objects that can be notified. All share a common notify_info area. | 201 | * Objects that can be notified. All share a common notify_info area. |
diff --git a/drivers/acpi/acpica/acopcode.h b/drivers/acpi/acpica/acopcode.h index 8c15ff43f42b..bb2ccfad7376 100644 --- a/drivers/acpi/acpica/acopcode.h +++ b/drivers/acpi/acpica/acopcode.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acparser.h b/drivers/acpi/acpica/acparser.h index d0bb0fd3e57a..5ea1e06afa20 100644 --- a/drivers/acpi/acpica/acparser.h +++ b/drivers/acpi/acpica/acparser.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acpredef.h b/drivers/acpi/acpica/acpredef.h index 10998d369ad0..94e73c97cf85 100644 --- a/drivers/acpi/acpica/acpredef.h +++ b/drivers/acpi/acpica/acpredef.h | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acresrc.h b/drivers/acpi/acpica/acresrc.h index 528bcbaf4ce7..f08b55b7f3a0 100644 --- a/drivers/acpi/acpica/acresrc.h +++ b/drivers/acpi/acpica/acresrc.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acstruct.h b/drivers/acpi/acpica/acstruct.h index 6e5dd97949fe..1623b245dde2 100644 --- a/drivers/acpi/acpica/acstruct.h +++ b/drivers/acpi/acpica/acstruct.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/actables.h b/drivers/acpi/acpica/actables.h index 62a576e34361..967f08124eba 100644 --- a/drivers/acpi/acpica/actables.h +++ b/drivers/acpi/acpica/actables.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acutils.h b/drivers/acpi/acpica/acutils.h index 72e4183c1937..99c140d8e348 100644 --- a/drivers/acpi/acpica/acutils.h +++ b/drivers/acpi/acpica/acutils.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/amlcode.h b/drivers/acpi/acpica/amlcode.h index 1f484ba228fc..f4f0998d3967 100644 --- a/drivers/acpi/acpica/amlcode.h +++ b/drivers/acpi/acpica/amlcode.h | |||
@@ -7,7 +7,7 @@ | |||
7 | *****************************************************************************/ | 7 | *****************************************************************************/ |
8 | 8 | ||
9 | /* | 9 | /* |
10 | * Copyright (C) 2000 - 2010, Intel Corp. | 10 | * Copyright (C) 2000 - 2011, Intel Corp. |
11 | * All rights reserved. | 11 | * All rights reserved. |
12 | * | 12 | * |
13 | * Redistribution and use in source and binary forms, with or without | 13 | * Redistribution and use in source and binary forms, with or without |
@@ -480,16 +480,10 @@ typedef enum { | |||
480 | AML_FIELD_ATTRIB_SMB_BLOCK_CALL = 0x0D | 480 | AML_FIELD_ATTRIB_SMB_BLOCK_CALL = 0x0D |
481 | } AML_ACCESS_ATTRIBUTE; | 481 | } AML_ACCESS_ATTRIBUTE; |
482 | 482 | ||
483 | /* Bit fields in method_flags byte */ | 483 | /* Bit fields in the AML method_flags byte */ |
484 | 484 | ||
485 | #define AML_METHOD_ARG_COUNT 0x07 | 485 | #define AML_METHOD_ARG_COUNT 0x07 |
486 | #define AML_METHOD_SERIALIZED 0x08 | 486 | #define AML_METHOD_SERIALIZED 0x08 |
487 | #define AML_METHOD_SYNC_LEVEL 0xF0 | 487 | #define AML_METHOD_SYNC_LEVEL 0xF0 |
488 | 488 | ||
489 | /* METHOD_FLAGS_ARG_COUNT is not used internally, define additional flags */ | ||
490 | |||
491 | #define AML_METHOD_INTERNAL_ONLY 0x01 | ||
492 | #define AML_METHOD_RESERVED1 0x02 | ||
493 | #define AML_METHOD_RESERVED2 0x04 | ||
494 | |||
495 | #endif /* __AMLCODE_H__ */ | 489 | #endif /* __AMLCODE_H__ */ |
diff --git a/drivers/acpi/acpica/amlresrc.h b/drivers/acpi/acpica/amlresrc.h index 0e5798fcbb19..59122cde247c 100644 --- a/drivers/acpi/acpica/amlresrc.h +++ b/drivers/acpi/acpica/amlresrc.h | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dsfield.c b/drivers/acpi/acpica/dsfield.c index 347bee1726f1..34be60c0e448 100644 --- a/drivers/acpi/acpica/dsfield.c +++ b/drivers/acpi/acpica/dsfield.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dsinit.c b/drivers/acpi/acpica/dsinit.c index cc4a38c57558..a7718bf2b9a1 100644 --- a/drivers/acpi/acpica/dsinit.c +++ b/drivers/acpi/acpica/dsinit.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dsmethod.c b/drivers/acpi/acpica/dsmethod.c index d94dd8974b55..5d797751e205 100644 --- a/drivers/acpi/acpica/dsmethod.c +++ b/drivers/acpi/acpica/dsmethod.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -43,7 +43,6 @@ | |||
43 | 43 | ||
44 | #include <acpi/acpi.h> | 44 | #include <acpi/acpi.h> |
45 | #include "accommon.h" | 45 | #include "accommon.h" |
46 | #include "amlcode.h" | ||
47 | #include "acdispat.h" | 46 | #include "acdispat.h" |
48 | #include "acinterp.h" | 47 | #include "acinterp.h" |
49 | #include "acnamesp.h" | 48 | #include "acnamesp.h" |
@@ -201,7 +200,7 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node, | |||
201 | /* | 200 | /* |
202 | * If this method is serialized, we need to acquire the method mutex. | 201 | * If this method is serialized, we need to acquire the method mutex. |
203 | */ | 202 | */ |
204 | if (obj_desc->method.method_flags & AML_METHOD_SERIALIZED) { | 203 | if (obj_desc->method.info_flags & ACPI_METHOD_SERIALIZED) { |
205 | /* | 204 | /* |
206 | * Create a mutex for the method if it is defined to be Serialized | 205 | * Create a mutex for the method if it is defined to be Serialized |
207 | * and a mutex has not already been created. We defer the mutex creation | 206 | * and a mutex has not already been created. We defer the mutex creation |
@@ -413,8 +412,9 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, | |||
413 | 412 | ||
414 | /* Invoke an internal method if necessary */ | 413 | /* Invoke an internal method if necessary */ |
415 | 414 | ||
416 | if (obj_desc->method.method_flags & AML_METHOD_INTERNAL_ONLY) { | 415 | if (obj_desc->method.info_flags & ACPI_METHOD_INTERNAL_ONLY) { |
417 | status = obj_desc->method.extra.implementation(next_walk_state); | 416 | status = |
417 | obj_desc->method.dispatch.implementation(next_walk_state); | ||
418 | if (status == AE_OK) { | 418 | if (status == AE_OK) { |
419 | status = AE_CTRL_TERMINATE; | 419 | status = AE_CTRL_TERMINATE; |
420 | } | 420 | } |
@@ -579,11 +579,14 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc, | |||
579 | 579 | ||
580 | /* | 580 | /* |
581 | * Delete any namespace objects created anywhere within the | 581 | * Delete any namespace objects created anywhere within the |
582 | * namespace by the execution of this method. Unless this method | 582 | * namespace by the execution of this method. Unless: |
583 | * is a module-level executable code method, in which case we | 583 | * 1) This method is a module-level executable code method, in which |
584 | * want make the objects permanent. | 584 | * case we want make the objects permanent. |
585 | * 2) There are other threads executing the method, in which case we | ||
586 | * will wait until the last thread has completed. | ||
585 | */ | 587 | */ |
586 | if (!(method_desc->method.flags & AOPOBJ_MODULE_LEVEL)) { | 588 | if (!(method_desc->method.info_flags & ACPI_METHOD_MODULE_LEVEL) |
589 | && (method_desc->method.thread_count == 1)) { | ||
587 | 590 | ||
588 | /* Delete any direct children of (created by) this method */ | 591 | /* Delete any direct children of (created by) this method */ |
589 | 592 | ||
@@ -593,12 +596,17 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc, | |||
593 | /* | 596 | /* |
594 | * Delete any objects that were created by this method | 597 | * Delete any objects that were created by this method |
595 | * elsewhere in the namespace (if any were created). | 598 | * elsewhere in the namespace (if any were created). |
599 | * Use of the ACPI_METHOD_MODIFIED_NAMESPACE optimizes the | ||
600 | * deletion such that we don't have to perform an entire | ||
601 | * namespace walk for every control method execution. | ||
596 | */ | 602 | */ |
597 | if (method_desc->method. | 603 | if (method_desc->method. |
598 | flags & AOPOBJ_MODIFIED_NAMESPACE) { | 604 | info_flags & ACPI_METHOD_MODIFIED_NAMESPACE) { |
599 | acpi_ns_delete_namespace_by_owner(method_desc-> | 605 | acpi_ns_delete_namespace_by_owner(method_desc-> |
600 | method. | 606 | method. |
601 | owner_id); | 607 | owner_id); |
608 | method_desc->method.info_flags &= | ||
609 | ~ACPI_METHOD_MODIFIED_NAMESPACE; | ||
602 | } | 610 | } |
603 | } | 611 | } |
604 | } | 612 | } |
@@ -629,19 +637,43 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc, | |||
629 | * Serialized if it appears that the method is incorrectly written and | 637 | * Serialized if it appears that the method is incorrectly written and |
630 | * does not support multiple thread execution. The best example of this | 638 | * does not support multiple thread execution. The best example of this |
631 | * is if such a method creates namespace objects and blocks. A second | 639 | * is if such a method creates namespace objects and blocks. A second |
632 | * thread will fail with an AE_ALREADY_EXISTS exception | 640 | * thread will fail with an AE_ALREADY_EXISTS exception. |
633 | * | 641 | * |
634 | * This code is here because we must wait until the last thread exits | 642 | * This code is here because we must wait until the last thread exits |
635 | * before creating the synchronization semaphore. | 643 | * before marking the method as serialized. |
636 | */ | 644 | */ |
637 | if ((method_desc->method.method_flags & AML_METHOD_SERIALIZED) | 645 | if (method_desc->method. |
638 | && (!method_desc->method.mutex)) { | 646 | info_flags & ACPI_METHOD_SERIALIZED_PENDING) { |
639 | (void)acpi_ds_create_method_mutex(method_desc); | 647 | if (walk_state) { |
648 | ACPI_INFO((AE_INFO, | ||
649 | "Marking method %4.4s as Serialized because of AE_ALREADY_EXISTS error", | ||
650 | walk_state->method_node->name. | ||
651 | ascii)); | ||
652 | } | ||
653 | |||
654 | /* | ||
655 | * Method tried to create an object twice and was marked as | ||
656 | * "pending serialized". The probable cause is that the method | ||
657 | * cannot handle reentrancy. | ||
658 | * | ||
659 | * The method was created as not_serialized, but it tried to create | ||
660 | * a named object and then blocked, causing the second thread | ||
661 | * entrance to begin and then fail. Workaround this problem by | ||
662 | * marking the method permanently as Serialized when the last | ||
663 | * thread exits here. | ||
664 | */ | ||
665 | method_desc->method.info_flags &= | ||
666 | ~ACPI_METHOD_SERIALIZED_PENDING; | ||
667 | method_desc->method.info_flags |= | ||
668 | ACPI_METHOD_SERIALIZED; | ||
669 | method_desc->method.sync_level = 0; | ||
640 | } | 670 | } |
641 | 671 | ||
642 | /* No more threads, we can free the owner_id */ | 672 | /* No more threads, we can free the owner_id */ |
643 | 673 | ||
644 | if (!(method_desc->method.flags & AOPOBJ_MODULE_LEVEL)) { | 674 | if (! |
675 | (method_desc->method. | ||
676 | info_flags & ACPI_METHOD_MODULE_LEVEL)) { | ||
645 | acpi_ut_release_owner_id(&method_desc->method.owner_id); | 677 | acpi_ut_release_owner_id(&method_desc->method.owner_id); |
646 | } | 678 | } |
647 | } | 679 | } |
diff --git a/drivers/acpi/acpica/dsmthdat.c b/drivers/acpi/acpica/dsmthdat.c index 8095306fcd8c..905ce29a92e1 100644 --- a/drivers/acpi/acpica/dsmthdat.c +++ b/drivers/acpi/acpica/dsmthdat.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dsobject.c b/drivers/acpi/acpica/dsobject.c index 8e85f54a8e0e..f42e17e5c252 100644 --- a/drivers/acpi/acpica/dsobject.c +++ b/drivers/acpi/acpica/dsobject.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dsopcode.c b/drivers/acpi/acpica/dsopcode.c index 7c0e74227171..bbecf293aeeb 100644 --- a/drivers/acpi/acpica/dsopcode.c +++ b/drivers/acpi/acpica/dsopcode.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dsutils.c b/drivers/acpi/acpica/dsutils.c index 15135c25aa9b..2c477ce172fa 100644 --- a/drivers/acpi/acpica/dsutils.c +++ b/drivers/acpi/acpica/dsutils.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dswexec.c b/drivers/acpi/acpica/dswexec.c index 6b0b5d08d97a..fe40e4c6554f 100644 --- a/drivers/acpi/acpica/dswexec.c +++ b/drivers/acpi/acpica/dswexec.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dswload.c b/drivers/acpi/acpica/dswload.c index 140a9d002959..52566ff5e903 100644 --- a/drivers/acpi/acpica/dswload.c +++ b/drivers/acpi/acpica/dswload.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dswscope.c b/drivers/acpi/acpica/dswscope.c index d1e701709dac..76a661fc1e09 100644 --- a/drivers/acpi/acpica/dswscope.c +++ b/drivers/acpi/acpica/dswscope.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dswstate.c b/drivers/acpi/acpica/dswstate.c index 83155dd8671e..a6c374ef9914 100644 --- a/drivers/acpi/acpica/dswstate.c +++ b/drivers/acpi/acpica/dswstate.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evevent.c b/drivers/acpi/acpica/evevent.c index e5e313c663a5..d458b041e651 100644 --- a/drivers/acpi/acpica/evevent.c +++ b/drivers/acpi/acpica/evevent.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c index 7c339d34ab42..14988a86066f 100644 --- a/drivers/acpi/acpica/evgpe.c +++ b/drivers/acpi/acpica/evgpe.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -471,6 +471,7 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) | |||
471 | 471 | ||
472 | status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); | 472 | status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); |
473 | if (ACPI_FAILURE(status)) { | 473 | if (ACPI_FAILURE(status)) { |
474 | ACPI_FREE(local_gpe_event_info); | ||
474 | return_VOID; | 475 | return_VOID; |
475 | } | 476 | } |
476 | 477 | ||
@@ -478,6 +479,7 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) | |||
478 | 479 | ||
479 | if (!acpi_ev_valid_gpe_event(gpe_event_info)) { | 480 | if (!acpi_ev_valid_gpe_event(gpe_event_info)) { |
480 | status = acpi_ut_release_mutex(ACPI_MTX_EVENTS); | 481 | status = acpi_ut_release_mutex(ACPI_MTX_EVENTS); |
482 | ACPI_FREE(local_gpe_event_info); | ||
481 | return_VOID; | 483 | return_VOID; |
482 | } | 484 | } |
483 | 485 | ||
diff --git a/drivers/acpi/acpica/evgpeblk.c b/drivers/acpi/acpica/evgpeblk.c index 9acb86958c09..ca2c41a53311 100644 --- a/drivers/acpi/acpica/evgpeblk.c +++ b/drivers/acpi/acpica/evgpeblk.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evgpeinit.c b/drivers/acpi/acpica/evgpeinit.c index c59dc2340593..ce9aa9f9a972 100644 --- a/drivers/acpi/acpica/evgpeinit.c +++ b/drivers/acpi/acpica/evgpeinit.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evgpeutil.c b/drivers/acpi/acpica/evgpeutil.c index 10e477494dcf..80a81d0c4a80 100644 --- a/drivers/acpi/acpica/evgpeutil.c +++ b/drivers/acpi/acpica/evgpeutil.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evmisc.c b/drivers/acpi/acpica/evmisc.c index 38bba66fcce5..7dc80946f7bd 100644 --- a/drivers/acpi/acpica/evmisc.c +++ b/drivers/acpi/acpica/evmisc.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evregion.c b/drivers/acpi/acpica/evregion.c index 98fd210e87b2..785a5ee64585 100644 --- a/drivers/acpi/acpica/evregion.c +++ b/drivers/acpi/acpica/evregion.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evrgnini.c b/drivers/acpi/acpica/evrgnini.c index 0b47a6dc9290..9659cee6093e 100644 --- a/drivers/acpi/acpica/evrgnini.c +++ b/drivers/acpi/acpica/evrgnini.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -590,9 +590,9 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj, | |||
590 | * See acpi_ns_exec_module_code | 590 | * See acpi_ns_exec_module_code |
591 | */ | 591 | */ |
592 | if (obj_desc->method. | 592 | if (obj_desc->method. |
593 | flags & AOPOBJ_MODULE_LEVEL) { | 593 | info_flags & ACPI_METHOD_MODULE_LEVEL) { |
594 | handler_obj = | 594 | handler_obj = |
595 | obj_desc->method.extra.handler; | 595 | obj_desc->method.dispatch.handler; |
596 | } | 596 | } |
597 | break; | 597 | break; |
598 | 598 | ||
diff --git a/drivers/acpi/acpica/evsci.c b/drivers/acpi/acpica/evsci.c index 8dfbaa96e422..2ebd40e1a3ef 100644 --- a/drivers/acpi/acpica/evsci.c +++ b/drivers/acpi/acpica/evsci.c | |||
@@ -6,7 +6,7 @@ | |||
6 | ******************************************************************************/ | 6 | ******************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evxface.c b/drivers/acpi/acpica/evxface.c index 1226689bdb1b..e1141402dbed 100644 --- a/drivers/acpi/acpica/evxface.c +++ b/drivers/acpi/acpica/evxface.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evxfevnt.c b/drivers/acpi/acpica/evxfevnt.c index 90488c1e0f3d..c57b5c707a77 100644 --- a/drivers/acpi/acpica/evxfevnt.c +++ b/drivers/acpi/acpica/evxfevnt.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evxfgpe.c b/drivers/acpi/acpica/evxfgpe.c index 416845bc9c1f..e9562a7cb2f9 100644 --- a/drivers/acpi/acpica/evxfgpe.c +++ b/drivers/acpi/acpica/evxfgpe.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evxfregn.c b/drivers/acpi/acpica/evxfregn.c index ce9314f79451..eb7386763712 100644 --- a/drivers/acpi/acpica/evxfregn.c +++ b/drivers/acpi/acpica/evxfregn.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exconfig.c b/drivers/acpi/acpica/exconfig.c index 18832205b631..745a42b401f5 100644 --- a/drivers/acpi/acpica/exconfig.c +++ b/drivers/acpi/acpica/exconfig.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exconvrt.c b/drivers/acpi/acpica/exconvrt.c index b73bc50c5b76..74162a11817d 100644 --- a/drivers/acpi/acpica/exconvrt.c +++ b/drivers/acpi/acpica/exconvrt.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/excreate.c b/drivers/acpi/acpica/excreate.c index 3c61b48c73f5..e7b372d17667 100644 --- a/drivers/acpi/acpica/excreate.c +++ b/drivers/acpi/acpica/excreate.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -482,13 +482,11 @@ acpi_ex_create_method(u8 * aml_start, | |||
482 | obj_desc->method.aml_length = aml_length; | 482 | obj_desc->method.aml_length = aml_length; |
483 | 483 | ||
484 | /* | 484 | /* |
485 | * Disassemble the method flags. Split off the Arg Count | 485 | * Disassemble the method flags. Split off the arg_count, Serialized |
486 | * for efficiency | 486 | * flag, and sync_level for efficiency. |
487 | */ | 487 | */ |
488 | method_flags = (u8) operand[1]->integer.value; | 488 | method_flags = (u8) operand[1]->integer.value; |
489 | 489 | ||
490 | obj_desc->method.method_flags = | ||
491 | (u8) (method_flags & ~AML_METHOD_ARG_COUNT); | ||
492 | obj_desc->method.param_count = | 490 | obj_desc->method.param_count = |
493 | (u8) (method_flags & AML_METHOD_ARG_COUNT); | 491 | (u8) (method_flags & AML_METHOD_ARG_COUNT); |
494 | 492 | ||
@@ -497,6 +495,8 @@ acpi_ex_create_method(u8 * aml_start, | |||
497 | * created for this method when it is parsed. | 495 | * created for this method when it is parsed. |
498 | */ | 496 | */ |
499 | if (method_flags & AML_METHOD_SERIALIZED) { | 497 | if (method_flags & AML_METHOD_SERIALIZED) { |
498 | obj_desc->method.info_flags = ACPI_METHOD_SERIALIZED; | ||
499 | |||
500 | /* | 500 | /* |
501 | * ACPI 1.0: sync_level = 0 | 501 | * ACPI 1.0: sync_level = 0 |
502 | * ACPI 2.0: sync_level = sync_level in method declaration | 502 | * ACPI 2.0: sync_level = sync_level in method declaration |
diff --git a/drivers/acpi/acpica/exdebug.c b/drivers/acpi/acpica/exdebug.c index be8c98b480d7..c7a2f1edd282 100644 --- a/drivers/acpi/acpica/exdebug.c +++ b/drivers/acpi/acpica/exdebug.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exdump.c b/drivers/acpi/acpica/exdump.c index f067bbb0d961..61b8c0e8b74d 100644 --- a/drivers/acpi/acpica/exdump.c +++ b/drivers/acpi/acpica/exdump.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -122,7 +122,7 @@ static struct acpi_exdump_info acpi_ex_dump_event[2] = { | |||
122 | 122 | ||
123 | static struct acpi_exdump_info acpi_ex_dump_method[9] = { | 123 | static struct acpi_exdump_info acpi_ex_dump_method[9] = { |
124 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_method), NULL}, | 124 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_method), NULL}, |
125 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.method_flags), "Method Flags"}, | 125 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.info_flags), "Info Flags"}, |
126 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.param_count), | 126 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.param_count), |
127 | "Parameter Count"}, | 127 | "Parameter Count"}, |
128 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.sync_level), "Sync Level"}, | 128 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.sync_level), "Sync Level"}, |
diff --git a/drivers/acpi/acpica/exfield.c b/drivers/acpi/acpica/exfield.c index f17d2ff0031b..0bde2230c028 100644 --- a/drivers/acpi/acpica/exfield.c +++ b/drivers/acpi/acpica/exfield.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exfldio.c b/drivers/acpi/acpica/exfldio.c index 38293fd3e088..6c79c29f082d 100644 --- a/drivers/acpi/acpica/exfldio.c +++ b/drivers/acpi/acpica/exfldio.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exmisc.c b/drivers/acpi/acpica/exmisc.c index 95db4be0877b..703d88ed0b3d 100644 --- a/drivers/acpi/acpica/exmisc.c +++ b/drivers/acpi/acpica/exmisc.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exmutex.c b/drivers/acpi/acpica/exmutex.c index 6af14e43f839..be1c56ead653 100644 --- a/drivers/acpi/acpica/exmutex.c +++ b/drivers/acpi/acpica/exmutex.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exnames.c b/drivers/acpi/acpica/exnames.c index d11e539ef763..49ec049c157e 100644 --- a/drivers/acpi/acpica/exnames.c +++ b/drivers/acpi/acpica/exnames.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exoparg1.c b/drivers/acpi/acpica/exoparg1.c index 84e4d185aa25..236ead14b7f7 100644 --- a/drivers/acpi/acpica/exoparg1.c +++ b/drivers/acpi/acpica/exoparg1.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exoparg2.c b/drivers/acpi/acpica/exoparg2.c index 10e104cf0fb9..2571b4a310f4 100644 --- a/drivers/acpi/acpica/exoparg2.c +++ b/drivers/acpi/acpica/exoparg2.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exoparg3.c b/drivers/acpi/acpica/exoparg3.c index 7a08d23befcd..1b48d9d28c9a 100644 --- a/drivers/acpi/acpica/exoparg3.c +++ b/drivers/acpi/acpica/exoparg3.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exoparg6.c b/drivers/acpi/acpica/exoparg6.c index 4b50730cf9a0..f4a2787e8e92 100644 --- a/drivers/acpi/acpica/exoparg6.c +++ b/drivers/acpi/acpica/exoparg6.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exprep.c b/drivers/acpi/acpica/exprep.c index 7aae29f73d3f..cc95e2000406 100644 --- a/drivers/acpi/acpica/exprep.c +++ b/drivers/acpi/acpica/exprep.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exregion.c b/drivers/acpi/acpica/exregion.c index de17e10da0ed..f0d5e14f1f2c 100644 --- a/drivers/acpi/acpica/exregion.c +++ b/drivers/acpi/acpica/exregion.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exresnte.c b/drivers/acpi/acpica/exresnte.c index 1fa4289a687e..55997e46948b 100644 --- a/drivers/acpi/acpica/exresnte.c +++ b/drivers/acpi/acpica/exresnte.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exresolv.c b/drivers/acpi/acpica/exresolv.c index 7ca35ea8acea..db502cd7d934 100644 --- a/drivers/acpi/acpica/exresolv.c +++ b/drivers/acpi/acpica/exresolv.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exresop.c b/drivers/acpi/acpica/exresop.c index 8c97cfd6a0fd..e3bb00ccdff5 100644 --- a/drivers/acpi/acpica/exresop.c +++ b/drivers/acpi/acpica/exresop.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exstore.c b/drivers/acpi/acpica/exstore.c index 1624436ba4c5..c0c8842dd344 100644 --- a/drivers/acpi/acpica/exstore.c +++ b/drivers/acpi/acpica/exstore.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exstoren.c b/drivers/acpi/acpica/exstoren.c index d4af684620ca..a979017d56b8 100644 --- a/drivers/acpi/acpica/exstoren.c +++ b/drivers/acpi/acpica/exstoren.c | |||
@@ -7,7 +7,7 @@ | |||
7 | *****************************************************************************/ | 7 | *****************************************************************************/ |
8 | 8 | ||
9 | /* | 9 | /* |
10 | * Copyright (C) 2000 - 2010, Intel Corp. | 10 | * Copyright (C) 2000 - 2011, Intel Corp. |
11 | * All rights reserved. | 11 | * All rights reserved. |
12 | * | 12 | * |
13 | * Redistribution and use in source and binary forms, with or without | 13 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exstorob.c b/drivers/acpi/acpica/exstorob.c index e972b667b09b..dc665cc554de 100644 --- a/drivers/acpi/acpica/exstorob.c +++ b/drivers/acpi/acpica/exstorob.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exsystem.c b/drivers/acpi/acpica/exsystem.c index 675aaa91a770..df66e7b686be 100644 --- a/drivers/acpi/acpica/exsystem.c +++ b/drivers/acpi/acpica/exsystem.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exutils.c b/drivers/acpi/acpica/exutils.c index 4093522eed45..8ad93146dd32 100644 --- a/drivers/acpi/acpica/exutils.c +++ b/drivers/acpi/acpica/exutils.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwacpi.c b/drivers/acpi/acpica/hwacpi.c index b44274a0b62c..fc380d3d45ab 100644 --- a/drivers/acpi/acpica/hwacpi.c +++ b/drivers/acpi/acpica/hwacpi.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwgpe.c b/drivers/acpi/acpica/hwgpe.c index 85c3cbd4304d..f610d88a66be 100644 --- a/drivers/acpi/acpica/hwgpe.c +++ b/drivers/acpi/acpica/hwgpe.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwpci.c b/drivers/acpi/acpica/hwpci.c index ad21c7d8bf4f..050fd227951b 100644 --- a/drivers/acpi/acpica/hwpci.c +++ b/drivers/acpi/acpica/hwpci.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwregs.c b/drivers/acpi/acpica/hwregs.c index 5d1273b660ae..55accb7018bb 100644 --- a/drivers/acpi/acpica/hwregs.c +++ b/drivers/acpi/acpica/hwregs.c | |||
@@ -7,7 +7,7 @@ | |||
7 | ******************************************************************************/ | 7 | ******************************************************************************/ |
8 | 8 | ||
9 | /* | 9 | /* |
10 | * Copyright (C) 2000 - 2010, Intel Corp. | 10 | * Copyright (C) 2000 - 2011, Intel Corp. |
11 | * All rights reserved. | 11 | * All rights reserved. |
12 | * | 12 | * |
13 | * Redistribution and use in source and binary forms, with or without | 13 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwsleep.c b/drivers/acpi/acpica/hwsleep.c index 3796811276ac..2ac28bbe8827 100644 --- a/drivers/acpi/acpica/hwsleep.c +++ b/drivers/acpi/acpica/hwsleep.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwtimer.c b/drivers/acpi/acpica/hwtimer.c index 1ef8e0bb250b..9c8eb71a12fb 100644 --- a/drivers/acpi/acpica/hwtimer.c +++ b/drivers/acpi/acpica/hwtimer.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwvalid.c b/drivers/acpi/acpica/hwvalid.c index e1d9c777b213..5f1605874655 100644 --- a/drivers/acpi/acpica/hwvalid.c +++ b/drivers/acpi/acpica/hwvalid.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwxface.c b/drivers/acpi/acpica/hwxface.c index 50cc3be77724..6f98d210e71c 100644 --- a/drivers/acpi/acpica/hwxface.c +++ b/drivers/acpi/acpica/hwxface.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsaccess.c b/drivers/acpi/acpica/nsaccess.c index 0cd925be5fc1..d93172fd15a8 100644 --- a/drivers/acpi/acpica/nsaccess.c +++ b/drivers/acpi/acpica/nsaccess.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -163,9 +163,9 @@ acpi_status acpi_ns_root_initialize(void) | |||
163 | #else | 163 | #else |
164 | /* Mark this as a very SPECIAL method */ | 164 | /* Mark this as a very SPECIAL method */ |
165 | 165 | ||
166 | obj_desc->method.method_flags = | 166 | obj_desc->method.info_flags = |
167 | AML_METHOD_INTERNAL_ONLY; | 167 | ACPI_METHOD_INTERNAL_ONLY; |
168 | obj_desc->method.extra.implementation = | 168 | obj_desc->method.dispatch.implementation = |
169 | acpi_ut_osi_implementation; | 169 | acpi_ut_osi_implementation; |
170 | #endif | 170 | #endif |
171 | break; | 171 | break; |
diff --git a/drivers/acpi/acpica/nsalloc.c b/drivers/acpi/acpica/nsalloc.c index 1e5ff803d9ad..1d0ef15d158f 100644 --- a/drivers/acpi/acpica/nsalloc.c +++ b/drivers/acpi/acpica/nsalloc.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -234,8 +234,8 @@ void acpi_ns_install_node(struct acpi_walk_state *walk_state, struct acpi_namesp | |||
234 | * modified the namespace. This is used for cleanup when the | 234 | * modified the namespace. This is used for cleanup when the |
235 | * method exits. | 235 | * method exits. |
236 | */ | 236 | */ |
237 | walk_state->method_desc->method.flags |= | 237 | walk_state->method_desc->method.info_flags |= |
238 | AOPOBJ_MODIFIED_NAMESPACE; | 238 | ACPI_METHOD_MODIFIED_NAMESPACE; |
239 | } | 239 | } |
240 | } | 240 | } |
241 | 241 | ||
@@ -341,6 +341,7 @@ void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node) | |||
341 | { | 341 | { |
342 | struct acpi_namespace_node *child_node = NULL; | 342 | struct acpi_namespace_node *child_node = NULL; |
343 | u32 level = 1; | 343 | u32 level = 1; |
344 | acpi_status status; | ||
344 | 345 | ||
345 | ACPI_FUNCTION_TRACE(ns_delete_namespace_subtree); | 346 | ACPI_FUNCTION_TRACE(ns_delete_namespace_subtree); |
346 | 347 | ||
@@ -348,6 +349,13 @@ void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node) | |||
348 | return_VOID; | 349 | return_VOID; |
349 | } | 350 | } |
350 | 351 | ||
352 | /* Lock namespace for possible update */ | ||
353 | |||
354 | status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); | ||
355 | if (ACPI_FAILURE(status)) { | ||
356 | return_VOID; | ||
357 | } | ||
358 | |||
351 | /* | 359 | /* |
352 | * Traverse the tree of objects until we bubble back up | 360 | * Traverse the tree of objects until we bubble back up |
353 | * to where we started. | 361 | * to where we started. |
@@ -397,6 +405,7 @@ void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node) | |||
397 | } | 405 | } |
398 | } | 406 | } |
399 | 407 | ||
408 | (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); | ||
400 | return_VOID; | 409 | return_VOID; |
401 | } | 410 | } |
402 | 411 | ||
diff --git a/drivers/acpi/acpica/nsdump.c b/drivers/acpi/acpica/nsdump.c index a54dc39e304b..b683cc2ff9d3 100644 --- a/drivers/acpi/acpica/nsdump.c +++ b/drivers/acpi/acpica/nsdump.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -624,9 +624,22 @@ acpi_ns_dump_objects(acpi_object_type type, | |||
624 | acpi_owner_id owner_id, acpi_handle start_handle) | 624 | acpi_owner_id owner_id, acpi_handle start_handle) |
625 | { | 625 | { |
626 | struct acpi_walk_info info; | 626 | struct acpi_walk_info info; |
627 | acpi_status status; | ||
627 | 628 | ||
628 | ACPI_FUNCTION_ENTRY(); | 629 | ACPI_FUNCTION_ENTRY(); |
629 | 630 | ||
631 | /* | ||
632 | * Just lock the entire namespace for the duration of the dump. | ||
633 | * We don't want any changes to the namespace during this time, | ||
634 | * especially the temporary nodes since we are going to display | ||
635 | * them also. | ||
636 | */ | ||
637 | status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); | ||
638 | if (ACPI_FAILURE(status)) { | ||
639 | acpi_os_printf("Could not acquire namespace mutex\n"); | ||
640 | return; | ||
641 | } | ||
642 | |||
630 | info.debug_level = ACPI_LV_TABLES; | 643 | info.debug_level = ACPI_LV_TABLES; |
631 | info.owner_id = owner_id; | 644 | info.owner_id = owner_id; |
632 | info.display_type = display_type; | 645 | info.display_type = display_type; |
@@ -636,6 +649,8 @@ acpi_ns_dump_objects(acpi_object_type type, | |||
636 | ACPI_NS_WALK_TEMP_NODES, | 649 | ACPI_NS_WALK_TEMP_NODES, |
637 | acpi_ns_dump_one_object, NULL, | 650 | acpi_ns_dump_one_object, NULL, |
638 | (void *)&info, NULL); | 651 | (void *)&info, NULL); |
652 | |||
653 | (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); | ||
639 | } | 654 | } |
640 | #endif /* ACPI_FUTURE_USAGE */ | 655 | #endif /* ACPI_FUTURE_USAGE */ |
641 | 656 | ||
diff --git a/drivers/acpi/acpica/nsdumpdv.c b/drivers/acpi/acpica/nsdumpdv.c index d2a97921e249..2ed294b7a4db 100644 --- a/drivers/acpi/acpica/nsdumpdv.c +++ b/drivers/acpi/acpica/nsdumpdv.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nseval.c b/drivers/acpi/acpica/nseval.c index f52829cc294b..c1bd02b1a058 100644 --- a/drivers/acpi/acpica/nseval.c +++ b/drivers/acpi/acpica/nseval.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -389,7 +389,7 @@ acpi_ns_exec_module_code(union acpi_operand_object *method_obj, | |||
389 | * acpi_gbl_root_node->Object is NULL at PASS1. | 389 | * acpi_gbl_root_node->Object is NULL at PASS1. |
390 | */ | 390 | */ |
391 | if ((type == ACPI_TYPE_DEVICE) && parent_node->object) { | 391 | if ((type == ACPI_TYPE_DEVICE) && parent_node->object) { |
392 | method_obj->method.extra.handler = | 392 | method_obj->method.dispatch.handler = |
393 | parent_node->object->device.handler; | 393 | parent_node->object->device.handler; |
394 | } | 394 | } |
395 | 395 | ||
diff --git a/drivers/acpi/acpica/nsinit.c b/drivers/acpi/acpica/nsinit.c index 0cac7ec0d2ec..fd7c6380e294 100644 --- a/drivers/acpi/acpica/nsinit.c +++ b/drivers/acpi/acpica/nsinit.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsload.c b/drivers/acpi/acpica/nsload.c index df18be94fefe..5f7dc691c183 100644 --- a/drivers/acpi/acpica/nsload.c +++ b/drivers/acpi/acpica/nsload.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsnames.c b/drivers/acpi/acpica/nsnames.c index d3104af57e13..d5fa520c3de5 100644 --- a/drivers/acpi/acpica/nsnames.c +++ b/drivers/acpi/acpica/nsnames.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsobject.c b/drivers/acpi/acpica/nsobject.c index 41a9213dd5af..3bb8bf105ea2 100644 --- a/drivers/acpi/acpica/nsobject.c +++ b/drivers/acpi/acpica/nsobject.c | |||
@@ -6,7 +6,7 @@ | |||
6 | ******************************************************************************/ | 6 | ******************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsparse.c b/drivers/acpi/acpica/nsparse.c index 5808c89e9fac..b3234fa795b8 100644 --- a/drivers/acpi/acpica/nsparse.c +++ b/drivers/acpi/acpica/nsparse.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nspredef.c b/drivers/acpi/acpica/nspredef.c index 7096bcda0c72..9fb03fa8ffde 100644 --- a/drivers/acpi/acpica/nspredef.c +++ b/drivers/acpi/acpica/nspredef.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsrepair.c b/drivers/acpi/acpica/nsrepair.c index d1c136692667..1d76ac85b5e7 100644 --- a/drivers/acpi/acpica/nsrepair.c +++ b/drivers/acpi/acpica/nsrepair.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsrepair2.c b/drivers/acpi/acpica/nsrepair2.c index 4ef9f43ea926..973883babee1 100644 --- a/drivers/acpi/acpica/nsrepair2.c +++ b/drivers/acpi/acpica/nsrepair2.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nssearch.c b/drivers/acpi/acpica/nssearch.c index 41102a84272f..28b0d7a62b99 100644 --- a/drivers/acpi/acpica/nssearch.c +++ b/drivers/acpi/acpica/nssearch.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsutils.c b/drivers/acpi/acpica/nsutils.c index a7d6ad9c111b..cb1b104a69a2 100644 --- a/drivers/acpi/acpica/nsutils.c +++ b/drivers/acpi/acpica/nsutils.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nswalk.c b/drivers/acpi/acpica/nswalk.c index 2cd5be8fe10f..345f0c3c6ad2 100644 --- a/drivers/acpi/acpica/nswalk.c +++ b/drivers/acpi/acpica/nswalk.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsxfeval.c b/drivers/acpi/acpica/nsxfeval.c index ebef8a7fd707..c53f0040e490 100644 --- a/drivers/acpi/acpica/nsxfeval.c +++ b/drivers/acpi/acpica/nsxfeval.c | |||
@@ -6,7 +6,7 @@ | |||
6 | ******************************************************************************/ | 6 | ******************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsxfname.c b/drivers/acpi/acpica/nsxfname.c index b01e45a415e3..3fd4526f3dba 100644 --- a/drivers/acpi/acpica/nsxfname.c +++ b/drivers/acpi/acpica/nsxfname.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
@@ -603,10 +603,9 @@ acpi_status acpi_install_method(u8 *buffer) | |||
603 | method_obj->method.param_count = (u8) | 603 | method_obj->method.param_count = (u8) |
604 | (method_flags & AML_METHOD_ARG_COUNT); | 604 | (method_flags & AML_METHOD_ARG_COUNT); |
605 | 605 | ||
606 | method_obj->method.method_flags = (u8) | ||
607 | (method_flags & ~AML_METHOD_ARG_COUNT); | ||
608 | |||
609 | if (method_flags & AML_METHOD_SERIALIZED) { | 606 | if (method_flags & AML_METHOD_SERIALIZED) { |
607 | method_obj->method.info_flags = ACPI_METHOD_SERIALIZED; | ||
608 | |||
610 | method_obj->method.sync_level = (u8) | 609 | method_obj->method.sync_level = (u8) |
611 | ((method_flags & AML_METHOD_SYNC_LEVEL) >> 4); | 610 | ((method_flags & AML_METHOD_SYNC_LEVEL) >> 4); |
612 | } | 611 | } |
diff --git a/drivers/acpi/acpica/nsxfobj.c b/drivers/acpi/acpica/nsxfobj.c index a1f04e9b8030..db7660f8b869 100644 --- a/drivers/acpi/acpica/nsxfobj.c +++ b/drivers/acpi/acpica/nsxfobj.c | |||
@@ -6,7 +6,7 @@ | |||
6 | ******************************************************************************/ | 6 | ******************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/psargs.c b/drivers/acpi/acpica/psargs.c index 7df1a4c95274..e1fad0ee0136 100644 --- a/drivers/acpi/acpica/psargs.c +++ b/drivers/acpi/acpica/psargs.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/psloop.c b/drivers/acpi/acpica/psloop.c index 2f2e7760938c..01dd70d1de51 100644 --- a/drivers/acpi/acpica/psloop.c +++ b/drivers/acpi/acpica/psloop.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -655,7 +655,7 @@ acpi_ps_link_module_code(union acpi_parse_object *parent_op, | |||
655 | method_obj->method.aml_start = aml_start; | 655 | method_obj->method.aml_start = aml_start; |
656 | method_obj->method.aml_length = aml_length; | 656 | method_obj->method.aml_length = aml_length; |
657 | method_obj->method.owner_id = owner_id; | 657 | method_obj->method.owner_id = owner_id; |
658 | method_obj->method.flags |= AOPOBJ_MODULE_LEVEL; | 658 | method_obj->method.info_flags |= ACPI_METHOD_MODULE_LEVEL; |
659 | 659 | ||
660 | /* | 660 | /* |
661 | * Save the parent node in next_object. This is cheating, but we | 661 | * Save the parent node in next_object. This is cheating, but we |
diff --git a/drivers/acpi/acpica/psopcode.c b/drivers/acpi/acpica/psopcode.c index 2b0c3be2b1b8..bed08de7528c 100644 --- a/drivers/acpi/acpica/psopcode.c +++ b/drivers/acpi/acpica/psopcode.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/psparse.c b/drivers/acpi/acpica/psparse.c index 8d81542194d4..9bb0cbd37b5e 100644 --- a/drivers/acpi/acpica/psparse.c +++ b/drivers/acpi/acpica/psparse.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -55,7 +55,6 @@ | |||
55 | #include "acparser.h" | 55 | #include "acparser.h" |
56 | #include "acdispat.h" | 56 | #include "acdispat.h" |
57 | #include "amlcode.h" | 57 | #include "amlcode.h" |
58 | #include "acnamesp.h" | ||
59 | #include "acinterp.h" | 58 | #include "acinterp.h" |
60 | 59 | ||
61 | #define _COMPONENT ACPI_PARSER | 60 | #define _COMPONENT ACPI_PARSER |
@@ -539,24 +538,16 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state) | |||
539 | /* Check for possible multi-thread reentrancy problem */ | 538 | /* Check for possible multi-thread reentrancy problem */ |
540 | 539 | ||
541 | if ((status == AE_ALREADY_EXISTS) && | 540 | if ((status == AE_ALREADY_EXISTS) && |
542 | (!walk_state->method_desc->method.mutex)) { | 541 | (!(walk_state->method_desc->method. |
543 | ACPI_INFO((AE_INFO, | 542 | info_flags & ACPI_METHOD_SERIALIZED))) { |
544 | "Marking method %4.4s as Serialized because of AE_ALREADY_EXISTS error", | ||
545 | walk_state->method_node->name. | ||
546 | ascii)); | ||
547 | |||
548 | /* | 543 | /* |
549 | * Method tried to create an object twice. The probable cause is | 544 | * Method is not serialized and tried to create an object |
550 | * that the method cannot handle reentrancy. | 545 | * twice. The probable cause is that the method cannot |
551 | * | 546 | * handle reentrancy. Mark as "pending serialized" now, and |
552 | * The method is marked not_serialized, but it tried to create | 547 | * then mark "serialized" when the last thread exits. |
553 | * a named object, causing the second thread entrance to fail. | ||
554 | * Workaround this problem by marking the method permanently | ||
555 | * as Serialized. | ||
556 | */ | 548 | */ |
557 | walk_state->method_desc->method.method_flags |= | 549 | walk_state->method_desc->method.info_flags |= |
558 | AML_METHOD_SERIALIZED; | 550 | ACPI_METHOD_SERIALIZED_PENDING; |
559 | walk_state->method_desc->method.sync_level = 0; | ||
560 | } | 551 | } |
561 | } | 552 | } |
562 | 553 | ||
diff --git a/drivers/acpi/acpica/psscope.c b/drivers/acpi/acpica/psscope.c index 40e2b279ea12..a5faa1323a02 100644 --- a/drivers/acpi/acpica/psscope.c +++ b/drivers/acpi/acpica/psscope.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/pstree.c b/drivers/acpi/acpica/pstree.c index d4b970c3630b..f1464c03aa42 100644 --- a/drivers/acpi/acpica/pstree.c +++ b/drivers/acpi/acpica/pstree.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/psutils.c b/drivers/acpi/acpica/psutils.c index fe29eee5adb1..7eda78503422 100644 --- a/drivers/acpi/acpica/psutils.c +++ b/drivers/acpi/acpica/psutils.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/pswalk.c b/drivers/acpi/acpica/pswalk.c index 8abb9629443d..3312d6368bf1 100644 --- a/drivers/acpi/acpica/pswalk.c +++ b/drivers/acpi/acpica/pswalk.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/psxface.c b/drivers/acpi/acpica/psxface.c index c42f067cff9d..8086805d4494 100644 --- a/drivers/acpi/acpica/psxface.c +++ b/drivers/acpi/acpica/psxface.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -47,7 +47,6 @@ | |||
47 | #include "acdispat.h" | 47 | #include "acdispat.h" |
48 | #include "acinterp.h" | 48 | #include "acinterp.h" |
49 | #include "actables.h" | 49 | #include "actables.h" |
50 | #include "amlcode.h" | ||
51 | 50 | ||
52 | #define _COMPONENT ACPI_PARSER | 51 | #define _COMPONENT ACPI_PARSER |
53 | ACPI_MODULE_NAME("psxface") | 52 | ACPI_MODULE_NAME("psxface") |
@@ -285,15 +284,15 @@ acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info) | |||
285 | goto cleanup; | 284 | goto cleanup; |
286 | } | 285 | } |
287 | 286 | ||
288 | if (info->obj_desc->method.flags & AOPOBJ_MODULE_LEVEL) { | 287 | if (info->obj_desc->method.info_flags & ACPI_METHOD_MODULE_LEVEL) { |
289 | walk_state->parse_flags |= ACPI_PARSE_MODULE_LEVEL; | 288 | walk_state->parse_flags |= ACPI_PARSE_MODULE_LEVEL; |
290 | } | 289 | } |
291 | 290 | ||
292 | /* Invoke an internal method if necessary */ | 291 | /* Invoke an internal method if necessary */ |
293 | 292 | ||
294 | if (info->obj_desc->method.method_flags & AML_METHOD_INTERNAL_ONLY) { | 293 | if (info->obj_desc->method.info_flags & ACPI_METHOD_INTERNAL_ONLY) { |
295 | status = | 294 | status = |
296 | info->obj_desc->method.extra.implementation(walk_state); | 295 | info->obj_desc->method.dispatch.implementation(walk_state); |
297 | info->return_object = walk_state->return_desc; | 296 | info->return_object = walk_state->return_desc; |
298 | 297 | ||
299 | /* Cleanup states */ | 298 | /* Cleanup states */ |
diff --git a/drivers/acpi/acpica/rsaddr.c b/drivers/acpi/acpica/rsaddr.c index 226c806ae986..9e66f9078426 100644 --- a/drivers/acpi/acpica/rsaddr.c +++ b/drivers/acpi/acpica/rsaddr.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rscalc.c b/drivers/acpi/acpica/rscalc.c index d6ebf7ec622d..3a8a89ec2ca4 100644 --- a/drivers/acpi/acpica/rscalc.c +++ b/drivers/acpi/acpica/rscalc.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rscreate.c b/drivers/acpi/acpica/rscreate.c index c80a2eea3a01..4ce6e1147e80 100644 --- a/drivers/acpi/acpica/rscreate.c +++ b/drivers/acpi/acpica/rscreate.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsdump.c b/drivers/acpi/acpica/rsdump.c index f859b0386fe4..33db7520c74b 100644 --- a/drivers/acpi/acpica/rsdump.c +++ b/drivers/acpi/acpica/rsdump.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsinfo.c b/drivers/acpi/acpica/rsinfo.c index 1fd868b964fd..f9ea60872aa4 100644 --- a/drivers/acpi/acpica/rsinfo.c +++ b/drivers/acpi/acpica/rsinfo.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsio.c b/drivers/acpi/acpica/rsio.c index 33bff17c0bbc..0c7efef008be 100644 --- a/drivers/acpi/acpica/rsio.c +++ b/drivers/acpi/acpica/rsio.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsirq.c b/drivers/acpi/acpica/rsirq.c index 545da40d7fa7..50b8ad211167 100644 --- a/drivers/acpi/acpica/rsirq.c +++ b/drivers/acpi/acpica/rsirq.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rslist.c b/drivers/acpi/acpica/rslist.c index 7335f22aac20..1bfcef736c50 100644 --- a/drivers/acpi/acpica/rslist.c +++ b/drivers/acpi/acpica/rslist.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsmemory.c b/drivers/acpi/acpica/rsmemory.c index 887b8ba8c432..7cc6d8625f1e 100644 --- a/drivers/acpi/acpica/rsmemory.c +++ b/drivers/acpi/acpica/rsmemory.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsmisc.c b/drivers/acpi/acpica/rsmisc.c index f8cd9e87d987..410264b22a29 100644 --- a/drivers/acpi/acpica/rsmisc.c +++ b/drivers/acpi/acpica/rsmisc.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsutils.c b/drivers/acpi/acpica/rsutils.c index 491191e6cf69..231811e56939 100644 --- a/drivers/acpi/acpica/rsutils.c +++ b/drivers/acpi/acpica/rsutils.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsxface.c b/drivers/acpi/acpica/rsxface.c index 9f6a6e7e1c8e..2ff657a28f26 100644 --- a/drivers/acpi/acpica/rsxface.c +++ b/drivers/acpi/acpica/rsxface.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/tbfadt.c b/drivers/acpi/acpica/tbfadt.c index d2ff4325c427..428d44e2d162 100644 --- a/drivers/acpi/acpica/tbfadt.c +++ b/drivers/acpi/acpica/tbfadt.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/tbfind.c b/drivers/acpi/acpica/tbfind.c index 989d5c867864..a55cb2bb5abb 100644 --- a/drivers/acpi/acpica/tbfind.c +++ b/drivers/acpi/acpica/tbfind.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/tbinstal.c b/drivers/acpi/acpica/tbinstal.c index 83d7af8d0905..48db0944ce4a 100644 --- a/drivers/acpi/acpica/tbinstal.c +++ b/drivers/acpi/acpica/tbinstal.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/tbutils.c b/drivers/acpi/acpica/tbutils.c index 34f9c2bc5e1f..0f2d395feaba 100644 --- a/drivers/acpi/acpica/tbutils.c +++ b/drivers/acpi/acpica/tbutils.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/tbxface.c b/drivers/acpi/acpica/tbxface.c index 4a8b9e6ea57a..4b7085dfc683 100644 --- a/drivers/acpi/acpica/tbxface.c +++ b/drivers/acpi/acpica/tbxface.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/tbxfroot.c b/drivers/acpi/acpica/tbxfroot.c index fd2c07d1d3ac..7eb6c6cc1edf 100644 --- a/drivers/acpi/acpica/tbxfroot.c +++ b/drivers/acpi/acpica/tbxfroot.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utalloc.c b/drivers/acpi/acpica/utalloc.c index 8f0896281567..0a697351cf69 100644 --- a/drivers/acpi/acpica/utalloc.c +++ b/drivers/acpi/acpica/utalloc.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utcopy.c b/drivers/acpi/acpica/utcopy.c index 6fef83f04bcd..aded299a2fa8 100644 --- a/drivers/acpi/acpica/utcopy.c +++ b/drivers/acpi/acpica/utcopy.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utdebug.c b/drivers/acpi/acpica/utdebug.c index f21c486929a5..a9bcd816dc29 100644 --- a/drivers/acpi/acpica/utdebug.c +++ b/drivers/acpi/acpica/utdebug.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utdelete.c b/drivers/acpi/acpica/utdelete.c index ed794cd033ea..31f5a7832ef1 100644 --- a/drivers/acpi/acpica/utdelete.c +++ b/drivers/acpi/acpica/utdelete.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/uteval.c b/drivers/acpi/acpica/uteval.c index 22f59ef604e0..18f73c9d10bc 100644 --- a/drivers/acpi/acpica/uteval.c +++ b/drivers/acpi/acpica/uteval.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utglobal.c b/drivers/acpi/acpica/utglobal.c index 508537f884ac..97dd9bbf055a 100644 --- a/drivers/acpi/acpica/utglobal.c +++ b/drivers/acpi/acpica/utglobal.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utids.c b/drivers/acpi/acpica/utids.c index d2906328535d..b679ea693545 100644 --- a/drivers/acpi/acpica/utids.c +++ b/drivers/acpi/acpica/utids.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utinit.c b/drivers/acpi/acpica/utinit.c index c1b1c803ea9b..191b6828cce9 100644 --- a/drivers/acpi/acpica/utinit.c +++ b/drivers/acpi/acpica/utinit.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utlock.c b/drivers/acpi/acpica/utlock.c index b081cd46a15f..f6bb75c6faf5 100644 --- a/drivers/acpi/acpica/utlock.c +++ b/drivers/acpi/acpica/utlock.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utmath.c b/drivers/acpi/acpica/utmath.c index 49cf7b7fd816..ce481da9bb45 100644 --- a/drivers/acpi/acpica/utmath.c +++ b/drivers/acpi/acpica/utmath.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utmisc.c b/drivers/acpi/acpica/utmisc.c index c7d0e05ef5a4..c33a852d4f42 100644 --- a/drivers/acpi/acpica/utmisc.c +++ b/drivers/acpi/acpica/utmisc.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utmutex.c b/drivers/acpi/acpica/utmutex.c index 199528ff7f1d..a946c689f03b 100644 --- a/drivers/acpi/acpica/utmutex.c +++ b/drivers/acpi/acpica/utmutex.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utobject.c b/drivers/acpi/acpica/utobject.c index fd1fa2749ea5..188340a017b4 100644 --- a/drivers/acpi/acpica/utobject.c +++ b/drivers/acpi/acpica/utobject.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utosi.c b/drivers/acpi/acpica/utosi.c index 18c59a85fdca..1fb10cb8f11d 100644 --- a/drivers/acpi/acpica/utosi.c +++ b/drivers/acpi/acpica/utosi.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utresrc.c b/drivers/acpi/acpica/utresrc.c index 7965919000b1..84e051844247 100644 --- a/drivers/acpi/acpica/utresrc.c +++ b/drivers/acpi/acpica/utresrc.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utstate.c b/drivers/acpi/acpica/utstate.c index d35d109b8da2..30c21e1a9360 100644 --- a/drivers/acpi/acpica/utstate.c +++ b/drivers/acpi/acpica/utstate.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utxface.c b/drivers/acpi/acpica/utxface.c index 1f484c9a6888..98ad125e14ff 100644 --- a/drivers/acpi/acpica/utxface.c +++ b/drivers/acpi/acpica/utxface.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utxferror.c b/drivers/acpi/acpica/utxferror.c index 6f12e314fbae..916ae097c43c 100644 --- a/drivers/acpi/acpica/utxferror.c +++ b/drivers/acpi/acpica/utxferror.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index 68bc227e7c4c..ac1a599f5147 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c | |||
@@ -998,7 +998,6 @@ static int acpi_battery_resume(struct acpi_device *device) | |||
998 | if (!device) | 998 | if (!device) |
999 | return -EINVAL; | 999 | return -EINVAL; |
1000 | battery = acpi_driver_data(device); | 1000 | battery = acpi_driver_data(device); |
1001 | acpi_battery_refresh(battery); | ||
1002 | battery->update_time = 0; | 1001 | battery->update_time = 0; |
1003 | acpi_battery_update(battery); | 1002 | acpi_battery_update(battery); |
1004 | return 0; | 1003 | return 0; |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 03e337072517..f6b9baa6a63d 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -928,6 +928,7 @@ static int intel_wrap_ring_buffer(struct intel_ring_buffer *ring) | |||
928 | 928 | ||
929 | int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n) | 929 | int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n) |
930 | { | 930 | { |
931 | int reread = 0; | ||
931 | struct drm_device *dev = ring->dev; | 932 | struct drm_device *dev = ring->dev; |
932 | struct drm_i915_private *dev_priv = dev->dev_private; | 933 | struct drm_i915_private *dev_priv = dev->dev_private; |
933 | unsigned long end; | 934 | unsigned long end; |
@@ -940,9 +941,8 @@ int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n) | |||
940 | * fallback to the slow and accurate path. | 941 | * fallback to the slow and accurate path. |
941 | */ | 942 | */ |
942 | head = intel_read_status_page(ring, 4); | 943 | head = intel_read_status_page(ring, 4); |
943 | if (head < ring->actual_head) | 944 | if (reread) |
944 | head = I915_READ_HEAD(ring); | 945 | head = I915_READ_HEAD(ring); |
945 | ring->actual_head = head; | ||
946 | ring->head = head & HEAD_ADDR; | 946 | ring->head = head & HEAD_ADDR; |
947 | ring->space = ring->head - (ring->tail + 8); | 947 | ring->space = ring->head - (ring->tail + 8); |
948 | if (ring->space < 0) | 948 | if (ring->space < 0) |
@@ -961,6 +961,7 @@ int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n) | |||
961 | msleep(1); | 961 | msleep(1); |
962 | if (atomic_read(&dev_priv->mm.wedged)) | 962 | if (atomic_read(&dev_priv->mm.wedged)) |
963 | return -EAGAIN; | 963 | return -EAGAIN; |
964 | reread = 1; | ||
964 | } while (!time_after(jiffies, end)); | 965 | } while (!time_after(jiffies, end)); |
965 | trace_i915_ring_wait_end (dev); | 966 | trace_i915_ring_wait_end (dev); |
966 | return -EBUSY; | 967 | return -EBUSY; |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index be9087e4c9be..5b0abfa881fc 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h | |||
@@ -47,7 +47,6 @@ struct intel_ring_buffer { | |||
47 | struct drm_device *dev; | 47 | struct drm_device *dev; |
48 | struct drm_i915_gem_object *obj; | 48 | struct drm_i915_gem_object *obj; |
49 | 49 | ||
50 | u32 actual_head; | ||
51 | u32 head; | 50 | u32 head; |
52 | u32 tail; | 51 | u32 tail; |
53 | int space; | 52 | int space; |
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 35f00dae3676..773e484f1646 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
@@ -618,8 +618,8 @@ config SENSORS_LM93 | |||
618 | depends on I2C | 618 | depends on I2C |
619 | select HWMON_VID | 619 | select HWMON_VID |
620 | help | 620 | help |
621 | If you say yes here you get support for National Semiconductor LM93 | 621 | If you say yes here you get support for National Semiconductor LM93, |
622 | sensor chips. | 622 | LM94, and compatible sensor chips. |
623 | 623 | ||
624 | This driver can also be built as a module. If so, the module | 624 | This driver can also be built as a module. If so, the module |
625 | will be called lm93. | 625 | will be called lm93. |
diff --git a/drivers/hwmon/lm93.c b/drivers/hwmon/lm93.c index c9ed14eba5a6..3b43df418613 100644 --- a/drivers/hwmon/lm93.c +++ b/drivers/hwmon/lm93.c | |||
@@ -135,6 +135,11 @@ | |||
135 | #define LM93_MFR_ID 0x73 | 135 | #define LM93_MFR_ID 0x73 |
136 | #define LM93_MFR_ID_PROTOTYPE 0x72 | 136 | #define LM93_MFR_ID_PROTOTYPE 0x72 |
137 | 137 | ||
138 | /* LM94 REGISTER VALUES */ | ||
139 | #define LM94_MFR_ID_2 0x7a | ||
140 | #define LM94_MFR_ID 0x79 | ||
141 | #define LM94_MFR_ID_PROTOTYPE 0x78 | ||
142 | |||
138 | /* SMBus capabilities */ | 143 | /* SMBus capabilities */ |
139 | #define LM93_SMBUS_FUNC_FULL (I2C_FUNC_SMBUS_BYTE_DATA | \ | 144 | #define LM93_SMBUS_FUNC_FULL (I2C_FUNC_SMBUS_BYTE_DATA | \ |
140 | I2C_FUNC_SMBUS_WORD_DATA | I2C_FUNC_SMBUS_BLOCK_DATA) | 145 | I2C_FUNC_SMBUS_WORD_DATA | I2C_FUNC_SMBUS_BLOCK_DATA) |
@@ -2504,6 +2509,7 @@ static int lm93_detect(struct i2c_client *client, struct i2c_board_info *info) | |||
2504 | { | 2509 | { |
2505 | struct i2c_adapter *adapter = client->adapter; | 2510 | struct i2c_adapter *adapter = client->adapter; |
2506 | int mfr, ver; | 2511 | int mfr, ver; |
2512 | const char *name; | ||
2507 | 2513 | ||
2508 | if (!i2c_check_functionality(adapter, LM93_SMBUS_FUNC_MIN)) | 2514 | if (!i2c_check_functionality(adapter, LM93_SMBUS_FUNC_MIN)) |
2509 | return -ENODEV; | 2515 | return -ENODEV; |
@@ -2517,13 +2523,23 @@ static int lm93_detect(struct i2c_client *client, struct i2c_board_info *info) | |||
2517 | } | 2523 | } |
2518 | 2524 | ||
2519 | ver = lm93_read_byte(client, LM93_REG_VER); | 2525 | ver = lm93_read_byte(client, LM93_REG_VER); |
2520 | if (ver != LM93_MFR_ID && ver != LM93_MFR_ID_PROTOTYPE) { | 2526 | switch (ver) { |
2527 | case LM93_MFR_ID: | ||
2528 | case LM93_MFR_ID_PROTOTYPE: | ||
2529 | name = "lm93"; | ||
2530 | break; | ||
2531 | case LM94_MFR_ID_2: | ||
2532 | case LM94_MFR_ID: | ||
2533 | case LM94_MFR_ID_PROTOTYPE: | ||
2534 | name = "lm94"; | ||
2535 | break; | ||
2536 | default: | ||
2521 | dev_dbg(&adapter->dev, | 2537 | dev_dbg(&adapter->dev, |
2522 | "detect failed, bad version id 0x%02x!\n", ver); | 2538 | "detect failed, bad version id 0x%02x!\n", ver); |
2523 | return -ENODEV; | 2539 | return -ENODEV; |
2524 | } | 2540 | } |
2525 | 2541 | ||
2526 | strlcpy(info->type, "lm93", I2C_NAME_SIZE); | 2542 | strlcpy(info->type, name, I2C_NAME_SIZE); |
2527 | dev_dbg(&adapter->dev,"loading %s at %d,0x%02x\n", | 2543 | dev_dbg(&adapter->dev,"loading %s at %d,0x%02x\n", |
2528 | client->name, i2c_adapter_id(client->adapter), | 2544 | client->name, i2c_adapter_id(client->adapter), |
2529 | client->addr); | 2545 | client->addr); |
@@ -2602,6 +2618,7 @@ static int lm93_remove(struct i2c_client *client) | |||
2602 | 2618 | ||
2603 | static const struct i2c_device_id lm93_id[] = { | 2619 | static const struct i2c_device_id lm93_id[] = { |
2604 | { "lm93", 0 }, | 2620 | { "lm93", 0 }, |
2621 | { "lm94", 0 }, | ||
2605 | { } | 2622 | { } |
2606 | }; | 2623 | }; |
2607 | MODULE_DEVICE_TABLE(i2c, lm93_id); | 2624 | MODULE_DEVICE_TABLE(i2c, lm93_id); |
diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h index a6cd335c9436..8e4183717d91 100644 --- a/drivers/net/bnx2x/bnx2x.h +++ b/drivers/net/bnx2x/bnx2x.h | |||
@@ -22,8 +22,8 @@ | |||
22 | * (you will need to reboot afterwards) */ | 22 | * (you will need to reboot afterwards) */ |
23 | /* #define BNX2X_STOP_ON_ERROR */ | 23 | /* #define BNX2X_STOP_ON_ERROR */ |
24 | 24 | ||
25 | #define DRV_MODULE_VERSION "1.62.00-3" | 25 | #define DRV_MODULE_VERSION "1.62.00-4" |
26 | #define DRV_MODULE_RELDATE "2010/12/21" | 26 | #define DRV_MODULE_RELDATE "2011/01/18" |
27 | #define BNX2X_BC_VER 0x040200 | 27 | #define BNX2X_BC_VER 0x040200 |
28 | 28 | ||
29 | #define BNX2X_MULTI_QUEUE | 29 | #define BNX2X_MULTI_QUEUE |
diff --git a/drivers/net/bnx2x/bnx2x_hsi.h b/drivers/net/bnx2x/bnx2x_hsi.h index 6238d4f63989..548f5631c0dc 100644 --- a/drivers/net/bnx2x/bnx2x_hsi.h +++ b/drivers/net/bnx2x/bnx2x_hsi.h | |||
@@ -352,6 +352,10 @@ struct port_hw_cfg { /* port 0: 0x12c port 1: 0x2bc */ | |||
352 | #define PORT_HW_CFG_LANE_SWAP_CFG_31203120 0x0000d8d8 | 352 | #define PORT_HW_CFG_LANE_SWAP_CFG_31203120 0x0000d8d8 |
353 | /* forced only */ | 353 | /* forced only */ |
354 | #define PORT_HW_CFG_LANE_SWAP_CFG_32103210 0x0000e4e4 | 354 | #define PORT_HW_CFG_LANE_SWAP_CFG_32103210 0x0000e4e4 |
355 | /* Indicate whether to swap the external phy polarity */ | ||
356 | #define PORT_HW_CFG_SWAP_PHY_POLARITY_MASK 0x00010000 | ||
357 | #define PORT_HW_CFG_SWAP_PHY_POLARITY_DISABLED 0x00000000 | ||
358 | #define PORT_HW_CFG_SWAP_PHY_POLARITY_ENABLED 0x00010000 | ||
355 | 359 | ||
356 | u32 external_phy_config; | 360 | u32 external_phy_config; |
357 | #define PORT_HW_CFG_SERDES_EXT_PHY_TYPE_MASK 0xff000000 | 361 | #define PORT_HW_CFG_SERDES_EXT_PHY_TYPE_MASK 0xff000000 |
diff --git a/drivers/net/bnx2x/bnx2x_link.c b/drivers/net/bnx2x/bnx2x_link.c index 43b0de24f391..7160ec51093e 100644 --- a/drivers/net/bnx2x/bnx2x_link.c +++ b/drivers/net/bnx2x/bnx2x_link.c | |||
@@ -1573,7 +1573,7 @@ static void bnx2x_set_aer_mmd_xgxs(struct link_params *params, | |||
1573 | 1573 | ||
1574 | offset = phy->addr + ser_lane; | 1574 | offset = phy->addr + ser_lane; |
1575 | if (CHIP_IS_E2(bp)) | 1575 | if (CHIP_IS_E2(bp)) |
1576 | aer_val = 0x2800 + offset - 1; | 1576 | aer_val = 0x3800 + offset - 1; |
1577 | else | 1577 | else |
1578 | aer_val = 0x3800 + offset; | 1578 | aer_val = 0x3800 + offset; |
1579 | CL45_WR_OVER_CL22(bp, phy, | 1579 | CL45_WR_OVER_CL22(bp, phy, |
@@ -3166,7 +3166,23 @@ u8 bnx2x_set_led(struct link_params *params, | |||
3166 | if (!vars->link_up) | 3166 | if (!vars->link_up) |
3167 | break; | 3167 | break; |
3168 | case LED_MODE_ON: | 3168 | case LED_MODE_ON: |
3169 | if (SINGLE_MEDIA_DIRECT(params)) { | 3169 | if (params->phy[EXT_PHY1].type == |
3170 | PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727 && | ||
3171 | CHIP_IS_E2(bp) && params->num_phys == 2) { | ||
3172 | /** | ||
3173 | * This is a work-around for E2+8727 Configurations | ||
3174 | */ | ||
3175 | if (mode == LED_MODE_ON || | ||
3176 | speed == SPEED_10000){ | ||
3177 | REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, 0); | ||
3178 | REG_WR(bp, NIG_REG_LED_10G_P0 + port*4, 1); | ||
3179 | |||
3180 | tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); | ||
3181 | EMAC_WR(bp, EMAC_REG_EMAC_LED, | ||
3182 | (tmp | EMAC_LED_OVERRIDE)); | ||
3183 | return rc; | ||
3184 | } | ||
3185 | } else if (SINGLE_MEDIA_DIRECT(params)) { | ||
3170 | /** | 3186 | /** |
3171 | * This is a work-around for HW issue found when link | 3187 | * This is a work-around for HW issue found when link |
3172 | * is up in CL73 | 3188 | * is up in CL73 |
@@ -3854,11 +3870,14 @@ static void bnx2x_8073_resolve_fc(struct bnx2x_phy *phy, | |||
3854 | pause_result); | 3870 | pause_result); |
3855 | } | 3871 | } |
3856 | } | 3872 | } |
3857 | 3873 | static u8 bnx2x_8073_8727_external_rom_boot(struct bnx2x *bp, | |
3858 | static void bnx2x_8073_8727_external_rom_boot(struct bnx2x *bp, | ||
3859 | struct bnx2x_phy *phy, | 3874 | struct bnx2x_phy *phy, |
3860 | u8 port) | 3875 | u8 port) |
3861 | { | 3876 | { |
3877 | u32 count = 0; | ||
3878 | u16 fw_ver1, fw_msgout; | ||
3879 | u8 rc = 0; | ||
3880 | |||
3862 | /* Boot port from external ROM */ | 3881 | /* Boot port from external ROM */ |
3863 | /* EDC grst */ | 3882 | /* EDC grst */ |
3864 | bnx2x_cl45_write(bp, phy, | 3883 | bnx2x_cl45_write(bp, phy, |
@@ -3888,14 +3907,45 @@ static void bnx2x_8073_8727_external_rom_boot(struct bnx2x *bp, | |||
3888 | MDIO_PMA_REG_GEN_CTRL, | 3907 | MDIO_PMA_REG_GEN_CTRL, |
3889 | MDIO_PMA_REG_GEN_CTRL_ROM_RESET_INTERNAL_MP); | 3908 | MDIO_PMA_REG_GEN_CTRL_ROM_RESET_INTERNAL_MP); |
3890 | 3909 | ||
3891 | /* wait for 120ms for code download via SPI port */ | 3910 | /* Delay 100ms per the PHY specifications */ |
3892 | msleep(120); | 3911 | msleep(100); |
3912 | |||
3913 | /* 8073 sometimes taking longer to download */ | ||
3914 | do { | ||
3915 | count++; | ||
3916 | if (count > 300) { | ||
3917 | DP(NETIF_MSG_LINK, | ||
3918 | "bnx2x_8073_8727_external_rom_boot port %x:" | ||
3919 | "Download failed. fw version = 0x%x\n", | ||
3920 | port, fw_ver1); | ||
3921 | rc = -EINVAL; | ||
3922 | break; | ||
3923 | } | ||
3924 | |||
3925 | bnx2x_cl45_read(bp, phy, | ||
3926 | MDIO_PMA_DEVAD, | ||
3927 | MDIO_PMA_REG_ROM_VER1, &fw_ver1); | ||
3928 | bnx2x_cl45_read(bp, phy, | ||
3929 | MDIO_PMA_DEVAD, | ||
3930 | MDIO_PMA_REG_M8051_MSGOUT_REG, &fw_msgout); | ||
3931 | |||
3932 | msleep(1); | ||
3933 | } while (fw_ver1 == 0 || fw_ver1 == 0x4321 || | ||
3934 | ((fw_msgout & 0xff) != 0x03 && (phy->type == | ||
3935 | PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073))); | ||
3893 | 3936 | ||
3894 | /* Clear ser_boot_ctl bit */ | 3937 | /* Clear ser_boot_ctl bit */ |
3895 | bnx2x_cl45_write(bp, phy, | 3938 | bnx2x_cl45_write(bp, phy, |
3896 | MDIO_PMA_DEVAD, | 3939 | MDIO_PMA_DEVAD, |
3897 | MDIO_PMA_REG_MISC_CTRL1, 0x0000); | 3940 | MDIO_PMA_REG_MISC_CTRL1, 0x0000); |
3898 | bnx2x_save_bcm_spirom_ver(bp, phy, port); | 3941 | bnx2x_save_bcm_spirom_ver(bp, phy, port); |
3942 | |||
3943 | DP(NETIF_MSG_LINK, | ||
3944 | "bnx2x_8073_8727_external_rom_boot port %x:" | ||
3945 | "Download complete. fw version = 0x%x\n", | ||
3946 | port, fw_ver1); | ||
3947 | |||
3948 | return rc; | ||
3899 | } | 3949 | } |
3900 | 3950 | ||
3901 | static void bnx2x_8073_set_xaui_low_power_mode(struct bnx2x *bp, | 3951 | static void bnx2x_8073_set_xaui_low_power_mode(struct bnx2x *bp, |
@@ -4108,6 +4158,25 @@ static u8 bnx2x_8073_config_init(struct bnx2x_phy *phy, | |||
4108 | 4158 | ||
4109 | DP(NETIF_MSG_LINK, "Before rom RX_ALARM(port1): 0x%x\n", tmp1); | 4159 | DP(NETIF_MSG_LINK, "Before rom RX_ALARM(port1): 0x%x\n", tmp1); |
4110 | 4160 | ||
4161 | /** | ||
4162 | * If this is forced speed, set to KR or KX (all other are not | ||
4163 | * supported) | ||
4164 | */ | ||
4165 | /* Swap polarity if required - Must be done only in non-1G mode */ | ||
4166 | if (params->lane_config & PORT_HW_CFG_SWAP_PHY_POLARITY_ENABLED) { | ||
4167 | /* Configure the 8073 to swap _P and _N of the KR lines */ | ||
4168 | DP(NETIF_MSG_LINK, "Swapping polarity for the 8073\n"); | ||
4169 | /* 10G Rx/Tx and 1G Tx signal polarity swap */ | ||
4170 | bnx2x_cl45_read(bp, phy, | ||
4171 | MDIO_PMA_DEVAD, | ||
4172 | MDIO_PMA_REG_8073_OPT_DIGITAL_CTRL, &val); | ||
4173 | bnx2x_cl45_write(bp, phy, | ||
4174 | MDIO_PMA_DEVAD, | ||
4175 | MDIO_PMA_REG_8073_OPT_DIGITAL_CTRL, | ||
4176 | (val | (3<<9))); | ||
4177 | } | ||
4178 | |||
4179 | |||
4111 | /* Enable CL37 BAM */ | 4180 | /* Enable CL37 BAM */ |
4112 | if (REG_RD(bp, params->shmem_base + | 4181 | if (REG_RD(bp, params->shmem_base + |
4113 | offsetof(struct shmem_region, dev_info. | 4182 | offsetof(struct shmem_region, dev_info. |
@@ -4314,8 +4383,32 @@ static u8 bnx2x_8073_read_status(struct bnx2x_phy *phy, | |||
4314 | } | 4383 | } |
4315 | 4384 | ||
4316 | if (link_up) { | 4385 | if (link_up) { |
4386 | /* Swap polarity if required */ | ||
4387 | if (params->lane_config & | ||
4388 | PORT_HW_CFG_SWAP_PHY_POLARITY_ENABLED) { | ||
4389 | /* Configure the 8073 to swap P and N of the KR lines */ | ||
4390 | bnx2x_cl45_read(bp, phy, | ||
4391 | MDIO_XS_DEVAD, | ||
4392 | MDIO_XS_REG_8073_RX_CTRL_PCIE, &val1); | ||
4393 | /** | ||
4394 | * Set bit 3 to invert Rx in 1G mode and clear this bit | ||
4395 | * when it`s in 10G mode. | ||
4396 | */ | ||
4397 | if (vars->line_speed == SPEED_1000) { | ||
4398 | DP(NETIF_MSG_LINK, "Swapping 1G polarity for" | ||
4399 | "the 8073\n"); | ||
4400 | val1 |= (1<<3); | ||
4401 | } else | ||
4402 | val1 &= ~(1<<3); | ||
4403 | |||
4404 | bnx2x_cl45_write(bp, phy, | ||
4405 | MDIO_XS_DEVAD, | ||
4406 | MDIO_XS_REG_8073_RX_CTRL_PCIE, | ||
4407 | val1); | ||
4408 | } | ||
4317 | bnx2x_ext_phy_10G_an_resolve(bp, phy, vars); | 4409 | bnx2x_ext_phy_10G_an_resolve(bp, phy, vars); |
4318 | bnx2x_8073_resolve_fc(phy, params, vars); | 4410 | bnx2x_8073_resolve_fc(phy, params, vars); |
4411 | vars->duplex = DUPLEX_FULL; | ||
4319 | } | 4412 | } |
4320 | return link_up; | 4413 | return link_up; |
4321 | } | 4414 | } |
@@ -5062,6 +5155,7 @@ static u8 bnx2x_8706_8726_read_status(struct bnx2x_phy *phy, | |||
5062 | else | 5155 | else |
5063 | vars->line_speed = SPEED_10000; | 5156 | vars->line_speed = SPEED_10000; |
5064 | bnx2x_ext_phy_resolve_fc(phy, params, vars); | 5157 | bnx2x_ext_phy_resolve_fc(phy, params, vars); |
5158 | vars->duplex = DUPLEX_FULL; | ||
5065 | } | 5159 | } |
5066 | return link_up; | 5160 | return link_up; |
5067 | } | 5161 | } |
@@ -5758,8 +5852,11 @@ static u8 bnx2x_8727_read_status(struct bnx2x_phy *phy, | |||
5758 | DP(NETIF_MSG_LINK, "port %x: External link is down\n", | 5852 | DP(NETIF_MSG_LINK, "port %x: External link is down\n", |
5759 | params->port); | 5853 | params->port); |
5760 | } | 5854 | } |
5761 | if (link_up) | 5855 | if (link_up) { |
5762 | bnx2x_ext_phy_resolve_fc(phy, params, vars); | 5856 | bnx2x_ext_phy_resolve_fc(phy, params, vars); |
5857 | vars->duplex = DUPLEX_FULL; | ||
5858 | DP(NETIF_MSG_LINK, "duplex = 0x%x\n", vars->duplex); | ||
5859 | } | ||
5763 | 5860 | ||
5764 | if ((DUAL_MEDIA(params)) && | 5861 | if ((DUAL_MEDIA(params)) && |
5765 | (phy->req_line_speed == SPEED_1000)) { | 5862 | (phy->req_line_speed == SPEED_1000)) { |
@@ -5875,10 +5972,26 @@ static void bnx2x_848xx_set_led(struct bnx2x *bp, | |||
5875 | MDIO_PMA_REG_8481_LED2_MASK, | 5972 | MDIO_PMA_REG_8481_LED2_MASK, |
5876 | 0x18); | 5973 | 0x18); |
5877 | 5974 | ||
5975 | /* Select activity source by Tx and Rx, as suggested by PHY AE */ | ||
5878 | bnx2x_cl45_write(bp, phy, | 5976 | bnx2x_cl45_write(bp, phy, |
5879 | MDIO_PMA_DEVAD, | 5977 | MDIO_PMA_DEVAD, |
5880 | MDIO_PMA_REG_8481_LED3_MASK, | 5978 | MDIO_PMA_REG_8481_LED3_MASK, |
5881 | 0x0040); | 5979 | 0x0006); |
5980 | |||
5981 | /* Select the closest activity blink rate to that in 10/100/1000 */ | ||
5982 | bnx2x_cl45_write(bp, phy, | ||
5983 | MDIO_PMA_DEVAD, | ||
5984 | MDIO_PMA_REG_8481_LED3_BLINK, | ||
5985 | 0); | ||
5986 | |||
5987 | bnx2x_cl45_read(bp, phy, | ||
5988 | MDIO_PMA_DEVAD, | ||
5989 | MDIO_PMA_REG_84823_CTL_LED_CTL_1, &val); | ||
5990 | val |= MDIO_PMA_REG_84823_LED3_STRETCH_EN; /* stretch_en for LED3*/ | ||
5991 | |||
5992 | bnx2x_cl45_write(bp, phy, | ||
5993 | MDIO_PMA_DEVAD, | ||
5994 | MDIO_PMA_REG_84823_CTL_LED_CTL_1, val); | ||
5882 | 5995 | ||
5883 | /* 'Interrupt Mask' */ | 5996 | /* 'Interrupt Mask' */ |
5884 | bnx2x_cl45_write(bp, phy, | 5997 | bnx2x_cl45_write(bp, phy, |
@@ -6126,6 +6239,7 @@ static u8 bnx2x_848xx_read_status(struct bnx2x_phy *phy, | |||
6126 | /* Check link 10G */ | 6239 | /* Check link 10G */ |
6127 | if (val2 & (1<<11)) { | 6240 | if (val2 & (1<<11)) { |
6128 | vars->line_speed = SPEED_10000; | 6241 | vars->line_speed = SPEED_10000; |
6242 | vars->duplex = DUPLEX_FULL; | ||
6129 | link_up = 1; | 6243 | link_up = 1; |
6130 | bnx2x_ext_phy_10G_an_resolve(bp, phy, vars); | 6244 | bnx2x_ext_phy_10G_an_resolve(bp, phy, vars); |
6131 | } else { /* Check Legacy speed link */ | 6245 | } else { /* Check Legacy speed link */ |
@@ -6489,6 +6603,7 @@ static u8 bnx2x_7101_read_status(struct bnx2x_phy *phy, | |||
6489 | MDIO_AN_DEVAD, MDIO_AN_REG_MASTER_STATUS, | 6603 | MDIO_AN_DEVAD, MDIO_AN_REG_MASTER_STATUS, |
6490 | &val2); | 6604 | &val2); |
6491 | vars->line_speed = SPEED_10000; | 6605 | vars->line_speed = SPEED_10000; |
6606 | vars->duplex = DUPLEX_FULL; | ||
6492 | DP(NETIF_MSG_LINK, "SFX7101 AN status 0x%x->Master=%x\n", | 6607 | DP(NETIF_MSG_LINK, "SFX7101 AN status 0x%x->Master=%x\n", |
6493 | val2, (val2 & (1<<14))); | 6608 | val2, (val2 & (1<<14))); |
6494 | bnx2x_ext_phy_10G_an_resolve(bp, phy, vars); | 6609 | bnx2x_ext_phy_10G_an_resolve(bp, phy, vars); |
@@ -7663,7 +7778,6 @@ static u8 bnx2x_8073_common_init_phy(struct bnx2x *bp, | |||
7663 | 7778 | ||
7664 | /* PART2 - Download firmware to both phys */ | 7779 | /* PART2 - Download firmware to both phys */ |
7665 | for (port = PORT_MAX - 1; port >= PORT_0; port--) { | 7780 | for (port = PORT_MAX - 1; port >= PORT_0; port--) { |
7666 | u16 fw_ver1; | ||
7667 | if (CHIP_IS_E2(bp)) | 7781 | if (CHIP_IS_E2(bp)) |
7668 | port_of_path = 0; | 7782 | port_of_path = 0; |
7669 | else | 7783 | else |
@@ -7671,19 +7785,9 @@ static u8 bnx2x_8073_common_init_phy(struct bnx2x *bp, | |||
7671 | 7785 | ||
7672 | DP(NETIF_MSG_LINK, "Loading spirom for phy address 0x%x\n", | 7786 | DP(NETIF_MSG_LINK, "Loading spirom for phy address 0x%x\n", |
7673 | phy_blk[port]->addr); | 7787 | phy_blk[port]->addr); |
7674 | bnx2x_8073_8727_external_rom_boot(bp, phy_blk[port], | 7788 | if (bnx2x_8073_8727_external_rom_boot(bp, phy_blk[port], |
7675 | port_of_path); | 7789 | port_of_path)) |
7676 | |||
7677 | bnx2x_cl45_read(bp, phy_blk[port], | ||
7678 | MDIO_PMA_DEVAD, | ||
7679 | MDIO_PMA_REG_ROM_VER1, &fw_ver1); | ||
7680 | if (fw_ver1 == 0 || fw_ver1 == 0x4321) { | ||
7681 | DP(NETIF_MSG_LINK, | ||
7682 | "bnx2x_8073_common_init_phy port %x:" | ||
7683 | "Download failed. fw version = 0x%x\n", | ||
7684 | port, fw_ver1); | ||
7685 | return -EINVAL; | 7790 | return -EINVAL; |
7686 | } | ||
7687 | 7791 | ||
7688 | /* Only set bit 10 = 1 (Tx power down) */ | 7792 | /* Only set bit 10 = 1 (Tx power down) */ |
7689 | bnx2x_cl45_read(bp, phy_blk[port], | 7793 | bnx2x_cl45_read(bp, phy_blk[port], |
@@ -7848,27 +7952,17 @@ static u8 bnx2x_8727_common_init_phy(struct bnx2x *bp, | |||
7848 | } | 7952 | } |
7849 | /* PART2 - Download firmware to both phys */ | 7953 | /* PART2 - Download firmware to both phys */ |
7850 | for (port = PORT_MAX - 1; port >= PORT_0; port--) { | 7954 | for (port = PORT_MAX - 1; port >= PORT_0; port--) { |
7851 | u16 fw_ver1; | ||
7852 | if (CHIP_IS_E2(bp)) | 7955 | if (CHIP_IS_E2(bp)) |
7853 | port_of_path = 0; | 7956 | port_of_path = 0; |
7854 | else | 7957 | else |
7855 | port_of_path = port; | 7958 | port_of_path = port; |
7856 | DP(NETIF_MSG_LINK, "Loading spirom for phy address 0x%x\n", | 7959 | DP(NETIF_MSG_LINK, "Loading spirom for phy address 0x%x\n", |
7857 | phy_blk[port]->addr); | 7960 | phy_blk[port]->addr); |
7858 | bnx2x_8073_8727_external_rom_boot(bp, phy_blk[port], | 7961 | if (bnx2x_8073_8727_external_rom_boot(bp, phy_blk[port], |
7859 | port_of_path); | 7962 | port_of_path)) |
7860 | bnx2x_cl45_read(bp, phy_blk[port], | ||
7861 | MDIO_PMA_DEVAD, | ||
7862 | MDIO_PMA_REG_ROM_VER1, &fw_ver1); | ||
7863 | if (fw_ver1 == 0 || fw_ver1 == 0x4321) { | ||
7864 | DP(NETIF_MSG_LINK, | ||
7865 | "bnx2x_8727_common_init_phy port %x:" | ||
7866 | "Download failed. fw version = 0x%x\n", | ||
7867 | port, fw_ver1); | ||
7868 | return -EINVAL; | 7963 | return -EINVAL; |
7869 | } | ||
7870 | } | ||
7871 | 7964 | ||
7965 | } | ||
7872 | return 0; | 7966 | return 0; |
7873 | } | 7967 | } |
7874 | 7968 | ||
@@ -7916,6 +8010,7 @@ u8 bnx2x_common_init_phy(struct bnx2x *bp, u32 shmem_base_path[], | |||
7916 | u32 shmem2_base_path[], u32 chip_id) | 8010 | u32 shmem2_base_path[], u32 chip_id) |
7917 | { | 8011 | { |
7918 | u8 rc = 0; | 8012 | u8 rc = 0; |
8013 | u32 phy_ver; | ||
7919 | u8 phy_index; | 8014 | u8 phy_index; |
7920 | u32 ext_phy_type, ext_phy_config; | 8015 | u32 ext_phy_type, ext_phy_config; |
7921 | DP(NETIF_MSG_LINK, "Begin common phy init\n"); | 8016 | DP(NETIF_MSG_LINK, "Begin common phy init\n"); |
@@ -7923,6 +8018,16 @@ u8 bnx2x_common_init_phy(struct bnx2x *bp, u32 shmem_base_path[], | |||
7923 | if (CHIP_REV_IS_EMUL(bp)) | 8018 | if (CHIP_REV_IS_EMUL(bp)) |
7924 | return 0; | 8019 | return 0; |
7925 | 8020 | ||
8021 | /* Check if common init was already done */ | ||
8022 | phy_ver = REG_RD(bp, shmem_base_path[0] + | ||
8023 | offsetof(struct shmem_region, | ||
8024 | port_mb[PORT_0].ext_phy_fw_version)); | ||
8025 | if (phy_ver) { | ||
8026 | DP(NETIF_MSG_LINK, "Not doing common init; phy ver is 0x%x\n", | ||
8027 | phy_ver); | ||
8028 | return 0; | ||
8029 | } | ||
8030 | |||
7926 | /* Read the ext_phy_type for arbitrary port(0) */ | 8031 | /* Read the ext_phy_type for arbitrary port(0) */ |
7927 | for (phy_index = EXT_PHY1; phy_index < MAX_PHYS; | 8032 | for (phy_index = EXT_PHY1; phy_index < MAX_PHYS; |
7928 | phy_index++) { | 8033 | phy_index++) { |
diff --git a/drivers/net/bnx2x/bnx2x_reg.h b/drivers/net/bnx2x/bnx2x_reg.h index c939683e3d61..e01330bb36c7 100644 --- a/drivers/net/bnx2x/bnx2x_reg.h +++ b/drivers/net/bnx2x/bnx2x_reg.h | |||
@@ -6194,7 +6194,11 @@ Theotherbitsarereservedandshouldbezero*/ | |||
6194 | #define MDIO_CTL_REG_84823_MEDIA_PRIORITY_COPPER 0x0000 | 6194 | #define MDIO_CTL_REG_84823_MEDIA_PRIORITY_COPPER 0x0000 |
6195 | #define MDIO_CTL_REG_84823_MEDIA_PRIORITY_FIBER 0x0100 | 6195 | #define MDIO_CTL_REG_84823_MEDIA_PRIORITY_FIBER 0x0100 |
6196 | #define MDIO_CTL_REG_84823_MEDIA_FIBER_1G 0x1000 | 6196 | #define MDIO_CTL_REG_84823_MEDIA_FIBER_1G 0x1000 |
6197 | #define MDIO_CTL_REG_84823_USER_CTRL_REG 0x4005 | ||
6198 | #define MDIO_CTL_REG_84823_USER_CTRL_CMS 0x0080 | ||
6197 | 6199 | ||
6200 | #define MDIO_PMA_REG_84823_CTL_LED_CTL_1 0xa8e3 | ||
6201 | #define MDIO_PMA_REG_84823_LED3_STRETCH_EN 0x0080 | ||
6198 | 6202 | ||
6199 | #define IGU_FUNC_BASE 0x0400 | 6203 | #define IGU_FUNC_BASE 0x0400 |
6200 | 6204 | ||
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 119aa2000c24..5ed8f9f9419f 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
@@ -1920,7 +1920,7 @@ int startup_gfar(struct net_device *ndev) | |||
1920 | if (err) { | 1920 | if (err) { |
1921 | for (j = 0; j < i; j++) | 1921 | for (j = 0; j < i; j++) |
1922 | free_grp_irqs(&priv->gfargrp[j]); | 1922 | free_grp_irqs(&priv->gfargrp[j]); |
1923 | goto irq_fail; | 1923 | goto irq_fail; |
1924 | } | 1924 | } |
1925 | } | 1925 | } |
1926 | 1926 | ||
diff --git a/drivers/net/irda/sh_irda.c b/drivers/net/irda/sh_irda.c index 9e3f4f54281d..4488bd581eca 100644 --- a/drivers/net/irda/sh_irda.c +++ b/drivers/net/irda/sh_irda.c | |||
@@ -635,7 +635,7 @@ static int sh_irda_hard_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
635 | 635 | ||
636 | ret = sh_irda_set_baudrate(self, speed); | 636 | ret = sh_irda_set_baudrate(self, speed); |
637 | if (ret < 0) | 637 | if (ret < 0) |
638 | return ret; | 638 | goto sh_irda_hard_xmit_end; |
639 | 639 | ||
640 | self->tx_buff.len = 0; | 640 | self->tx_buff.len = 0; |
641 | if (skb->len) { | 641 | if (skb->len) { |
@@ -652,11 +652,21 @@ static int sh_irda_hard_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
652 | 652 | ||
653 | sh_irda_write(self, IRTFLR, self->tx_buff.len); | 653 | sh_irda_write(self, IRTFLR, self->tx_buff.len); |
654 | sh_irda_write(self, IRTCTR, ARMOD | TE); | 654 | sh_irda_write(self, IRTCTR, ARMOD | TE); |
655 | } | 655 | } else |
656 | goto sh_irda_hard_xmit_end; | ||
656 | 657 | ||
657 | dev_kfree_skb(skb); | 658 | dev_kfree_skb(skb); |
658 | 659 | ||
659 | return 0; | 660 | return 0; |
661 | |||
662 | sh_irda_hard_xmit_end: | ||
663 | sh_irda_set_baudrate(self, 9600); | ||
664 | netif_wake_queue(self->ndev); | ||
665 | sh_irda_rcv_ctrl(self, 1); | ||
666 | dev_kfree_skb(skb); | ||
667 | |||
668 | return ret; | ||
669 | |||
660 | } | 670 | } |
661 | 671 | ||
662 | static int sh_irda_ioctl(struct net_device *ndev, struct ifreq *ifreq, int cmd) | 672 | static int sh_irda_ioctl(struct net_device *ndev, struct ifreq *ifreq, int cmd) |
diff --git a/drivers/net/ns83820.c b/drivers/net/ns83820.c index 84134c766f3a..a41b2cf4d917 100644 --- a/drivers/net/ns83820.c +++ b/drivers/net/ns83820.c | |||
@@ -1988,12 +1988,11 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, | |||
1988 | } | 1988 | } |
1989 | 1989 | ||
1990 | ndev = alloc_etherdev(sizeof(struct ns83820)); | 1990 | ndev = alloc_etherdev(sizeof(struct ns83820)); |
1991 | dev = PRIV(ndev); | ||
1992 | |||
1993 | err = -ENOMEM; | 1991 | err = -ENOMEM; |
1994 | if (!dev) | 1992 | if (!ndev) |
1995 | goto out; | 1993 | goto out; |
1996 | 1994 | ||
1995 | dev = PRIV(ndev); | ||
1997 | dev->ndev = ndev; | 1996 | dev->ndev = ndev; |
1998 | 1997 | ||
1999 | spin_lock_init(&dev->rx_info.lock); | 1998 | spin_lock_init(&dev->rx_info.lock); |
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index d776c4a8d3c1..04e8ce14a1d0 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c | |||
@@ -54,7 +54,7 @@ | |||
54 | #include <linux/usb/usbnet.h> | 54 | #include <linux/usb/usbnet.h> |
55 | #include <linux/usb/cdc.h> | 55 | #include <linux/usb/cdc.h> |
56 | 56 | ||
57 | #define DRIVER_VERSION "30-Nov-2010" | 57 | #define DRIVER_VERSION "17-Jan-2011" |
58 | 58 | ||
59 | /* CDC NCM subclass 3.2.1 */ | 59 | /* CDC NCM subclass 3.2.1 */ |
60 | #define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10 | 60 | #define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10 |
@@ -868,15 +868,19 @@ static void cdc_ncm_tx_timeout(unsigned long arg) | |||
868 | if (ctx->tx_timer_pending != 0) { | 868 | if (ctx->tx_timer_pending != 0) { |
869 | ctx->tx_timer_pending--; | 869 | ctx->tx_timer_pending--; |
870 | restart = 1; | 870 | restart = 1; |
871 | } else | 871 | } else { |
872 | restart = 0; | 872 | restart = 0; |
873 | } | ||
873 | 874 | ||
874 | spin_unlock(&ctx->mtx); | 875 | spin_unlock(&ctx->mtx); |
875 | 876 | ||
876 | if (restart) | 877 | if (restart) { |
878 | spin_lock(&ctx->mtx); | ||
877 | cdc_ncm_tx_timeout_start(ctx); | 879 | cdc_ncm_tx_timeout_start(ctx); |
878 | else if (ctx->netdev != NULL) | 880 | spin_unlock(&ctx->mtx); |
881 | } else if (ctx->netdev != NULL) { | ||
879 | usbnet_start_xmit(NULL, ctx->netdev); | 882 | usbnet_start_xmit(NULL, ctx->netdev); |
883 | } | ||
880 | } | 884 | } |
881 | 885 | ||
882 | static struct sk_buff * | 886 | static struct sk_buff * |
@@ -900,7 +904,6 @@ cdc_ncm_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) | |||
900 | skb_out = cdc_ncm_fill_tx_frame(ctx, skb); | 904 | skb_out = cdc_ncm_fill_tx_frame(ctx, skb); |
901 | if (ctx->tx_curr_skb != NULL) | 905 | if (ctx->tx_curr_skb != NULL) |
902 | need_timer = 1; | 906 | need_timer = 1; |
903 | spin_unlock(&ctx->mtx); | ||
904 | 907 | ||
905 | /* Start timer, if there is a remaining skb */ | 908 | /* Start timer, if there is a remaining skb */ |
906 | if (need_timer) | 909 | if (need_timer) |
@@ -908,6 +911,8 @@ cdc_ncm_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) | |||
908 | 911 | ||
909 | if (skb_out) | 912 | if (skb_out) |
910 | dev->net->stats.tx_packets += ctx->tx_curr_frame_num; | 913 | dev->net->stats.tx_packets += ctx->tx_curr_frame_num; |
914 | |||
915 | spin_unlock(&ctx->mtx); | ||
911 | return skb_out; | 916 | return skb_out; |
912 | 917 | ||
913 | error: | 918 | error: |
@@ -1020,8 +1025,8 @@ static int cdc_ncm_rx_fixup(struct usbnet *dev, struct sk_buff *skb_in) | |||
1020 | if (((offset + temp) > actlen) || | 1025 | if (((offset + temp) > actlen) || |
1021 | (temp > CDC_NCM_MAX_DATAGRAM_SIZE) || (temp < ETH_HLEN)) { | 1026 | (temp > CDC_NCM_MAX_DATAGRAM_SIZE) || (temp < ETH_HLEN)) { |
1022 | pr_debug("invalid frame detected (ignored)" | 1027 | pr_debug("invalid frame detected (ignored)" |
1023 | "offset[%u]=%u, length=%u, skb=%p\n", | 1028 | "offset[%u]=%u, length=%u, skb=%p\n", |
1024 | x, offset, temp, skb_in); | 1029 | x, offset, temp, skb_in); |
1025 | if (!x) | 1030 | if (!x) |
1026 | goto error; | 1031 | goto error; |
1027 | break; | 1032 | break; |
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index d143e8b72b5b..cc14b4a75048 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c | |||
@@ -48,6 +48,9 @@ static atomic_t devices_found; | |||
48 | static int enable_mq = 1; | 48 | static int enable_mq = 1; |
49 | static int irq_share_mode; | 49 | static int irq_share_mode; |
50 | 50 | ||
51 | static void | ||
52 | vmxnet3_write_mac_addr(struct vmxnet3_adapter *adapter, u8 *mac); | ||
53 | |||
51 | /* | 54 | /* |
52 | * Enable/Disable the given intr | 55 | * Enable/Disable the given intr |
53 | */ | 56 | */ |
@@ -139,9 +142,13 @@ vmxnet3_check_link(struct vmxnet3_adapter *adapter, bool affectTxQueue) | |||
139 | { | 142 | { |
140 | u32 ret; | 143 | u32 ret; |
141 | int i; | 144 | int i; |
145 | unsigned long flags; | ||
142 | 146 | ||
147 | spin_lock_irqsave(&adapter->cmd_lock, flags); | ||
143 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_LINK); | 148 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_LINK); |
144 | ret = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD); | 149 | ret = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD); |
150 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | ||
151 | |||
145 | adapter->link_speed = ret >> 16; | 152 | adapter->link_speed = ret >> 16; |
146 | if (ret & 1) { /* Link is up. */ | 153 | if (ret & 1) { /* Link is up. */ |
147 | printk(KERN_INFO "%s: NIC Link is Up %d Mbps\n", | 154 | printk(KERN_INFO "%s: NIC Link is Up %d Mbps\n", |
@@ -183,8 +190,10 @@ vmxnet3_process_events(struct vmxnet3_adapter *adapter) | |||
183 | 190 | ||
184 | /* Check if there is an error on xmit/recv queues */ | 191 | /* Check if there is an error on xmit/recv queues */ |
185 | if (events & (VMXNET3_ECR_TQERR | VMXNET3_ECR_RQERR)) { | 192 | if (events & (VMXNET3_ECR_TQERR | VMXNET3_ECR_RQERR)) { |
193 | spin_lock(&adapter->cmd_lock); | ||
186 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 194 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
187 | VMXNET3_CMD_GET_QUEUE_STATUS); | 195 | VMXNET3_CMD_GET_QUEUE_STATUS); |
196 | spin_unlock(&adapter->cmd_lock); | ||
188 | 197 | ||
189 | for (i = 0; i < adapter->num_tx_queues; i++) | 198 | for (i = 0; i < adapter->num_tx_queues; i++) |
190 | if (adapter->tqd_start[i].status.stopped) | 199 | if (adapter->tqd_start[i].status.stopped) |
@@ -804,30 +813,25 @@ vmxnet3_parse_and_copy_hdr(struct sk_buff *skb, struct vmxnet3_tx_queue *tq, | |||
804 | skb_transport_header(skb))->doff * 4; | 813 | skb_transport_header(skb))->doff * 4; |
805 | ctx->copy_size = ctx->eth_ip_hdr_size + ctx->l4_hdr_size; | 814 | ctx->copy_size = ctx->eth_ip_hdr_size + ctx->l4_hdr_size; |
806 | } else { | 815 | } else { |
807 | unsigned int pull_size; | ||
808 | |||
809 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 816 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
810 | ctx->eth_ip_hdr_size = skb_checksum_start_offset(skb); | 817 | ctx->eth_ip_hdr_size = skb_checksum_start_offset(skb); |
811 | 818 | ||
812 | if (ctx->ipv4) { | 819 | if (ctx->ipv4) { |
813 | struct iphdr *iph = (struct iphdr *) | 820 | struct iphdr *iph = (struct iphdr *) |
814 | skb_network_header(skb); | 821 | skb_network_header(skb); |
815 | if (iph->protocol == IPPROTO_TCP) { | 822 | if (iph->protocol == IPPROTO_TCP) |
816 | pull_size = ctx->eth_ip_hdr_size + | ||
817 | sizeof(struct tcphdr); | ||
818 | |||
819 | if (unlikely(!pskb_may_pull(skb, | ||
820 | pull_size))) { | ||
821 | goto err; | ||
822 | } | ||
823 | ctx->l4_hdr_size = ((struct tcphdr *) | 823 | ctx->l4_hdr_size = ((struct tcphdr *) |
824 | skb_transport_header(skb))->doff * 4; | 824 | skb_transport_header(skb))->doff * 4; |
825 | } else if (iph->protocol == IPPROTO_UDP) { | 825 | else if (iph->protocol == IPPROTO_UDP) |
826 | /* | ||
827 | * Use tcp header size so that bytes to | ||
828 | * be copied are more than required by | ||
829 | * the device. | ||
830 | */ | ||
826 | ctx->l4_hdr_size = | 831 | ctx->l4_hdr_size = |
827 | sizeof(struct udphdr); | 832 | sizeof(struct tcphdr); |
828 | } else { | 833 | else |
829 | ctx->l4_hdr_size = 0; | 834 | ctx->l4_hdr_size = 0; |
830 | } | ||
831 | } else { | 835 | } else { |
832 | /* for simplicity, don't copy L4 headers */ | 836 | /* for simplicity, don't copy L4 headers */ |
833 | ctx->l4_hdr_size = 0; | 837 | ctx->l4_hdr_size = 0; |
@@ -1859,18 +1863,14 @@ vmxnet3_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp) | |||
1859 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); | 1863 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); |
1860 | struct Vmxnet3_DriverShared *shared = adapter->shared; | 1864 | struct Vmxnet3_DriverShared *shared = adapter->shared; |
1861 | u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable; | 1865 | u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable; |
1866 | unsigned long flags; | ||
1862 | 1867 | ||
1863 | if (grp) { | 1868 | if (grp) { |
1864 | /* add vlan rx stripping. */ | 1869 | /* add vlan rx stripping. */ |
1865 | if (adapter->netdev->features & NETIF_F_HW_VLAN_RX) { | 1870 | if (adapter->netdev->features & NETIF_F_HW_VLAN_RX) { |
1866 | int i; | 1871 | int i; |
1867 | struct Vmxnet3_DSDevRead *devRead = &shared->devRead; | ||
1868 | adapter->vlan_grp = grp; | 1872 | adapter->vlan_grp = grp; |
1869 | 1873 | ||
1870 | /* update FEATURES to device */ | ||
1871 | devRead->misc.uptFeatures |= UPT1_F_RXVLAN; | ||
1872 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | ||
1873 | VMXNET3_CMD_UPDATE_FEATURE); | ||
1874 | /* | 1874 | /* |
1875 | * Clear entire vfTable; then enable untagged pkts. | 1875 | * Clear entire vfTable; then enable untagged pkts. |
1876 | * Note: setting one entry in vfTable to non-zero turns | 1876 | * Note: setting one entry in vfTable to non-zero turns |
@@ -1880,8 +1880,10 @@ vmxnet3_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp) | |||
1880 | vfTable[i] = 0; | 1880 | vfTable[i] = 0; |
1881 | 1881 | ||
1882 | VMXNET3_SET_VFTABLE_ENTRY(vfTable, 0); | 1882 | VMXNET3_SET_VFTABLE_ENTRY(vfTable, 0); |
1883 | spin_lock_irqsave(&adapter->cmd_lock, flags); | ||
1883 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 1884 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
1884 | VMXNET3_CMD_UPDATE_VLAN_FILTERS); | 1885 | VMXNET3_CMD_UPDATE_VLAN_FILTERS); |
1886 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | ||
1885 | } else { | 1887 | } else { |
1886 | printk(KERN_ERR "%s: vlan_rx_register when device has " | 1888 | printk(KERN_ERR "%s: vlan_rx_register when device has " |
1887 | "no NETIF_F_HW_VLAN_RX\n", netdev->name); | 1889 | "no NETIF_F_HW_VLAN_RX\n", netdev->name); |
@@ -1900,13 +1902,10 @@ vmxnet3_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp) | |||
1900 | */ | 1902 | */ |
1901 | vfTable[i] = 0; | 1903 | vfTable[i] = 0; |
1902 | } | 1904 | } |
1905 | spin_lock_irqsave(&adapter->cmd_lock, flags); | ||
1903 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 1906 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
1904 | VMXNET3_CMD_UPDATE_VLAN_FILTERS); | 1907 | VMXNET3_CMD_UPDATE_VLAN_FILTERS); |
1905 | 1908 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | |
1906 | /* update FEATURES to device */ | ||
1907 | devRead->misc.uptFeatures &= ~UPT1_F_RXVLAN; | ||
1908 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | ||
1909 | VMXNET3_CMD_UPDATE_FEATURE); | ||
1910 | } | 1909 | } |
1911 | } | 1910 | } |
1912 | } | 1911 | } |
@@ -1939,10 +1938,13 @@ vmxnet3_vlan_rx_add_vid(struct net_device *netdev, u16 vid) | |||
1939 | { | 1938 | { |
1940 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); | 1939 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); |
1941 | u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable; | 1940 | u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable; |
1941 | unsigned long flags; | ||
1942 | 1942 | ||
1943 | VMXNET3_SET_VFTABLE_ENTRY(vfTable, vid); | 1943 | VMXNET3_SET_VFTABLE_ENTRY(vfTable, vid); |
1944 | spin_lock_irqsave(&adapter->cmd_lock, flags); | ||
1944 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 1945 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
1945 | VMXNET3_CMD_UPDATE_VLAN_FILTERS); | 1946 | VMXNET3_CMD_UPDATE_VLAN_FILTERS); |
1947 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | ||
1946 | } | 1948 | } |
1947 | 1949 | ||
1948 | 1950 | ||
@@ -1951,10 +1953,13 @@ vmxnet3_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) | |||
1951 | { | 1953 | { |
1952 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); | 1954 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); |
1953 | u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable; | 1955 | u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable; |
1956 | unsigned long flags; | ||
1954 | 1957 | ||
1955 | VMXNET3_CLEAR_VFTABLE_ENTRY(vfTable, vid); | 1958 | VMXNET3_CLEAR_VFTABLE_ENTRY(vfTable, vid); |
1959 | spin_lock_irqsave(&adapter->cmd_lock, flags); | ||
1956 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 1960 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
1957 | VMXNET3_CMD_UPDATE_VLAN_FILTERS); | 1961 | VMXNET3_CMD_UPDATE_VLAN_FILTERS); |
1962 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | ||
1958 | } | 1963 | } |
1959 | 1964 | ||
1960 | 1965 | ||
@@ -1985,6 +1990,7 @@ static void | |||
1985 | vmxnet3_set_mc(struct net_device *netdev) | 1990 | vmxnet3_set_mc(struct net_device *netdev) |
1986 | { | 1991 | { |
1987 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); | 1992 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); |
1993 | unsigned long flags; | ||
1988 | struct Vmxnet3_RxFilterConf *rxConf = | 1994 | struct Vmxnet3_RxFilterConf *rxConf = |
1989 | &adapter->shared->devRead.rxFilterConf; | 1995 | &adapter->shared->devRead.rxFilterConf; |
1990 | u8 *new_table = NULL; | 1996 | u8 *new_table = NULL; |
@@ -2020,6 +2026,7 @@ vmxnet3_set_mc(struct net_device *netdev) | |||
2020 | rxConf->mfTablePA = 0; | 2026 | rxConf->mfTablePA = 0; |
2021 | } | 2027 | } |
2022 | 2028 | ||
2029 | spin_lock_irqsave(&adapter->cmd_lock, flags); | ||
2023 | if (new_mode != rxConf->rxMode) { | 2030 | if (new_mode != rxConf->rxMode) { |
2024 | rxConf->rxMode = cpu_to_le32(new_mode); | 2031 | rxConf->rxMode = cpu_to_le32(new_mode); |
2025 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 2032 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
@@ -2028,6 +2035,7 @@ vmxnet3_set_mc(struct net_device *netdev) | |||
2028 | 2035 | ||
2029 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 2036 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
2030 | VMXNET3_CMD_UPDATE_MAC_FILTERS); | 2037 | VMXNET3_CMD_UPDATE_MAC_FILTERS); |
2038 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | ||
2031 | 2039 | ||
2032 | kfree(new_table); | 2040 | kfree(new_table); |
2033 | } | 2041 | } |
@@ -2080,10 +2088,8 @@ vmxnet3_setup_driver_shared(struct vmxnet3_adapter *adapter) | |||
2080 | devRead->misc.uptFeatures |= UPT1_F_LRO; | 2088 | devRead->misc.uptFeatures |= UPT1_F_LRO; |
2081 | devRead->misc.maxNumRxSG = cpu_to_le16(1 + MAX_SKB_FRAGS); | 2089 | devRead->misc.maxNumRxSG = cpu_to_le16(1 + MAX_SKB_FRAGS); |
2082 | } | 2090 | } |
2083 | if ((adapter->netdev->features & NETIF_F_HW_VLAN_RX) && | 2091 | if (adapter->netdev->features & NETIF_F_HW_VLAN_RX) |
2084 | adapter->vlan_grp) { | ||
2085 | devRead->misc.uptFeatures |= UPT1_F_RXVLAN; | 2092 | devRead->misc.uptFeatures |= UPT1_F_RXVLAN; |
2086 | } | ||
2087 | 2093 | ||
2088 | devRead->misc.mtu = cpu_to_le32(adapter->netdev->mtu); | 2094 | devRead->misc.mtu = cpu_to_le32(adapter->netdev->mtu); |
2089 | devRead->misc.queueDescPA = cpu_to_le64(adapter->queue_desc_pa); | 2095 | devRead->misc.queueDescPA = cpu_to_le64(adapter->queue_desc_pa); |
@@ -2168,6 +2174,8 @@ vmxnet3_setup_driver_shared(struct vmxnet3_adapter *adapter) | |||
2168 | /* rx filter settings */ | 2174 | /* rx filter settings */ |
2169 | devRead->rxFilterConf.rxMode = 0; | 2175 | devRead->rxFilterConf.rxMode = 0; |
2170 | vmxnet3_restore_vlan(adapter); | 2176 | vmxnet3_restore_vlan(adapter); |
2177 | vmxnet3_write_mac_addr(adapter, adapter->netdev->dev_addr); | ||
2178 | |||
2171 | /* the rest are already zeroed */ | 2179 | /* the rest are already zeroed */ |
2172 | } | 2180 | } |
2173 | 2181 | ||
@@ -2177,6 +2185,7 @@ vmxnet3_activate_dev(struct vmxnet3_adapter *adapter) | |||
2177 | { | 2185 | { |
2178 | int err, i; | 2186 | int err, i; |
2179 | u32 ret; | 2187 | u32 ret; |
2188 | unsigned long flags; | ||
2180 | 2189 | ||
2181 | dev_dbg(&adapter->netdev->dev, "%s: skb_buf_size %d, rx_buf_per_pkt %d," | 2190 | dev_dbg(&adapter->netdev->dev, "%s: skb_buf_size %d, rx_buf_per_pkt %d," |
2182 | " ring sizes %u %u %u\n", adapter->netdev->name, | 2191 | " ring sizes %u %u %u\n", adapter->netdev->name, |
@@ -2206,9 +2215,11 @@ vmxnet3_activate_dev(struct vmxnet3_adapter *adapter) | |||
2206 | adapter->shared_pa)); | 2215 | adapter->shared_pa)); |
2207 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_DSAH, VMXNET3_GET_ADDR_HI( | 2216 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_DSAH, VMXNET3_GET_ADDR_HI( |
2208 | adapter->shared_pa)); | 2217 | adapter->shared_pa)); |
2218 | spin_lock_irqsave(&adapter->cmd_lock, flags); | ||
2209 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 2219 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
2210 | VMXNET3_CMD_ACTIVATE_DEV); | 2220 | VMXNET3_CMD_ACTIVATE_DEV); |
2211 | ret = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD); | 2221 | ret = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD); |
2222 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | ||
2212 | 2223 | ||
2213 | if (ret != 0) { | 2224 | if (ret != 0) { |
2214 | printk(KERN_ERR "Failed to activate dev %s: error %u\n", | 2225 | printk(KERN_ERR "Failed to activate dev %s: error %u\n", |
@@ -2255,7 +2266,10 @@ rq_err: | |||
2255 | void | 2266 | void |
2256 | vmxnet3_reset_dev(struct vmxnet3_adapter *adapter) | 2267 | vmxnet3_reset_dev(struct vmxnet3_adapter *adapter) |
2257 | { | 2268 | { |
2269 | unsigned long flags; | ||
2270 | spin_lock_irqsave(&adapter->cmd_lock, flags); | ||
2258 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV); | 2271 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV); |
2272 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | ||
2259 | } | 2273 | } |
2260 | 2274 | ||
2261 | 2275 | ||
@@ -2263,12 +2277,15 @@ int | |||
2263 | vmxnet3_quiesce_dev(struct vmxnet3_adapter *adapter) | 2277 | vmxnet3_quiesce_dev(struct vmxnet3_adapter *adapter) |
2264 | { | 2278 | { |
2265 | int i; | 2279 | int i; |
2280 | unsigned long flags; | ||
2266 | if (test_and_set_bit(VMXNET3_STATE_BIT_QUIESCED, &adapter->state)) | 2281 | if (test_and_set_bit(VMXNET3_STATE_BIT_QUIESCED, &adapter->state)) |
2267 | return 0; | 2282 | return 0; |
2268 | 2283 | ||
2269 | 2284 | ||
2285 | spin_lock_irqsave(&adapter->cmd_lock, flags); | ||
2270 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 2286 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
2271 | VMXNET3_CMD_QUIESCE_DEV); | 2287 | VMXNET3_CMD_QUIESCE_DEV); |
2288 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | ||
2272 | vmxnet3_disable_all_intrs(adapter); | 2289 | vmxnet3_disable_all_intrs(adapter); |
2273 | 2290 | ||
2274 | for (i = 0; i < adapter->num_rx_queues; i++) | 2291 | for (i = 0; i < adapter->num_rx_queues; i++) |
@@ -2426,7 +2443,7 @@ vmxnet3_adjust_rx_ring_size(struct vmxnet3_adapter *adapter) | |||
2426 | sz = adapter->rx_buf_per_pkt * VMXNET3_RING_SIZE_ALIGN; | 2443 | sz = adapter->rx_buf_per_pkt * VMXNET3_RING_SIZE_ALIGN; |
2427 | ring0_size = adapter->rx_queue[0].rx_ring[0].size; | 2444 | ring0_size = adapter->rx_queue[0].rx_ring[0].size; |
2428 | ring0_size = (ring0_size + sz - 1) / sz * sz; | 2445 | ring0_size = (ring0_size + sz - 1) / sz * sz; |
2429 | ring0_size = min_t(u32, rq->rx_ring[0].size, VMXNET3_RX_RING_MAX_SIZE / | 2446 | ring0_size = min_t(u32, ring0_size, VMXNET3_RX_RING_MAX_SIZE / |
2430 | sz * sz); | 2447 | sz * sz); |
2431 | ring1_size = adapter->rx_queue[0].rx_ring[1].size; | 2448 | ring1_size = adapter->rx_queue[0].rx_ring[1].size; |
2432 | comp_size = ring0_size + ring1_size; | 2449 | comp_size = ring0_size + ring1_size; |
@@ -2695,7 +2712,7 @@ vmxnet3_acquire_msix_vectors(struct vmxnet3_adapter *adapter, | |||
2695 | break; | 2712 | break; |
2696 | } else { | 2713 | } else { |
2697 | /* If fails to enable required number of MSI-x vectors | 2714 | /* If fails to enable required number of MSI-x vectors |
2698 | * try enabling 3 of them. One each for rx, tx and event | 2715 | * try enabling minimum number of vectors required. |
2699 | */ | 2716 | */ |
2700 | vectors = vector_threshold; | 2717 | vectors = vector_threshold; |
2701 | printk(KERN_ERR "Failed to enable %d MSI-X for %s, try" | 2718 | printk(KERN_ERR "Failed to enable %d MSI-X for %s, try" |
@@ -2718,9 +2735,11 @@ vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter) | |||
2718 | u32 cfg; | 2735 | u32 cfg; |
2719 | 2736 | ||
2720 | /* intr settings */ | 2737 | /* intr settings */ |
2738 | spin_lock(&adapter->cmd_lock); | ||
2721 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 2739 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
2722 | VMXNET3_CMD_GET_CONF_INTR); | 2740 | VMXNET3_CMD_GET_CONF_INTR); |
2723 | cfg = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD); | 2741 | cfg = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD); |
2742 | spin_unlock(&adapter->cmd_lock); | ||
2724 | adapter->intr.type = cfg & 0x3; | 2743 | adapter->intr.type = cfg & 0x3; |
2725 | adapter->intr.mask_mode = (cfg >> 2) & 0x3; | 2744 | adapter->intr.mask_mode = (cfg >> 2) & 0x3; |
2726 | 2745 | ||
@@ -2755,7 +2774,7 @@ vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter) | |||
2755 | */ | 2774 | */ |
2756 | if (err == VMXNET3_LINUX_MIN_MSIX_VECT) { | 2775 | if (err == VMXNET3_LINUX_MIN_MSIX_VECT) { |
2757 | if (adapter->share_intr != VMXNET3_INTR_BUDDYSHARE | 2776 | if (adapter->share_intr != VMXNET3_INTR_BUDDYSHARE |
2758 | || adapter->num_rx_queues != 2) { | 2777 | || adapter->num_rx_queues != 1) { |
2759 | adapter->share_intr = VMXNET3_INTR_TXSHARE; | 2778 | adapter->share_intr = VMXNET3_INTR_TXSHARE; |
2760 | printk(KERN_ERR "Number of rx queues : 1\n"); | 2779 | printk(KERN_ERR "Number of rx queues : 1\n"); |
2761 | adapter->num_rx_queues = 1; | 2780 | adapter->num_rx_queues = 1; |
@@ -2905,6 +2924,7 @@ vmxnet3_probe_device(struct pci_dev *pdev, | |||
2905 | adapter->netdev = netdev; | 2924 | adapter->netdev = netdev; |
2906 | adapter->pdev = pdev; | 2925 | adapter->pdev = pdev; |
2907 | 2926 | ||
2927 | spin_lock_init(&adapter->cmd_lock); | ||
2908 | adapter->shared = pci_alloc_consistent(adapter->pdev, | 2928 | adapter->shared = pci_alloc_consistent(adapter->pdev, |
2909 | sizeof(struct Vmxnet3_DriverShared), | 2929 | sizeof(struct Vmxnet3_DriverShared), |
2910 | &adapter->shared_pa); | 2930 | &adapter->shared_pa); |
@@ -3108,11 +3128,15 @@ vmxnet3_suspend(struct device *device) | |||
3108 | u8 *arpreq; | 3128 | u8 *arpreq; |
3109 | struct in_device *in_dev; | 3129 | struct in_device *in_dev; |
3110 | struct in_ifaddr *ifa; | 3130 | struct in_ifaddr *ifa; |
3131 | unsigned long flags; | ||
3111 | int i = 0; | 3132 | int i = 0; |
3112 | 3133 | ||
3113 | if (!netif_running(netdev)) | 3134 | if (!netif_running(netdev)) |
3114 | return 0; | 3135 | return 0; |
3115 | 3136 | ||
3137 | for (i = 0; i < adapter->num_rx_queues; i++) | ||
3138 | napi_disable(&adapter->rx_queue[i].napi); | ||
3139 | |||
3116 | vmxnet3_disable_all_intrs(adapter); | 3140 | vmxnet3_disable_all_intrs(adapter); |
3117 | vmxnet3_free_irqs(adapter); | 3141 | vmxnet3_free_irqs(adapter); |
3118 | vmxnet3_free_intr_resources(adapter); | 3142 | vmxnet3_free_intr_resources(adapter); |
@@ -3188,8 +3212,10 @@ skip_arp: | |||
3188 | adapter->shared->devRead.pmConfDesc.confPA = cpu_to_le64(virt_to_phys( | 3212 | adapter->shared->devRead.pmConfDesc.confPA = cpu_to_le64(virt_to_phys( |
3189 | pmConf)); | 3213 | pmConf)); |
3190 | 3214 | ||
3215 | spin_lock_irqsave(&adapter->cmd_lock, flags); | ||
3191 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 3216 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
3192 | VMXNET3_CMD_UPDATE_PMCFG); | 3217 | VMXNET3_CMD_UPDATE_PMCFG); |
3218 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | ||
3193 | 3219 | ||
3194 | pci_save_state(pdev); | 3220 | pci_save_state(pdev); |
3195 | pci_enable_wake(pdev, pci_choose_state(pdev, PMSG_SUSPEND), | 3221 | pci_enable_wake(pdev, pci_choose_state(pdev, PMSG_SUSPEND), |
@@ -3204,7 +3230,8 @@ skip_arp: | |||
3204 | static int | 3230 | static int |
3205 | vmxnet3_resume(struct device *device) | 3231 | vmxnet3_resume(struct device *device) |
3206 | { | 3232 | { |
3207 | int err; | 3233 | int err, i = 0; |
3234 | unsigned long flags; | ||
3208 | struct pci_dev *pdev = to_pci_dev(device); | 3235 | struct pci_dev *pdev = to_pci_dev(device); |
3209 | struct net_device *netdev = pci_get_drvdata(pdev); | 3236 | struct net_device *netdev = pci_get_drvdata(pdev); |
3210 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); | 3237 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); |
@@ -3232,10 +3259,14 @@ vmxnet3_resume(struct device *device) | |||
3232 | 3259 | ||
3233 | pci_enable_wake(pdev, PCI_D0, 0); | 3260 | pci_enable_wake(pdev, PCI_D0, 0); |
3234 | 3261 | ||
3262 | spin_lock_irqsave(&adapter->cmd_lock, flags); | ||
3235 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 3263 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
3236 | VMXNET3_CMD_UPDATE_PMCFG); | 3264 | VMXNET3_CMD_UPDATE_PMCFG); |
3265 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | ||
3237 | vmxnet3_alloc_intr_resources(adapter); | 3266 | vmxnet3_alloc_intr_resources(adapter); |
3238 | vmxnet3_request_irqs(adapter); | 3267 | vmxnet3_request_irqs(adapter); |
3268 | for (i = 0; i < adapter->num_rx_queues; i++) | ||
3269 | napi_enable(&adapter->rx_queue[i].napi); | ||
3239 | vmxnet3_enable_all_intrs(adapter); | 3270 | vmxnet3_enable_all_intrs(adapter); |
3240 | 3271 | ||
3241 | return 0; | 3272 | return 0; |
diff --git a/drivers/net/vmxnet3/vmxnet3_ethtool.c b/drivers/net/vmxnet3/vmxnet3_ethtool.c index 8e17fc8a7fe7..81254be85b92 100644 --- a/drivers/net/vmxnet3/vmxnet3_ethtool.c +++ b/drivers/net/vmxnet3/vmxnet3_ethtool.c | |||
@@ -45,6 +45,7 @@ static int | |||
45 | vmxnet3_set_rx_csum(struct net_device *netdev, u32 val) | 45 | vmxnet3_set_rx_csum(struct net_device *netdev, u32 val) |
46 | { | 46 | { |
47 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); | 47 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); |
48 | unsigned long flags; | ||
48 | 49 | ||
49 | if (adapter->rxcsum != val) { | 50 | if (adapter->rxcsum != val) { |
50 | adapter->rxcsum = val; | 51 | adapter->rxcsum = val; |
@@ -56,8 +57,10 @@ vmxnet3_set_rx_csum(struct net_device *netdev, u32 val) | |||
56 | adapter->shared->devRead.misc.uptFeatures &= | 57 | adapter->shared->devRead.misc.uptFeatures &= |
57 | ~UPT1_F_RXCSUM; | 58 | ~UPT1_F_RXCSUM; |
58 | 59 | ||
60 | spin_lock_irqsave(&adapter->cmd_lock, flags); | ||
59 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 61 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
60 | VMXNET3_CMD_UPDATE_FEATURE); | 62 | VMXNET3_CMD_UPDATE_FEATURE); |
63 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | ||
61 | } | 64 | } |
62 | } | 65 | } |
63 | return 0; | 66 | return 0; |
@@ -68,76 +71,78 @@ vmxnet3_set_rx_csum(struct net_device *netdev, u32 val) | |||
68 | static const struct vmxnet3_stat_desc | 71 | static const struct vmxnet3_stat_desc |
69 | vmxnet3_tq_dev_stats[] = { | 72 | vmxnet3_tq_dev_stats[] = { |
70 | /* description, offset */ | 73 | /* description, offset */ |
71 | { "TSO pkts tx", offsetof(struct UPT1_TxStats, TSOPktsTxOK) }, | 74 | { "Tx Queue#", 0 }, |
72 | { "TSO bytes tx", offsetof(struct UPT1_TxStats, TSOBytesTxOK) }, | 75 | { " TSO pkts tx", offsetof(struct UPT1_TxStats, TSOPktsTxOK) }, |
73 | { "ucast pkts tx", offsetof(struct UPT1_TxStats, ucastPktsTxOK) }, | 76 | { " TSO bytes tx", offsetof(struct UPT1_TxStats, TSOBytesTxOK) }, |
74 | { "ucast bytes tx", offsetof(struct UPT1_TxStats, ucastBytesTxOK) }, | 77 | { " ucast pkts tx", offsetof(struct UPT1_TxStats, ucastPktsTxOK) }, |
75 | { "mcast pkts tx", offsetof(struct UPT1_TxStats, mcastPktsTxOK) }, | 78 | { " ucast bytes tx", offsetof(struct UPT1_TxStats, ucastBytesTxOK) }, |
76 | { "mcast bytes tx", offsetof(struct UPT1_TxStats, mcastBytesTxOK) }, | 79 | { " mcast pkts tx", offsetof(struct UPT1_TxStats, mcastPktsTxOK) }, |
77 | { "bcast pkts tx", offsetof(struct UPT1_TxStats, bcastPktsTxOK) }, | 80 | { " mcast bytes tx", offsetof(struct UPT1_TxStats, mcastBytesTxOK) }, |
78 | { "bcast bytes tx", offsetof(struct UPT1_TxStats, bcastBytesTxOK) }, | 81 | { " bcast pkts tx", offsetof(struct UPT1_TxStats, bcastPktsTxOK) }, |
79 | { "pkts tx err", offsetof(struct UPT1_TxStats, pktsTxError) }, | 82 | { " bcast bytes tx", offsetof(struct UPT1_TxStats, bcastBytesTxOK) }, |
80 | { "pkts tx discard", offsetof(struct UPT1_TxStats, pktsTxDiscard) }, | 83 | { " pkts tx err", offsetof(struct UPT1_TxStats, pktsTxError) }, |
84 | { " pkts tx discard", offsetof(struct UPT1_TxStats, pktsTxDiscard) }, | ||
81 | }; | 85 | }; |
82 | 86 | ||
83 | /* per tq stats maintained by the driver */ | 87 | /* per tq stats maintained by the driver */ |
84 | static const struct vmxnet3_stat_desc | 88 | static const struct vmxnet3_stat_desc |
85 | vmxnet3_tq_driver_stats[] = { | 89 | vmxnet3_tq_driver_stats[] = { |
86 | /* description, offset */ | 90 | /* description, offset */ |
87 | {"drv dropped tx total", offsetof(struct vmxnet3_tq_driver_stats, | 91 | {" drv dropped tx total", offsetof(struct vmxnet3_tq_driver_stats, |
88 | drop_total) }, | 92 | drop_total) }, |
89 | { " too many frags", offsetof(struct vmxnet3_tq_driver_stats, | 93 | { " too many frags", offsetof(struct vmxnet3_tq_driver_stats, |
90 | drop_too_many_frags) }, | 94 | drop_too_many_frags) }, |
91 | { " giant hdr", offsetof(struct vmxnet3_tq_driver_stats, | 95 | { " giant hdr", offsetof(struct vmxnet3_tq_driver_stats, |
92 | drop_oversized_hdr) }, | 96 | drop_oversized_hdr) }, |
93 | { " hdr err", offsetof(struct vmxnet3_tq_driver_stats, | 97 | { " hdr err", offsetof(struct vmxnet3_tq_driver_stats, |
94 | drop_hdr_inspect_err) }, | 98 | drop_hdr_inspect_err) }, |
95 | { " tso", offsetof(struct vmxnet3_tq_driver_stats, | 99 | { " tso", offsetof(struct vmxnet3_tq_driver_stats, |
96 | drop_tso) }, | 100 | drop_tso) }, |
97 | { "ring full", offsetof(struct vmxnet3_tq_driver_stats, | 101 | { " ring full", offsetof(struct vmxnet3_tq_driver_stats, |
98 | tx_ring_full) }, | 102 | tx_ring_full) }, |
99 | { "pkts linearized", offsetof(struct vmxnet3_tq_driver_stats, | 103 | { " pkts linearized", offsetof(struct vmxnet3_tq_driver_stats, |
100 | linearized) }, | 104 | linearized) }, |
101 | { "hdr cloned", offsetof(struct vmxnet3_tq_driver_stats, | 105 | { " hdr cloned", offsetof(struct vmxnet3_tq_driver_stats, |
102 | copy_skb_header) }, | 106 | copy_skb_header) }, |
103 | { "giant hdr", offsetof(struct vmxnet3_tq_driver_stats, | 107 | { " giant hdr", offsetof(struct vmxnet3_tq_driver_stats, |
104 | oversized_hdr) }, | 108 | oversized_hdr) }, |
105 | }; | 109 | }; |
106 | 110 | ||
107 | /* per rq stats maintained by the device */ | 111 | /* per rq stats maintained by the device */ |
108 | static const struct vmxnet3_stat_desc | 112 | static const struct vmxnet3_stat_desc |
109 | vmxnet3_rq_dev_stats[] = { | 113 | vmxnet3_rq_dev_stats[] = { |
110 | { "LRO pkts rx", offsetof(struct UPT1_RxStats, LROPktsRxOK) }, | 114 | { "Rx Queue#", 0 }, |
111 | { "LRO byte rx", offsetof(struct UPT1_RxStats, LROBytesRxOK) }, | 115 | { " LRO pkts rx", offsetof(struct UPT1_RxStats, LROPktsRxOK) }, |
112 | { "ucast pkts rx", offsetof(struct UPT1_RxStats, ucastPktsRxOK) }, | 116 | { " LRO byte rx", offsetof(struct UPT1_RxStats, LROBytesRxOK) }, |
113 | { "ucast bytes rx", offsetof(struct UPT1_RxStats, ucastBytesRxOK) }, | 117 | { " ucast pkts rx", offsetof(struct UPT1_RxStats, ucastPktsRxOK) }, |
114 | { "mcast pkts rx", offsetof(struct UPT1_RxStats, mcastPktsRxOK) }, | 118 | { " ucast bytes rx", offsetof(struct UPT1_RxStats, ucastBytesRxOK) }, |
115 | { "mcast bytes rx", offsetof(struct UPT1_RxStats, mcastBytesRxOK) }, | 119 | { " mcast pkts rx", offsetof(struct UPT1_RxStats, mcastPktsRxOK) }, |
116 | { "bcast pkts rx", offsetof(struct UPT1_RxStats, bcastPktsRxOK) }, | 120 | { " mcast bytes rx", offsetof(struct UPT1_RxStats, mcastBytesRxOK) }, |
117 | { "bcast bytes rx", offsetof(struct UPT1_RxStats, bcastBytesRxOK) }, | 121 | { " bcast pkts rx", offsetof(struct UPT1_RxStats, bcastPktsRxOK) }, |
118 | { "pkts rx out of buf", offsetof(struct UPT1_RxStats, pktsRxOutOfBuf) }, | 122 | { " bcast bytes rx", offsetof(struct UPT1_RxStats, bcastBytesRxOK) }, |
119 | { "pkts rx err", offsetof(struct UPT1_RxStats, pktsRxError) }, | 123 | { " pkts rx OOB", offsetof(struct UPT1_RxStats, pktsRxOutOfBuf) }, |
124 | { " pkts rx err", offsetof(struct UPT1_RxStats, pktsRxError) }, | ||
120 | }; | 125 | }; |
121 | 126 | ||
122 | /* per rq stats maintained by the driver */ | 127 | /* per rq stats maintained by the driver */ |
123 | static const struct vmxnet3_stat_desc | 128 | static const struct vmxnet3_stat_desc |
124 | vmxnet3_rq_driver_stats[] = { | 129 | vmxnet3_rq_driver_stats[] = { |
125 | /* description, offset */ | 130 | /* description, offset */ |
126 | { "drv dropped rx total", offsetof(struct vmxnet3_rq_driver_stats, | 131 | { " drv dropped rx total", offsetof(struct vmxnet3_rq_driver_stats, |
127 | drop_total) }, | 132 | drop_total) }, |
128 | { " err", offsetof(struct vmxnet3_rq_driver_stats, | 133 | { " err", offsetof(struct vmxnet3_rq_driver_stats, |
129 | drop_err) }, | 134 | drop_err) }, |
130 | { " fcs", offsetof(struct vmxnet3_rq_driver_stats, | 135 | { " fcs", offsetof(struct vmxnet3_rq_driver_stats, |
131 | drop_fcs) }, | 136 | drop_fcs) }, |
132 | { "rx buf alloc fail", offsetof(struct vmxnet3_rq_driver_stats, | 137 | { " rx buf alloc fail", offsetof(struct vmxnet3_rq_driver_stats, |
133 | rx_buf_alloc_failure) }, | 138 | rx_buf_alloc_failure) }, |
134 | }; | 139 | }; |
135 | 140 | ||
136 | /* gloabl stats maintained by the driver */ | 141 | /* gloabl stats maintained by the driver */ |
137 | static const struct vmxnet3_stat_desc | 142 | static const struct vmxnet3_stat_desc |
138 | vmxnet3_global_stats[] = { | 143 | vmxnet3_global_stats[] = { |
139 | /* description, offset */ | 144 | /* description, offset */ |
140 | { "tx timeout count", offsetof(struct vmxnet3_adapter, | 145 | { "tx timeout count", offsetof(struct vmxnet3_adapter, |
141 | tx_timeout_count) } | 146 | tx_timeout_count) } |
142 | }; | 147 | }; |
143 | 148 | ||
@@ -151,12 +156,15 @@ vmxnet3_get_stats(struct net_device *netdev) | |||
151 | struct UPT1_TxStats *devTxStats; | 156 | struct UPT1_TxStats *devTxStats; |
152 | struct UPT1_RxStats *devRxStats; | 157 | struct UPT1_RxStats *devRxStats; |
153 | struct net_device_stats *net_stats = &netdev->stats; | 158 | struct net_device_stats *net_stats = &netdev->stats; |
159 | unsigned long flags; | ||
154 | int i; | 160 | int i; |
155 | 161 | ||
156 | adapter = netdev_priv(netdev); | 162 | adapter = netdev_priv(netdev); |
157 | 163 | ||
158 | /* Collect the dev stats into the shared area */ | 164 | /* Collect the dev stats into the shared area */ |
165 | spin_lock_irqsave(&adapter->cmd_lock, flags); | ||
159 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_STATS); | 166 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_STATS); |
167 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | ||
160 | 168 | ||
161 | memset(net_stats, 0, sizeof(*net_stats)); | 169 | memset(net_stats, 0, sizeof(*net_stats)); |
162 | for (i = 0; i < adapter->num_tx_queues; i++) { | 170 | for (i = 0; i < adapter->num_tx_queues; i++) { |
@@ -193,12 +201,15 @@ vmxnet3_get_stats(struct net_device *netdev) | |||
193 | static int | 201 | static int |
194 | vmxnet3_get_sset_count(struct net_device *netdev, int sset) | 202 | vmxnet3_get_sset_count(struct net_device *netdev, int sset) |
195 | { | 203 | { |
204 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); | ||
196 | switch (sset) { | 205 | switch (sset) { |
197 | case ETH_SS_STATS: | 206 | case ETH_SS_STATS: |
198 | return ARRAY_SIZE(vmxnet3_tq_dev_stats) + | 207 | return (ARRAY_SIZE(vmxnet3_tq_dev_stats) + |
199 | ARRAY_SIZE(vmxnet3_tq_driver_stats) + | 208 | ARRAY_SIZE(vmxnet3_tq_driver_stats)) * |
200 | ARRAY_SIZE(vmxnet3_rq_dev_stats) + | 209 | adapter->num_tx_queues + |
201 | ARRAY_SIZE(vmxnet3_rq_driver_stats) + | 210 | (ARRAY_SIZE(vmxnet3_rq_dev_stats) + |
211 | ARRAY_SIZE(vmxnet3_rq_driver_stats)) * | ||
212 | adapter->num_rx_queues + | ||
202 | ARRAY_SIZE(vmxnet3_global_stats); | 213 | ARRAY_SIZE(vmxnet3_global_stats); |
203 | default: | 214 | default: |
204 | return -EOPNOTSUPP; | 215 | return -EOPNOTSUPP; |
@@ -206,10 +217,16 @@ vmxnet3_get_sset_count(struct net_device *netdev, int sset) | |||
206 | } | 217 | } |
207 | 218 | ||
208 | 219 | ||
220 | /* Should be multiple of 4 */ | ||
221 | #define NUM_TX_REGS 8 | ||
222 | #define NUM_RX_REGS 12 | ||
223 | |||
209 | static int | 224 | static int |
210 | vmxnet3_get_regs_len(struct net_device *netdev) | 225 | vmxnet3_get_regs_len(struct net_device *netdev) |
211 | { | 226 | { |
212 | return 20 * sizeof(u32); | 227 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); |
228 | return (adapter->num_tx_queues * NUM_TX_REGS * sizeof(u32) + | ||
229 | adapter->num_rx_queues * NUM_RX_REGS * sizeof(u32)); | ||
213 | } | 230 | } |
214 | 231 | ||
215 | 232 | ||
@@ -240,29 +257,37 @@ vmxnet3_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo) | |||
240 | static void | 257 | static void |
241 | vmxnet3_get_strings(struct net_device *netdev, u32 stringset, u8 *buf) | 258 | vmxnet3_get_strings(struct net_device *netdev, u32 stringset, u8 *buf) |
242 | { | 259 | { |
260 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); | ||
243 | if (stringset == ETH_SS_STATS) { | 261 | if (stringset == ETH_SS_STATS) { |
244 | int i; | 262 | int i, j; |
245 | 263 | for (j = 0; j < adapter->num_tx_queues; j++) { | |
246 | for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_dev_stats); i++) { | 264 | for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_dev_stats); i++) { |
247 | memcpy(buf, vmxnet3_tq_dev_stats[i].desc, | 265 | memcpy(buf, vmxnet3_tq_dev_stats[i].desc, |
248 | ETH_GSTRING_LEN); | 266 | ETH_GSTRING_LEN); |
249 | buf += ETH_GSTRING_LEN; | 267 | buf += ETH_GSTRING_LEN; |
250 | } | 268 | } |
251 | for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_driver_stats); i++) { | 269 | for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_driver_stats); |
252 | memcpy(buf, vmxnet3_tq_driver_stats[i].desc, | 270 | i++) { |
253 | ETH_GSTRING_LEN); | 271 | memcpy(buf, vmxnet3_tq_driver_stats[i].desc, |
254 | buf += ETH_GSTRING_LEN; | 272 | ETH_GSTRING_LEN); |
255 | } | 273 | buf += ETH_GSTRING_LEN; |
256 | for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_dev_stats); i++) { | 274 | } |
257 | memcpy(buf, vmxnet3_rq_dev_stats[i].desc, | ||
258 | ETH_GSTRING_LEN); | ||
259 | buf += ETH_GSTRING_LEN; | ||
260 | } | 275 | } |
261 | for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_driver_stats); i++) { | 276 | |
262 | memcpy(buf, vmxnet3_rq_driver_stats[i].desc, | 277 | for (j = 0; j < adapter->num_rx_queues; j++) { |
263 | ETH_GSTRING_LEN); | 278 | for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_dev_stats); i++) { |
264 | buf += ETH_GSTRING_LEN; | 279 | memcpy(buf, vmxnet3_rq_dev_stats[i].desc, |
280 | ETH_GSTRING_LEN); | ||
281 | buf += ETH_GSTRING_LEN; | ||
282 | } | ||
283 | for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_driver_stats); | ||
284 | i++) { | ||
285 | memcpy(buf, vmxnet3_rq_driver_stats[i].desc, | ||
286 | ETH_GSTRING_LEN); | ||
287 | buf += ETH_GSTRING_LEN; | ||
288 | } | ||
265 | } | 289 | } |
290 | |||
266 | for (i = 0; i < ARRAY_SIZE(vmxnet3_global_stats); i++) { | 291 | for (i = 0; i < ARRAY_SIZE(vmxnet3_global_stats); i++) { |
267 | memcpy(buf, vmxnet3_global_stats[i].desc, | 292 | memcpy(buf, vmxnet3_global_stats[i].desc, |
268 | ETH_GSTRING_LEN); | 293 | ETH_GSTRING_LEN); |
@@ -277,6 +302,7 @@ vmxnet3_set_flags(struct net_device *netdev, u32 data) | |||
277 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); | 302 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); |
278 | u8 lro_requested = (data & ETH_FLAG_LRO) == 0 ? 0 : 1; | 303 | u8 lro_requested = (data & ETH_FLAG_LRO) == 0 ? 0 : 1; |
279 | u8 lro_present = (netdev->features & NETIF_F_LRO) == 0 ? 0 : 1; | 304 | u8 lro_present = (netdev->features & NETIF_F_LRO) == 0 ? 0 : 1; |
305 | unsigned long flags; | ||
280 | 306 | ||
281 | if (data & ~ETH_FLAG_LRO) | 307 | if (data & ~ETH_FLAG_LRO) |
282 | return -EOPNOTSUPP; | 308 | return -EOPNOTSUPP; |
@@ -292,8 +318,10 @@ vmxnet3_set_flags(struct net_device *netdev, u32 data) | |||
292 | else | 318 | else |
293 | adapter->shared->devRead.misc.uptFeatures &= | 319 | adapter->shared->devRead.misc.uptFeatures &= |
294 | ~UPT1_F_LRO; | 320 | ~UPT1_F_LRO; |
321 | spin_lock_irqsave(&adapter->cmd_lock, flags); | ||
295 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 322 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
296 | VMXNET3_CMD_UPDATE_FEATURE); | 323 | VMXNET3_CMD_UPDATE_FEATURE); |
324 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | ||
297 | } | 325 | } |
298 | return 0; | 326 | return 0; |
299 | } | 327 | } |
@@ -303,30 +331,41 @@ vmxnet3_get_ethtool_stats(struct net_device *netdev, | |||
303 | struct ethtool_stats *stats, u64 *buf) | 331 | struct ethtool_stats *stats, u64 *buf) |
304 | { | 332 | { |
305 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); | 333 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); |
334 | unsigned long flags; | ||
306 | u8 *base; | 335 | u8 *base; |
307 | int i; | 336 | int i; |
308 | int j = 0; | 337 | int j = 0; |
309 | 338 | ||
339 | spin_lock_irqsave(&adapter->cmd_lock, flags); | ||
310 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_STATS); | 340 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_STATS); |
341 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | ||
311 | 342 | ||
312 | /* this does assume each counter is 64-bit wide */ | 343 | /* this does assume each counter is 64-bit wide */ |
313 | /* TODO change this for multiple queues */ | 344 | for (j = 0; j < adapter->num_tx_queues; j++) { |
314 | 345 | base = (u8 *)&adapter->tqd_start[j].stats; | |
315 | base = (u8 *)&adapter->tqd_start[j].stats; | 346 | *buf++ = (u64)j; |
316 | for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_dev_stats); i++) | 347 | for (i = 1; i < ARRAY_SIZE(vmxnet3_tq_dev_stats); i++) |
317 | *buf++ = *(u64 *)(base + vmxnet3_tq_dev_stats[i].offset); | 348 | *buf++ = *(u64 *)(base + |
318 | 349 | vmxnet3_tq_dev_stats[i].offset); | |
319 | base = (u8 *)&adapter->tx_queue[j].stats; | 350 | |
320 | for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_driver_stats); i++) | 351 | base = (u8 *)&adapter->tx_queue[j].stats; |
321 | *buf++ = *(u64 *)(base + vmxnet3_tq_driver_stats[i].offset); | 352 | for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_driver_stats); i++) |
322 | 353 | *buf++ = *(u64 *)(base + | |
323 | base = (u8 *)&adapter->rqd_start[j].stats; | 354 | vmxnet3_tq_driver_stats[i].offset); |
324 | for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_dev_stats); i++) | 355 | } |
325 | *buf++ = *(u64 *)(base + vmxnet3_rq_dev_stats[i].offset); | ||
326 | 356 | ||
327 | base = (u8 *)&adapter->rx_queue[j].stats; | 357 | for (j = 0; j < adapter->num_tx_queues; j++) { |
328 | for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_driver_stats); i++) | 358 | base = (u8 *)&adapter->rqd_start[j].stats; |
329 | *buf++ = *(u64 *)(base + vmxnet3_rq_driver_stats[i].offset); | 359 | *buf++ = (u64) j; |
360 | for (i = 1; i < ARRAY_SIZE(vmxnet3_rq_dev_stats); i++) | ||
361 | *buf++ = *(u64 *)(base + | ||
362 | vmxnet3_rq_dev_stats[i].offset); | ||
363 | |||
364 | base = (u8 *)&adapter->rx_queue[j].stats; | ||
365 | for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_driver_stats); i++) | ||
366 | *buf++ = *(u64 *)(base + | ||
367 | vmxnet3_rq_driver_stats[i].offset); | ||
368 | } | ||
330 | 369 | ||
331 | base = (u8 *)adapter; | 370 | base = (u8 *)adapter; |
332 | for (i = 0; i < ARRAY_SIZE(vmxnet3_global_stats); i++) | 371 | for (i = 0; i < ARRAY_SIZE(vmxnet3_global_stats); i++) |
@@ -339,7 +378,7 @@ vmxnet3_get_regs(struct net_device *netdev, struct ethtool_regs *regs, void *p) | |||
339 | { | 378 | { |
340 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); | 379 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); |
341 | u32 *buf = p; | 380 | u32 *buf = p; |
342 | int i = 0; | 381 | int i = 0, j = 0; |
343 | 382 | ||
344 | memset(p, 0, vmxnet3_get_regs_len(netdev)); | 383 | memset(p, 0, vmxnet3_get_regs_len(netdev)); |
345 | 384 | ||
@@ -348,31 +387,35 @@ vmxnet3_get_regs(struct net_device *netdev, struct ethtool_regs *regs, void *p) | |||
348 | /* Update vmxnet3_get_regs_len if we want to dump more registers */ | 387 | /* Update vmxnet3_get_regs_len if we want to dump more registers */ |
349 | 388 | ||
350 | /* make each ring use multiple of 16 bytes */ | 389 | /* make each ring use multiple of 16 bytes */ |
351 | /* TODO change this for multiple queues */ | 390 | for (i = 0; i < adapter->num_tx_queues; i++) { |
352 | buf[0] = adapter->tx_queue[i].tx_ring.next2fill; | 391 | buf[j++] = adapter->tx_queue[i].tx_ring.next2fill; |
353 | buf[1] = adapter->tx_queue[i].tx_ring.next2comp; | 392 | buf[j++] = adapter->tx_queue[i].tx_ring.next2comp; |
354 | buf[2] = adapter->tx_queue[i].tx_ring.gen; | 393 | buf[j++] = adapter->tx_queue[i].tx_ring.gen; |
355 | buf[3] = 0; | 394 | buf[j++] = 0; |
356 | 395 | ||
357 | buf[4] = adapter->tx_queue[i].comp_ring.next2proc; | 396 | buf[j++] = adapter->tx_queue[i].comp_ring.next2proc; |
358 | buf[5] = adapter->tx_queue[i].comp_ring.gen; | 397 | buf[j++] = adapter->tx_queue[i].comp_ring.gen; |
359 | buf[6] = adapter->tx_queue[i].stopped; | 398 | buf[j++] = adapter->tx_queue[i].stopped; |
360 | buf[7] = 0; | 399 | buf[j++] = 0; |
361 | 400 | } | |
362 | buf[8] = adapter->rx_queue[i].rx_ring[0].next2fill; | 401 | |
363 | buf[9] = adapter->rx_queue[i].rx_ring[0].next2comp; | 402 | for (i = 0; i < adapter->num_rx_queues; i++) { |
364 | buf[10] = adapter->rx_queue[i].rx_ring[0].gen; | 403 | buf[j++] = adapter->rx_queue[i].rx_ring[0].next2fill; |
365 | buf[11] = 0; | 404 | buf[j++] = adapter->rx_queue[i].rx_ring[0].next2comp; |
366 | 405 | buf[j++] = adapter->rx_queue[i].rx_ring[0].gen; | |
367 | buf[12] = adapter->rx_queue[i].rx_ring[1].next2fill; | 406 | buf[j++] = 0; |
368 | buf[13] = adapter->rx_queue[i].rx_ring[1].next2comp; | 407 | |
369 | buf[14] = adapter->rx_queue[i].rx_ring[1].gen; | 408 | buf[j++] = adapter->rx_queue[i].rx_ring[1].next2fill; |
370 | buf[15] = 0; | 409 | buf[j++] = adapter->rx_queue[i].rx_ring[1].next2comp; |
371 | 410 | buf[j++] = adapter->rx_queue[i].rx_ring[1].gen; | |
372 | buf[16] = adapter->rx_queue[i].comp_ring.next2proc; | 411 | buf[j++] = 0; |
373 | buf[17] = adapter->rx_queue[i].comp_ring.gen; | 412 | |
374 | buf[18] = 0; | 413 | buf[j++] = adapter->rx_queue[i].comp_ring.next2proc; |
375 | buf[19] = 0; | 414 | buf[j++] = adapter->rx_queue[i].comp_ring.gen; |
415 | buf[j++] = 0; | ||
416 | buf[j++] = 0; | ||
417 | } | ||
418 | |||
376 | } | 419 | } |
377 | 420 | ||
378 | 421 | ||
@@ -574,6 +617,7 @@ vmxnet3_set_rss_indir(struct net_device *netdev, | |||
574 | const struct ethtool_rxfh_indir *p) | 617 | const struct ethtool_rxfh_indir *p) |
575 | { | 618 | { |
576 | unsigned int i; | 619 | unsigned int i; |
620 | unsigned long flags; | ||
577 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); | 621 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); |
578 | struct UPT1_RSSConf *rssConf = adapter->rss_conf; | 622 | struct UPT1_RSSConf *rssConf = adapter->rss_conf; |
579 | 623 | ||
@@ -592,8 +636,10 @@ vmxnet3_set_rss_indir(struct net_device *netdev, | |||
592 | for (i = 0; i < rssConf->indTableSize; i++) | 636 | for (i = 0; i < rssConf->indTableSize; i++) |
593 | rssConf->indTable[i] = p->ring_index[i]; | 637 | rssConf->indTable[i] = p->ring_index[i]; |
594 | 638 | ||
639 | spin_lock_irqsave(&adapter->cmd_lock, flags); | ||
595 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 640 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
596 | VMXNET3_CMD_UPDATE_RSSIDT); | 641 | VMXNET3_CMD_UPDATE_RSSIDT); |
642 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | ||
597 | 643 | ||
598 | return 0; | 644 | return 0; |
599 | 645 | ||
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h index 7fadeed37f03..fb5d245ac878 100644 --- a/drivers/net/vmxnet3/vmxnet3_int.h +++ b/drivers/net/vmxnet3/vmxnet3_int.h | |||
@@ -68,10 +68,10 @@ | |||
68 | /* | 68 | /* |
69 | * Version numbers | 69 | * Version numbers |
70 | */ | 70 | */ |
71 | #define VMXNET3_DRIVER_VERSION_STRING "1.0.16.0-k" | 71 | #define VMXNET3_DRIVER_VERSION_STRING "1.0.25.0-k" |
72 | 72 | ||
73 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ | 73 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ |
74 | #define VMXNET3_DRIVER_VERSION_NUM 0x01001000 | 74 | #define VMXNET3_DRIVER_VERSION_NUM 0x01001900 |
75 | 75 | ||
76 | #if defined(CONFIG_PCI_MSI) | 76 | #if defined(CONFIG_PCI_MSI) |
77 | /* RSS only makes sense if MSI-X is supported. */ | 77 | /* RSS only makes sense if MSI-X is supported. */ |
@@ -289,7 +289,7 @@ struct vmxnet3_rx_queue { | |||
289 | 289 | ||
290 | #define VMXNET3_LINUX_MAX_MSIX_VECT (VMXNET3_DEVICE_MAX_TX_QUEUES + \ | 290 | #define VMXNET3_LINUX_MAX_MSIX_VECT (VMXNET3_DEVICE_MAX_TX_QUEUES + \ |
291 | VMXNET3_DEVICE_MAX_RX_QUEUES + 1) | 291 | VMXNET3_DEVICE_MAX_RX_QUEUES + 1) |
292 | #define VMXNET3_LINUX_MIN_MSIX_VECT 3 /* 1 for each : tx, rx and event */ | 292 | #define VMXNET3_LINUX_MIN_MSIX_VECT 2 /* 1 for tx-rx pair and 1 for event */ |
293 | 293 | ||
294 | 294 | ||
295 | struct vmxnet3_intr { | 295 | struct vmxnet3_intr { |
@@ -317,6 +317,7 @@ struct vmxnet3_adapter { | |||
317 | struct vmxnet3_rx_queue rx_queue[VMXNET3_DEVICE_MAX_RX_QUEUES]; | 317 | struct vmxnet3_rx_queue rx_queue[VMXNET3_DEVICE_MAX_RX_QUEUES]; |
318 | struct vlan_group *vlan_grp; | 318 | struct vlan_group *vlan_grp; |
319 | struct vmxnet3_intr intr; | 319 | struct vmxnet3_intr intr; |
320 | spinlock_t cmd_lock; | ||
320 | struct Vmxnet3_DriverShared *shared; | 321 | struct Vmxnet3_DriverShared *shared; |
321 | struct Vmxnet3_PMConf *pm_conf; | 322 | struct Vmxnet3_PMConf *pm_conf; |
322 | struct Vmxnet3_TxQueueDesc *tqd_start; /* all tx queue desc */ | 323 | struct Vmxnet3_TxQueueDesc *tqd_start; /* all tx queue desc */ |
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index 019a74d533a6..09ae4ef0fd51 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c | |||
@@ -2294,6 +2294,8 @@ ath5k_tx_complete_poll_work(struct work_struct *work) | |||
2294 | int i; | 2294 | int i; |
2295 | bool needreset = false; | 2295 | bool needreset = false; |
2296 | 2296 | ||
2297 | mutex_lock(&sc->lock); | ||
2298 | |||
2297 | for (i = 0; i < ARRAY_SIZE(sc->txqs); i++) { | 2299 | for (i = 0; i < ARRAY_SIZE(sc->txqs); i++) { |
2298 | if (sc->txqs[i].setup) { | 2300 | if (sc->txqs[i].setup) { |
2299 | txq = &sc->txqs[i]; | 2301 | txq = &sc->txqs[i]; |
@@ -2321,6 +2323,8 @@ ath5k_tx_complete_poll_work(struct work_struct *work) | |||
2321 | ath5k_reset(sc, NULL, true); | 2323 | ath5k_reset(sc, NULL, true); |
2322 | } | 2324 | } |
2323 | 2325 | ||
2326 | mutex_unlock(&sc->lock); | ||
2327 | |||
2324 | ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, | 2328 | ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, |
2325 | msecs_to_jiffies(ATH5K_TX_COMPLETE_POLL_INT)); | 2329 | msecs_to_jiffies(ATH5K_TX_COMPLETE_POLL_INT)); |
2326 | } | 2330 | } |
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_calib.c b/drivers/net/wireless/ath/ath9k/ar9002_calib.c index ea2e7d714bda..5e300bd3d264 100644 --- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c +++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c | |||
@@ -679,10 +679,6 @@ static bool ar9002_hw_calibrate(struct ath_hw *ah, | |||
679 | 679 | ||
680 | /* Do NF cal only at longer intervals */ | 680 | /* Do NF cal only at longer intervals */ |
681 | if (longcal || nfcal_pending) { | 681 | if (longcal || nfcal_pending) { |
682 | /* Do periodic PAOffset Cal */ | ||
683 | ar9002_hw_pa_cal(ah, false); | ||
684 | ar9002_hw_olc_temp_compensation(ah); | ||
685 | |||
686 | /* | 682 | /* |
687 | * Get the value from the previous NF cal and update | 683 | * Get the value from the previous NF cal and update |
688 | * history buffer. | 684 | * history buffer. |
@@ -697,8 +693,12 @@ static bool ar9002_hw_calibrate(struct ath_hw *ah, | |||
697 | ath9k_hw_loadnf(ah, ah->curchan); | 693 | ath9k_hw_loadnf(ah, ah->curchan); |
698 | } | 694 | } |
699 | 695 | ||
700 | if (longcal) | 696 | if (longcal) { |
701 | ath9k_hw_start_nfcal(ah, false); | 697 | ath9k_hw_start_nfcal(ah, false); |
698 | /* Do periodic PAOffset Cal */ | ||
699 | ar9002_hw_pa_cal(ah, false); | ||
700 | ar9002_hw_olc_temp_compensation(ah); | ||
701 | } | ||
702 | } | 702 | } |
703 | 703 | ||
704 | return iscaldone; | 704 | return iscaldone; |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h index 81f9cf294dec..9ecca93392e8 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h | |||
@@ -1842,7 +1842,7 @@ static const u32 ar9300_2p2_soc_preamble[][2] = { | |||
1842 | 1842 | ||
1843 | static const u32 ar9300PciePhy_pll_on_clkreq_disable_L1_2p2[][2] = { | 1843 | static const u32 ar9300PciePhy_pll_on_clkreq_disable_L1_2p2[][2] = { |
1844 | /* Addr allmodes */ | 1844 | /* Addr allmodes */ |
1845 | {0x00004040, 0x08212e5e}, | 1845 | {0x00004040, 0x0821265e}, |
1846 | {0x00004040, 0x0008003b}, | 1846 | {0x00004040, 0x0008003b}, |
1847 | {0x00004044, 0x00000000}, | 1847 | {0x00004044, 0x00000000}, |
1848 | }; | 1848 | }; |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c index 6137634e46ca..06fb2c850535 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c | |||
@@ -146,8 +146,8 @@ static void ar9003_hw_init_mode_regs(struct ath_hw *ah) | |||
146 | /* Sleep Setting */ | 146 | /* Sleep Setting */ |
147 | 147 | ||
148 | INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, | 148 | INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, |
149 | ar9300PciePhy_clkreq_enable_L1_2p2, | 149 | ar9300PciePhy_pll_on_clkreq_disable_L1_2p2, |
150 | ARRAY_SIZE(ar9300PciePhy_clkreq_enable_L1_2p2), | 150 | ARRAY_SIZE(ar9300PciePhy_pll_on_clkreq_disable_L1_2p2), |
151 | 2); | 151 | 2); |
152 | 152 | ||
153 | /* Fast clock modal settings */ | 153 | /* Fast clock modal settings */ |
diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h index 1ce506f23110..780ac5eac501 100644 --- a/drivers/net/wireless/ath/ath9k/htc.h +++ b/drivers/net/wireless/ath/ath9k/htc.h | |||
@@ -78,7 +78,7 @@ struct tx_frame_hdr { | |||
78 | u8 node_idx; | 78 | u8 node_idx; |
79 | u8 vif_idx; | 79 | u8 vif_idx; |
80 | u8 tidno; | 80 | u8 tidno; |
81 | u32 flags; /* ATH9K_HTC_TX_* */ | 81 | __be32 flags; /* ATH9K_HTC_TX_* */ |
82 | u8 key_type; | 82 | u8 key_type; |
83 | u8 keyix; | 83 | u8 keyix; |
84 | u8 reserved[26]; | 84 | u8 reserved[26]; |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c index 33f36029fa4f..7a5ffca21958 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | |||
@@ -113,6 +113,7 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, struct sk_buff *skb) | |||
113 | 113 | ||
114 | if (ieee80211_is_data(fc)) { | 114 | if (ieee80211_is_data(fc)) { |
115 | struct tx_frame_hdr tx_hdr; | 115 | struct tx_frame_hdr tx_hdr; |
116 | u32 flags = 0; | ||
116 | u8 *qc; | 117 | u8 *qc; |
117 | 118 | ||
118 | memset(&tx_hdr, 0, sizeof(struct tx_frame_hdr)); | 119 | memset(&tx_hdr, 0, sizeof(struct tx_frame_hdr)); |
@@ -136,13 +137,14 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, struct sk_buff *skb) | |||
136 | /* Check for RTS protection */ | 137 | /* Check for RTS protection */ |
137 | if (priv->hw->wiphy->rts_threshold != (u32) -1) | 138 | if (priv->hw->wiphy->rts_threshold != (u32) -1) |
138 | if (skb->len > priv->hw->wiphy->rts_threshold) | 139 | if (skb->len > priv->hw->wiphy->rts_threshold) |
139 | tx_hdr.flags |= ATH9K_HTC_TX_RTSCTS; | 140 | flags |= ATH9K_HTC_TX_RTSCTS; |
140 | 141 | ||
141 | /* CTS-to-self */ | 142 | /* CTS-to-self */ |
142 | if (!(tx_hdr.flags & ATH9K_HTC_TX_RTSCTS) && | 143 | if (!(flags & ATH9K_HTC_TX_RTSCTS) && |
143 | (priv->op_flags & OP_PROTECT_ENABLE)) | 144 | (priv->op_flags & OP_PROTECT_ENABLE)) |
144 | tx_hdr.flags |= ATH9K_HTC_TX_CTSONLY; | 145 | flags |= ATH9K_HTC_TX_CTSONLY; |
145 | 146 | ||
147 | tx_hdr.flags = cpu_to_be32(flags); | ||
146 | tx_hdr.key_type = ath9k_cmn_get_hw_crypto_keytype(skb); | 148 | tx_hdr.key_type = ath9k_cmn_get_hw_crypto_keytype(skb); |
147 | if (tx_hdr.key_type == ATH9K_KEY_TYPE_CLEAR) | 149 | if (tx_hdr.key_type == ATH9K_KEY_TYPE_CLEAR) |
148 | tx_hdr.keyix = (u8) ATH9K_TXKEYIX_INVALID; | 150 | tx_hdr.keyix = (u8) ATH9K_TXKEYIX_INVALID; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c b/drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c index 97906dd442e6..14ceb4df72f6 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c | |||
@@ -168,7 +168,7 @@ int iwl_eeprom_check_sku(struct iwl_priv *priv) | |||
168 | /* not using .cfg overwrite */ | 168 | /* not using .cfg overwrite */ |
169 | radio_cfg = iwl_eeprom_query16(priv, EEPROM_RADIO_CONFIG); | 169 | radio_cfg = iwl_eeprom_query16(priv, EEPROM_RADIO_CONFIG); |
170 | priv->cfg->valid_tx_ant = EEPROM_RF_CFG_TX_ANT_MSK(radio_cfg); | 170 | priv->cfg->valid_tx_ant = EEPROM_RF_CFG_TX_ANT_MSK(radio_cfg); |
171 | priv->cfg->valid_rx_ant = EEPROM_RF_CFG_TX_ANT_MSK(radio_cfg); | 171 | priv->cfg->valid_rx_ant = EEPROM_RF_CFG_RX_ANT_MSK(radio_cfg); |
172 | if (!priv->cfg->valid_tx_ant || !priv->cfg->valid_rx_ant) { | 172 | if (!priv->cfg->valid_tx_ant || !priv->cfg->valid_rx_ant) { |
173 | IWL_ERR(priv, "Invalid chain (0X%x, 0X%x)\n", | 173 | IWL_ERR(priv, "Invalid chain (0X%x, 0X%x)\n", |
174 | priv->cfg->valid_tx_ant, | 174 | priv->cfg->valid_tx_ant, |
diff --git a/drivers/net/wireless/iwmc3200wifi/netdev.c b/drivers/net/wireless/iwmc3200wifi/netdev.c index 13a69ebf2a94..5091d77e02ce 100644 --- a/drivers/net/wireless/iwmc3200wifi/netdev.c +++ b/drivers/net/wireless/iwmc3200wifi/netdev.c | |||
@@ -126,6 +126,7 @@ void *iwm_if_alloc(int sizeof_bus, struct device *dev, | |||
126 | ndev = alloc_netdev_mq(0, "wlan%d", ether_setup, IWM_TX_QUEUES); | 126 | ndev = alloc_netdev_mq(0, "wlan%d", ether_setup, IWM_TX_QUEUES); |
127 | if (!ndev) { | 127 | if (!ndev) { |
128 | dev_err(dev, "no memory for network device instance\n"); | 128 | dev_err(dev, "no memory for network device instance\n"); |
129 | ret = -ENOMEM; | ||
129 | goto out_priv; | 130 | goto out_priv; |
130 | } | 131 | } |
131 | 132 | ||
@@ -138,6 +139,7 @@ void *iwm_if_alloc(int sizeof_bus, struct device *dev, | |||
138 | GFP_KERNEL); | 139 | GFP_KERNEL); |
139 | if (!iwm->umac_profile) { | 140 | if (!iwm->umac_profile) { |
140 | dev_err(dev, "Couldn't alloc memory for profile\n"); | 141 | dev_err(dev, "Couldn't alloc memory for profile\n"); |
142 | ret = -ENOMEM; | ||
141 | goto out_profile; | 143 | goto out_profile; |
142 | } | 144 | } |
143 | 145 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00firmware.c b/drivers/net/wireless/rt2x00/rt2x00firmware.c index f0e1eb72befc..be0ff78c1b16 100644 --- a/drivers/net/wireless/rt2x00/rt2x00firmware.c +++ b/drivers/net/wireless/rt2x00/rt2x00firmware.c | |||
@@ -58,6 +58,7 @@ static int rt2x00lib_request_firmware(struct rt2x00_dev *rt2x00dev) | |||
58 | 58 | ||
59 | if (!fw || !fw->size || !fw->data) { | 59 | if (!fw || !fw->size || !fw->data) { |
60 | ERROR(rt2x00dev, "Failed to read Firmware.\n"); | 60 | ERROR(rt2x00dev, "Failed to read Firmware.\n"); |
61 | release_firmware(fw); | ||
61 | return -ENOENT; | 62 | return -ENOENT; |
62 | } | 63 | } |
63 | 64 | ||
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c index 7a7a1b664781..2ac8f6aff5a4 100644 --- a/drivers/s390/net/qeth_l2_main.c +++ b/drivers/s390/net/qeth_l2_main.c | |||
@@ -831,12 +831,14 @@ tx_drop: | |||
831 | return NETDEV_TX_OK; | 831 | return NETDEV_TX_OK; |
832 | } | 832 | } |
833 | 833 | ||
834 | static int qeth_l2_open(struct net_device *dev) | 834 | static int __qeth_l2_open(struct net_device *dev) |
835 | { | 835 | { |
836 | struct qeth_card *card = dev->ml_priv; | 836 | struct qeth_card *card = dev->ml_priv; |
837 | int rc = 0; | 837 | int rc = 0; |
838 | 838 | ||
839 | QETH_CARD_TEXT(card, 4, "qethopen"); | 839 | QETH_CARD_TEXT(card, 4, "qethopen"); |
840 | if (card->state == CARD_STATE_UP) | ||
841 | return rc; | ||
840 | if (card->state != CARD_STATE_SOFTSETUP) | 842 | if (card->state != CARD_STATE_SOFTSETUP) |
841 | return -ENODEV; | 843 | return -ENODEV; |
842 | 844 | ||
@@ -857,6 +859,18 @@ static int qeth_l2_open(struct net_device *dev) | |||
857 | return rc; | 859 | return rc; |
858 | } | 860 | } |
859 | 861 | ||
862 | static int qeth_l2_open(struct net_device *dev) | ||
863 | { | ||
864 | struct qeth_card *card = dev->ml_priv; | ||
865 | |||
866 | QETH_CARD_TEXT(card, 5, "qethope_"); | ||
867 | if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { | ||
868 | QETH_CARD_TEXT(card, 3, "openREC"); | ||
869 | return -ERESTARTSYS; | ||
870 | } | ||
871 | return __qeth_l2_open(dev); | ||
872 | } | ||
873 | |||
860 | static int qeth_l2_stop(struct net_device *dev) | 874 | static int qeth_l2_stop(struct net_device *dev) |
861 | { | 875 | { |
862 | struct qeth_card *card = dev->ml_priv; | 876 | struct qeth_card *card = dev->ml_priv; |
@@ -1046,7 +1060,7 @@ contin: | |||
1046 | if (recover_flag == CARD_STATE_RECOVER) { | 1060 | if (recover_flag == CARD_STATE_RECOVER) { |
1047 | if (recovery_mode && | 1061 | if (recovery_mode && |
1048 | card->info.type != QETH_CARD_TYPE_OSN) { | 1062 | card->info.type != QETH_CARD_TYPE_OSN) { |
1049 | qeth_l2_open(card->dev); | 1063 | __qeth_l2_open(card->dev); |
1050 | } else { | 1064 | } else { |
1051 | rtnl_lock(); | 1065 | rtnl_lock(); |
1052 | dev_open(card->dev); | 1066 | dev_open(card->dev); |
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c index e227e465bfc4..d09b0c44fc3d 100644 --- a/drivers/s390/net/qeth_l3_main.c +++ b/drivers/s390/net/qeth_l3_main.c | |||
@@ -2998,7 +2998,9 @@ static inline void qeth_l3_hdr_csum(struct qeth_card *card, | |||
2998 | */ | 2998 | */ |
2999 | if (iph->protocol == IPPROTO_UDP) | 2999 | if (iph->protocol == IPPROTO_UDP) |
3000 | hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_UDP; | 3000 | hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_UDP; |
3001 | hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ; | 3001 | hdr->hdr.l3.ext_flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ | |
3002 | QETH_HDR_EXT_CSUM_HDR_REQ; | ||
3003 | iph->check = 0; | ||
3002 | if (card->options.performance_stats) | 3004 | if (card->options.performance_stats) |
3003 | card->perf_stats.tx_csum++; | 3005 | card->perf_stats.tx_csum++; |
3004 | } | 3006 | } |
@@ -3240,12 +3242,14 @@ tx_drop: | |||
3240 | return NETDEV_TX_OK; | 3242 | return NETDEV_TX_OK; |
3241 | } | 3243 | } |
3242 | 3244 | ||
3243 | static int qeth_l3_open(struct net_device *dev) | 3245 | static int __qeth_l3_open(struct net_device *dev) |
3244 | { | 3246 | { |
3245 | struct qeth_card *card = dev->ml_priv; | 3247 | struct qeth_card *card = dev->ml_priv; |
3246 | int rc = 0; | 3248 | int rc = 0; |
3247 | 3249 | ||
3248 | QETH_CARD_TEXT(card, 4, "qethopen"); | 3250 | QETH_CARD_TEXT(card, 4, "qethopen"); |
3251 | if (card->state == CARD_STATE_UP) | ||
3252 | return rc; | ||
3249 | if (card->state != CARD_STATE_SOFTSETUP) | 3253 | if (card->state != CARD_STATE_SOFTSETUP) |
3250 | return -ENODEV; | 3254 | return -ENODEV; |
3251 | card->data.state = CH_STATE_UP; | 3255 | card->data.state = CH_STATE_UP; |
@@ -3260,6 +3264,18 @@ static int qeth_l3_open(struct net_device *dev) | |||
3260 | return rc; | 3264 | return rc; |
3261 | } | 3265 | } |
3262 | 3266 | ||
3267 | static int qeth_l3_open(struct net_device *dev) | ||
3268 | { | ||
3269 | struct qeth_card *card = dev->ml_priv; | ||
3270 | |||
3271 | QETH_CARD_TEXT(card, 5, "qethope_"); | ||
3272 | if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { | ||
3273 | QETH_CARD_TEXT(card, 3, "openREC"); | ||
3274 | return -ERESTARTSYS; | ||
3275 | } | ||
3276 | return __qeth_l3_open(dev); | ||
3277 | } | ||
3278 | |||
3263 | static int qeth_l3_stop(struct net_device *dev) | 3279 | static int qeth_l3_stop(struct net_device *dev) |
3264 | { | 3280 | { |
3265 | struct qeth_card *card = dev->ml_priv; | 3281 | struct qeth_card *card = dev->ml_priv; |
@@ -3564,7 +3580,7 @@ contin: | |||
3564 | netif_carrier_off(card->dev); | 3580 | netif_carrier_off(card->dev); |
3565 | if (recover_flag == CARD_STATE_RECOVER) { | 3581 | if (recover_flag == CARD_STATE_RECOVER) { |
3566 | if (recovery_mode) | 3582 | if (recovery_mode) |
3567 | qeth_l3_open(card->dev); | 3583 | __qeth_l3_open(card->dev); |
3568 | else { | 3584 | else { |
3569 | rtnl_lock(); | 3585 | rtnl_lock(); |
3570 | dev_open(card->dev); | 3586 | dev_open(card->dev); |
diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index 13bfa9d48082..bb233a9cbad2 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig | |||
@@ -53,6 +53,14 @@ if SPI_MASTER | |||
53 | 53 | ||
54 | comment "SPI Master Controller Drivers" | 54 | comment "SPI Master Controller Drivers" |
55 | 55 | ||
56 | config SPI_ATH79 | ||
57 | tristate "Atheros AR71XX/AR724X/AR913X SPI controller driver" | ||
58 | depends on ATH79 && GENERIC_GPIO | ||
59 | select SPI_BITBANG | ||
60 | help | ||
61 | This enables support for the SPI controller present on the | ||
62 | Atheros AR71XX/AR724X/AR913X SoCs. | ||
63 | |||
56 | config SPI_ATMEL | 64 | config SPI_ATMEL |
57 | tristate "Atmel SPI Controller" | 65 | tristate "Atmel SPI Controller" |
58 | depends on (ARCH_AT91 || AVR32) | 66 | depends on (ARCH_AT91 || AVR32) |
diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile index 3a42463c92a4..86d1b5f9bbd9 100644 --- a/drivers/spi/Makefile +++ b/drivers/spi/Makefile | |||
@@ -10,6 +10,7 @@ obj-$(CONFIG_SPI_MASTER) += spi.o | |||
10 | 10 | ||
11 | # SPI master controller drivers (bus) | 11 | # SPI master controller drivers (bus) |
12 | obj-$(CONFIG_SPI_ATMEL) += atmel_spi.o | 12 | obj-$(CONFIG_SPI_ATMEL) += atmel_spi.o |
13 | obj-$(CONFIG_SPI_ATH79) += ath79_spi.o | ||
13 | obj-$(CONFIG_SPI_BFIN) += spi_bfin5xx.o | 14 | obj-$(CONFIG_SPI_BFIN) += spi_bfin5xx.o |
14 | obj-$(CONFIG_SPI_BITBANG) += spi_bitbang.o | 15 | obj-$(CONFIG_SPI_BITBANG) += spi_bitbang.o |
15 | obj-$(CONFIG_SPI_AU1550) += au1550_spi.o | 16 | obj-$(CONFIG_SPI_AU1550) += au1550_spi.o |
diff --git a/drivers/spi/ath79_spi.c b/drivers/spi/ath79_spi.c new file mode 100644 index 000000000000..fcff810ea3b0 --- /dev/null +++ b/drivers/spi/ath79_spi.c | |||
@@ -0,0 +1,292 @@ | |||
1 | /* | ||
2 | * SPI controller driver for the Atheros AR71XX/AR724X/AR913X SoCs | ||
3 | * | ||
4 | * Copyright (C) 2009-2011 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * | ||
6 | * This driver has been based on the spi-gpio.c: | ||
7 | * Copyright (C) 2006,2008 David Brownell | ||
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 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/delay.h> | ||
18 | #include <linux/spinlock.h> | ||
19 | #include <linux/workqueue.h> | ||
20 | #include <linux/platform_device.h> | ||
21 | #include <linux/io.h> | ||
22 | #include <linux/spi/spi.h> | ||
23 | #include <linux/spi/spi_bitbang.h> | ||
24 | #include <linux/bitops.h> | ||
25 | #include <linux/gpio.h> | ||
26 | |||
27 | #include <asm/mach-ath79/ar71xx_regs.h> | ||
28 | #include <asm/mach-ath79/ath79_spi_platform.h> | ||
29 | |||
30 | #define DRV_NAME "ath79-spi" | ||
31 | |||
32 | struct ath79_spi { | ||
33 | struct spi_bitbang bitbang; | ||
34 | u32 ioc_base; | ||
35 | u32 reg_ctrl; | ||
36 | void __iomem *base; | ||
37 | }; | ||
38 | |||
39 | static inline u32 ath79_spi_rr(struct ath79_spi *sp, unsigned reg) | ||
40 | { | ||
41 | return ioread32(sp->base + reg); | ||
42 | } | ||
43 | |||
44 | static inline void ath79_spi_wr(struct ath79_spi *sp, unsigned reg, u32 val) | ||
45 | { | ||
46 | iowrite32(val, sp->base + reg); | ||
47 | } | ||
48 | |||
49 | static inline struct ath79_spi *ath79_spidev_to_sp(struct spi_device *spi) | ||
50 | { | ||
51 | return spi_master_get_devdata(spi->master); | ||
52 | } | ||
53 | |||
54 | static void ath79_spi_chipselect(struct spi_device *spi, int is_active) | ||
55 | { | ||
56 | struct ath79_spi *sp = ath79_spidev_to_sp(spi); | ||
57 | int cs_high = (spi->mode & SPI_CS_HIGH) ? is_active : !is_active; | ||
58 | |||
59 | if (is_active) { | ||
60 | /* set initial clock polarity */ | ||
61 | if (spi->mode & SPI_CPOL) | ||
62 | sp->ioc_base |= AR71XX_SPI_IOC_CLK; | ||
63 | else | ||
64 | sp->ioc_base &= ~AR71XX_SPI_IOC_CLK; | ||
65 | |||
66 | ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base); | ||
67 | } | ||
68 | |||
69 | if (spi->chip_select) { | ||
70 | struct ath79_spi_controller_data *cdata = spi->controller_data; | ||
71 | |||
72 | /* SPI is normally active-low */ | ||
73 | gpio_set_value(cdata->gpio, cs_high); | ||
74 | } else { | ||
75 | if (cs_high) | ||
76 | sp->ioc_base |= AR71XX_SPI_IOC_CS0; | ||
77 | else | ||
78 | sp->ioc_base &= ~AR71XX_SPI_IOC_CS0; | ||
79 | |||
80 | ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base); | ||
81 | } | ||
82 | |||
83 | } | ||
84 | |||
85 | static int ath79_spi_setup_cs(struct spi_device *spi) | ||
86 | { | ||
87 | struct ath79_spi *sp = ath79_spidev_to_sp(spi); | ||
88 | struct ath79_spi_controller_data *cdata; | ||
89 | |||
90 | cdata = spi->controller_data; | ||
91 | if (spi->chip_select && !cdata) | ||
92 | return -EINVAL; | ||
93 | |||
94 | /* enable GPIO mode */ | ||
95 | ath79_spi_wr(sp, AR71XX_SPI_REG_FS, AR71XX_SPI_FS_GPIO); | ||
96 | |||
97 | /* save CTRL register */ | ||
98 | sp->reg_ctrl = ath79_spi_rr(sp, AR71XX_SPI_REG_CTRL); | ||
99 | sp->ioc_base = ath79_spi_rr(sp, AR71XX_SPI_REG_IOC); | ||
100 | |||
101 | /* TODO: setup speed? */ | ||
102 | ath79_spi_wr(sp, AR71XX_SPI_REG_CTRL, 0x43); | ||
103 | |||
104 | if (spi->chip_select) { | ||
105 | int status = 0; | ||
106 | |||
107 | status = gpio_request(cdata->gpio, dev_name(&spi->dev)); | ||
108 | if (status) | ||
109 | return status; | ||
110 | |||
111 | status = gpio_direction_output(cdata->gpio, | ||
112 | spi->mode & SPI_CS_HIGH); | ||
113 | if (status) { | ||
114 | gpio_free(cdata->gpio); | ||
115 | return status; | ||
116 | } | ||
117 | } else { | ||
118 | if (spi->mode & SPI_CS_HIGH) | ||
119 | sp->ioc_base |= AR71XX_SPI_IOC_CS0; | ||
120 | else | ||
121 | sp->ioc_base &= ~AR71XX_SPI_IOC_CS0; | ||
122 | ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base); | ||
123 | } | ||
124 | |||
125 | return 0; | ||
126 | } | ||
127 | |||
128 | static void ath79_spi_cleanup_cs(struct spi_device *spi) | ||
129 | { | ||
130 | struct ath79_spi *sp = ath79_spidev_to_sp(spi); | ||
131 | |||
132 | if (spi->chip_select) { | ||
133 | struct ath79_spi_controller_data *cdata = spi->controller_data; | ||
134 | gpio_free(cdata->gpio); | ||
135 | } | ||
136 | |||
137 | /* restore CTRL register */ | ||
138 | ath79_spi_wr(sp, AR71XX_SPI_REG_CTRL, sp->reg_ctrl); | ||
139 | /* disable GPIO mode */ | ||
140 | ath79_spi_wr(sp, AR71XX_SPI_REG_FS, 0); | ||
141 | } | ||
142 | |||
143 | static int ath79_spi_setup(struct spi_device *spi) | ||
144 | { | ||
145 | int status = 0; | ||
146 | |||
147 | if (spi->bits_per_word > 32) | ||
148 | return -EINVAL; | ||
149 | |||
150 | if (!spi->controller_state) { | ||
151 | status = ath79_spi_setup_cs(spi); | ||
152 | if (status) | ||
153 | return status; | ||
154 | } | ||
155 | |||
156 | status = spi_bitbang_setup(spi); | ||
157 | if (status && !spi->controller_state) | ||
158 | ath79_spi_cleanup_cs(spi); | ||
159 | |||
160 | return status; | ||
161 | } | ||
162 | |||
163 | static void ath79_spi_cleanup(struct spi_device *spi) | ||
164 | { | ||
165 | ath79_spi_cleanup_cs(spi); | ||
166 | spi_bitbang_cleanup(spi); | ||
167 | } | ||
168 | |||
169 | static u32 ath79_spi_txrx_mode0(struct spi_device *spi, unsigned nsecs, | ||
170 | u32 word, u8 bits) | ||
171 | { | ||
172 | struct ath79_spi *sp = ath79_spidev_to_sp(spi); | ||
173 | u32 ioc = sp->ioc_base; | ||
174 | |||
175 | /* clock starts at inactive polarity */ | ||
176 | for (word <<= (32 - bits); likely(bits); bits--) { | ||
177 | u32 out; | ||
178 | |||
179 | if (word & (1 << 31)) | ||
180 | out = ioc | AR71XX_SPI_IOC_DO; | ||
181 | else | ||
182 | out = ioc & ~AR71XX_SPI_IOC_DO; | ||
183 | |||
184 | /* setup MSB (to slave) on trailing edge */ | ||
185 | ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, out); | ||
186 | ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, out | AR71XX_SPI_IOC_CLK); | ||
187 | |||
188 | word <<= 1; | ||
189 | } | ||
190 | |||
191 | return ath79_spi_rr(sp, AR71XX_SPI_REG_RDS); | ||
192 | } | ||
193 | |||
194 | static __devinit int ath79_spi_probe(struct platform_device *pdev) | ||
195 | { | ||
196 | struct spi_master *master; | ||
197 | struct ath79_spi *sp; | ||
198 | struct ath79_spi_platform_data *pdata; | ||
199 | struct resource *r; | ||
200 | int ret; | ||
201 | |||
202 | master = spi_alloc_master(&pdev->dev, sizeof(*sp)); | ||
203 | if (master == NULL) { | ||
204 | dev_err(&pdev->dev, "failed to allocate spi master\n"); | ||
205 | return -ENOMEM; | ||
206 | } | ||
207 | |||
208 | sp = spi_master_get_devdata(master); | ||
209 | platform_set_drvdata(pdev, sp); | ||
210 | |||
211 | pdata = pdev->dev.platform_data; | ||
212 | |||
213 | master->setup = ath79_spi_setup; | ||
214 | master->cleanup = ath79_spi_cleanup; | ||
215 | if (pdata) { | ||
216 | master->bus_num = pdata->bus_num; | ||
217 | master->num_chipselect = pdata->num_chipselect; | ||
218 | } else { | ||
219 | master->bus_num = -1; | ||
220 | master->num_chipselect = 1; | ||
221 | } | ||
222 | |||
223 | sp->bitbang.master = spi_master_get(master); | ||
224 | sp->bitbang.chipselect = ath79_spi_chipselect; | ||
225 | sp->bitbang.txrx_word[SPI_MODE_0] = ath79_spi_txrx_mode0; | ||
226 | sp->bitbang.setup_transfer = spi_bitbang_setup_transfer; | ||
227 | sp->bitbang.flags = SPI_CS_HIGH; | ||
228 | |||
229 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
230 | if (r == NULL) { | ||
231 | ret = -ENOENT; | ||
232 | goto err_put_master; | ||
233 | } | ||
234 | |||
235 | sp->base = ioremap(r->start, r->end - r->start + 1); | ||
236 | if (!sp->base) { | ||
237 | ret = -ENXIO; | ||
238 | goto err_put_master; | ||
239 | } | ||
240 | |||
241 | ret = spi_bitbang_start(&sp->bitbang); | ||
242 | if (ret) | ||
243 | goto err_unmap; | ||
244 | |||
245 | return 0; | ||
246 | |||
247 | err_unmap: | ||
248 | iounmap(sp->base); | ||
249 | err_put_master: | ||
250 | platform_set_drvdata(pdev, NULL); | ||
251 | spi_master_put(sp->bitbang.master); | ||
252 | |||
253 | return ret; | ||
254 | } | ||
255 | |||
256 | static __devexit int ath79_spi_remove(struct platform_device *pdev) | ||
257 | { | ||
258 | struct ath79_spi *sp = platform_get_drvdata(pdev); | ||
259 | |||
260 | spi_bitbang_stop(&sp->bitbang); | ||
261 | iounmap(sp->base); | ||
262 | platform_set_drvdata(pdev, NULL); | ||
263 | spi_master_put(sp->bitbang.master); | ||
264 | |||
265 | return 0; | ||
266 | } | ||
267 | |||
268 | static struct platform_driver ath79_spi_driver = { | ||
269 | .probe = ath79_spi_probe, | ||
270 | .remove = __devexit_p(ath79_spi_remove), | ||
271 | .driver = { | ||
272 | .name = DRV_NAME, | ||
273 | .owner = THIS_MODULE, | ||
274 | }, | ||
275 | }; | ||
276 | |||
277 | static __init int ath79_spi_init(void) | ||
278 | { | ||
279 | return platform_driver_register(&ath79_spi_driver); | ||
280 | } | ||
281 | module_init(ath79_spi_init); | ||
282 | |||
283 | static __exit void ath79_spi_exit(void) | ||
284 | { | ||
285 | platform_driver_unregister(&ath79_spi_driver); | ||
286 | } | ||
287 | module_exit(ath79_spi_exit); | ||
288 | |||
289 | MODULE_DESCRIPTION("SPI controller driver for Atheros AR71XX/AR724X/AR913X"); | ||
290 | MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>"); | ||
291 | MODULE_LICENSE("GPL v2"); | ||
292 | MODULE_ALIAS("platform:" DRV_NAME); | ||
diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h index 1f016bfb42d5..54f923792728 100644 --- a/fs/autofs4/autofs_i.h +++ b/fs/autofs4/autofs_i.h | |||
@@ -88,14 +88,6 @@ struct autofs_info { | |||
88 | 88 | ||
89 | uid_t uid; | 89 | uid_t uid; |
90 | gid_t gid; | 90 | gid_t gid; |
91 | |||
92 | mode_t mode; | ||
93 | size_t size; | ||
94 | |||
95 | void (*free)(struct autofs_info *); | ||
96 | union { | ||
97 | const char *symlink; | ||
98 | } u; | ||
99 | }; | 91 | }; |
100 | 92 | ||
101 | #define AUTOFS_INF_EXPIRING (1<<0) /* dentry is in the process of expiring */ | 93 | #define AUTOFS_INF_EXPIRING (1<<0) /* dentry is in the process of expiring */ |
@@ -175,7 +167,7 @@ static inline int autofs4_ispending(struct dentry *dentry) | |||
175 | return 0; | 167 | return 0; |
176 | } | 168 | } |
177 | 169 | ||
178 | struct inode *autofs4_get_inode(struct super_block *, struct autofs_info *); | 170 | struct inode *autofs4_get_inode(struct super_block *, mode_t); |
179 | void autofs4_free_ino(struct autofs_info *); | 171 | void autofs4_free_ino(struct autofs_info *); |
180 | 172 | ||
181 | /* Expiration */ | 173 | /* Expiration */ |
@@ -285,7 +277,8 @@ static inline void managed_dentry_clear_managed(struct dentry *dentry) | |||
285 | /* Initializing function */ | 277 | /* Initializing function */ |
286 | 278 | ||
287 | int autofs4_fill_super(struct super_block *, void *, int); | 279 | int autofs4_fill_super(struct super_block *, void *, int); |
288 | struct autofs_info *autofs4_init_ino(struct autofs_info *, struct autofs_sb_info *sbi, mode_t mode); | 280 | struct autofs_info *autofs4_new_ino(struct autofs_sb_info *); |
281 | void autofs4_clean_ino(struct autofs_info *); | ||
289 | 282 | ||
290 | /* Queue management functions */ | 283 | /* Queue management functions */ |
291 | 284 | ||
@@ -345,5 +338,4 @@ static inline void autofs4_del_expiring(struct dentry *dentry) | |||
345 | return; | 338 | return; |
346 | } | 339 | } |
347 | 340 | ||
348 | void autofs4_dentry_release(struct dentry *); | ||
349 | extern void autofs4_kill_sb(struct super_block *); | 341 | extern void autofs4_kill_sb(struct super_block *); |
diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c index 3ed79d76c233..f43100b9662b 100644 --- a/fs/autofs4/expire.c +++ b/fs/autofs4/expire.c | |||
@@ -96,7 +96,7 @@ static struct dentry *get_next_positive_dentry(struct dentry *prev, | |||
96 | struct dentry *p, *ret; | 96 | struct dentry *p, *ret; |
97 | 97 | ||
98 | if (prev == NULL) | 98 | if (prev == NULL) |
99 | return dget(prev); | 99 | return dget(root); |
100 | 100 | ||
101 | spin_lock(&autofs4_lock); | 101 | spin_lock(&autofs4_lock); |
102 | relock: | 102 | relock: |
@@ -133,7 +133,7 @@ again: | |||
133 | spin_lock_nested(&ret->d_lock, DENTRY_D_LOCK_NESTED); | 133 | spin_lock_nested(&ret->d_lock, DENTRY_D_LOCK_NESTED); |
134 | /* Negative dentry - try next */ | 134 | /* Negative dentry - try next */ |
135 | if (!simple_positive(ret)) { | 135 | if (!simple_positive(ret)) { |
136 | spin_unlock(&ret->d_lock); | 136 | spin_unlock(&p->d_lock); |
137 | p = ret; | 137 | p = ret; |
138 | goto again; | 138 | goto again; |
139 | } | 139 | } |
diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c index 9e1a9dad23e1..180fa2425e49 100644 --- a/fs/autofs4/inode.c +++ b/fs/autofs4/inode.c | |||
@@ -22,65 +22,27 @@ | |||
22 | #include "autofs_i.h" | 22 | #include "autofs_i.h" |
23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
24 | 24 | ||
25 | static void ino_lnkfree(struct autofs_info *ino) | 25 | struct autofs_info *autofs4_new_ino(struct autofs_sb_info *sbi) |
26 | { | 26 | { |
27 | if (ino->u.symlink) { | 27 | struct autofs_info *ino = kzalloc(sizeof(*ino), GFP_KERNEL); |
28 | kfree(ino->u.symlink); | 28 | if (ino) { |
29 | ino->u.symlink = NULL; | ||
30 | } | ||
31 | } | ||
32 | |||
33 | struct autofs_info *autofs4_init_ino(struct autofs_info *ino, | ||
34 | struct autofs_sb_info *sbi, mode_t mode) | ||
35 | { | ||
36 | int reinit = 1; | ||
37 | |||
38 | if (ino == NULL) { | ||
39 | reinit = 0; | ||
40 | ino = kmalloc(sizeof(*ino), GFP_KERNEL); | ||
41 | } | ||
42 | |||
43 | if (ino == NULL) | ||
44 | return NULL; | ||
45 | |||
46 | if (!reinit) { | ||
47 | ino->flags = 0; | ||
48 | ino->dentry = NULL; | ||
49 | ino->size = 0; | ||
50 | INIT_LIST_HEAD(&ino->active); | 29 | INIT_LIST_HEAD(&ino->active); |
51 | ino->active_count = 0; | ||
52 | INIT_LIST_HEAD(&ino->expiring); | 30 | INIT_LIST_HEAD(&ino->expiring); |
53 | atomic_set(&ino->count, 0); | 31 | ino->last_used = jiffies; |
32 | ino->sbi = sbi; | ||
54 | } | 33 | } |
34 | return ino; | ||
35 | } | ||
55 | 36 | ||
37 | void autofs4_clean_ino(struct autofs_info *ino) | ||
38 | { | ||
56 | ino->uid = 0; | 39 | ino->uid = 0; |
57 | ino->gid = 0; | 40 | ino->gid = 0; |
58 | ino->mode = mode; | ||
59 | ino->last_used = jiffies; | 41 | ino->last_used = jiffies; |
60 | |||
61 | ino->sbi = sbi; | ||
62 | |||
63 | if (reinit && ino->free) | ||
64 | (ino->free)(ino); | ||
65 | |||
66 | memset(&ino->u, 0, sizeof(ino->u)); | ||
67 | |||
68 | ino->free = NULL; | ||
69 | |||
70 | if (S_ISLNK(mode)) | ||
71 | ino->free = ino_lnkfree; | ||
72 | |||
73 | return ino; | ||
74 | } | 42 | } |
75 | 43 | ||
76 | void autofs4_free_ino(struct autofs_info *ino) | 44 | void autofs4_free_ino(struct autofs_info *ino) |
77 | { | 45 | { |
78 | if (ino->dentry) { | ||
79 | ino->dentry->d_fsdata = NULL; | ||
80 | ino->dentry = NULL; | ||
81 | } | ||
82 | if (ino->free) | ||
83 | (ino->free)(ino); | ||
84 | kfree(ino); | 46 | kfree(ino); |
85 | } | 47 | } |
86 | 48 | ||
@@ -136,9 +98,16 @@ static int autofs4_show_options(struct seq_file *m, struct vfsmount *mnt) | |||
136 | return 0; | 98 | return 0; |
137 | } | 99 | } |
138 | 100 | ||
101 | static void autofs4_evict_inode(struct inode *inode) | ||
102 | { | ||
103 | end_writeback(inode); | ||
104 | kfree(inode->i_private); | ||
105 | } | ||
106 | |||
139 | static const struct super_operations autofs4_sops = { | 107 | static const struct super_operations autofs4_sops = { |
140 | .statfs = simple_statfs, | 108 | .statfs = simple_statfs, |
141 | .show_options = autofs4_show_options, | 109 | .show_options = autofs4_show_options, |
110 | .evict_inode = autofs4_evict_inode, | ||
142 | }; | 111 | }; |
143 | 112 | ||
144 | enum {Opt_err, Opt_fd, Opt_uid, Opt_gid, Opt_pgrp, Opt_minproto, Opt_maxproto, | 113 | enum {Opt_err, Opt_fd, Opt_uid, Opt_gid, Opt_pgrp, Opt_minproto, Opt_maxproto, |
@@ -228,17 +197,6 @@ static int parse_options(char *options, int *pipefd, uid_t *uid, gid_t *gid, | |||
228 | return (*pipefd < 0); | 197 | return (*pipefd < 0); |
229 | } | 198 | } |
230 | 199 | ||
231 | static struct autofs_info *autofs4_mkroot(struct autofs_sb_info *sbi) | ||
232 | { | ||
233 | struct autofs_info *ino; | ||
234 | |||
235 | ino = autofs4_init_ino(NULL, sbi, S_IFDIR | 0755); | ||
236 | if (!ino) | ||
237 | return NULL; | ||
238 | |||
239 | return ino; | ||
240 | } | ||
241 | |||
242 | int autofs4_fill_super(struct super_block *s, void *data, int silent) | 200 | int autofs4_fill_super(struct super_block *s, void *data, int silent) |
243 | { | 201 | { |
244 | struct inode * root_inode; | 202 | struct inode * root_inode; |
@@ -282,10 +240,10 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) | |||
282 | /* | 240 | /* |
283 | * Get the root inode and dentry, but defer checking for errors. | 241 | * Get the root inode and dentry, but defer checking for errors. |
284 | */ | 242 | */ |
285 | ino = autofs4_mkroot(sbi); | 243 | ino = autofs4_new_ino(sbi); |
286 | if (!ino) | 244 | if (!ino) |
287 | goto fail_free; | 245 | goto fail_free; |
288 | root_inode = autofs4_get_inode(s, ino); | 246 | root_inode = autofs4_get_inode(s, S_IFDIR | 0755); |
289 | if (!root_inode) | 247 | if (!root_inode) |
290 | goto fail_ino; | 248 | goto fail_ino; |
291 | 249 | ||
@@ -368,15 +326,14 @@ fail_unlock: | |||
368 | return -EINVAL; | 326 | return -EINVAL; |
369 | } | 327 | } |
370 | 328 | ||
371 | struct inode *autofs4_get_inode(struct super_block *sb, | 329 | struct inode *autofs4_get_inode(struct super_block *sb, mode_t mode) |
372 | struct autofs_info *inf) | ||
373 | { | 330 | { |
374 | struct inode *inode = new_inode(sb); | 331 | struct inode *inode = new_inode(sb); |
375 | 332 | ||
376 | if (inode == NULL) | 333 | if (inode == NULL) |
377 | return NULL; | 334 | return NULL; |
378 | 335 | ||
379 | inode->i_mode = inf->mode; | 336 | inode->i_mode = mode; |
380 | if (sb->s_root) { | 337 | if (sb->s_root) { |
381 | inode->i_uid = sb->s_root->d_inode->i_uid; | 338 | inode->i_uid = sb->s_root->d_inode->i_uid; |
382 | inode->i_gid = sb->s_root->d_inode->i_gid; | 339 | inode->i_gid = sb->s_root->d_inode->i_gid; |
@@ -384,12 +341,11 @@ struct inode *autofs4_get_inode(struct super_block *sb, | |||
384 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 341 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
385 | inode->i_ino = get_next_ino(); | 342 | inode->i_ino = get_next_ino(); |
386 | 343 | ||
387 | if (S_ISDIR(inf->mode)) { | 344 | if (S_ISDIR(mode)) { |
388 | inode->i_nlink = 2; | 345 | inode->i_nlink = 2; |
389 | inode->i_op = &autofs4_dir_inode_operations; | 346 | inode->i_op = &autofs4_dir_inode_operations; |
390 | inode->i_fop = &autofs4_dir_operations; | 347 | inode->i_fop = &autofs4_dir_operations; |
391 | } else if (S_ISLNK(inf->mode)) { | 348 | } else if (S_ISLNK(mode)) { |
392 | inode->i_size = inf->size; | ||
393 | inode->i_op = &autofs4_symlink_inode_operations; | 349 | inode->i_op = &autofs4_symlink_inode_operations; |
394 | } | 350 | } |
395 | 351 | ||
diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c index 1dba035fc376..014e7aba3b08 100644 --- a/fs/autofs4/root.c +++ b/fs/autofs4/root.c | |||
@@ -37,6 +37,7 @@ static int autofs4_dir_open(struct inode *inode, struct file *file); | |||
37 | static struct dentry *autofs4_lookup(struct inode *,struct dentry *, struct nameidata *); | 37 | static struct dentry *autofs4_lookup(struct inode *,struct dentry *, struct nameidata *); |
38 | static struct vfsmount *autofs4_d_automount(struct path *); | 38 | static struct vfsmount *autofs4_d_automount(struct path *); |
39 | static int autofs4_d_manage(struct dentry *, bool, bool); | 39 | static int autofs4_d_manage(struct dentry *, bool, bool); |
40 | static void autofs4_dentry_release(struct dentry *); | ||
40 | 41 | ||
41 | const struct file_operations autofs4_root_operations = { | 42 | const struct file_operations autofs4_root_operations = { |
42 | .open = dcache_dir_open, | 43 | .open = dcache_dir_open, |
@@ -138,25 +139,26 @@ out: | |||
138 | return dcache_dir_open(inode, file); | 139 | return dcache_dir_open(inode, file); |
139 | } | 140 | } |
140 | 141 | ||
141 | void autofs4_dentry_release(struct dentry *de) | 142 | static void autofs4_dentry_release(struct dentry *de) |
142 | { | 143 | { |
143 | struct autofs_info *inf; | 144 | struct autofs_info *ino = autofs4_dentry_ino(de); |
145 | struct autofs_sb_info *sbi = autofs4_sbi(de->d_sb); | ||
144 | 146 | ||
145 | DPRINTK("releasing %p", de); | 147 | DPRINTK("releasing %p", de); |
146 | 148 | ||
147 | inf = autofs4_dentry_ino(de); | 149 | if (!ino) |
148 | if (inf) { | 150 | return; |
149 | struct autofs_sb_info *sbi = autofs4_sbi(de->d_sb); | 151 | |
150 | if (sbi) { | 152 | if (sbi) { |
151 | spin_lock(&sbi->lookup_lock); | 153 | spin_lock(&sbi->lookup_lock); |
152 | if (!list_empty(&inf->active)) | 154 | if (!list_empty(&ino->active)) |
153 | list_del(&inf->active); | 155 | list_del(&ino->active); |
154 | if (!list_empty(&inf->expiring)) | 156 | if (!list_empty(&ino->expiring)) |
155 | list_del(&inf->expiring); | 157 | list_del(&ino->expiring); |
156 | spin_unlock(&sbi->lookup_lock); | 158 | spin_unlock(&sbi->lookup_lock); |
157 | } | ||
158 | autofs4_free_ino(inf); | ||
159 | } | 159 | } |
160 | |||
161 | autofs4_free_ino(ino); | ||
160 | } | 162 | } |
161 | 163 | ||
162 | static struct dentry *autofs4_lookup_active(struct dentry *dentry) | 164 | static struct dentry *autofs4_lookup_active(struct dentry *dentry) |
@@ -488,7 +490,8 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s | |||
488 | sbi = autofs4_sbi(dir->i_sb); | 490 | sbi = autofs4_sbi(dir->i_sb); |
489 | 491 | ||
490 | DPRINTK("pid = %u, pgrp = %u, catatonic = %d, oz_mode = %d", | 492 | DPRINTK("pid = %u, pgrp = %u, catatonic = %d, oz_mode = %d", |
491 | current->pid, task_pgrp_nr(current), sbi->catatonic, oz_mode); | 493 | current->pid, task_pgrp_nr(current), sbi->catatonic, |
494 | autofs4_oz_mode(sbi)); | ||
492 | 495 | ||
493 | active = autofs4_lookup_active(dentry); | 496 | active = autofs4_lookup_active(dentry); |
494 | if (active) { | 497 | if (active) { |
@@ -507,7 +510,7 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s | |||
507 | if (autofs_type_indirect(sbi->type) && IS_ROOT(dentry->d_parent)) | 510 | if (autofs_type_indirect(sbi->type) && IS_ROOT(dentry->d_parent)) |
508 | __managed_dentry_set_managed(dentry); | 511 | __managed_dentry_set_managed(dentry); |
509 | 512 | ||
510 | ino = autofs4_init_ino(NULL, sbi, 0555); | 513 | ino = autofs4_new_ino(sbi); |
511 | if (!ino) | 514 | if (!ino) |
512 | return ERR_PTR(-ENOMEM); | 515 | return ERR_PTR(-ENOMEM); |
513 | 516 | ||
@@ -529,6 +532,7 @@ static int autofs4_dir_symlink(struct inode *dir, | |||
529 | struct autofs_info *ino = autofs4_dentry_ino(dentry); | 532 | struct autofs_info *ino = autofs4_dentry_ino(dentry); |
530 | struct autofs_info *p_ino; | 533 | struct autofs_info *p_ino; |
531 | struct inode *inode; | 534 | struct inode *inode; |
535 | size_t size = strlen(symname); | ||
532 | char *cp; | 536 | char *cp; |
533 | 537 | ||
534 | DPRINTK("%s <- %.*s", symname, | 538 | DPRINTK("%s <- %.*s", symname, |
@@ -537,39 +541,35 @@ static int autofs4_dir_symlink(struct inode *dir, | |||
537 | if (!autofs4_oz_mode(sbi)) | 541 | if (!autofs4_oz_mode(sbi)) |
538 | return -EACCES; | 542 | return -EACCES; |
539 | 543 | ||
540 | ino = autofs4_init_ino(ino, sbi, S_IFLNK | 0555); | 544 | BUG_ON(!ino); |
541 | if (!ino) | 545 | |
542 | return -ENOMEM; | 546 | autofs4_clean_ino(ino); |
543 | 547 | ||
544 | autofs4_del_active(dentry); | 548 | autofs4_del_active(dentry); |
545 | 549 | ||
546 | ino->size = strlen(symname); | 550 | cp = kmalloc(size + 1, GFP_KERNEL); |
547 | cp = kmalloc(ino->size + 1, GFP_KERNEL); | 551 | if (!cp) |
548 | if (!cp) { | ||
549 | if (!dentry->d_fsdata) | ||
550 | kfree(ino); | ||
551 | return -ENOMEM; | 552 | return -ENOMEM; |
552 | } | ||
553 | 553 | ||
554 | strcpy(cp, symname); | 554 | strcpy(cp, symname); |
555 | 555 | ||
556 | inode = autofs4_get_inode(dir->i_sb, ino); | 556 | inode = autofs4_get_inode(dir->i_sb, S_IFLNK | 0555); |
557 | if (!inode) { | 557 | if (!inode) { |
558 | kfree(cp); | 558 | kfree(cp); |
559 | if (!dentry->d_fsdata) | 559 | if (!dentry->d_fsdata) |
560 | kfree(ino); | 560 | kfree(ino); |
561 | return -ENOMEM; | 561 | return -ENOMEM; |
562 | } | 562 | } |
563 | inode->i_private = cp; | ||
564 | inode->i_size = size; | ||
563 | d_add(dentry, inode); | 565 | d_add(dentry, inode); |
564 | 566 | ||
565 | dentry->d_fsdata = ino; | 567 | dget(dentry); |
566 | ino->dentry = dget(dentry); | ||
567 | atomic_inc(&ino->count); | 568 | atomic_inc(&ino->count); |
568 | p_ino = autofs4_dentry_ino(dentry->d_parent); | 569 | p_ino = autofs4_dentry_ino(dentry->d_parent); |
569 | if (p_ino && dentry->d_parent != dentry) | 570 | if (p_ino && dentry->d_parent != dentry) |
570 | atomic_inc(&p_ino->count); | 571 | atomic_inc(&p_ino->count); |
571 | 572 | ||
572 | ino->u.symlink = cp; | ||
573 | dir->i_mtime = CURRENT_TIME; | 573 | dir->i_mtime = CURRENT_TIME; |
574 | 574 | ||
575 | return 0; | 575 | return 0; |
@@ -732,25 +732,21 @@ static int autofs4_dir_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
732 | DPRINTK("dentry %p, creating %.*s", | 732 | DPRINTK("dentry %p, creating %.*s", |
733 | dentry, dentry->d_name.len, dentry->d_name.name); | 733 | dentry, dentry->d_name.len, dentry->d_name.name); |
734 | 734 | ||
735 | ino = autofs4_init_ino(ino, sbi, S_IFDIR | 0555); | 735 | BUG_ON(!ino); |
736 | if (!ino) | 736 | |
737 | return -ENOMEM; | 737 | autofs4_clean_ino(ino); |
738 | 738 | ||
739 | autofs4_del_active(dentry); | 739 | autofs4_del_active(dentry); |
740 | 740 | ||
741 | inode = autofs4_get_inode(dir->i_sb, ino); | 741 | inode = autofs4_get_inode(dir->i_sb, S_IFDIR | 0555); |
742 | if (!inode) { | 742 | if (!inode) |
743 | if (!dentry->d_fsdata) | ||
744 | kfree(ino); | ||
745 | return -ENOMEM; | 743 | return -ENOMEM; |
746 | } | ||
747 | d_add(dentry, inode); | 744 | d_add(dentry, inode); |
748 | 745 | ||
749 | if (sbi->version < 5) | 746 | if (sbi->version < 5) |
750 | autofs_set_leaf_automount_flags(dentry); | 747 | autofs_set_leaf_automount_flags(dentry); |
751 | 748 | ||
752 | dentry->d_fsdata = ino; | 749 | dget(dentry); |
753 | ino->dentry = dget(dentry); | ||
754 | atomic_inc(&ino->count); | 750 | atomic_inc(&ino->count); |
755 | p_ino = autofs4_dentry_ino(dentry->d_parent); | 751 | p_ino = autofs4_dentry_ino(dentry->d_parent); |
756 | if (p_ino && dentry->d_parent != dentry) | 752 | if (p_ino && dentry->d_parent != dentry) |
diff --git a/fs/autofs4/symlink.c b/fs/autofs4/symlink.c index b4ea82934d2e..f27c094a1919 100644 --- a/fs/autofs4/symlink.c +++ b/fs/autofs4/symlink.c | |||
@@ -14,8 +14,7 @@ | |||
14 | 14 | ||
15 | static void *autofs4_follow_link(struct dentry *dentry, struct nameidata *nd) | 15 | static void *autofs4_follow_link(struct dentry *dentry, struct nameidata *nd) |
16 | { | 16 | { |
17 | struct autofs_info *ino = autofs4_dentry_ino(dentry); | 17 | nd_set_link(nd, dentry->d_inode->i_private); |
18 | nd_set_link(nd, (char *)ino->u.symlink); | ||
19 | return NULL; | 18 | return NULL; |
20 | } | 19 | } |
21 | 20 | ||
diff --git a/fs/namei.c b/fs/namei.c index b753192d8c3f..7d77f24d32a9 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -1272,8 +1272,10 @@ done: | |||
1272 | path->mnt = mnt; | 1272 | path->mnt = mnt; |
1273 | path->dentry = dentry; | 1273 | path->dentry = dentry; |
1274 | err = follow_managed(path, nd->flags); | 1274 | err = follow_managed(path, nd->flags); |
1275 | if (unlikely(err < 0)) | 1275 | if (unlikely(err < 0)) { |
1276 | path_put_conditional(path, nd); | ||
1276 | return err; | 1277 | return err; |
1278 | } | ||
1277 | *inode = path->dentry->d_inode; | 1279 | *inode = path->dentry->d_inode; |
1278 | return 0; | 1280 | return 0; |
1279 | 1281 | ||
@@ -441,7 +441,7 @@ redo: | |||
441 | break; | 441 | break; |
442 | } | 442 | } |
443 | if (do_wakeup) { | 443 | if (do_wakeup) { |
444 | wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT); | 444 | wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT | POLLWRNORM); |
445 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); | 445 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); |
446 | } | 446 | } |
447 | pipe_wait(pipe); | 447 | pipe_wait(pipe); |
@@ -450,7 +450,7 @@ redo: | |||
450 | 450 | ||
451 | /* Signal writers asynchronously that there is more room. */ | 451 | /* Signal writers asynchronously that there is more room. */ |
452 | if (do_wakeup) { | 452 | if (do_wakeup) { |
453 | wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT); | 453 | wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT | POLLWRNORM); |
454 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); | 454 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); |
455 | } | 455 | } |
456 | if (ret > 0) | 456 | if (ret > 0) |
@@ -612,7 +612,7 @@ redo2: | |||
612 | break; | 612 | break; |
613 | } | 613 | } |
614 | if (do_wakeup) { | 614 | if (do_wakeup) { |
615 | wake_up_interruptible_sync_poll(&pipe->wait, POLLIN); | 615 | wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLRDNORM); |
616 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); | 616 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); |
617 | do_wakeup = 0; | 617 | do_wakeup = 0; |
618 | } | 618 | } |
@@ -623,7 +623,7 @@ redo2: | |||
623 | out: | 623 | out: |
624 | mutex_unlock(&inode->i_mutex); | 624 | mutex_unlock(&inode->i_mutex); |
625 | if (do_wakeup) { | 625 | if (do_wakeup) { |
626 | wake_up_interruptible_sync_poll(&pipe->wait, POLLIN); | 626 | wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLRDNORM); |
627 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); | 627 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); |
628 | } | 628 | } |
629 | if (ret > 0) | 629 | if (ret > 0) |
@@ -715,7 +715,7 @@ pipe_release(struct inode *inode, int decr, int decw) | |||
715 | if (!pipe->readers && !pipe->writers) { | 715 | if (!pipe->readers && !pipe->writers) { |
716 | free_pipe_info(inode); | 716 | free_pipe_info(inode); |
717 | } else { | 717 | } else { |
718 | wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLOUT); | 718 | wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM | POLLERR | POLLHUP); |
719 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); | 719 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); |
720 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); | 720 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); |
721 | } | 721 | } |
diff --git a/include/acpi/acexcep.h b/include/acpi/acexcep.h index 17714beb868e..5b6c391efc8e 100644 --- a/include/acpi/acexcep.h +++ b/include/acpi/acexcep.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/acnames.h b/include/acpi/acnames.h index 9cf736ea4691..fc1575fd4596 100644 --- a/include/acpi/acnames.h +++ b/include/acpi/acnames.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/acoutput.h b/include/acpi/acoutput.h index bc4a6deb73b0..ef1cef77d32b 100644 --- a/include/acpi/acoutput.h +++ b/include/acpi/acoutput.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/acpi.h b/include/acpi/acpi.h index a091cabca4b1..de39915f6b7f 100644 --- a/include/acpi/acpi.h +++ b/include/acpi/acpi.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h index 65b3f5888f42..a3252a5ead66 100644 --- a/include/acpi/acpiosxf.h +++ b/include/acpi/acpiosxf.h | |||
@@ -8,7 +8,7 @@ | |||
8 | *****************************************************************************/ | 8 | *****************************************************************************/ |
9 | 9 | ||
10 | /* | 10 | /* |
11 | * Copyright (C) 2000 - 2010, Intel Corp. | 11 | * Copyright (C) 2000 - 2011, Intel Corp. |
12 | * All rights reserved. | 12 | * All rights reserved. |
13 | * | 13 | * |
14 | * Redistribution and use in source and binary forms, with or without | 14 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 241b8a04c83c..e46ec95a8ada 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2010, Intel Corp. | 9 | * Copyright (C) 2000 - 2011, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
@@ -47,7 +47,7 @@ | |||
47 | 47 | ||
48 | /* Current ACPICA subsystem version in YYYYMMDD format */ | 48 | /* Current ACPICA subsystem version in YYYYMMDD format */ |
49 | 49 | ||
50 | #define ACPI_CA_VERSION 0x20101209 | 50 | #define ACPI_CA_VERSION 0x20110112 |
51 | 51 | ||
52 | #include "actypes.h" | 52 | #include "actypes.h" |
53 | #include "actbl.h" | 53 | #include "actbl.h" |
diff --git a/include/acpi/acrestyp.h b/include/acpi/acrestyp.h index e5526354ba5e..0a66cc45dd6b 100644 --- a/include/acpi/acrestyp.h +++ b/include/acpi/acrestyp.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/actbl.h b/include/acpi/actbl.h index ad2001683ba7..7e42bfee0e29 100644 --- a/include/acpi/actbl.h +++ b/include/acpi/actbl.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/actbl1.h b/include/acpi/actbl1.h index cd77aa75c962..7504bc99b29b 100644 --- a/include/acpi/actbl1.h +++ b/include/acpi/actbl1.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h index d4136b28011f..0fc15dfb2e22 100644 --- a/include/acpi/actbl2.h +++ b/include/acpi/actbl2.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index 939a431a6ab6..64f838beaabf 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/platform/acenv.h b/include/acpi/platform/acenv.h index a3e334ab1119..5af3ed52ef98 100644 --- a/include/acpi/platform/acenv.h +++ b/include/acpi/platform/acenv.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/platform/acgcc.h b/include/acpi/platform/acgcc.h index 5dcb9537343c..e228893591a9 100644 --- a/include/acpi/platform/acgcc.h +++ b/include/acpi/platform/acgcc.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h index 572189e37133..5d2a5e9544d9 100644 --- a/include/acpi/platform/aclinux.h +++ b/include/acpi/platform/aclinux.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2010, Intel Corp. | 8 | * Copyright (C) 2000 - 2011, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 6042228954a7..294169e31364 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h | |||
@@ -959,7 +959,7 @@ struct ieee80211_ht_info { | |||
959 | /* block-ack parameters */ | 959 | /* block-ack parameters */ |
960 | #define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002 | 960 | #define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002 |
961 | #define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C | 961 | #define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C |
962 | #define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0 | 962 | #define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFC0 |
963 | #define IEEE80211_DELBA_PARAM_TID_MASK 0xF000 | 963 | #define IEEE80211_DELBA_PARAM_TID_MASK 0xF000 |
964 | #define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800 | 964 | #define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800 |
965 | 965 | ||
diff --git a/include/net/sctp/user.h b/include/net/sctp/user.h index 2a128c8c2718..e73ebdae323d 100644 --- a/include/net/sctp/user.h +++ b/include/net/sctp/user.h | |||
@@ -78,6 +78,7 @@ typedef __s32 sctp_assoc_t; | |||
78 | #define SCTP_GET_PEER_ADDR_INFO 15 | 78 | #define SCTP_GET_PEER_ADDR_INFO 15 |
79 | #define SCTP_DELAYED_ACK_TIME 16 | 79 | #define SCTP_DELAYED_ACK_TIME 16 |
80 | #define SCTP_DELAYED_ACK SCTP_DELAYED_ACK_TIME | 80 | #define SCTP_DELAYED_ACK SCTP_DELAYED_ACK_TIME |
81 | #define SCTP_DELAYED_SACK SCTP_DELAYED_ACK_TIME | ||
81 | #define SCTP_CONTEXT 17 | 82 | #define SCTP_CONTEXT 17 |
82 | #define SCTP_FRAGMENT_INTERLEAVE 18 | 83 | #define SCTP_FRAGMENT_INTERLEAVE 18 |
83 | #define SCTP_PARTIAL_DELIVERY_POINT 19 /* Set/Get partial delivery point */ | 84 | #define SCTP_PARTIAL_DELIVERY_POINT 19 /* Set/Get partial delivery point */ |
diff --git a/include/sound/ac97_codec.h b/include/sound/ac97_codec.h index 49400459b477..b602f475cdbb 100644 --- a/include/sound/ac97_codec.h +++ b/include/sound/ac97_codec.h | |||
@@ -477,7 +477,7 @@ struct snd_ac97_template { | |||
477 | 477 | ||
478 | struct snd_ac97 { | 478 | struct snd_ac97 { |
479 | /* -- lowlevel (hardware) driver specific -- */ | 479 | /* -- lowlevel (hardware) driver specific -- */ |
480 | struct snd_ac97_build_ops * build_ops; | 480 | const struct snd_ac97_build_ops *build_ops; |
481 | void *private_data; | 481 | void *private_data; |
482 | void (*private_free) (struct snd_ac97 *ac97); | 482 | void (*private_free) (struct snd_ac97 *ac97); |
483 | /* --- */ | 483 | /* --- */ |
diff --git a/kernel/perf_event.c b/kernel/perf_event.c index 05ebe841270b..84522c796987 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c | |||
@@ -2228,14 +2228,11 @@ find_get_context(struct pmu *pmu, struct task_struct *task, int cpu) | |||
2228 | unsigned long flags; | 2228 | unsigned long flags; |
2229 | int ctxn, err; | 2229 | int ctxn, err; |
2230 | 2230 | ||
2231 | if (!task && cpu != -1) { | 2231 | if (!task) { |
2232 | /* Must be root to operate on a CPU event: */ | 2232 | /* Must be root to operate on a CPU event: */ |
2233 | if (perf_paranoid_cpu() && !capable(CAP_SYS_ADMIN)) | 2233 | if (perf_paranoid_cpu() && !capable(CAP_SYS_ADMIN)) |
2234 | return ERR_PTR(-EACCES); | 2234 | return ERR_PTR(-EACCES); |
2235 | 2235 | ||
2236 | if (cpu < 0 || cpu >= nr_cpumask_bits) | ||
2237 | return ERR_PTR(-EINVAL); | ||
2238 | |||
2239 | /* | 2236 | /* |
2240 | * We could be clever and allow to attach a event to an | 2237 | * We could be clever and allow to attach a event to an |
2241 | * offline CPU and activate it when the CPU comes up, but | 2238 | * offline CPU and activate it when the CPU comes up, but |
@@ -5541,6 +5538,11 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu, | |||
5541 | struct hw_perf_event *hwc; | 5538 | struct hw_perf_event *hwc; |
5542 | long err; | 5539 | long err; |
5543 | 5540 | ||
5541 | if ((unsigned)cpu >= nr_cpu_ids) { | ||
5542 | if (!task || cpu != -1) | ||
5543 | return ERR_PTR(-EINVAL); | ||
5544 | } | ||
5545 | |||
5544 | event = kzalloc(sizeof(*event), GFP_KERNEL); | 5546 | event = kzalloc(sizeof(*event), GFP_KERNEL); |
5545 | if (!event) | 5547 | if (!event) |
5546 | return ERR_PTR(-ENOMEM); | 5548 | return ERR_PTR(-ENOMEM); |
@@ -5589,7 +5591,7 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu, | |||
5589 | 5591 | ||
5590 | if (!overflow_handler && parent_event) | 5592 | if (!overflow_handler && parent_event) |
5591 | overflow_handler = parent_event->overflow_handler; | 5593 | overflow_handler = parent_event->overflow_handler; |
5592 | 5594 | ||
5593 | event->overflow_handler = overflow_handler; | 5595 | event->overflow_handler = overflow_handler; |
5594 | 5596 | ||
5595 | if (attr->disabled) | 5597 | if (attr->disabled) |
@@ -6494,7 +6496,6 @@ int perf_event_init_context(struct task_struct *child, int ctxn) | |||
6494 | 6496 | ||
6495 | raw_spin_lock_irqsave(&parent_ctx->lock, flags); | 6497 | raw_spin_lock_irqsave(&parent_ctx->lock, flags); |
6496 | parent_ctx->rotate_disable = 0; | 6498 | parent_ctx->rotate_disable = 0; |
6497 | raw_spin_unlock_irqrestore(&parent_ctx->lock, flags); | ||
6498 | 6499 | ||
6499 | child_ctx = child->perf_event_ctxp[ctxn]; | 6500 | child_ctx = child->perf_event_ctxp[ctxn]; |
6500 | 6501 | ||
@@ -6502,12 +6503,11 @@ int perf_event_init_context(struct task_struct *child, int ctxn) | |||
6502 | /* | 6503 | /* |
6503 | * Mark the child context as a clone of the parent | 6504 | * Mark the child context as a clone of the parent |
6504 | * context, or of whatever the parent is a clone of. | 6505 | * context, or of whatever the parent is a clone of. |
6505 | * Note that if the parent is a clone, it could get | 6506 | * |
6506 | * uncloned at any point, but that doesn't matter | 6507 | * Note that if the parent is a clone, the holding of |
6507 | * because the list of events and the generation | 6508 | * parent_ctx->lock avoids it from being uncloned. |
6508 | * count can't have changed since we took the mutex. | ||
6509 | */ | 6509 | */ |
6510 | cloned_ctx = rcu_dereference(parent_ctx->parent_ctx); | 6510 | cloned_ctx = parent_ctx->parent_ctx; |
6511 | if (cloned_ctx) { | 6511 | if (cloned_ctx) { |
6512 | child_ctx->parent_ctx = cloned_ctx; | 6512 | child_ctx->parent_ctx = cloned_ctx; |
6513 | child_ctx->parent_gen = parent_ctx->parent_gen; | 6513 | child_ctx->parent_gen = parent_ctx->parent_gen; |
@@ -6518,6 +6518,7 @@ int perf_event_init_context(struct task_struct *child, int ctxn) | |||
6518 | get_ctx(child_ctx->parent_ctx); | 6518 | get_ctx(child_ctx->parent_ctx); |
6519 | } | 6519 | } |
6520 | 6520 | ||
6521 | raw_spin_unlock_irqrestore(&parent_ctx->lock, flags); | ||
6521 | mutex_unlock(&parent_ctx->mutex); | 6522 | mutex_unlock(&parent_ctx->mutex); |
6522 | 6523 | ||
6523 | perf_unpin_context(parent_ctx); | 6524 | perf_unpin_context(parent_ctx); |
diff --git a/net/batman-adv/main.h b/net/batman-adv/main.h index d4d9926c2201..65106fb61b8f 100644 --- a/net/batman-adv/main.h +++ b/net/batman-adv/main.h | |||
@@ -151,9 +151,9 @@ int debug_log(struct bat_priv *bat_priv, char *fmt, ...); | |||
151 | } \ | 151 | } \ |
152 | while (0) | 152 | while (0) |
153 | #else /* !CONFIG_BATMAN_ADV_DEBUG */ | 153 | #else /* !CONFIG_BATMAN_ADV_DEBUG */ |
154 | static inline void bat_dbg(char type __attribute__((unused)), | 154 | static inline void bat_dbg(char type __always_unused, |
155 | struct bat_priv *bat_priv __attribute__((unused)), | 155 | struct bat_priv *bat_priv __always_unused, |
156 | char *fmt __attribute__((unused)), ...) | 156 | char *fmt __always_unused, ...) |
157 | { | 157 | { |
158 | } | 158 | } |
159 | #endif | 159 | #endif |
diff --git a/net/batman-adv/packet.h b/net/batman-adv/packet.h index b49fdf70a6d5..2284e8129cb2 100644 --- a/net/batman-adv/packet.h +++ b/net/batman-adv/packet.h | |||
@@ -63,7 +63,7 @@ struct batman_packet { | |||
63 | uint8_t num_hna; | 63 | uint8_t num_hna; |
64 | uint8_t gw_flags; /* flags related to gateway class */ | 64 | uint8_t gw_flags; /* flags related to gateway class */ |
65 | uint8_t align; | 65 | uint8_t align; |
66 | } __attribute__((packed)); | 66 | } __packed; |
67 | 67 | ||
68 | #define BAT_PACKET_LEN sizeof(struct batman_packet) | 68 | #define BAT_PACKET_LEN sizeof(struct batman_packet) |
69 | 69 | ||
@@ -76,7 +76,7 @@ struct icmp_packet { | |||
76 | uint8_t orig[6]; | 76 | uint8_t orig[6]; |
77 | uint16_t seqno; | 77 | uint16_t seqno; |
78 | uint8_t uid; | 78 | uint8_t uid; |
79 | } __attribute__((packed)); | 79 | } __packed; |
80 | 80 | ||
81 | #define BAT_RR_LEN 16 | 81 | #define BAT_RR_LEN 16 |
82 | 82 | ||
@@ -93,14 +93,14 @@ struct icmp_packet_rr { | |||
93 | uint8_t uid; | 93 | uint8_t uid; |
94 | uint8_t rr_cur; | 94 | uint8_t rr_cur; |
95 | uint8_t rr[BAT_RR_LEN][ETH_ALEN]; | 95 | uint8_t rr[BAT_RR_LEN][ETH_ALEN]; |
96 | } __attribute__((packed)); | 96 | } __packed; |
97 | 97 | ||
98 | struct unicast_packet { | 98 | struct unicast_packet { |
99 | uint8_t packet_type; | 99 | uint8_t packet_type; |
100 | uint8_t version; /* batman version field */ | 100 | uint8_t version; /* batman version field */ |
101 | uint8_t dest[6]; | 101 | uint8_t dest[6]; |
102 | uint8_t ttl; | 102 | uint8_t ttl; |
103 | } __attribute__((packed)); | 103 | } __packed; |
104 | 104 | ||
105 | struct unicast_frag_packet { | 105 | struct unicast_frag_packet { |
106 | uint8_t packet_type; | 106 | uint8_t packet_type; |
@@ -110,7 +110,7 @@ struct unicast_frag_packet { | |||
110 | uint8_t flags; | 110 | uint8_t flags; |
111 | uint8_t orig[6]; | 111 | uint8_t orig[6]; |
112 | uint16_t seqno; | 112 | uint16_t seqno; |
113 | } __attribute__((packed)); | 113 | } __packed; |
114 | 114 | ||
115 | struct bcast_packet { | 115 | struct bcast_packet { |
116 | uint8_t packet_type; | 116 | uint8_t packet_type; |
@@ -118,7 +118,7 @@ struct bcast_packet { | |||
118 | uint8_t orig[6]; | 118 | uint8_t orig[6]; |
119 | uint8_t ttl; | 119 | uint8_t ttl; |
120 | uint32_t seqno; | 120 | uint32_t seqno; |
121 | } __attribute__((packed)); | 121 | } __packed; |
122 | 122 | ||
123 | struct vis_packet { | 123 | struct vis_packet { |
124 | uint8_t packet_type; | 124 | uint8_t packet_type; |
@@ -131,6 +131,6 @@ struct vis_packet { | |||
131 | * neighbors */ | 131 | * neighbors */ |
132 | uint8_t target_orig[6]; /* who should receive this packet */ | 132 | uint8_t target_orig[6]; /* who should receive this packet */ |
133 | uint8_t sender_orig[6]; /* who sent or rebroadcasted this packet */ | 133 | uint8_t sender_orig[6]; /* who sent or rebroadcasted this packet */ |
134 | } __attribute__((packed)); | 134 | } __packed; |
135 | 135 | ||
136 | #endif /* _NET_BATMAN_ADV_PACKET_H_ */ | 136 | #endif /* _NET_BATMAN_ADV_PACKET_H_ */ |
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h index 97cb23dd3e69..bf3f6f5a12c4 100644 --- a/net/batman-adv/types.h +++ b/net/batman-adv/types.h | |||
@@ -246,13 +246,13 @@ struct vis_info { | |||
246 | /* this packet might be part of the vis send queue. */ | 246 | /* this packet might be part of the vis send queue. */ |
247 | struct sk_buff *skb_packet; | 247 | struct sk_buff *skb_packet; |
248 | /* vis_info may follow here*/ | 248 | /* vis_info may follow here*/ |
249 | } __attribute__((packed)); | 249 | } __packed; |
250 | 250 | ||
251 | struct vis_info_entry { | 251 | struct vis_info_entry { |
252 | uint8_t src[ETH_ALEN]; | 252 | uint8_t src[ETH_ALEN]; |
253 | uint8_t dest[ETH_ALEN]; | 253 | uint8_t dest[ETH_ALEN]; |
254 | uint8_t quality; /* quality = 0 means HNA */ | 254 | uint8_t quality; /* quality = 0 means HNA */ |
255 | } __attribute__((packed)); | 255 | } __packed; |
256 | 256 | ||
257 | struct recvlist_node { | 257 | struct recvlist_node { |
258 | struct list_head list; | 258 | struct list_head list; |
diff --git a/net/batman-adv/unicast.c b/net/batman-adv/unicast.c index dc2e28bed844..ee41fef04b21 100644 --- a/net/batman-adv/unicast.c +++ b/net/batman-adv/unicast.c | |||
@@ -229,10 +229,12 @@ int frag_send_skb(struct sk_buff *skb, struct bat_priv *bat_priv, | |||
229 | if (!bat_priv->primary_if) | 229 | if (!bat_priv->primary_if) |
230 | goto dropped; | 230 | goto dropped; |
231 | 231 | ||
232 | unicast_packet = (struct unicast_packet *) skb->data; | 232 | frag_skb = dev_alloc_skb(data_len - (data_len / 2) + ucf_hdr_len); |
233 | if (!frag_skb) | ||
234 | goto dropped; | ||
233 | 235 | ||
236 | unicast_packet = (struct unicast_packet *) skb->data; | ||
234 | memcpy(&tmp_uc, unicast_packet, uc_hdr_len); | 237 | memcpy(&tmp_uc, unicast_packet, uc_hdr_len); |
235 | frag_skb = dev_alloc_skb(data_len - (data_len / 2) + ucf_hdr_len); | ||
236 | skb_split(skb, frag_skb, data_len / 2); | 238 | skb_split(skb, frag_skb, data_len / 2); |
237 | 239 | ||
238 | if (my_skb_head_push(skb, ucf_hdr_len - uc_hdr_len) < 0 || | 240 | if (my_skb_head_push(skb, ucf_hdr_len - uc_hdr_len) < 0 || |
diff --git a/net/caif/cfcnfg.c b/net/caif/cfcnfg.c index 21ede141018a..c665de778b60 100644 --- a/net/caif/cfcnfg.c +++ b/net/caif/cfcnfg.c | |||
@@ -191,6 +191,7 @@ int cfcnfg_disconn_adapt_layer(struct cfcnfg *cnfg, struct cflayer *adap_layer) | |||
191 | struct cflayer *servl = NULL; | 191 | struct cflayer *servl = NULL; |
192 | struct cfcnfg_phyinfo *phyinfo = NULL; | 192 | struct cfcnfg_phyinfo *phyinfo = NULL; |
193 | u8 phyid = 0; | 193 | u8 phyid = 0; |
194 | |||
194 | caif_assert(adap_layer != NULL); | 195 | caif_assert(adap_layer != NULL); |
195 | channel_id = adap_layer->id; | 196 | channel_id = adap_layer->id; |
196 | if (adap_layer->dn == NULL || channel_id == 0) { | 197 | if (adap_layer->dn == NULL || channel_id == 0) { |
@@ -199,16 +200,16 @@ int cfcnfg_disconn_adapt_layer(struct cfcnfg *cnfg, struct cflayer *adap_layer) | |||
199 | goto end; | 200 | goto end; |
200 | } | 201 | } |
201 | servl = cfmuxl_remove_uplayer(cnfg->mux, channel_id); | 202 | servl = cfmuxl_remove_uplayer(cnfg->mux, channel_id); |
202 | if (servl == NULL) | ||
203 | goto end; | ||
204 | layer_set_up(servl, NULL); | ||
205 | ret = cfctrl_linkdown_req(cnfg->ctrl, channel_id, adap_layer); | ||
206 | if (servl == NULL) { | 203 | if (servl == NULL) { |
207 | pr_err("PROTOCOL ERROR - Error removing service_layer Channel_Id(%d)", | 204 | pr_err("PROTOCOL ERROR - Error removing service_layer Channel_Id(%d)", |
208 | channel_id); | 205 | channel_id); |
209 | ret = -EINVAL; | 206 | ret = -EINVAL; |
210 | goto end; | 207 | goto end; |
211 | } | 208 | } |
209 | layer_set_up(servl, NULL); | ||
210 | ret = cfctrl_linkdown_req(cnfg->ctrl, channel_id, adap_layer); | ||
211 | if (ret) | ||
212 | goto end; | ||
212 | caif_assert(channel_id == servl->id); | 213 | caif_assert(channel_id == servl->id); |
213 | if (adap_layer->dn != NULL) { | 214 | if (adap_layer->dn != NULL) { |
214 | phyid = cfsrvl_getphyid(adap_layer->dn); | 215 | phyid = cfsrvl_getphyid(adap_layer->dn); |
diff --git a/net/can/bcm.c b/net/can/bcm.c index 9d5e8accfab1..092dc88a7c64 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c | |||
@@ -1256,6 +1256,9 @@ static int bcm_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
1256 | struct sockaddr_can *addr = | 1256 | struct sockaddr_can *addr = |
1257 | (struct sockaddr_can *)msg->msg_name; | 1257 | (struct sockaddr_can *)msg->msg_name; |
1258 | 1258 | ||
1259 | if (msg->msg_namelen < sizeof(*addr)) | ||
1260 | return -EINVAL; | ||
1261 | |||
1259 | if (addr->can_family != AF_CAN) | 1262 | if (addr->can_family != AF_CAN) |
1260 | return -EINVAL; | 1263 | return -EINVAL; |
1261 | 1264 | ||
diff --git a/net/can/raw.c b/net/can/raw.c index e88f610fdb7b..883e9d74fddf 100644 --- a/net/can/raw.c +++ b/net/can/raw.c | |||
@@ -649,6 +649,9 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
649 | struct sockaddr_can *addr = | 649 | struct sockaddr_can *addr = |
650 | (struct sockaddr_can *)msg->msg_name; | 650 | (struct sockaddr_can *)msg->msg_name; |
651 | 651 | ||
652 | if (msg->msg_namelen < sizeof(*addr)) | ||
653 | return -EINVAL; | ||
654 | |||
652 | if (addr->can_family != AF_CAN) | 655 | if (addr->can_family != AF_CAN) |
653 | return -EINVAL; | 656 | return -EINVAL; |
654 | 657 | ||
diff --git a/net/core/dev.c b/net/core/dev.c index 54277df0f735..7c6a46f80372 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2001,7 +2001,7 @@ static bool can_checksum_protocol(unsigned long features, __be16 protocol) | |||
2001 | 2001 | ||
2002 | static int harmonize_features(struct sk_buff *skb, __be16 protocol, int features) | 2002 | static int harmonize_features(struct sk_buff *skb, __be16 protocol, int features) |
2003 | { | 2003 | { |
2004 | if (!can_checksum_protocol(protocol, features)) { | 2004 | if (!can_checksum_protocol(features, protocol)) { |
2005 | features &= ~NETIF_F_ALL_CSUM; | 2005 | features &= ~NETIF_F_ALL_CSUM; |
2006 | features &= ~NETIF_F_SG; | 2006 | features &= ~NETIF_F_SG; |
2007 | } else if (illegal_highdma(skb->dev, skb)) { | 2007 | } else if (illegal_highdma(skb->dev, skb)) { |
@@ -2023,13 +2023,13 @@ int netif_skb_features(struct sk_buff *skb) | |||
2023 | return harmonize_features(skb, protocol, features); | 2023 | return harmonize_features(skb, protocol, features); |
2024 | } | 2024 | } |
2025 | 2025 | ||
2026 | features &= skb->dev->vlan_features; | 2026 | features &= (skb->dev->vlan_features | NETIF_F_HW_VLAN_TX); |
2027 | 2027 | ||
2028 | if (protocol != htons(ETH_P_8021Q)) { | 2028 | if (protocol != htons(ETH_P_8021Q)) { |
2029 | return harmonize_features(skb, protocol, features); | 2029 | return harmonize_features(skb, protocol, features); |
2030 | } else { | 2030 | } else { |
2031 | features &= NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | | 2031 | features &= NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | |
2032 | NETIF_F_GEN_CSUM; | 2032 | NETIF_F_GEN_CSUM | NETIF_F_HW_VLAN_TX; |
2033 | return harmonize_features(skb, protocol, features); | 2033 | return harmonize_features(skb, protocol, features); |
2034 | } | 2034 | } |
2035 | } | 2035 | } |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index a5f7535aab5b..750db57f3bb3 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -1820,7 +1820,7 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
1820 | if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) | 1820 | if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) |
1821 | return -EPERM; | 1821 | return -EPERM; |
1822 | 1822 | ||
1823 | if (kind == 2 && (nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { | 1823 | if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { |
1824 | struct sock *rtnl; | 1824 | struct sock *rtnl; |
1825 | rtnl_dumpit_func dumpit; | 1825 | rtnl_dumpit_func dumpit; |
1826 | 1826 | ||
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index 2746c1fa6417..2ada17129fce 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c | |||
@@ -858,7 +858,7 @@ static int inet_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
858 | nlmsg_len(nlh) < hdrlen) | 858 | nlmsg_len(nlh) < hdrlen) |
859 | return -EINVAL; | 859 | return -EINVAL; |
860 | 860 | ||
861 | if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { | 861 | if (nlh->nlmsg_flags & NLM_F_DUMP) { |
862 | if (nlmsg_attrlen(nlh, hdrlen)) { | 862 | if (nlmsg_attrlen(nlh, hdrlen)) { |
863 | struct nlattr *attr; | 863 | struct nlattr *attr; |
864 | 864 | ||
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 5b189c97c2fc..24a1cf110d80 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -420,9 +420,6 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev) | |||
420 | dev->type == ARPHRD_TUNNEL6 || | 420 | dev->type == ARPHRD_TUNNEL6 || |
421 | dev->type == ARPHRD_SIT || | 421 | dev->type == ARPHRD_SIT || |
422 | dev->type == ARPHRD_NONE) { | 422 | dev->type == ARPHRD_NONE) { |
423 | printk(KERN_INFO | ||
424 | "%s: Disabled Privacy Extensions\n", | ||
425 | dev->name); | ||
426 | ndev->cnf.use_tempaddr = -1; | 423 | ndev->cnf.use_tempaddr = -1; |
427 | } else { | 424 | } else { |
428 | in6_dev_hold(ndev); | 425 | in6_dev_hold(ndev); |
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c index f138b195d657..227ca82eef72 100644 --- a/net/mac80211/agg-rx.c +++ b/net/mac80211/agg-rx.c | |||
@@ -185,8 +185,6 @@ void ieee80211_process_addba_request(struct ieee80211_local *local, | |||
185 | struct ieee80211_mgmt *mgmt, | 185 | struct ieee80211_mgmt *mgmt, |
186 | size_t len) | 186 | size_t len) |
187 | { | 187 | { |
188 | struct ieee80211_hw *hw = &local->hw; | ||
189 | struct ieee80211_conf *conf = &hw->conf; | ||
190 | struct tid_ampdu_rx *tid_agg_rx; | 188 | struct tid_ampdu_rx *tid_agg_rx; |
191 | u16 capab, tid, timeout, ba_policy, buf_size, start_seq_num, status; | 189 | u16 capab, tid, timeout, ba_policy, buf_size, start_seq_num, status; |
192 | u8 dialog_token; | 190 | u8 dialog_token; |
@@ -231,13 +229,8 @@ void ieee80211_process_addba_request(struct ieee80211_local *local, | |||
231 | goto end_no_lock; | 229 | goto end_no_lock; |
232 | } | 230 | } |
233 | /* determine default buffer size */ | 231 | /* determine default buffer size */ |
234 | if (buf_size == 0) { | 232 | if (buf_size == 0) |
235 | struct ieee80211_supported_band *sband; | 233 | buf_size = IEEE80211_MAX_AMPDU_BUF; |
236 | |||
237 | sband = local->hw.wiphy->bands[conf->channel->band]; | ||
238 | buf_size = IEEE80211_MIN_AMPDU_BUF; | ||
239 | buf_size = buf_size << sband->ht_cap.ampdu_factor; | ||
240 | } | ||
241 | 234 | ||
242 | 235 | ||
243 | /* examine state machine */ | 236 | /* examine state machine */ |
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 485d36bc9a46..a46ff06d7cb8 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
@@ -39,6 +39,8 @@ module_param(ieee80211_disable_40mhz_24ghz, bool, 0644); | |||
39 | MODULE_PARM_DESC(ieee80211_disable_40mhz_24ghz, | 39 | MODULE_PARM_DESC(ieee80211_disable_40mhz_24ghz, |
40 | "Disable 40MHz support in the 2.4GHz band"); | 40 | "Disable 40MHz support in the 2.4GHz band"); |
41 | 41 | ||
42 | static struct lock_class_key ieee80211_rx_skb_queue_class; | ||
43 | |||
42 | void ieee80211_configure_filter(struct ieee80211_local *local) | 44 | void ieee80211_configure_filter(struct ieee80211_local *local) |
43 | { | 45 | { |
44 | u64 mc; | 46 | u64 mc; |
@@ -569,7 +571,15 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len, | |||
569 | spin_lock_init(&local->filter_lock); | 571 | spin_lock_init(&local->filter_lock); |
570 | spin_lock_init(&local->queue_stop_reason_lock); | 572 | spin_lock_init(&local->queue_stop_reason_lock); |
571 | 573 | ||
572 | skb_queue_head_init(&local->rx_skb_queue); | 574 | /* |
575 | * The rx_skb_queue is only accessed from tasklets, | ||
576 | * but other SKB queues are used from within IRQ | ||
577 | * context. Therefore, this one needs a different | ||
578 | * locking class so our direct, non-irq-safe use of | ||
579 | * the queue's lock doesn't throw lockdep warnings. | ||
580 | */ | ||
581 | skb_queue_head_init_class(&local->rx_skb_queue, | ||
582 | &ieee80211_rx_skb_queue_class); | ||
573 | 583 | ||
574 | INIT_DELAYED_WORK(&local->scan_work, ieee80211_scan_work); | 584 | INIT_DELAYED_WORK(&local->scan_work, ieee80211_scan_work); |
575 | 585 | ||
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 2b7eef37875c..93297aaceb2b 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
@@ -924,7 +924,7 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb, | |||
924 | u16 zone; | 924 | u16 zone; |
925 | int err; | 925 | int err; |
926 | 926 | ||
927 | if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) | 927 | if (nlh->nlmsg_flags & NLM_F_DUMP) |
928 | return netlink_dump_start(ctnl, skb, nlh, ctnetlink_dump_table, | 928 | return netlink_dump_start(ctnl, skb, nlh, ctnetlink_dump_table, |
929 | ctnetlink_done); | 929 | ctnetlink_done); |
930 | 930 | ||
@@ -1787,7 +1787,7 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb, | |||
1787 | u16 zone; | 1787 | u16 zone; |
1788 | int err; | 1788 | int err; |
1789 | 1789 | ||
1790 | if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { | 1790 | if (nlh->nlmsg_flags & NLM_F_DUMP) { |
1791 | return netlink_dump_start(ctnl, skb, nlh, | 1791 | return netlink_dump_start(ctnl, skb, nlh, |
1792 | ctnetlink_exp_dump_table, | 1792 | ctnetlink_exp_dump_table, |
1793 | ctnetlink_exp_done); | 1793 | ctnetlink_exp_done); |
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c index f83cb370292b..1781d99145e2 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c | |||
@@ -519,7 +519,7 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
519 | security_netlink_recv(skb, CAP_NET_ADMIN)) | 519 | security_netlink_recv(skb, CAP_NET_ADMIN)) |
520 | return -EPERM; | 520 | return -EPERM; |
521 | 521 | ||
522 | if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { | 522 | if (nlh->nlmsg_flags & NLM_F_DUMP) { |
523 | if (ops->dumpit == NULL) | 523 | if (ops->dumpit == NULL) |
524 | return -EOPNOTSUPP; | 524 | return -EOPNOTSUPP; |
525 | 525 | ||
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index a09b0dd25f50..8e02550ff3e8 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -3428,7 +3428,7 @@ SCTP_STATIC int sctp_setsockopt(struct sock *sk, int level, int optname, | |||
3428 | retval = sctp_setsockopt_peer_addr_params(sk, optval, optlen); | 3428 | retval = sctp_setsockopt_peer_addr_params(sk, optval, optlen); |
3429 | break; | 3429 | break; |
3430 | 3430 | ||
3431 | case SCTP_DELAYED_ACK: | 3431 | case SCTP_DELAYED_SACK: |
3432 | retval = sctp_setsockopt_delayed_ack(sk, optval, optlen); | 3432 | retval = sctp_setsockopt_delayed_ack(sk, optval, optlen); |
3433 | break; | 3433 | break; |
3434 | case SCTP_PARTIAL_DELIVERY_POINT: | 3434 | case SCTP_PARTIAL_DELIVERY_POINT: |
@@ -5333,7 +5333,7 @@ SCTP_STATIC int sctp_getsockopt(struct sock *sk, int level, int optname, | |||
5333 | retval = sctp_getsockopt_peer_addr_params(sk, len, optval, | 5333 | retval = sctp_getsockopt_peer_addr_params(sk, len, optval, |
5334 | optlen); | 5334 | optlen); |
5335 | break; | 5335 | break; |
5336 | case SCTP_DELAYED_ACK: | 5336 | case SCTP_DELAYED_SACK: |
5337 | retval = sctp_getsockopt_delayed_ack(sk, len, optval, | 5337 | retval = sctp_getsockopt_delayed_ack(sk, len, optval, |
5338 | optlen); | 5338 | optlen); |
5339 | break; | 5339 | break; |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index d5e1e0b08890..61291965c5f6 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -2189,7 +2189,7 @@ static int xfrm_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
2189 | 2189 | ||
2190 | if ((type == (XFRM_MSG_GETSA - XFRM_MSG_BASE) || | 2190 | if ((type == (XFRM_MSG_GETSA - XFRM_MSG_BASE) || |
2191 | type == (XFRM_MSG_GETPOLICY - XFRM_MSG_BASE)) && | 2191 | type == (XFRM_MSG_GETPOLICY - XFRM_MSG_BASE)) && |
2192 | (nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { | 2192 | (nlh->nlmsg_flags & NLM_F_DUMP)) { |
2193 | if (link->dump == NULL) | 2193 | if (link->dump == NULL) |
2194 | return -EINVAL; | 2194 | return -EINVAL; |
2195 | 2195 | ||
diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c index 0fc614ce16c1..cb62d178b3e0 100644 --- a/sound/pci/ac97/ac97_codec.c +++ b/sound/pci/ac97/ac97_codec.c | |||
@@ -1961,7 +1961,7 @@ static int snd_ac97_dev_disconnect(struct snd_device *device) | |||
1961 | } | 1961 | } |
1962 | 1962 | ||
1963 | /* build_ops to do nothing */ | 1963 | /* build_ops to do nothing */ |
1964 | static struct snd_ac97_build_ops null_build_ops; | 1964 | static const struct snd_ac97_build_ops null_build_ops; |
1965 | 1965 | ||
1966 | #ifdef CONFIG_SND_AC97_POWER_SAVE | 1966 | #ifdef CONFIG_SND_AC97_POWER_SAVE |
1967 | static void do_update_power(struct work_struct *work) | 1967 | static void do_update_power(struct work_struct *work) |
diff --git a/sound/pci/ac97/ac97_patch.c b/sound/pci/ac97/ac97_patch.c index e68c98ef4041..bf47574ca1f0 100644 --- a/sound/pci/ac97/ac97_patch.c +++ b/sound/pci/ac97/ac97_patch.c | |||
@@ -371,7 +371,7 @@ static int patch_yamaha_ymf743_build_spdif(struct snd_ac97 *ac97) | |||
371 | return 0; | 371 | return 0; |
372 | } | 372 | } |
373 | 373 | ||
374 | static struct snd_ac97_build_ops patch_yamaha_ymf743_ops = { | 374 | static const struct snd_ac97_build_ops patch_yamaha_ymf743_ops = { |
375 | .build_spdif = patch_yamaha_ymf743_build_spdif, | 375 | .build_spdif = patch_yamaha_ymf743_build_spdif, |
376 | .build_3d = patch_yamaha_ymf7x3_3d, | 376 | .build_3d = patch_yamaha_ymf7x3_3d, |
377 | }; | 377 | }; |
@@ -455,7 +455,7 @@ static int patch_yamaha_ymf753_post_spdif(struct snd_ac97 * ac97) | |||
455 | return 0; | 455 | return 0; |
456 | } | 456 | } |
457 | 457 | ||
458 | static struct snd_ac97_build_ops patch_yamaha_ymf753_ops = { | 458 | static const struct snd_ac97_build_ops patch_yamaha_ymf753_ops = { |
459 | .build_3d = patch_yamaha_ymf7x3_3d, | 459 | .build_3d = patch_yamaha_ymf7x3_3d, |
460 | .build_post_spdif = patch_yamaha_ymf753_post_spdif | 460 | .build_post_spdif = patch_yamaha_ymf753_post_spdif |
461 | }; | 461 | }; |
@@ -502,7 +502,7 @@ static int patch_wolfson_wm9703_specific(struct snd_ac97 * ac97) | |||
502 | return 0; | 502 | return 0; |
503 | } | 503 | } |
504 | 504 | ||
505 | static struct snd_ac97_build_ops patch_wolfson_wm9703_ops = { | 505 | static const struct snd_ac97_build_ops patch_wolfson_wm9703_ops = { |
506 | .build_specific = patch_wolfson_wm9703_specific, | 506 | .build_specific = patch_wolfson_wm9703_specific, |
507 | }; | 507 | }; |
508 | 508 | ||
@@ -533,7 +533,7 @@ static int patch_wolfson_wm9704_specific(struct snd_ac97 * ac97) | |||
533 | return 0; | 533 | return 0; |
534 | } | 534 | } |
535 | 535 | ||
536 | static struct snd_ac97_build_ops patch_wolfson_wm9704_ops = { | 536 | static const struct snd_ac97_build_ops patch_wolfson_wm9704_ops = { |
537 | .build_specific = patch_wolfson_wm9704_specific, | 537 | .build_specific = patch_wolfson_wm9704_specific, |
538 | }; | 538 | }; |
539 | 539 | ||
@@ -677,7 +677,7 @@ static int patch_wolfson_wm9711_specific(struct snd_ac97 * ac97) | |||
677 | return 0; | 677 | return 0; |
678 | } | 678 | } |
679 | 679 | ||
680 | static struct snd_ac97_build_ops patch_wolfson_wm9711_ops = { | 680 | static const struct snd_ac97_build_ops patch_wolfson_wm9711_ops = { |
681 | .build_specific = patch_wolfson_wm9711_specific, | 681 | .build_specific = patch_wolfson_wm9711_specific, |
682 | }; | 682 | }; |
683 | 683 | ||
@@ -871,7 +871,7 @@ static void patch_wolfson_wm9713_resume (struct snd_ac97 * ac97) | |||
871 | } | 871 | } |
872 | #endif | 872 | #endif |
873 | 873 | ||
874 | static struct snd_ac97_build_ops patch_wolfson_wm9713_ops = { | 874 | static const struct snd_ac97_build_ops patch_wolfson_wm9713_ops = { |
875 | .build_specific = patch_wolfson_wm9713_specific, | 875 | .build_specific = patch_wolfson_wm9713_specific, |
876 | .build_3d = patch_wolfson_wm9713_3d, | 876 | .build_3d = patch_wolfson_wm9713_3d, |
877 | #ifdef CONFIG_PM | 877 | #ifdef CONFIG_PM |
@@ -976,7 +976,7 @@ static int patch_sigmatel_stac97xx_specific(struct snd_ac97 * ac97) | |||
976 | return 0; | 976 | return 0; |
977 | } | 977 | } |
978 | 978 | ||
979 | static struct snd_ac97_build_ops patch_sigmatel_stac9700_ops = { | 979 | static const struct snd_ac97_build_ops patch_sigmatel_stac9700_ops = { |
980 | .build_3d = patch_sigmatel_stac9700_3d, | 980 | .build_3d = patch_sigmatel_stac9700_3d, |
981 | .build_specific = patch_sigmatel_stac97xx_specific | 981 | .build_specific = patch_sigmatel_stac97xx_specific |
982 | }; | 982 | }; |
@@ -1023,7 +1023,7 @@ static int patch_sigmatel_stac9708_specific(struct snd_ac97 *ac97) | |||
1023 | return patch_sigmatel_stac97xx_specific(ac97); | 1023 | return patch_sigmatel_stac97xx_specific(ac97); |
1024 | } | 1024 | } |
1025 | 1025 | ||
1026 | static struct snd_ac97_build_ops patch_sigmatel_stac9708_ops = { | 1026 | static const struct snd_ac97_build_ops patch_sigmatel_stac9708_ops = { |
1027 | .build_3d = patch_sigmatel_stac9708_3d, | 1027 | .build_3d = patch_sigmatel_stac9708_3d, |
1028 | .build_specific = patch_sigmatel_stac9708_specific | 1028 | .build_specific = patch_sigmatel_stac9708_specific |
1029 | }; | 1029 | }; |
@@ -1252,7 +1252,7 @@ static int patch_sigmatel_stac9758_specific(struct snd_ac97 *ac97) | |||
1252 | return 0; | 1252 | return 0; |
1253 | } | 1253 | } |
1254 | 1254 | ||
1255 | static struct snd_ac97_build_ops patch_sigmatel_stac9758_ops = { | 1255 | static const struct snd_ac97_build_ops patch_sigmatel_stac9758_ops = { |
1256 | .build_3d = patch_sigmatel_stac9700_3d, | 1256 | .build_3d = patch_sigmatel_stac9700_3d, |
1257 | .build_specific = patch_sigmatel_stac9758_specific | 1257 | .build_specific = patch_sigmatel_stac9758_specific |
1258 | }; | 1258 | }; |
@@ -1327,7 +1327,7 @@ static int patch_cirrus_build_spdif(struct snd_ac97 * ac97) | |||
1327 | return 0; | 1327 | return 0; |
1328 | } | 1328 | } |
1329 | 1329 | ||
1330 | static struct snd_ac97_build_ops patch_cirrus_ops = { | 1330 | static const struct snd_ac97_build_ops patch_cirrus_ops = { |
1331 | .build_spdif = patch_cirrus_build_spdif | 1331 | .build_spdif = patch_cirrus_build_spdif |
1332 | }; | 1332 | }; |
1333 | 1333 | ||
@@ -1384,7 +1384,7 @@ static int patch_conexant_build_spdif(struct snd_ac97 * ac97) | |||
1384 | return 0; | 1384 | return 0; |
1385 | } | 1385 | } |
1386 | 1386 | ||
1387 | static struct snd_ac97_build_ops patch_conexant_ops = { | 1387 | static const struct snd_ac97_build_ops patch_conexant_ops = { |
1388 | .build_spdif = patch_conexant_build_spdif | 1388 | .build_spdif = patch_conexant_build_spdif |
1389 | }; | 1389 | }; |
1390 | 1390 | ||
@@ -1560,7 +1560,7 @@ static void patch_ad1881_chained(struct snd_ac97 * ac97, int unchained_idx, int | |||
1560 | } | 1560 | } |
1561 | } | 1561 | } |
1562 | 1562 | ||
1563 | static struct snd_ac97_build_ops patch_ad1881_build_ops = { | 1563 | static const struct snd_ac97_build_ops patch_ad1881_build_ops = { |
1564 | #ifdef CONFIG_PM | 1564 | #ifdef CONFIG_PM |
1565 | .resume = ad18xx_resume | 1565 | .resume = ad18xx_resume |
1566 | #endif | 1566 | #endif |
@@ -1647,7 +1647,7 @@ static int patch_ad1885_specific(struct snd_ac97 * ac97) | |||
1647 | return 0; | 1647 | return 0; |
1648 | } | 1648 | } |
1649 | 1649 | ||
1650 | static struct snd_ac97_build_ops patch_ad1885_build_ops = { | 1650 | static const struct snd_ac97_build_ops patch_ad1885_build_ops = { |
1651 | .build_specific = &patch_ad1885_specific, | 1651 | .build_specific = &patch_ad1885_specific, |
1652 | #ifdef CONFIG_PM | 1652 | #ifdef CONFIG_PM |
1653 | .resume = ad18xx_resume | 1653 | .resume = ad18xx_resume |
@@ -1674,7 +1674,7 @@ static int patch_ad1886_specific(struct snd_ac97 * ac97) | |||
1674 | return 0; | 1674 | return 0; |
1675 | } | 1675 | } |
1676 | 1676 | ||
1677 | static struct snd_ac97_build_ops patch_ad1886_build_ops = { | 1677 | static const struct snd_ac97_build_ops patch_ad1886_build_ops = { |
1678 | .build_specific = &patch_ad1886_specific, | 1678 | .build_specific = &patch_ad1886_specific, |
1679 | #ifdef CONFIG_PM | 1679 | #ifdef CONFIG_PM |
1680 | .resume = ad18xx_resume | 1680 | .resume = ad18xx_resume |
@@ -1881,7 +1881,7 @@ static int patch_ad1981a_specific(struct snd_ac97 * ac97) | |||
1881 | ARRAY_SIZE(snd_ac97_ad1981x_jack_sense)); | 1881 | ARRAY_SIZE(snd_ac97_ad1981x_jack_sense)); |
1882 | } | 1882 | } |
1883 | 1883 | ||
1884 | static struct snd_ac97_build_ops patch_ad1981a_build_ops = { | 1884 | static const struct snd_ac97_build_ops patch_ad1981a_build_ops = { |
1885 | .build_post_spdif = patch_ad198x_post_spdif, | 1885 | .build_post_spdif = patch_ad198x_post_spdif, |
1886 | .build_specific = patch_ad1981a_specific, | 1886 | .build_specific = patch_ad1981a_specific, |
1887 | #ifdef CONFIG_PM | 1887 | #ifdef CONFIG_PM |
@@ -1936,7 +1936,7 @@ static int patch_ad1981b_specific(struct snd_ac97 *ac97) | |||
1936 | ARRAY_SIZE(snd_ac97_ad1981x_jack_sense)); | 1936 | ARRAY_SIZE(snd_ac97_ad1981x_jack_sense)); |
1937 | } | 1937 | } |
1938 | 1938 | ||
1939 | static struct snd_ac97_build_ops patch_ad1981b_build_ops = { | 1939 | static const struct snd_ac97_build_ops patch_ad1981b_build_ops = { |
1940 | .build_post_spdif = patch_ad198x_post_spdif, | 1940 | .build_post_spdif = patch_ad198x_post_spdif, |
1941 | .build_specific = patch_ad1981b_specific, | 1941 | .build_specific = patch_ad1981b_specific, |
1942 | #ifdef CONFIG_PM | 1942 | #ifdef CONFIG_PM |
@@ -2075,7 +2075,7 @@ static int patch_ad1888_specific(struct snd_ac97 *ac97) | |||
2075 | return patch_build_controls(ac97, snd_ac97_ad1888_controls, ARRAY_SIZE(snd_ac97_ad1888_controls)); | 2075 | return patch_build_controls(ac97, snd_ac97_ad1888_controls, ARRAY_SIZE(snd_ac97_ad1888_controls)); |
2076 | } | 2076 | } |
2077 | 2077 | ||
2078 | static struct snd_ac97_build_ops patch_ad1888_build_ops = { | 2078 | static const struct snd_ac97_build_ops patch_ad1888_build_ops = { |
2079 | .build_post_spdif = patch_ad198x_post_spdif, | 2079 | .build_post_spdif = patch_ad198x_post_spdif, |
2080 | .build_specific = patch_ad1888_specific, | 2080 | .build_specific = patch_ad1888_specific, |
2081 | #ifdef CONFIG_PM | 2081 | #ifdef CONFIG_PM |
@@ -2124,7 +2124,7 @@ static int patch_ad1980_specific(struct snd_ac97 *ac97) | |||
2124 | return patch_build_controls(ac97, &snd_ac97_ad198x_2cmic, 1); | 2124 | return patch_build_controls(ac97, &snd_ac97_ad198x_2cmic, 1); |
2125 | } | 2125 | } |
2126 | 2126 | ||
2127 | static struct snd_ac97_build_ops patch_ad1980_build_ops = { | 2127 | static const struct snd_ac97_build_ops patch_ad1980_build_ops = { |
2128 | .build_post_spdif = patch_ad198x_post_spdif, | 2128 | .build_post_spdif = patch_ad198x_post_spdif, |
2129 | .build_specific = patch_ad1980_specific, | 2129 | .build_specific = patch_ad1980_specific, |
2130 | #ifdef CONFIG_PM | 2130 | #ifdef CONFIG_PM |
@@ -2239,7 +2239,7 @@ static int patch_ad1985_specific(struct snd_ac97 *ac97) | |||
2239 | ARRAY_SIZE(snd_ac97_ad1985_controls)); | 2239 | ARRAY_SIZE(snd_ac97_ad1985_controls)); |
2240 | } | 2240 | } |
2241 | 2241 | ||
2242 | static struct snd_ac97_build_ops patch_ad1985_build_ops = { | 2242 | static const struct snd_ac97_build_ops patch_ad1985_build_ops = { |
2243 | .build_post_spdif = patch_ad198x_post_spdif, | 2243 | .build_post_spdif = patch_ad198x_post_spdif, |
2244 | .build_specific = patch_ad1985_specific, | 2244 | .build_specific = patch_ad1985_specific, |
2245 | #ifdef CONFIG_PM | 2245 | #ifdef CONFIG_PM |
@@ -2531,7 +2531,7 @@ static int patch_ad1986_specific(struct snd_ac97 *ac97) | |||
2531 | ARRAY_SIZE(snd_ac97_ad1985_controls)); | 2531 | ARRAY_SIZE(snd_ac97_ad1985_controls)); |
2532 | } | 2532 | } |
2533 | 2533 | ||
2534 | static struct snd_ac97_build_ops patch_ad1986_build_ops = { | 2534 | static const struct snd_ac97_build_ops patch_ad1986_build_ops = { |
2535 | .build_post_spdif = patch_ad198x_post_spdif, | 2535 | .build_post_spdif = patch_ad198x_post_spdif, |
2536 | .build_specific = patch_ad1986_specific, | 2536 | .build_specific = patch_ad1986_specific, |
2537 | #ifdef CONFIG_PM | 2537 | #ifdef CONFIG_PM |
@@ -2636,7 +2636,7 @@ static int patch_alc650_specific(struct snd_ac97 * ac97) | |||
2636 | return 0; | 2636 | return 0; |
2637 | } | 2637 | } |
2638 | 2638 | ||
2639 | static struct snd_ac97_build_ops patch_alc650_ops = { | 2639 | static const struct snd_ac97_build_ops patch_alc650_ops = { |
2640 | .build_specific = patch_alc650_specific, | 2640 | .build_specific = patch_alc650_specific, |
2641 | .update_jacks = alc650_update_jacks | 2641 | .update_jacks = alc650_update_jacks |
2642 | }; | 2642 | }; |
@@ -2788,7 +2788,7 @@ static int patch_alc655_specific(struct snd_ac97 * ac97) | |||
2788 | return 0; | 2788 | return 0; |
2789 | } | 2789 | } |
2790 | 2790 | ||
2791 | static struct snd_ac97_build_ops patch_alc655_ops = { | 2791 | static const struct snd_ac97_build_ops patch_alc655_ops = { |
2792 | .build_specific = patch_alc655_specific, | 2792 | .build_specific = patch_alc655_specific, |
2793 | .update_jacks = alc655_update_jacks | 2793 | .update_jacks = alc655_update_jacks |
2794 | }; | 2794 | }; |
@@ -2900,7 +2900,7 @@ static int patch_alc850_specific(struct snd_ac97 *ac97) | |||
2900 | return 0; | 2900 | return 0; |
2901 | } | 2901 | } |
2902 | 2902 | ||
2903 | static struct snd_ac97_build_ops patch_alc850_ops = { | 2903 | static const struct snd_ac97_build_ops patch_alc850_ops = { |
2904 | .build_specific = patch_alc850_specific, | 2904 | .build_specific = patch_alc850_specific, |
2905 | .update_jacks = alc850_update_jacks | 2905 | .update_jacks = alc850_update_jacks |
2906 | }; | 2906 | }; |
@@ -2962,7 +2962,7 @@ static int patch_cm9738_specific(struct snd_ac97 * ac97) | |||
2962 | return patch_build_controls(ac97, snd_ac97_cm9738_controls, ARRAY_SIZE(snd_ac97_cm9738_controls)); | 2962 | return patch_build_controls(ac97, snd_ac97_cm9738_controls, ARRAY_SIZE(snd_ac97_cm9738_controls)); |
2963 | } | 2963 | } |
2964 | 2964 | ||
2965 | static struct snd_ac97_build_ops patch_cm9738_ops = { | 2965 | static const struct snd_ac97_build_ops patch_cm9738_ops = { |
2966 | .build_specific = patch_cm9738_specific, | 2966 | .build_specific = patch_cm9738_specific, |
2967 | .update_jacks = cm9738_update_jacks | 2967 | .update_jacks = cm9738_update_jacks |
2968 | }; | 2968 | }; |
@@ -3053,7 +3053,7 @@ static int patch_cm9739_post_spdif(struct snd_ac97 * ac97) | |||
3053 | return patch_build_controls(ac97, snd_ac97_cm9739_controls_spdif, ARRAY_SIZE(snd_ac97_cm9739_controls_spdif)); | 3053 | return patch_build_controls(ac97, snd_ac97_cm9739_controls_spdif, ARRAY_SIZE(snd_ac97_cm9739_controls_spdif)); |
3054 | } | 3054 | } |
3055 | 3055 | ||
3056 | static struct snd_ac97_build_ops patch_cm9739_ops = { | 3056 | static const struct snd_ac97_build_ops patch_cm9739_ops = { |
3057 | .build_specific = patch_cm9739_specific, | 3057 | .build_specific = patch_cm9739_specific, |
3058 | .build_post_spdif = patch_cm9739_post_spdif, | 3058 | .build_post_spdif = patch_cm9739_post_spdif, |
3059 | .update_jacks = cm9739_update_jacks | 3059 | .update_jacks = cm9739_update_jacks |
@@ -3227,7 +3227,7 @@ static int patch_cm9761_specific(struct snd_ac97 * ac97) | |||
3227 | return patch_build_controls(ac97, snd_ac97_cm9761_controls, ARRAY_SIZE(snd_ac97_cm9761_controls)); | 3227 | return patch_build_controls(ac97, snd_ac97_cm9761_controls, ARRAY_SIZE(snd_ac97_cm9761_controls)); |
3228 | } | 3228 | } |
3229 | 3229 | ||
3230 | static struct snd_ac97_build_ops patch_cm9761_ops = { | 3230 | static const struct snd_ac97_build_ops patch_cm9761_ops = { |
3231 | .build_specific = patch_cm9761_specific, | 3231 | .build_specific = patch_cm9761_specific, |
3232 | .build_post_spdif = patch_cm9761_post_spdif, | 3232 | .build_post_spdif = patch_cm9761_post_spdif, |
3233 | .update_jacks = cm9761_update_jacks | 3233 | .update_jacks = cm9761_update_jacks |
@@ -3323,7 +3323,7 @@ static int patch_cm9780_specific(struct snd_ac97 *ac97) | |||
3323 | return patch_build_controls(ac97, cm9780_controls, ARRAY_SIZE(cm9780_controls)); | 3323 | return patch_build_controls(ac97, cm9780_controls, ARRAY_SIZE(cm9780_controls)); |
3324 | } | 3324 | } |
3325 | 3325 | ||
3326 | static struct snd_ac97_build_ops patch_cm9780_ops = { | 3326 | static const struct snd_ac97_build_ops patch_cm9780_ops = { |
3327 | .build_specific = patch_cm9780_specific, | 3327 | .build_specific = patch_cm9780_specific, |
3328 | .build_post_spdif = patch_cm9761_post_spdif /* identical with CM9761 */ | 3328 | .build_post_spdif = patch_cm9761_post_spdif /* identical with CM9761 */ |
3329 | }; | 3329 | }; |
@@ -3443,7 +3443,7 @@ static int patch_vt1616_specific(struct snd_ac97 * ac97) | |||
3443 | return 0; | 3443 | return 0; |
3444 | } | 3444 | } |
3445 | 3445 | ||
3446 | static struct snd_ac97_build_ops patch_vt1616_ops = { | 3446 | static const struct snd_ac97_build_ops patch_vt1616_ops = { |
3447 | .build_specific = patch_vt1616_specific | 3447 | .build_specific = patch_vt1616_specific |
3448 | }; | 3448 | }; |
3449 | 3449 | ||
@@ -3797,7 +3797,7 @@ static int patch_it2646_specific(struct snd_ac97 * ac97) | |||
3797 | return 0; | 3797 | return 0; |
3798 | } | 3798 | } |
3799 | 3799 | ||
3800 | static struct snd_ac97_build_ops patch_it2646_ops = { | 3800 | static const struct snd_ac97_build_ops patch_it2646_ops = { |
3801 | .build_specific = patch_it2646_specific, | 3801 | .build_specific = patch_it2646_specific, |
3802 | .update_jacks = it2646_update_jacks | 3802 | .update_jacks = it2646_update_jacks |
3803 | }; | 3803 | }; |
@@ -3831,7 +3831,7 @@ static int patch_si3036_specific(struct snd_ac97 * ac97) | |||
3831 | return 0; | 3831 | return 0; |
3832 | } | 3832 | } |
3833 | 3833 | ||
3834 | static struct snd_ac97_build_ops patch_si3036_ops = { | 3834 | static const struct snd_ac97_build_ops patch_si3036_ops = { |
3835 | .build_specific = patch_si3036_specific, | 3835 | .build_specific = patch_si3036_specific, |
3836 | }; | 3836 | }; |
3837 | 3837 | ||
@@ -3898,7 +3898,7 @@ static int patch_ucb1400_specific(struct snd_ac97 * ac97) | |||
3898 | return 0; | 3898 | return 0; |
3899 | } | 3899 | } |
3900 | 3900 | ||
3901 | static struct snd_ac97_build_ops patch_ucb1400_ops = { | 3901 | static const struct snd_ac97_build_ops patch_ucb1400_ops = { |
3902 | .build_specific = patch_ucb1400_specific, | 3902 | .build_specific = patch_ucb1400_specific, |
3903 | }; | 3903 | }; |
3904 | 3904 | ||
diff --git a/sound/pci/au88x0/au88x0_pcm.c b/sound/pci/au88x0/au88x0_pcm.c index b9d2f202cf9b..5439d662d104 100644 --- a/sound/pci/au88x0/au88x0_pcm.c +++ b/sound/pci/au88x0/au88x0_pcm.c | |||
@@ -42,11 +42,7 @@ static struct snd_pcm_hardware snd_vortex_playback_hw_adb = { | |||
42 | .rate_min = 5000, | 42 | .rate_min = 5000, |
43 | .rate_max = 48000, | 43 | .rate_max = 48000, |
44 | .channels_min = 1, | 44 | .channels_min = 1, |
45 | #ifdef CHIP_AU8830 | ||
46 | .channels_max = 4, | ||
47 | #else | ||
48 | .channels_max = 2, | 45 | .channels_max = 2, |
49 | #endif | ||
50 | .buffer_bytes_max = 0x10000, | 46 | .buffer_bytes_max = 0x10000, |
51 | .period_bytes_min = 0x1, | 47 | .period_bytes_min = 0x1, |
52 | .period_bytes_max = 0x1000, | 48 | .period_bytes_max = 0x1000, |
@@ -115,6 +111,17 @@ static struct snd_pcm_hardware snd_vortex_playback_hw_wt = { | |||
115 | .periods_max = 64, | 111 | .periods_max = 64, |
116 | }; | 112 | }; |
117 | #endif | 113 | #endif |
114 | #ifdef CHIP_AU8830 | ||
115 | static unsigned int au8830_channels[3] = { | ||
116 | 1, 2, 4, | ||
117 | }; | ||
118 | |||
119 | static struct snd_pcm_hw_constraint_list hw_constraints_au8830_channels = { | ||
120 | .count = ARRAY_SIZE(au8830_channels), | ||
121 | .list = au8830_channels, | ||
122 | .mask = 0, | ||
123 | }; | ||
124 | #endif | ||
118 | /* open callback */ | 125 | /* open callback */ |
119 | static int snd_vortex_pcm_open(struct snd_pcm_substream *substream) | 126 | static int snd_vortex_pcm_open(struct snd_pcm_substream *substream) |
120 | { | 127 | { |
@@ -156,6 +163,15 @@ static int snd_vortex_pcm_open(struct snd_pcm_substream *substream) | |||
156 | if (VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_ADB | 163 | if (VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_ADB |
157 | || VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_I2S) | 164 | || VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_I2S) |
158 | runtime->hw = snd_vortex_playback_hw_adb; | 165 | runtime->hw = snd_vortex_playback_hw_adb; |
166 | #ifdef CHIP_AU8830 | ||
167 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && | ||
168 | VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_ADB) { | ||
169 | runtime->hw.channels_max = 4; | ||
170 | snd_pcm_hw_constraint_list(runtime, 0, | ||
171 | SNDRV_PCM_HW_PARAM_CHANNELS, | ||
172 | &hw_constraints_au8830_channels); | ||
173 | } | ||
174 | #endif | ||
159 | substream->runtime->private_data = NULL; | 175 | substream->runtime->private_data = NULL; |
160 | } | 176 | } |
161 | #ifndef CHIP_AU8810 | 177 | #ifndef CHIP_AU8810 |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 05e5ec88c2d9..ae5c5d5e4b7c 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -2134,10 +2134,10 @@ int snd_hda_codec_reset(struct hda_codec *codec) | |||
2134 | * This function returns zero if successful or a negative error code. | 2134 | * This function returns zero if successful or a negative error code. |
2135 | */ | 2135 | */ |
2136 | int snd_hda_add_vmaster(struct hda_codec *codec, char *name, | 2136 | int snd_hda_add_vmaster(struct hda_codec *codec, char *name, |
2137 | unsigned int *tlv, const char **slaves) | 2137 | unsigned int *tlv, const char * const *slaves) |
2138 | { | 2138 | { |
2139 | struct snd_kcontrol *kctl; | 2139 | struct snd_kcontrol *kctl; |
2140 | const char **s; | 2140 | const char * const *s; |
2141 | int err; | 2141 | int err; |
2142 | 2142 | ||
2143 | for (s = slaves; *s && !snd_hda_find_mixer_ctl(codec, *s); s++) | 2143 | for (s = slaves; *s && !snd_hda_find_mixer_ctl(codec, *s); s++) |
@@ -3689,7 +3689,7 @@ EXPORT_SYMBOL_HDA(snd_hda_build_pcms); | |||
3689 | * If no entries are matching, the function returns a negative value. | 3689 | * If no entries are matching, the function returns a negative value. |
3690 | */ | 3690 | */ |
3691 | int snd_hda_check_board_config(struct hda_codec *codec, | 3691 | int snd_hda_check_board_config(struct hda_codec *codec, |
3692 | int num_configs, const char **models, | 3692 | int num_configs, const char * const *models, |
3693 | const struct snd_pci_quirk *tbl) | 3693 | const struct snd_pci_quirk *tbl) |
3694 | { | 3694 | { |
3695 | if (codec->modelname && models) { | 3695 | if (codec->modelname && models) { |
@@ -3753,7 +3753,7 @@ EXPORT_SYMBOL_HDA(snd_hda_check_board_config); | |||
3753 | * If no entries are matching, the function returns a negative value. | 3753 | * If no entries are matching, the function returns a negative value. |
3754 | */ | 3754 | */ |
3755 | int snd_hda_check_board_codec_sid_config(struct hda_codec *codec, | 3755 | int snd_hda_check_board_codec_sid_config(struct hda_codec *codec, |
3756 | int num_configs, const char **models, | 3756 | int num_configs, const char * const *models, |
3757 | const struct snd_pci_quirk *tbl) | 3757 | const struct snd_pci_quirk *tbl) |
3758 | { | 3758 | { |
3759 | const struct snd_pci_quirk *q; | 3759 | const struct snd_pci_quirk *q; |
@@ -4690,7 +4690,7 @@ const char *hda_get_input_pin_label(struct hda_codec *codec, hda_nid_t pin, | |||
4690 | int check_location) | 4690 | int check_location) |
4691 | { | 4691 | { |
4692 | unsigned int def_conf; | 4692 | unsigned int def_conf; |
4693 | static const char *mic_names[] = { | 4693 | static const char * const mic_names[] = { |
4694 | "Internal Mic", "Dock Mic", "Mic", "Front Mic", "Rear Mic", | 4694 | "Internal Mic", "Dock Mic", "Mic", "Front Mic", "Rear Mic", |
4695 | }; | 4695 | }; |
4696 | int attr; | 4696 | int attr; |
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index fb0582f8d725..a63c54d9d767 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c | |||
@@ -762,7 +762,8 @@ static int check_existing_control(struct hda_codec *codec, const char *type, con | |||
762 | /* | 762 | /* |
763 | * build output mixer controls | 763 | * build output mixer controls |
764 | */ | 764 | */ |
765 | static int create_output_mixers(struct hda_codec *codec, const char **names) | 765 | static int create_output_mixers(struct hda_codec *codec, |
766 | const char * const *names) | ||
766 | { | 767 | { |
767 | struct hda_gspec *spec = codec->spec; | 768 | struct hda_gspec *spec = codec->spec; |
768 | int i, err; | 769 | int i, err; |
@@ -780,8 +781,8 @@ static int create_output_mixers(struct hda_codec *codec, const char **names) | |||
780 | static int build_output_controls(struct hda_codec *codec) | 781 | static int build_output_controls(struct hda_codec *codec) |
781 | { | 782 | { |
782 | struct hda_gspec *spec = codec->spec; | 783 | struct hda_gspec *spec = codec->spec; |
783 | static const char *types_speaker[] = { "Speaker", "Headphone" }; | 784 | static const char * const types_speaker[] = { "Speaker", "Headphone" }; |
784 | static const char *types_line[] = { "Front", "Headphone" }; | 785 | static const char * const types_line[] = { "Front", "Headphone" }; |
785 | 786 | ||
786 | switch (spec->pcm_vol_nodes) { | 787 | switch (spec->pcm_vol_nodes) { |
787 | case 1: | 788 | case 1: |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index d3d18be483e1..2e91a991eb15 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -2809,6 +2809,8 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | |||
2809 | #endif | 2809 | #endif |
2810 | /* Vortex86MX */ | 2810 | /* Vortex86MX */ |
2811 | { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC }, | 2811 | { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC }, |
2812 | /* VMware HDAudio */ | ||
2813 | { PCI_DEVICE(0x15ad, 0x1977), .driver_data = AZX_DRIVER_GENERIC }, | ||
2812 | /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */ | 2814 | /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */ |
2813 | { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID), | 2815 | { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID), |
2814 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, | 2816 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, |
diff --git a/sound/pci/hda/hda_local.h b/sound/pci/hda/hda_local.h index 46bbefe2e4a9..3ab5e7a303db 100644 --- a/sound/pci/hda/hda_local.h +++ b/sound/pci/hda/hda_local.h | |||
@@ -140,7 +140,7 @@ void snd_hda_set_vmaster_tlv(struct hda_codec *codec, hda_nid_t nid, int dir, | |||
140 | struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec, | 140 | struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec, |
141 | const char *name); | 141 | const char *name); |
142 | int snd_hda_add_vmaster(struct hda_codec *codec, char *name, | 142 | int snd_hda_add_vmaster(struct hda_codec *codec, char *name, |
143 | unsigned int *tlv, const char **slaves); | 143 | unsigned int *tlv, const char * const *slaves); |
144 | int snd_hda_codec_reset(struct hda_codec *codec); | 144 | int snd_hda_codec_reset(struct hda_codec *codec); |
145 | 145 | ||
146 | /* amp value bits */ | 146 | /* amp value bits */ |
@@ -341,10 +341,10 @@ void snd_print_pcm_bits(int pcm, char *buf, int buflen); | |||
341 | * Misc | 341 | * Misc |
342 | */ | 342 | */ |
343 | int snd_hda_check_board_config(struct hda_codec *codec, int num_configs, | 343 | int snd_hda_check_board_config(struct hda_codec *codec, int num_configs, |
344 | const char **modelnames, | 344 | const char * const *modelnames, |
345 | const struct snd_pci_quirk *pci_list); | 345 | const struct snd_pci_quirk *pci_list); |
346 | int snd_hda_check_board_codec_sid_config(struct hda_codec *codec, | 346 | int snd_hda_check_board_codec_sid_config(struct hda_codec *codec, |
347 | int num_configs, const char **models, | 347 | int num_configs, const char * const *models, |
348 | const struct snd_pci_quirk *tbl); | 348 | const struct snd_pci_quirk *tbl); |
349 | int snd_hda_add_new_ctls(struct hda_codec *codec, | 349 | int snd_hda_add_new_ctls(struct hda_codec *codec, |
350 | struct snd_kcontrol_new *knew); | 350 | struct snd_kcontrol_new *knew); |
diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c index f025200f2a62..bfe74c2fb079 100644 --- a/sound/pci/hda/hda_proc.c +++ b/sound/pci/hda/hda_proc.c | |||
@@ -418,7 +418,7 @@ static void print_digital_conv(struct snd_info_buffer *buffer, | |||
418 | 418 | ||
419 | static const char *get_pwr_state(u32 state) | 419 | static const char *get_pwr_state(u32 state) |
420 | { | 420 | { |
421 | static const char *buf[4] = { | 421 | static const char * const buf[4] = { |
422 | "D0", "D1", "D2", "D3" | 422 | "D0", "D1", "D2", "D3" |
423 | }; | 423 | }; |
424 | if (state < 4) | 424 | if (state < 4) |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 46780670162b..8dabab798689 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
@@ -46,6 +46,9 @@ struct ad198x_spec { | |||
46 | unsigned int cur_eapd; | 46 | unsigned int cur_eapd; |
47 | unsigned int need_dac_fix; | 47 | unsigned int need_dac_fix; |
48 | 48 | ||
49 | hda_nid_t *alt_dac_nid; | ||
50 | struct hda_pcm_stream *stream_analog_alt_playback; | ||
51 | |||
49 | /* capture */ | 52 | /* capture */ |
50 | unsigned int num_adc_nids; | 53 | unsigned int num_adc_nids; |
51 | hda_nid_t *adc_nids; | 54 | hda_nid_t *adc_nids; |
@@ -81,8 +84,8 @@ struct ad198x_spec { | |||
81 | #endif | 84 | #endif |
82 | /* for virtual master */ | 85 | /* for virtual master */ |
83 | hda_nid_t vmaster_nid; | 86 | hda_nid_t vmaster_nid; |
84 | const char **slave_vols; | 87 | const char * const *slave_vols; |
85 | const char **slave_sws; | 88 | const char * const *slave_sws; |
86 | }; | 89 | }; |
87 | 90 | ||
88 | /* | 91 | /* |
@@ -130,7 +133,7 @@ static int ad198x_init(struct hda_codec *codec) | |||
130 | return 0; | 133 | return 0; |
131 | } | 134 | } |
132 | 135 | ||
133 | static const char *ad_slave_vols[] = { | 136 | static const char * const ad_slave_vols[] = { |
134 | "Front Playback Volume", | 137 | "Front Playback Volume", |
135 | "Surround Playback Volume", | 138 | "Surround Playback Volume", |
136 | "Center Playback Volume", | 139 | "Center Playback Volume", |
@@ -143,7 +146,7 @@ static const char *ad_slave_vols[] = { | |||
143 | NULL | 146 | NULL |
144 | }; | 147 | }; |
145 | 148 | ||
146 | static const char *ad_slave_sws[] = { | 149 | static const char * const ad_slave_sws[] = { |
147 | "Front Playback Switch", | 150 | "Front Playback Switch", |
148 | "Surround Playback Switch", | 151 | "Surround Playback Switch", |
149 | "Center Playback Switch", | 152 | "Center Playback Switch", |
@@ -156,6 +159,25 @@ static const char *ad_slave_sws[] = { | |||
156 | NULL | 159 | NULL |
157 | }; | 160 | }; |
158 | 161 | ||
162 | static const char * const ad1988_6stack_fp_slave_vols[] = { | ||
163 | "Front Playback Volume", | ||
164 | "Surround Playback Volume", | ||
165 | "Center Playback Volume", | ||
166 | "LFE Playback Volume", | ||
167 | "Side Playback Volume", | ||
168 | "IEC958 Playback Volume", | ||
169 | NULL | ||
170 | }; | ||
171 | |||
172 | static const char * const ad1988_6stack_fp_slave_sws[] = { | ||
173 | "Front Playback Switch", | ||
174 | "Surround Playback Switch", | ||
175 | "Center Playback Switch", | ||
176 | "LFE Playback Switch", | ||
177 | "Side Playback Switch", | ||
178 | "IEC958 Playback Switch", | ||
179 | NULL | ||
180 | }; | ||
159 | static void ad198x_free_kctls(struct hda_codec *codec); | 181 | static void ad198x_free_kctls(struct hda_codec *codec); |
160 | 182 | ||
161 | #ifdef CONFIG_SND_HDA_INPUT_BEEP | 183 | #ifdef CONFIG_SND_HDA_INPUT_BEEP |
@@ -309,6 +331,38 @@ static int ad198x_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, | |||
309 | return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout); | 331 | return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout); |
310 | } | 332 | } |
311 | 333 | ||
334 | static int ad198x_alt_playback_pcm_prepare(struct hda_pcm_stream *hinfo, | ||
335 | struct hda_codec *codec, | ||
336 | unsigned int stream_tag, | ||
337 | unsigned int format, | ||
338 | struct snd_pcm_substream *substream) | ||
339 | { | ||
340 | struct ad198x_spec *spec = codec->spec; | ||
341 | snd_hda_codec_setup_stream(codec, spec->alt_dac_nid[0], stream_tag, | ||
342 | 0, format); | ||
343 | return 0; | ||
344 | } | ||
345 | |||
346 | static int ad198x_alt_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, | ||
347 | struct hda_codec *codec, | ||
348 | struct snd_pcm_substream *substream) | ||
349 | { | ||
350 | struct ad198x_spec *spec = codec->spec; | ||
351 | snd_hda_codec_cleanup_stream(codec, spec->alt_dac_nid[0]); | ||
352 | return 0; | ||
353 | } | ||
354 | |||
355 | static struct hda_pcm_stream ad198x_pcm_analog_alt_playback = { | ||
356 | .substreams = 1, | ||
357 | .channels_min = 2, | ||
358 | .channels_max = 2, | ||
359 | /* NID is set in ad198x_build_pcms */ | ||
360 | .ops = { | ||
361 | .prepare = ad198x_alt_playback_pcm_prepare, | ||
362 | .cleanup = ad198x_alt_playback_pcm_cleanup | ||
363 | }, | ||
364 | }; | ||
365 | |||
312 | /* | 366 | /* |
313 | * Digital out | 367 | * Digital out |
314 | */ | 368 | */ |
@@ -446,6 +500,17 @@ static int ad198x_build_pcms(struct hda_codec *codec) | |||
446 | } | 500 | } |
447 | } | 501 | } |
448 | 502 | ||
503 | if (spec->alt_dac_nid && spec->stream_analog_alt_playback) { | ||
504 | codec->num_pcms++; | ||
505 | info = spec->pcm_rec + 2; | ||
506 | info->name = "AD198x Headphone"; | ||
507 | info->pcm_type = HDA_PCM_TYPE_AUDIO; | ||
508 | info->stream[SNDRV_PCM_STREAM_PLAYBACK] = | ||
509 | *spec->stream_analog_alt_playback; | ||
510 | info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = | ||
511 | spec->alt_dac_nid[0]; | ||
512 | } | ||
513 | |||
449 | return 0; | 514 | return 0; |
450 | } | 515 | } |
451 | 516 | ||
@@ -1069,7 +1134,7 @@ enum { | |||
1069 | AD1986A_MODELS | 1134 | AD1986A_MODELS |
1070 | }; | 1135 | }; |
1071 | 1136 | ||
1072 | static const char *ad1986a_models[AD1986A_MODELS] = { | 1137 | static const char * const ad1986a_models[AD1986A_MODELS] = { |
1073 | [AD1986A_6STACK] = "6stack", | 1138 | [AD1986A_6STACK] = "6stack", |
1074 | [AD1986A_3STACK] = "3stack", | 1139 | [AD1986A_3STACK] = "3stack", |
1075 | [AD1986A_LAPTOP] = "laptop", | 1140 | [AD1986A_LAPTOP] = "laptop", |
@@ -1813,7 +1878,7 @@ enum { | |||
1813 | AD1981_MODELS | 1878 | AD1981_MODELS |
1814 | }; | 1879 | }; |
1815 | 1880 | ||
1816 | static const char *ad1981_models[AD1981_MODELS] = { | 1881 | static const char * const ad1981_models[AD1981_MODELS] = { |
1817 | [AD1981_HP] = "hp", | 1882 | [AD1981_HP] = "hp", |
1818 | [AD1981_THINKPAD] = "thinkpad", | 1883 | [AD1981_THINKPAD] = "thinkpad", |
1819 | [AD1981_BASIC] = "basic", | 1884 | [AD1981_BASIC] = "basic", |
@@ -2015,6 +2080,7 @@ static int patch_ad1981(struct hda_codec *codec) | |||
2015 | enum { | 2080 | enum { |
2016 | AD1988_6STACK, | 2081 | AD1988_6STACK, |
2017 | AD1988_6STACK_DIG, | 2082 | AD1988_6STACK_DIG, |
2083 | AD1988_6STACK_DIG_FP, | ||
2018 | AD1988_3STACK, | 2084 | AD1988_3STACK, |
2019 | AD1988_3STACK_DIG, | 2085 | AD1988_3STACK_DIG, |
2020 | AD1988_LAPTOP, | 2086 | AD1988_LAPTOP, |
@@ -2047,6 +2113,10 @@ static hda_nid_t ad1988_6stack_dac_nids_rev2[4] = { | |||
2047 | 0x04, 0x05, 0x0a, 0x06 | 2113 | 0x04, 0x05, 0x0a, 0x06 |
2048 | }; | 2114 | }; |
2049 | 2115 | ||
2116 | static hda_nid_t ad1988_alt_dac_nid[1] = { | ||
2117 | 0x03 | ||
2118 | }; | ||
2119 | |||
2050 | static hda_nid_t ad1988_3stack_dac_nids_rev2[3] = { | 2120 | static hda_nid_t ad1988_3stack_dac_nids_rev2[3] = { |
2051 | 0x04, 0x0a, 0x06 | 2121 | 0x04, 0x0a, 0x06 |
2052 | }; | 2122 | }; |
@@ -2166,6 +2236,35 @@ static struct snd_kcontrol_new ad1988_6stack_mixers2[] = { | |||
2166 | { } /* end */ | 2236 | { } /* end */ |
2167 | }; | 2237 | }; |
2168 | 2238 | ||
2239 | static struct snd_kcontrol_new ad1988_6stack_fp_mixers[] = { | ||
2240 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), | ||
2241 | |||
2242 | HDA_BIND_MUTE("Front Playback Switch", 0x29, 2, HDA_INPUT), | ||
2243 | HDA_BIND_MUTE("Surround Playback Switch", 0x2a, 2, HDA_INPUT), | ||
2244 | HDA_BIND_MUTE_MONO("Center Playback Switch", 0x27, 1, 2, HDA_INPUT), | ||
2245 | HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x27, 2, 2, HDA_INPUT), | ||
2246 | HDA_BIND_MUTE("Side Playback Switch", 0x28, 2, HDA_INPUT), | ||
2247 | HDA_BIND_MUTE("Headphone Playback Switch", 0x22, 2, HDA_INPUT), | ||
2248 | HDA_BIND_MUTE("Mono Playback Switch", 0x1e, 2, HDA_INPUT), | ||
2249 | |||
2250 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x6, HDA_INPUT), | ||
2251 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x6, HDA_INPUT), | ||
2252 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x0, HDA_INPUT), | ||
2253 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x0, HDA_INPUT), | ||
2254 | HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT), | ||
2255 | HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT), | ||
2256 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT), | ||
2257 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT), | ||
2258 | |||
2259 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), | ||
2260 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), | ||
2261 | |||
2262 | HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x39, 0x0, HDA_OUTPUT), | ||
2263 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x3c, 0x0, HDA_OUTPUT), | ||
2264 | |||
2265 | { } /* end */ | ||
2266 | }; | ||
2267 | |||
2169 | /* 3-stack mode */ | 2268 | /* 3-stack mode */ |
2170 | static struct snd_kcontrol_new ad1988_3stack_mixers1[] = { | 2269 | static struct snd_kcontrol_new ad1988_3stack_mixers1[] = { |
2171 | HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT), | 2270 | HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT), |
@@ -2445,6 +2544,68 @@ static struct hda_verb ad1988_6stack_init_verbs[] = { | |||
2445 | { } | 2544 | { } |
2446 | }; | 2545 | }; |
2447 | 2546 | ||
2547 | static struct hda_verb ad1988_6stack_fp_init_verbs[] = { | ||
2548 | /* Front, Surround, CLFE, side DAC; unmute as default */ | ||
2549 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2550 | {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2551 | {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2552 | {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2553 | /* Headphone; unmute as default */ | ||
2554 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2555 | /* Port-A front headphon path */ | ||
2556 | {0x37, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC0:03h */ | ||
2557 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2558 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
2559 | {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2560 | {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
2561 | /* Port-D line-out path */ | ||
2562 | {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2563 | {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
2564 | {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2565 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
2566 | /* Port-F surround path */ | ||
2567 | {0x2a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2568 | {0x2a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
2569 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2570 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
2571 | /* Port-G CLFE path */ | ||
2572 | {0x27, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2573 | {0x27, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
2574 | {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2575 | {0x24, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
2576 | /* Port-H side path */ | ||
2577 | {0x28, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2578 | {0x28, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
2579 | {0x25, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2580 | {0x25, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
2581 | /* Mono out path */ | ||
2582 | {0x36, AC_VERB_SET_CONNECT_SEL, 0x1}, /* DAC1:04h */ | ||
2583 | {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2584 | {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
2585 | {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
2586 | {0x13, AC_VERB_SET_AMP_GAIN_MUTE, 0xb01f}, /* unmute, 0dB */ | ||
2587 | /* Port-B front mic-in path */ | ||
2588 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2589 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
2590 | {0x39, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
2591 | /* Port-C line-in path */ | ||
2592 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2593 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
2594 | {0x3a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
2595 | {0x33, AC_VERB_SET_CONNECT_SEL, 0x0}, | ||
2596 | /* Port-E mic-in path */ | ||
2597 | {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2598 | {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
2599 | {0x3c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | ||
2600 | {0x34, AC_VERB_SET_CONNECT_SEL, 0x0}, | ||
2601 | /* Analog CD Input */ | ||
2602 | {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
2603 | /* Analog Mix output amp */ | ||
2604 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */ | ||
2605 | |||
2606 | { } | ||
2607 | }; | ||
2608 | |||
2448 | static struct hda_verb ad1988_capture_init_verbs[] = { | 2609 | static struct hda_verb ad1988_capture_init_verbs[] = { |
2449 | /* mute analog mix */ | 2610 | /* mute analog mix */ |
2450 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 2611 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, |
@@ -2792,7 +2953,9 @@ static int ad1988_auto_create_multi_out_ctls(struct ad198x_spec *spec, | |||
2792 | const struct auto_pin_cfg *cfg) | 2953 | const struct auto_pin_cfg *cfg) |
2793 | { | 2954 | { |
2794 | char name[32]; | 2955 | char name[32]; |
2795 | static const char *chname[4] = { "Front", "Surround", NULL /*CLFE*/, "Side" }; | 2956 | static const char * const chname[4] = { |
2957 | "Front", "Surround", NULL /*CLFE*/, "Side" | ||
2958 | }; | ||
2796 | hda_nid_t nid; | 2959 | hda_nid_t nid; |
2797 | int i, err; | 2960 | int i, err; |
2798 | 2961 | ||
@@ -3074,13 +3237,13 @@ static int ad1988_auto_init(struct hda_codec *codec) | |||
3074 | return 0; | 3237 | return 0; |
3075 | } | 3238 | } |
3076 | 3239 | ||
3077 | |||
3078 | /* | 3240 | /* |
3079 | */ | 3241 | */ |
3080 | 3242 | ||
3081 | static const char *ad1988_models[AD1988_MODEL_LAST] = { | 3243 | static const char * const ad1988_models[AD1988_MODEL_LAST] = { |
3082 | [AD1988_6STACK] = "6stack", | 3244 | [AD1988_6STACK] = "6stack", |
3083 | [AD1988_6STACK_DIG] = "6stack-dig", | 3245 | [AD1988_6STACK_DIG] = "6stack-dig", |
3246 | [AD1988_6STACK_DIG_FP] = "6stack-dig-fp", | ||
3084 | [AD1988_3STACK] = "3stack", | 3247 | [AD1988_3STACK] = "3stack", |
3085 | [AD1988_3STACK_DIG] = "3stack-dig", | 3248 | [AD1988_3STACK_DIG] = "3stack-dig", |
3086 | [AD1988_LAPTOP] = "laptop", | 3249 | [AD1988_LAPTOP] = "laptop", |
@@ -3140,6 +3303,7 @@ static int patch_ad1988(struct hda_codec *codec) | |||
3140 | switch (board_config) { | 3303 | switch (board_config) { |
3141 | case AD1988_6STACK: | 3304 | case AD1988_6STACK: |
3142 | case AD1988_6STACK_DIG: | 3305 | case AD1988_6STACK_DIG: |
3306 | case AD1988_6STACK_DIG_FP: | ||
3143 | spec->multiout.max_channels = 8; | 3307 | spec->multiout.max_channels = 8; |
3144 | spec->multiout.num_dacs = 4; | 3308 | spec->multiout.num_dacs = 4; |
3145 | if (is_rev2(codec)) | 3309 | if (is_rev2(codec)) |
@@ -3152,10 +3316,22 @@ static int patch_ad1988(struct hda_codec *codec) | |||
3152 | spec->mixers[0] = ad1988_6stack_mixers1_rev2; | 3316 | spec->mixers[0] = ad1988_6stack_mixers1_rev2; |
3153 | else | 3317 | else |
3154 | spec->mixers[0] = ad1988_6stack_mixers1; | 3318 | spec->mixers[0] = ad1988_6stack_mixers1; |
3155 | spec->mixers[1] = ad1988_6stack_mixers2; | 3319 | if (board_config == AD1988_6STACK_DIG_FP) { |
3320 | spec->mixers[1] = ad1988_6stack_fp_mixers; | ||
3321 | spec->slave_vols = ad1988_6stack_fp_slave_vols; | ||
3322 | spec->slave_sws = ad1988_6stack_fp_slave_sws; | ||
3323 | spec->alt_dac_nid = ad1988_alt_dac_nid; | ||
3324 | spec->stream_analog_alt_playback = | ||
3325 | &ad198x_pcm_analog_alt_playback; | ||
3326 | } else | ||
3327 | spec->mixers[1] = ad1988_6stack_mixers2; | ||
3156 | spec->num_init_verbs = 1; | 3328 | spec->num_init_verbs = 1; |
3157 | spec->init_verbs[0] = ad1988_6stack_init_verbs; | 3329 | if (board_config == AD1988_6STACK_DIG_FP) |
3158 | if (board_config == AD1988_6STACK_DIG) { | 3330 | spec->init_verbs[0] = ad1988_6stack_fp_init_verbs; |
3331 | else | ||
3332 | spec->init_verbs[0] = ad1988_6stack_init_verbs; | ||
3333 | if ((board_config == AD1988_6STACK_DIG) || | ||
3334 | (board_config == AD1988_6STACK_DIG_FP)) { | ||
3159 | spec->multiout.dig_out_nid = AD1988_SPDIF_OUT; | 3335 | spec->multiout.dig_out_nid = AD1988_SPDIF_OUT; |
3160 | spec->dig_in_nid = AD1988_SPDIF_IN; | 3336 | spec->dig_in_nid = AD1988_SPDIF_IN; |
3161 | } | 3337 | } |
@@ -3399,7 +3575,7 @@ static struct hda_amp_list ad1884_loopbacks[] = { | |||
3399 | }; | 3575 | }; |
3400 | #endif | 3576 | #endif |
3401 | 3577 | ||
3402 | static const char *ad1884_slave_vols[] = { | 3578 | static const char * const ad1884_slave_vols[] = { |
3403 | "PCM Playback Volume", | 3579 | "PCM Playback Volume", |
3404 | "Mic Playback Volume", | 3580 | "Mic Playback Volume", |
3405 | "Mono Playback Volume", | 3581 | "Mono Playback Volume", |
@@ -3637,7 +3813,7 @@ enum { | |||
3637 | AD1984_MODELS | 3813 | AD1984_MODELS |
3638 | }; | 3814 | }; |
3639 | 3815 | ||
3640 | static const char *ad1984_models[AD1984_MODELS] = { | 3816 | static const char * const ad1984_models[AD1984_MODELS] = { |
3641 | [AD1984_BASIC] = "basic", | 3817 | [AD1984_BASIC] = "basic", |
3642 | [AD1984_THINKPAD] = "thinkpad", | 3818 | [AD1984_THINKPAD] = "thinkpad", |
3643 | [AD1984_DELL_DESKTOP] = "dell_desktop", | 3819 | [AD1984_DELL_DESKTOP] = "dell_desktop", |
@@ -4308,7 +4484,7 @@ enum { | |||
4308 | AD1884A_MODELS | 4484 | AD1884A_MODELS |
4309 | }; | 4485 | }; |
4310 | 4486 | ||
4311 | static const char *ad1884a_models[AD1884A_MODELS] = { | 4487 | static const char * const ad1884a_models[AD1884A_MODELS] = { |
4312 | [AD1884A_DESKTOP] = "desktop", | 4488 | [AD1884A_DESKTOP] = "desktop", |
4313 | [AD1884A_LAPTOP] = "laptop", | 4489 | [AD1884A_LAPTOP] = "laptop", |
4314 | [AD1884A_MOBILE] = "mobile", | 4490 | [AD1884A_MOBILE] = "mobile", |
@@ -4696,7 +4872,7 @@ enum { | |||
4696 | AD1882_MODELS | 4872 | AD1882_MODELS |
4697 | }; | 4873 | }; |
4698 | 4874 | ||
4699 | static const char *ad1882_models[AD1986A_MODELS] = { | 4875 | static const char * const ad1882_models[AD1986A_MODELS] = { |
4700 | [AD1882_3STACK] = "3stack", | 4876 | [AD1882_3STACK] = "3stack", |
4701 | [AD1882_6STACK] = "6stack", | 4877 | [AD1882_6STACK] = "6stack", |
4702 | }; | 4878 | }; |
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index 18af38ebf757..a07b031090d8 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c | |||
@@ -490,7 +490,7 @@ static int parse_digital_input(struct hda_codec *codec) | |||
490 | * create mixer controls | 490 | * create mixer controls |
491 | */ | 491 | */ |
492 | 492 | ||
493 | static const char *dir_sfx[2] = { "Playback", "Capture" }; | 493 | static const char * const dir_sfx[2] = { "Playback", "Capture" }; |
494 | 494 | ||
495 | static int add_mute(struct hda_codec *codec, const char *name, int index, | 495 | static int add_mute(struct hda_codec *codec, const char *name, int index, |
496 | unsigned int pval, int dir, struct snd_kcontrol **kctlp) | 496 | unsigned int pval, int dir, struct snd_kcontrol **kctlp) |
@@ -1156,7 +1156,7 @@ static int cs_parse_auto_config(struct hda_codec *codec) | |||
1156 | return 0; | 1156 | return 0; |
1157 | } | 1157 | } |
1158 | 1158 | ||
1159 | static const char *cs420x_models[CS420X_MODELS] = { | 1159 | static const char * const cs420x_models[CS420X_MODELS] = { |
1160 | [CS420X_MBP53] = "mbp53", | 1160 | [CS420X_MBP53] = "mbp53", |
1161 | [CS420X_MBP55] = "mbp55", | 1161 | [CS420X_MBP55] = "mbp55", |
1162 | [CS420X_IMAC27] = "imac27", | 1162 | [CS420X_IMAC27] = "imac27", |
diff --git a/sound/pci/hda/patch_cmedia.c b/sound/pci/hda/patch_cmedia.c index ff60908f4554..1f8bbcd0f802 100644 --- a/sound/pci/hda/patch_cmedia.c +++ b/sound/pci/hda/patch_cmedia.c | |||
@@ -608,7 +608,7 @@ static void cmi9880_free(struct hda_codec *codec) | |||
608 | /* | 608 | /* |
609 | */ | 609 | */ |
610 | 610 | ||
611 | static const char *cmi9880_models[CMI_MODELS] = { | 611 | static const char * const cmi9880_models[CMI_MODELS] = { |
612 | [CMI_MINIMAL] = "minimal", | 612 | [CMI_MINIMAL] = "minimal", |
613 | [CMI_MIN_FP] = "min_fp", | 613 | [CMI_MIN_FP] = "min_fp", |
614 | [CMI_FULL] = "full", | 614 | [CMI_FULL] = "full", |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index e96581fcdbdb..9bb030a469cd 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
@@ -537,13 +537,13 @@ static struct snd_kcontrol_new cxt_beep_mixer[] = { | |||
537 | }; | 537 | }; |
538 | #endif | 538 | #endif |
539 | 539 | ||
540 | static const char *slave_vols[] = { | 540 | static const char * const slave_vols[] = { |
541 | "Headphone Playback Volume", | 541 | "Headphone Playback Volume", |
542 | "Speaker Playback Volume", | 542 | "Speaker Playback Volume", |
543 | NULL | 543 | NULL |
544 | }; | 544 | }; |
545 | 545 | ||
546 | static const char *slave_sws[] = { | 546 | static const char * const slave_sws[] = { |
547 | "Headphone Playback Switch", | 547 | "Headphone Playback Switch", |
548 | "Speaker Playback Switch", | 548 | "Speaker Playback Switch", |
549 | NULL | 549 | NULL |
@@ -1134,7 +1134,7 @@ enum { | |||
1134 | CXT5045_MODELS | 1134 | CXT5045_MODELS |
1135 | }; | 1135 | }; |
1136 | 1136 | ||
1137 | static const char *cxt5045_models[CXT5045_MODELS] = { | 1137 | static const char * const cxt5045_models[CXT5045_MODELS] = { |
1138 | [CXT5045_LAPTOP_HPSENSE] = "laptop-hpsense", | 1138 | [CXT5045_LAPTOP_HPSENSE] = "laptop-hpsense", |
1139 | [CXT5045_LAPTOP_MICSENSE] = "laptop-micsense", | 1139 | [CXT5045_LAPTOP_MICSENSE] = "laptop-micsense", |
1140 | [CXT5045_LAPTOP_HPMICSENSE] = "laptop-hpmicsense", | 1140 | [CXT5045_LAPTOP_HPMICSENSE] = "laptop-hpmicsense", |
@@ -1579,7 +1579,7 @@ enum { | |||
1579 | CXT5047_MODELS | 1579 | CXT5047_MODELS |
1580 | }; | 1580 | }; |
1581 | 1581 | ||
1582 | static const char *cxt5047_models[CXT5047_MODELS] = { | 1582 | static const char * const cxt5047_models[CXT5047_MODELS] = { |
1583 | [CXT5047_LAPTOP] = "laptop", | 1583 | [CXT5047_LAPTOP] = "laptop", |
1584 | [CXT5047_LAPTOP_HP] = "laptop-hp", | 1584 | [CXT5047_LAPTOP_HP] = "laptop-hp", |
1585 | [CXT5047_LAPTOP_EAPD] = "laptop-eapd", | 1585 | [CXT5047_LAPTOP_EAPD] = "laptop-eapd", |
@@ -1995,7 +1995,7 @@ enum { | |||
1995 | CXT5051_MODELS | 1995 | CXT5051_MODELS |
1996 | }; | 1996 | }; |
1997 | 1997 | ||
1998 | static const char *cxt5051_models[CXT5051_MODELS] = { | 1998 | static const char *const cxt5051_models[CXT5051_MODELS] = { |
1999 | [CXT5051_LAPTOP] = "laptop", | 1999 | [CXT5051_LAPTOP] = "laptop", |
2000 | [CXT5051_HP] = "hp", | 2000 | [CXT5051_HP] = "hp", |
2001 | [CXT5051_HP_DV6736] = "hp-dv6736", | 2001 | [CXT5051_HP_DV6736] = "hp-dv6736", |
@@ -3084,7 +3084,7 @@ enum { | |||
3084 | CXT5066_MODELS | 3084 | CXT5066_MODELS |
3085 | }; | 3085 | }; |
3086 | 3086 | ||
3087 | static const char *cxt5066_models[CXT5066_MODELS] = { | 3087 | static const char * const cxt5066_models[CXT5066_MODELS] = { |
3088 | [CXT5066_LAPTOP] = "laptop", | 3088 | [CXT5066_LAPTOP] = "laptop", |
3089 | [CXT5066_DELL_LAPTOP] = "dell-laptop", | 3089 | [CXT5066_DELL_LAPTOP] = "dell-laptop", |
3090 | [CXT5066_OLPC_XO_1_5] = "olpc-xo-1_5", | 3090 | [CXT5066_OLPC_XO_1_5] = "olpc-xo-1_5", |
@@ -3746,7 +3746,7 @@ static int cx_auto_build_output_controls(struct hda_codec *codec) | |||
3746 | struct conexant_spec *spec = codec->spec; | 3746 | struct conexant_spec *spec = codec->spec; |
3747 | int i, err; | 3747 | int i, err; |
3748 | int num_line = 0, num_hp = 0, num_spk = 0; | 3748 | int num_line = 0, num_hp = 0, num_spk = 0; |
3749 | static const char *texts[3] = { "Front", "Surround", "CLFE" }; | 3749 | static const char * const texts[3] = { "Front", "Surround", "CLFE" }; |
3750 | 3750 | ||
3751 | if (spec->dac_info_filled == 1) | 3751 | if (spec->dac_info_filled == 1) |
3752 | return cx_auto_add_pb_volume(codec, spec->dac_info[0].dac, | 3752 | return cx_auto_add_pb_volume(codec, spec->dac_info[0].dac, |
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index f29b97b5de8f..2d5b83fa8d24 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
@@ -817,6 +817,7 @@ static int hdmi_pcm_open(struct hda_pcm_stream *hinfo, | |||
817 | struct hdmi_spec *spec = codec->spec; | 817 | struct hdmi_spec *spec = codec->spec; |
818 | struct hdmi_eld *eld; | 818 | struct hdmi_eld *eld; |
819 | struct hda_pcm_stream *codec_pars; | 819 | struct hda_pcm_stream *codec_pars; |
820 | struct snd_pcm_runtime *runtime = substream->runtime; | ||
820 | unsigned int idx; | 821 | unsigned int idx; |
821 | 822 | ||
822 | for (idx = 0; idx < spec->num_cvts; idx++) | 823 | for (idx = 0; idx < spec->num_cvts; idx++) |
@@ -844,6 +845,14 @@ static int hdmi_pcm_open(struct hda_pcm_stream *hinfo, | |||
844 | hinfo->formats = codec_pars->formats; | 845 | hinfo->formats = codec_pars->formats; |
845 | hinfo->maxbps = codec_pars->maxbps; | 846 | hinfo->maxbps = codec_pars->maxbps; |
846 | } | 847 | } |
848 | /* store the updated parameters */ | ||
849 | runtime->hw.channels_min = hinfo->channels_min; | ||
850 | runtime->hw.channels_max = hinfo->channels_max; | ||
851 | runtime->hw.formats = hinfo->formats; | ||
852 | runtime->hw.rates = hinfo->rates; | ||
853 | |||
854 | snd_pcm_hw_constraint_step(substream->runtime, 0, | ||
855 | SNDRV_PCM_HW_PARAM_CHANNELS, 2); | ||
847 | return 0; | 856 | return 0; |
848 | } | 857 | } |
849 | 858 | ||
@@ -1238,6 +1247,9 @@ static int simple_playback_pcm_open(struct hda_pcm_stream *hinfo, | |||
1238 | snd_pcm_hw_constraint_list(substream->runtime, 0, | 1247 | snd_pcm_hw_constraint_list(substream->runtime, 0, |
1239 | SNDRV_PCM_HW_PARAM_CHANNELS, | 1248 | SNDRV_PCM_HW_PARAM_CHANNELS, |
1240 | hw_constraints_channels); | 1249 | hw_constraints_channels); |
1250 | } else { | ||
1251 | snd_pcm_hw_constraint_step(substream->runtime, 0, | ||
1252 | SNDRV_PCM_HW_PARAM_CHANNELS, 2); | ||
1241 | } | 1253 | } |
1242 | 1254 | ||
1243 | return snd_hda_multi_out_dig_open(codec, &spec->multiout); | 1255 | return snd_hda_multi_out_dig_open(codec, &spec->multiout); |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 51c08edd7563..269dbff70b92 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -303,6 +303,8 @@ struct alc_customize_define { | |||
303 | unsigned int fixup:1; /* Means that this sku is set by driver, not read from hw */ | 303 | unsigned int fixup:1; /* Means that this sku is set by driver, not read from hw */ |
304 | }; | 304 | }; |
305 | 305 | ||
306 | struct alc_fixup; | ||
307 | |||
306 | struct alc_spec { | 308 | struct alc_spec { |
307 | /* codec parameterization */ | 309 | /* codec parameterization */ |
308 | struct snd_kcontrol_new *mixers[5]; /* mixer arrays */ | 310 | struct snd_kcontrol_new *mixers[5]; /* mixer arrays */ |
@@ -404,6 +406,11 @@ struct alc_spec { | |||
404 | /* for PLL fix */ | 406 | /* for PLL fix */ |
405 | hda_nid_t pll_nid; | 407 | hda_nid_t pll_nid; |
406 | unsigned int pll_coef_idx, pll_coef_bit; | 408 | unsigned int pll_coef_idx, pll_coef_bit; |
409 | |||
410 | /* fix-up list */ | ||
411 | int fixup_id; | ||
412 | const struct alc_fixup *fixup_list; | ||
413 | const char *fixup_name; | ||
407 | }; | 414 | }; |
408 | 415 | ||
409 | /* | 416 | /* |
@@ -1683,88 +1690,131 @@ struct alc_model_fixup { | |||
1683 | }; | 1690 | }; |
1684 | 1691 | ||
1685 | struct alc_fixup { | 1692 | struct alc_fixup { |
1686 | unsigned int sku; | 1693 | int type; |
1687 | const struct alc_pincfg *pins; | 1694 | bool chained; |
1688 | const struct hda_verb *verbs; | 1695 | int chain_id; |
1689 | void (*func)(struct hda_codec *codec, const struct alc_fixup *fix, | 1696 | union { |
1690 | int pre_init); | 1697 | unsigned int sku; |
1698 | const struct alc_pincfg *pins; | ||
1699 | const struct hda_verb *verbs; | ||
1700 | void (*func)(struct hda_codec *codec, | ||
1701 | const struct alc_fixup *fix, | ||
1702 | int action); | ||
1703 | } v; | ||
1691 | }; | 1704 | }; |
1692 | 1705 | ||
1693 | static void __alc_pick_fixup(struct hda_codec *codec, | 1706 | enum { |
1694 | const struct alc_fixup *fix, | 1707 | ALC_FIXUP_INVALID, |
1695 | const char *modelname, | 1708 | ALC_FIXUP_SKU, |
1696 | int pre_init) | 1709 | ALC_FIXUP_PINS, |
1710 | ALC_FIXUP_VERBS, | ||
1711 | ALC_FIXUP_FUNC, | ||
1712 | }; | ||
1713 | |||
1714 | enum { | ||
1715 | ALC_FIXUP_ACT_PRE_PROBE, | ||
1716 | ALC_FIXUP_ACT_PROBE, | ||
1717 | ALC_FIXUP_ACT_INIT, | ||
1718 | }; | ||
1719 | |||
1720 | static void alc_apply_fixup(struct hda_codec *codec, int action) | ||
1697 | { | 1721 | { |
1698 | const struct alc_pincfg *cfg; | 1722 | struct alc_spec *spec = codec->spec; |
1699 | struct alc_spec *spec; | 1723 | int id = spec->fixup_id; |
1724 | const char *modelname = spec->fixup_name; | ||
1725 | int depth = 0; | ||
1700 | 1726 | ||
1701 | cfg = fix->pins; | 1727 | if (!spec->fixup_list) |
1702 | if (pre_init && fix->sku) { | 1728 | return; |
1703 | #ifdef CONFIG_SND_DEBUG_VERBOSE | 1729 | |
1704 | snd_printdd(KERN_INFO "hda_codec: %s: Apply sku override for %s\n", | 1730 | while (id >= 0) { |
1705 | codec->chip_name, modelname); | 1731 | const struct alc_fixup *fix = spec->fixup_list + id; |
1706 | #endif | 1732 | const struct alc_pincfg *cfg; |
1707 | spec = codec->spec; | 1733 | |
1708 | spec->cdefine.sku_cfg = fix->sku; | 1734 | switch (fix->type) { |
1709 | spec->cdefine.fixup = 1; | 1735 | case ALC_FIXUP_SKU: |
1710 | } | 1736 | if (action != ALC_FIXUP_ACT_PRE_PROBE || !fix->v.sku) |
1711 | if (pre_init && cfg) { | 1737 | break;; |
1712 | #ifdef CONFIG_SND_DEBUG_VERBOSE | 1738 | snd_printdd(KERN_INFO "hda_codec: %s: " |
1713 | snd_printdd(KERN_INFO "hda_codec: %s: Apply pincfg for %s\n", | 1739 | "Apply sku override for %s\n", |
1714 | codec->chip_name, modelname); | 1740 | codec->chip_name, modelname); |
1715 | #endif | 1741 | spec->cdefine.sku_cfg = fix->v.sku; |
1716 | for (; cfg->nid; cfg++) | 1742 | spec->cdefine.fixup = 1; |
1717 | snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val); | 1743 | break; |
1718 | } | 1744 | case ALC_FIXUP_PINS: |
1719 | if (!pre_init && fix->verbs) { | 1745 | cfg = fix->v.pins; |
1720 | #ifdef CONFIG_SND_DEBUG_VERBOSE | 1746 | if (action != ALC_FIXUP_ACT_PRE_PROBE || !cfg) |
1721 | snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-verbs for %s\n", | 1747 | break; |
1722 | codec->chip_name, modelname); | 1748 | snd_printdd(KERN_INFO "hda_codec: %s: " |
1723 | #endif | 1749 | "Apply pincfg for %s\n", |
1724 | add_verb(codec->spec, fix->verbs); | 1750 | codec->chip_name, modelname); |
1725 | } | 1751 | for (; cfg->nid; cfg++) |
1726 | if (fix->func) { | 1752 | snd_hda_codec_set_pincfg(codec, cfg->nid, |
1727 | #ifdef CONFIG_SND_DEBUG_VERBOSE | 1753 | cfg->val); |
1728 | snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-func for %s\n", | 1754 | break; |
1729 | codec->chip_name, modelname); | 1755 | case ALC_FIXUP_VERBS: |
1730 | #endif | 1756 | if (action != ALC_FIXUP_ACT_PROBE || !fix->v.verbs) |
1731 | fix->func(codec, fix, pre_init); | 1757 | break; |
1758 | snd_printdd(KERN_INFO "hda_codec: %s: " | ||
1759 | "Apply fix-verbs for %s\n", | ||
1760 | codec->chip_name, modelname); | ||
1761 | add_verb(codec->spec, fix->v.verbs); | ||
1762 | break; | ||
1763 | case ALC_FIXUP_FUNC: | ||
1764 | if (!fix->v.func) | ||
1765 | break; | ||
1766 | snd_printdd(KERN_INFO "hda_codec: %s: " | ||
1767 | "Apply fix-func for %s\n", | ||
1768 | codec->chip_name, modelname); | ||
1769 | fix->v.func(codec, fix, action); | ||
1770 | break; | ||
1771 | default: | ||
1772 | snd_printk(KERN_ERR "hda_codec: %s: " | ||
1773 | "Invalid fixup type %d\n", | ||
1774 | codec->chip_name, fix->type); | ||
1775 | break; | ||
1776 | } | ||
1777 | if (!fix[id].chained) | ||
1778 | break; | ||
1779 | if (++depth > 10) | ||
1780 | break; | ||
1781 | id = fix[id].chain_id; | ||
1732 | } | 1782 | } |
1733 | } | 1783 | } |
1734 | 1784 | ||
1735 | static void alc_pick_fixup(struct hda_codec *codec, | 1785 | static void alc_pick_fixup(struct hda_codec *codec, |
1736 | const struct snd_pci_quirk *quirk, | 1786 | const struct alc_model_fixup *models, |
1737 | const struct alc_fixup *fix, | 1787 | const struct snd_pci_quirk *quirk, |
1738 | int pre_init) | 1788 | const struct alc_fixup *fixlist) |
1739 | { | 1789 | { |
1740 | quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk); | 1790 | struct alc_spec *spec = codec->spec; |
1741 | if (quirk) { | 1791 | int id = -1; |
1742 | fix += quirk->value; | 1792 | const char *name = NULL; |
1743 | #ifdef CONFIG_SND_DEBUG_VERBOSE | ||
1744 | __alc_pick_fixup(codec, fix, quirk->name, pre_init); | ||
1745 | #else | ||
1746 | __alc_pick_fixup(codec, fix, NULL, pre_init); | ||
1747 | #endif | ||
1748 | } | ||
1749 | } | ||
1750 | 1793 | ||
1751 | static void alc_pick_fixup_model(struct hda_codec *codec, | ||
1752 | const struct alc_model_fixup *models, | ||
1753 | const struct snd_pci_quirk *quirk, | ||
1754 | const struct alc_fixup *fix, | ||
1755 | int pre_init) | ||
1756 | { | ||
1757 | if (codec->modelname && models) { | 1794 | if (codec->modelname && models) { |
1758 | while (models->name) { | 1795 | while (models->name) { |
1759 | if (!strcmp(codec->modelname, models->name)) { | 1796 | if (!strcmp(codec->modelname, models->name)) { |
1760 | fix += models->id; | 1797 | id = models->id; |
1798 | name = models->name; | ||
1761 | break; | 1799 | break; |
1762 | } | 1800 | } |
1763 | models++; | 1801 | models++; |
1764 | } | 1802 | } |
1765 | __alc_pick_fixup(codec, fix, codec->modelname, pre_init); | 1803 | } |
1766 | } else { | 1804 | if (id < 0) { |
1767 | alc_pick_fixup(codec, quirk, fix, pre_init); | 1805 | quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk); |
1806 | if (quirk) { | ||
1807 | id = quirk->value; | ||
1808 | #ifdef CONFIG_SND_DEBUG_VERBOSE | ||
1809 | name = quirk->name; | ||
1810 | #endif | ||
1811 | } | ||
1812 | } | ||
1813 | |||
1814 | spec->fixup_id = id; | ||
1815 | if (id >= 0) { | ||
1816 | spec->fixup_list = fixlist; | ||
1817 | spec->fixup_name = name; | ||
1768 | } | 1818 | } |
1769 | } | 1819 | } |
1770 | 1820 | ||
@@ -2866,7 +2916,7 @@ static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = { | |||
2866 | /* | 2916 | /* |
2867 | * slave controls for virtual master | 2917 | * slave controls for virtual master |
2868 | */ | 2918 | */ |
2869 | static const char *alc_slave_vols[] = { | 2919 | static const char * const alc_slave_vols[] = { |
2870 | "Front Playback Volume", | 2920 | "Front Playback Volume", |
2871 | "Surround Playback Volume", | 2921 | "Surround Playback Volume", |
2872 | "Center Playback Volume", | 2922 | "Center Playback Volume", |
@@ -2880,7 +2930,7 @@ static const char *alc_slave_vols[] = { | |||
2880 | NULL, | 2930 | NULL, |
2881 | }; | 2931 | }; |
2882 | 2932 | ||
2883 | static const char *alc_slave_sws[] = { | 2933 | static const char * const alc_slave_sws[] = { |
2884 | "Front Playback Switch", | 2934 | "Front Playback Switch", |
2885 | "Surround Playback Switch", | 2935 | "Surround Playback Switch", |
2886 | "Center Playback Switch", | 2936 | "Center Playback Switch", |
@@ -3861,6 +3911,8 @@ static int alc_init(struct hda_codec *codec) | |||
3861 | if (spec->init_hook) | 3911 | if (spec->init_hook) |
3862 | spec->init_hook(codec); | 3912 | spec->init_hook(codec); |
3863 | 3913 | ||
3914 | alc_apply_fixup(codec, ALC_FIXUP_ACT_INIT); | ||
3915 | |||
3864 | hda_call_check_power_status(codec, 0x01); | 3916 | hda_call_check_power_status(codec, 0x01); |
3865 | return 0; | 3917 | return 0; |
3866 | } | 3918 | } |
@@ -4559,7 +4611,7 @@ static struct hda_verb alc880_test_init_verbs[] = { | |||
4559 | /* | 4611 | /* |
4560 | */ | 4612 | */ |
4561 | 4613 | ||
4562 | static const char *alc880_models[ALC880_MODEL_LAST] = { | 4614 | static const char * const alc880_models[ALC880_MODEL_LAST] = { |
4563 | [ALC880_3ST] = "3stack", | 4615 | [ALC880_3ST] = "3stack", |
4564 | [ALC880_TCL_S700] = "tcl", | 4616 | [ALC880_TCL_S700] = "tcl", |
4565 | [ALC880_3ST_DIG] = "3stack-digout", | 4617 | [ALC880_3ST_DIG] = "3stack-digout", |
@@ -5092,7 +5144,7 @@ static const char *alc_get_line_out_pfx(const struct auto_pin_cfg *cfg, | |||
5092 | static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec, | 5144 | static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec, |
5093 | const struct auto_pin_cfg *cfg) | 5145 | const struct auto_pin_cfg *cfg) |
5094 | { | 5146 | { |
5095 | static const char *chname[4] = { | 5147 | static const char * const chname[4] = { |
5096 | "Front", "Surround", NULL /*CLFE*/, "Side" | 5148 | "Front", "Surround", NULL /*CLFE*/, "Side" |
5097 | }; | 5149 | }; |
5098 | const char *pfx = alc_get_line_out_pfx(cfg, false); | 5150 | const char *pfx = alc_get_line_out_pfx(cfg, false); |
@@ -7090,7 +7142,8 @@ enum { | |||
7090 | 7142 | ||
7091 | static const struct alc_fixup alc260_fixups[] = { | 7143 | static const struct alc_fixup alc260_fixups[] = { |
7092 | [PINFIX_HP_DC5750] = { | 7144 | [PINFIX_HP_DC5750] = { |
7093 | .pins = (const struct alc_pincfg[]) { | 7145 | .type = ALC_FIXUP_PINS, |
7146 | .v.pins = (const struct alc_pincfg[]) { | ||
7094 | { 0x11, 0x90130110 }, /* speaker */ | 7147 | { 0x11, 0x90130110 }, /* speaker */ |
7095 | { } | 7148 | { } |
7096 | } | 7149 | } |
@@ -7105,7 +7158,7 @@ static struct snd_pci_quirk alc260_fixup_tbl[] = { | |||
7105 | /* | 7158 | /* |
7106 | * ALC260 configurations | 7159 | * ALC260 configurations |
7107 | */ | 7160 | */ |
7108 | static const char *alc260_models[ALC260_MODEL_LAST] = { | 7161 | static const char * const alc260_models[ALC260_MODEL_LAST] = { |
7109 | [ALC260_BASIC] = "basic", | 7162 | [ALC260_BASIC] = "basic", |
7110 | [ALC260_HP] = "hp", | 7163 | [ALC260_HP] = "hp", |
7111 | [ALC260_HP_3013] = "hp-3013", | 7164 | [ALC260_HP_3013] = "hp-3013", |
@@ -7301,8 +7354,10 @@ static int patch_alc260(struct hda_codec *codec) | |||
7301 | board_config = ALC260_AUTO; | 7354 | board_config = ALC260_AUTO; |
7302 | } | 7355 | } |
7303 | 7356 | ||
7304 | if (board_config == ALC260_AUTO) | 7357 | if (board_config == ALC260_AUTO) { |
7305 | alc_pick_fixup(codec, alc260_fixup_tbl, alc260_fixups, 1); | 7358 | alc_pick_fixup(codec, NULL, alc260_fixup_tbl, alc260_fixups); |
7359 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
7360 | } | ||
7306 | 7361 | ||
7307 | if (board_config == ALC260_AUTO) { | 7362 | if (board_config == ALC260_AUTO) { |
7308 | /* automatic parse from the BIOS config */ | 7363 | /* automatic parse from the BIOS config */ |
@@ -7350,8 +7405,7 @@ static int patch_alc260(struct hda_codec *codec) | |||
7350 | set_capture_mixer(codec); | 7405 | set_capture_mixer(codec); |
7351 | set_beep_amp(spec, 0x07, 0x05, HDA_INPUT); | 7406 | set_beep_amp(spec, 0x07, 0x05, HDA_INPUT); |
7352 | 7407 | ||
7353 | if (board_config == ALC260_AUTO) | 7408 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
7354 | alc_pick_fixup(codec, alc260_fixup_tbl, alc260_fixups, 0); | ||
7355 | 7409 | ||
7356 | spec->vmaster_nid = 0x08; | 7410 | spec->vmaster_nid = 0x08; |
7357 | 7411 | ||
@@ -9727,7 +9781,7 @@ static hda_nid_t alc1200_slave_dig_outs[] = { | |||
9727 | /* | 9781 | /* |
9728 | * configuration and preset | 9782 | * configuration and preset |
9729 | */ | 9783 | */ |
9730 | static const char *alc882_models[ALC882_MODEL_LAST] = { | 9784 | static const char * const alc882_models[ALC882_MODEL_LAST] = { |
9731 | [ALC882_3ST_DIG] = "3stack-dig", | 9785 | [ALC882_3ST_DIG] = "3stack-dig", |
9732 | [ALC882_6ST_DIG] = "6stack-dig", | 9786 | [ALC882_6ST_DIG] = "6stack-dig", |
9733 | [ALC882_ARIMA] = "arima", | 9787 | [ALC882_ARIMA] = "arima", |
@@ -10678,7 +10732,8 @@ enum { | |||
10678 | 10732 | ||
10679 | static const struct alc_fixup alc882_fixups[] = { | 10733 | static const struct alc_fixup alc882_fixups[] = { |
10680 | [PINFIX_ABIT_AW9D_MAX] = { | 10734 | [PINFIX_ABIT_AW9D_MAX] = { |
10681 | .pins = (const struct alc_pincfg[]) { | 10735 | .type = ALC_FIXUP_PINS, |
10736 | .v.pins = (const struct alc_pincfg[]) { | ||
10682 | { 0x15, 0x01080104 }, /* side */ | 10737 | { 0x15, 0x01080104 }, /* side */ |
10683 | { 0x16, 0x01011012 }, /* rear */ | 10738 | { 0x16, 0x01011012 }, /* rear */ |
10684 | { 0x17, 0x01016011 }, /* clfe */ | 10739 | { 0x17, 0x01016011 }, /* clfe */ |
@@ -10686,13 +10741,15 @@ static const struct alc_fixup alc882_fixups[] = { | |||
10686 | } | 10741 | } |
10687 | }, | 10742 | }, |
10688 | [PINFIX_PB_M5210] = { | 10743 | [PINFIX_PB_M5210] = { |
10689 | .verbs = (const struct hda_verb[]) { | 10744 | .type = ALC_FIXUP_VERBS, |
10745 | .v.verbs = (const struct hda_verb[]) { | ||
10690 | { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, | 10746 | { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, |
10691 | {} | 10747 | {} |
10692 | } | 10748 | } |
10693 | }, | 10749 | }, |
10694 | [PINFIX_ACER_ASPIRE_7736] = { | 10750 | [PINFIX_ACER_ASPIRE_7736] = { |
10695 | .sku = ALC_FIXUP_SKU_IGNORE, | 10751 | .type = ALC_FIXUP_SKU, |
10752 | .v.sku = ALC_FIXUP_SKU_IGNORE, | ||
10696 | }, | 10753 | }, |
10697 | }; | 10754 | }; |
10698 | 10755 | ||
@@ -10984,8 +11041,10 @@ static int patch_alc882(struct hda_codec *codec) | |||
10984 | board_config = ALC882_AUTO; | 11041 | board_config = ALC882_AUTO; |
10985 | } | 11042 | } |
10986 | 11043 | ||
10987 | if (board_config == ALC882_AUTO) | 11044 | if (board_config == ALC882_AUTO) { |
10988 | alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 1); | 11045 | alc_pick_fixup(codec, NULL, alc882_fixup_tbl, alc882_fixups); |
11046 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
11047 | } | ||
10989 | 11048 | ||
10990 | alc_auto_parse_customize_define(codec); | 11049 | alc_auto_parse_customize_define(codec); |
10991 | 11050 | ||
@@ -11061,8 +11120,7 @@ static int patch_alc882(struct hda_codec *codec) | |||
11061 | if (has_cdefine_beep(codec)) | 11120 | if (has_cdefine_beep(codec)) |
11062 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | 11121 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); |
11063 | 11122 | ||
11064 | if (board_config == ALC882_AUTO) | 11123 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
11065 | alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 0); | ||
11066 | 11124 | ||
11067 | spec->vmaster_nid = 0x0c; | 11125 | spec->vmaster_nid = 0x0c; |
11068 | 11126 | ||
@@ -12452,19 +12510,14 @@ enum { | |||
12452 | 12510 | ||
12453 | static const struct alc_fixup alc262_fixups[] = { | 12511 | static const struct alc_fixup alc262_fixups[] = { |
12454 | [PINFIX_FSC_H270] = { | 12512 | [PINFIX_FSC_H270] = { |
12455 | .pins = (const struct alc_pincfg[]) { | 12513 | .type = ALC_FIXUP_PINS, |
12514 | .v.pins = (const struct alc_pincfg[]) { | ||
12456 | { 0x14, 0x99130110 }, /* speaker */ | 12515 | { 0x14, 0x99130110 }, /* speaker */ |
12457 | { 0x15, 0x0221142f }, /* front HP */ | 12516 | { 0x15, 0x0221142f }, /* front HP */ |
12458 | { 0x1b, 0x0121141f }, /* rear HP */ | 12517 | { 0x1b, 0x0121141f }, /* rear HP */ |
12459 | { } | 12518 | { } |
12460 | } | 12519 | } |
12461 | }, | 12520 | }, |
12462 | [PINFIX_PB_M5210] = { | ||
12463 | .verbs = (const struct hda_verb[]) { | ||
12464 | { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, | ||
12465 | {} | ||
12466 | } | ||
12467 | }, | ||
12468 | }; | 12521 | }; |
12469 | 12522 | ||
12470 | static struct snd_pci_quirk alc262_fixup_tbl[] = { | 12523 | static struct snd_pci_quirk alc262_fixup_tbl[] = { |
@@ -12554,7 +12607,7 @@ static void alc262_auto_init(struct hda_codec *codec) | |||
12554 | /* | 12607 | /* |
12555 | * configuration and preset | 12608 | * configuration and preset |
12556 | */ | 12609 | */ |
12557 | static const char *alc262_models[ALC262_MODEL_LAST] = { | 12610 | static const char * const alc262_models[ALC262_MODEL_LAST] = { |
12558 | [ALC262_BASIC] = "basic", | 12611 | [ALC262_BASIC] = "basic", |
12559 | [ALC262_HIPPO] = "hippo", | 12612 | [ALC262_HIPPO] = "hippo", |
12560 | [ALC262_HIPPO_1] = "hippo_1", | 12613 | [ALC262_HIPPO_1] = "hippo_1", |
@@ -12895,8 +12948,10 @@ static int patch_alc262(struct hda_codec *codec) | |||
12895 | board_config = ALC262_AUTO; | 12948 | board_config = ALC262_AUTO; |
12896 | } | 12949 | } |
12897 | 12950 | ||
12898 | if (board_config == ALC262_AUTO) | 12951 | if (board_config == ALC262_AUTO) { |
12899 | alc_pick_fixup(codec, alc262_fixup_tbl, alc262_fixups, 1); | 12952 | alc_pick_fixup(codec, NULL, alc262_fixup_tbl, alc262_fixups); |
12953 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
12954 | } | ||
12900 | 12955 | ||
12901 | if (board_config == ALC262_AUTO) { | 12956 | if (board_config == ALC262_AUTO) { |
12902 | /* automatic parse from the BIOS config */ | 12957 | /* automatic parse from the BIOS config */ |
@@ -12966,8 +13021,7 @@ static int patch_alc262(struct hda_codec *codec) | |||
12966 | if (!spec->no_analog && has_cdefine_beep(codec)) | 13021 | if (!spec->no_analog && has_cdefine_beep(codec)) |
12967 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | 13022 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); |
12968 | 13023 | ||
12969 | if (board_config == ALC262_AUTO) | 13024 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
12970 | alc_pick_fixup(codec, alc262_fixup_tbl, alc262_fixups, 0); | ||
12971 | 13025 | ||
12972 | spec->vmaster_nid = 0x0c; | 13026 | spec->vmaster_nid = 0x0c; |
12973 | 13027 | ||
@@ -13741,7 +13795,7 @@ static void alc268_auto_init(struct hda_codec *codec) | |||
13741 | /* | 13795 | /* |
13742 | * configuration and preset | 13796 | * configuration and preset |
13743 | */ | 13797 | */ |
13744 | static const char *alc268_models[ALC268_MODEL_LAST] = { | 13798 | static const char * const alc268_models[ALC268_MODEL_LAST] = { |
13745 | [ALC267_QUANTA_IL1] = "quanta-il1", | 13799 | [ALC267_QUANTA_IL1] = "quanta-il1", |
13746 | [ALC268_3ST] = "3stack", | 13800 | [ALC268_3ST] = "3stack", |
13747 | [ALC268_TOSHIBA] = "toshiba", | 13801 | [ALC268_TOSHIBA] = "toshiba", |
@@ -14822,17 +14876,19 @@ static int alc269_resume(struct hda_codec *codec) | |||
14822 | #endif /* SND_HDA_NEEDS_RESUME */ | 14876 | #endif /* SND_HDA_NEEDS_RESUME */ |
14823 | 14877 | ||
14824 | static void alc269_fixup_hweq(struct hda_codec *codec, | 14878 | static void alc269_fixup_hweq(struct hda_codec *codec, |
14825 | const struct alc_fixup *fix, int pre_init) | 14879 | const struct alc_fixup *fix, int action) |
14826 | { | 14880 | { |
14827 | int coef; | 14881 | int coef; |
14828 | 14882 | ||
14883 | if (action != ALC_FIXUP_ACT_INIT) | ||
14884 | return; | ||
14829 | coef = alc_read_coef_idx(codec, 0x1e); | 14885 | coef = alc_read_coef_idx(codec, 0x1e); |
14830 | alc_write_coef_idx(codec, 0x1e, coef | 0x80); | 14886 | alc_write_coef_idx(codec, 0x1e, coef | 0x80); |
14831 | } | 14887 | } |
14832 | 14888 | ||
14833 | enum { | 14889 | enum { |
14834 | ALC269_FIXUP_SONY_VAIO, | 14890 | ALC269_FIXUP_SONY_VAIO, |
14835 | ALC275_FIX_SONY_VAIO_GPIO2, | 14891 | ALC275_FIXUP_SONY_VAIO_GPIO2, |
14836 | ALC269_FIXUP_DELL_M101Z, | 14892 | ALC269_FIXUP_DELL_M101Z, |
14837 | ALC269_FIXUP_SKU_IGNORE, | 14893 | ALC269_FIXUP_SKU_IGNORE, |
14838 | ALC269_FIXUP_ASUS_G73JW, | 14894 | ALC269_FIXUP_ASUS_G73JW, |
@@ -14842,22 +14898,26 @@ enum { | |||
14842 | 14898 | ||
14843 | static const struct alc_fixup alc269_fixups[] = { | 14899 | static const struct alc_fixup alc269_fixups[] = { |
14844 | [ALC269_FIXUP_SONY_VAIO] = { | 14900 | [ALC269_FIXUP_SONY_VAIO] = { |
14845 | .verbs = (const struct hda_verb[]) { | 14901 | .type = ALC_FIXUP_VERBS, |
14902 | .v.verbs = (const struct hda_verb[]) { | ||
14846 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD}, | 14903 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD}, |
14847 | {} | 14904 | {} |
14848 | } | 14905 | } |
14849 | }, | 14906 | }, |
14850 | [ALC275_FIX_SONY_VAIO_GPIO2] = { | 14907 | [ALC275_FIXUP_SONY_VAIO_GPIO2] = { |
14851 | .verbs = (const struct hda_verb[]) { | 14908 | .type = ALC_FIXUP_VERBS, |
14909 | .v.verbs = (const struct hda_verb[]) { | ||
14852 | {0x01, AC_VERB_SET_GPIO_MASK, 0x04}, | 14910 | {0x01, AC_VERB_SET_GPIO_MASK, 0x04}, |
14853 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04}, | 14911 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04}, |
14854 | {0x01, AC_VERB_SET_GPIO_DATA, 0x00}, | 14912 | {0x01, AC_VERB_SET_GPIO_DATA, 0x00}, |
14855 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD}, | ||
14856 | { } | 14913 | { } |
14857 | } | 14914 | }, |
14915 | .chained = true, | ||
14916 | .chain_id = ALC269_FIXUP_SONY_VAIO | ||
14858 | }, | 14917 | }, |
14859 | [ALC269_FIXUP_DELL_M101Z] = { | 14918 | [ALC269_FIXUP_DELL_M101Z] = { |
14860 | .verbs = (const struct hda_verb[]) { | 14919 | .type = ALC_FIXUP_VERBS, |
14920 | .v.verbs = (const struct hda_verb[]) { | ||
14861 | /* Enables internal speaker */ | 14921 | /* Enables internal speaker */ |
14862 | {0x20, AC_VERB_SET_COEF_INDEX, 13}, | 14922 | {0x20, AC_VERB_SET_COEF_INDEX, 13}, |
14863 | {0x20, AC_VERB_SET_PROC_COEF, 0x4040}, | 14923 | {0x20, AC_VERB_SET_PROC_COEF, 0x4040}, |
@@ -14865,34 +14925,33 @@ static const struct alc_fixup alc269_fixups[] = { | |||
14865 | } | 14925 | } |
14866 | }, | 14926 | }, |
14867 | [ALC269_FIXUP_SKU_IGNORE] = { | 14927 | [ALC269_FIXUP_SKU_IGNORE] = { |
14868 | .sku = ALC_FIXUP_SKU_IGNORE, | 14928 | .type = ALC_FIXUP_SKU, |
14929 | .v.sku = ALC_FIXUP_SKU_IGNORE, | ||
14869 | }, | 14930 | }, |
14870 | [ALC269_FIXUP_ASUS_G73JW] = { | 14931 | [ALC269_FIXUP_ASUS_G73JW] = { |
14871 | .pins = (const struct alc_pincfg[]) { | 14932 | .type = ALC_FIXUP_PINS, |
14933 | .v.pins = (const struct alc_pincfg[]) { | ||
14872 | { 0x17, 0x99130111 }, /* subwoofer */ | 14934 | { 0x17, 0x99130111 }, /* subwoofer */ |
14873 | { } | 14935 | { } |
14874 | } | 14936 | } |
14875 | }, | 14937 | }, |
14876 | [ALC269_FIXUP_LENOVO_EAPD] = { | 14938 | [ALC269_FIXUP_LENOVO_EAPD] = { |
14877 | .verbs = (const struct hda_verb[]) { | 14939 | .type = ALC_FIXUP_VERBS, |
14940 | .v.verbs = (const struct hda_verb[]) { | ||
14878 | {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0}, | 14941 | {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0}, |
14879 | {} | 14942 | {} |
14880 | } | 14943 | } |
14881 | }, | 14944 | }, |
14882 | [ALC275_FIXUP_SONY_HWEQ] = { | 14945 | [ALC275_FIXUP_SONY_HWEQ] = { |
14883 | .func = alc269_fixup_hweq, | 14946 | .type = ALC_FIXUP_FUNC, |
14884 | .verbs = (const struct hda_verb[]) { | 14947 | .v.func = alc269_fixup_hweq, |
14885 | {0x01, AC_VERB_SET_GPIO_MASK, 0x04}, | 14948 | .chained = true, |
14886 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04}, | 14949 | .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2 |
14887 | {0x01, AC_VERB_SET_GPIO_DATA, 0x00}, | ||
14888 | {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD}, | ||
14889 | { } | ||
14890 | } | ||
14891 | } | 14950 | } |
14892 | }; | 14951 | }; |
14893 | 14952 | ||
14894 | static struct snd_pci_quirk alc269_fixup_tbl[] = { | 14953 | static struct snd_pci_quirk alc269_fixup_tbl[] = { |
14895 | SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIX_SONY_VAIO_GPIO2), | 14954 | SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2), |
14896 | SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), | 14955 | SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), |
14897 | SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), | 14956 | SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), |
14898 | SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), | 14957 | SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), |
@@ -14908,7 +14967,7 @@ static struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
14908 | /* | 14967 | /* |
14909 | * configuration and preset | 14968 | * configuration and preset |
14910 | */ | 14969 | */ |
14911 | static const char *alc269_models[ALC269_MODEL_LAST] = { | 14970 | static const char * const alc269_models[ALC269_MODEL_LAST] = { |
14912 | [ALC269_BASIC] = "basic", | 14971 | [ALC269_BASIC] = "basic", |
14913 | [ALC269_QUANTA_FL1] = "quanta", | 14972 | [ALC269_QUANTA_FL1] = "quanta", |
14914 | [ALC269_AMIC] = "laptop-amic", | 14973 | [ALC269_AMIC] = "laptop-amic", |
@@ -15184,8 +15243,10 @@ static int patch_alc269(struct hda_codec *codec) | |||
15184 | board_config = ALC269_AUTO; | 15243 | board_config = ALC269_AUTO; |
15185 | } | 15244 | } |
15186 | 15245 | ||
15187 | if (board_config == ALC269_AUTO) | 15246 | if (board_config == ALC269_AUTO) { |
15188 | alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 1); | 15247 | alc_pick_fixup(codec, NULL, alc269_fixup_tbl, alc269_fixups); |
15248 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
15249 | } | ||
15189 | 15250 | ||
15190 | if (board_config == ALC269_AUTO) { | 15251 | if (board_config == ALC269_AUTO) { |
15191 | /* automatic parse from the BIOS config */ | 15252 | /* automatic parse from the BIOS config */ |
@@ -15246,8 +15307,7 @@ static int patch_alc269(struct hda_codec *codec) | |||
15246 | if (has_cdefine_beep(codec)) | 15307 | if (has_cdefine_beep(codec)) |
15247 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); | 15308 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); |
15248 | 15309 | ||
15249 | if (board_config == ALC269_AUTO) | 15310 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
15250 | alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 0); | ||
15251 | 15311 | ||
15252 | spec->vmaster_nid = 0x02; | 15312 | spec->vmaster_nid = 0x02; |
15253 | 15313 | ||
@@ -15950,7 +16010,7 @@ static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec, | |||
15950 | const struct auto_pin_cfg *cfg) | 16010 | const struct auto_pin_cfg *cfg) |
15951 | { | 16011 | { |
15952 | struct alc_spec *spec = codec->spec; | 16012 | struct alc_spec *spec = codec->spec; |
15953 | static const char *chname[4] = { | 16013 | static const char * const chname[4] = { |
15954 | "Front", "Surround", NULL /*CLFE*/, "Side" | 16014 | "Front", "Surround", NULL /*CLFE*/, "Side" |
15955 | }; | 16015 | }; |
15956 | const char *pfx = alc_get_line_out_pfx(cfg, true); | 16016 | const char *pfx = alc_get_line_out_pfx(cfg, true); |
@@ -16156,7 +16216,7 @@ static struct hda_amp_list alc861_loopbacks[] = { | |||
16156 | /* | 16216 | /* |
16157 | * configuration and preset | 16217 | * configuration and preset |
16158 | */ | 16218 | */ |
16159 | static const char *alc861_models[ALC861_MODEL_LAST] = { | 16219 | static const char * const alc861_models[ALC861_MODEL_LAST] = { |
16160 | [ALC861_3ST] = "3stack", | 16220 | [ALC861_3ST] = "3stack", |
16161 | [ALC660_3ST] = "3stack-660", | 16221 | [ALC660_3ST] = "3stack-660", |
16162 | [ALC861_3ST_DIG] = "3stack-dig", | 16222 | [ALC861_3ST_DIG] = "3stack-dig", |
@@ -16306,7 +16366,8 @@ enum { | |||
16306 | 16366 | ||
16307 | static const struct alc_fixup alc861_fixups[] = { | 16367 | static const struct alc_fixup alc861_fixups[] = { |
16308 | [PINFIX_FSC_AMILO_PI1505] = { | 16368 | [PINFIX_FSC_AMILO_PI1505] = { |
16309 | .pins = (const struct alc_pincfg[]) { | 16369 | .type = ALC_FIXUP_PINS, |
16370 | .v.pins = (const struct alc_pincfg[]) { | ||
16310 | { 0x0b, 0x0221101f }, /* HP */ | 16371 | { 0x0b, 0x0221101f }, /* HP */ |
16311 | { 0x0f, 0x90170310 }, /* speaker */ | 16372 | { 0x0f, 0x90170310 }, /* speaker */ |
16312 | { } | 16373 | { } |
@@ -16341,8 +16402,10 @@ static int patch_alc861(struct hda_codec *codec) | |||
16341 | board_config = ALC861_AUTO; | 16402 | board_config = ALC861_AUTO; |
16342 | } | 16403 | } |
16343 | 16404 | ||
16344 | if (board_config == ALC861_AUTO) | 16405 | if (board_config == ALC861_AUTO) { |
16345 | alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 1); | 16406 | alc_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups); |
16407 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
16408 | } | ||
16346 | 16409 | ||
16347 | if (board_config == ALC861_AUTO) { | 16410 | if (board_config == ALC861_AUTO) { |
16348 | /* automatic parse from the BIOS config */ | 16411 | /* automatic parse from the BIOS config */ |
@@ -16379,8 +16442,7 @@ static int patch_alc861(struct hda_codec *codec) | |||
16379 | 16442 | ||
16380 | spec->vmaster_nid = 0x03; | 16443 | spec->vmaster_nid = 0x03; |
16381 | 16444 | ||
16382 | if (board_config == ALC861_AUTO) | 16445 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
16383 | alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 0); | ||
16384 | 16446 | ||
16385 | codec->patch_ops = alc_patch_ops; | 16447 | codec->patch_ops = alc_patch_ops; |
16386 | if (board_config == ALC861_AUTO) { | 16448 | if (board_config == ALC861_AUTO) { |
@@ -16857,7 +16919,7 @@ static void alc861vd_dallas_setup(struct hda_codec *codec) | |||
16857 | /* | 16919 | /* |
16858 | * configuration and preset | 16920 | * configuration and preset |
16859 | */ | 16921 | */ |
16860 | static const char *alc861vd_models[ALC861VD_MODEL_LAST] = { | 16922 | static const char * const alc861vd_models[ALC861VD_MODEL_LAST] = { |
16861 | [ALC660VD_3ST] = "3stack-660", | 16923 | [ALC660VD_3ST] = "3stack-660", |
16862 | [ALC660VD_3ST_DIG] = "3stack-660-digout", | 16924 | [ALC660VD_3ST_DIG] = "3stack-660-digout", |
16863 | [ALC660VD_ASUS_V1S] = "asus-v1s", | 16925 | [ALC660VD_ASUS_V1S] = "asus-v1s", |
@@ -17077,7 +17139,9 @@ static void alc861vd_auto_init_analog_input(struct hda_codec *codec) | |||
17077 | static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec, | 17139 | static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec, |
17078 | const struct auto_pin_cfg *cfg) | 17140 | const struct auto_pin_cfg *cfg) |
17079 | { | 17141 | { |
17080 | static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"}; | 17142 | static const char * const chname[4] = { |
17143 | "Front", "Surround", "CLFE", "Side" | ||
17144 | }; | ||
17081 | const char *pfx = alc_get_line_out_pfx(cfg, true); | 17145 | const char *pfx = alc_get_line_out_pfx(cfg, true); |
17082 | hda_nid_t nid_v, nid_s; | 17146 | hda_nid_t nid_v, nid_s; |
17083 | int i, err; | 17147 | int i, err; |
@@ -17262,7 +17326,8 @@ enum { | |||
17262 | /* reset GPIO1 */ | 17326 | /* reset GPIO1 */ |
17263 | static const struct alc_fixup alc861vd_fixups[] = { | 17327 | static const struct alc_fixup alc861vd_fixups[] = { |
17264 | [ALC660VD_FIX_ASUS_GPIO1] = { | 17328 | [ALC660VD_FIX_ASUS_GPIO1] = { |
17265 | .verbs = (const struct hda_verb[]) { | 17329 | .type = ALC_FIXUP_VERBS, |
17330 | .v.verbs = (const struct hda_verb[]) { | ||
17266 | {0x01, AC_VERB_SET_GPIO_MASK, 0x03}, | 17331 | {0x01, AC_VERB_SET_GPIO_MASK, 0x03}, |
17267 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, | 17332 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, |
17268 | {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, | 17333 | {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, |
@@ -17297,8 +17362,10 @@ static int patch_alc861vd(struct hda_codec *codec) | |||
17297 | board_config = ALC861VD_AUTO; | 17362 | board_config = ALC861VD_AUTO; |
17298 | } | 17363 | } |
17299 | 17364 | ||
17300 | if (board_config == ALC861VD_AUTO) | 17365 | if (board_config == ALC861VD_AUTO) { |
17301 | alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 1); | 17366 | alc_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups); |
17367 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
17368 | } | ||
17302 | 17369 | ||
17303 | if (board_config == ALC861VD_AUTO) { | 17370 | if (board_config == ALC861VD_AUTO) { |
17304 | /* automatic parse from the BIOS config */ | 17371 | /* automatic parse from the BIOS config */ |
@@ -17346,8 +17413,7 @@ static int patch_alc861vd(struct hda_codec *codec) | |||
17346 | 17413 | ||
17347 | spec->vmaster_nid = 0x02; | 17414 | spec->vmaster_nid = 0x02; |
17348 | 17415 | ||
17349 | if (board_config == ALC861VD_AUTO) | 17416 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); |
17350 | alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 0); | ||
17351 | 17417 | ||
17352 | codec->patch_ops = alc_patch_ops; | 17418 | codec->patch_ops = alc_patch_ops; |
17353 | 17419 | ||
@@ -18630,7 +18696,7 @@ static struct snd_kcontrol_new alc272_nc10_mixer[] = { | |||
18630 | /* | 18696 | /* |
18631 | * configuration and preset | 18697 | * configuration and preset |
18632 | */ | 18698 | */ |
18633 | static const char *alc662_models[ALC662_MODEL_LAST] = { | 18699 | static const char * const alc662_models[ALC662_MODEL_LAST] = { |
18634 | [ALC662_3ST_2ch_DIG] = "3stack-dig", | 18700 | [ALC662_3ST_2ch_DIG] = "3stack-dig", |
18635 | [ALC662_3ST_6ch_DIG] = "3stack-6ch-dig", | 18701 | [ALC662_3ST_6ch_DIG] = "3stack-6ch-dig", |
18636 | [ALC662_3ST_6ch] = "3stack-6ch", | 18702 | [ALC662_3ST_6ch] = "3stack-6ch", |
@@ -19145,7 +19211,7 @@ static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec, | |||
19145 | const struct auto_pin_cfg *cfg) | 19211 | const struct auto_pin_cfg *cfg) |
19146 | { | 19212 | { |
19147 | struct alc_spec *spec = codec->spec; | 19213 | struct alc_spec *spec = codec->spec; |
19148 | static const char *chname[4] = { | 19214 | static const char * const chname[4] = { |
19149 | "Front", "Surround", NULL /*CLFE*/, "Side" | 19215 | "Front", "Surround", NULL /*CLFE*/, "Side" |
19150 | }; | 19216 | }; |
19151 | const char *pfx = alc_get_line_out_pfx(cfg, true); | 19217 | const char *pfx = alc_get_line_out_pfx(cfg, true); |
@@ -19378,7 +19444,10 @@ static void alc662_auto_init(struct hda_codec *codec) | |||
19378 | } | 19444 | } |
19379 | 19445 | ||
19380 | static void alc272_fixup_mario(struct hda_codec *codec, | 19446 | static void alc272_fixup_mario(struct hda_codec *codec, |
19381 | const struct alc_fixup *fix, int pre_init) { | 19447 | const struct alc_fixup *fix, int action) |
19448 | { | ||
19449 | if (action != ALC_FIXUP_ACT_PROBE) | ||
19450 | return; | ||
19382 | if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT, | 19451 | if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT, |
19383 | (0x3b << AC_AMPCAP_OFFSET_SHIFT) | | 19452 | (0x3b << AC_AMPCAP_OFFSET_SHIFT) | |
19384 | (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) | | 19453 | (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) | |
@@ -19396,19 +19465,22 @@ enum { | |||
19396 | 19465 | ||
19397 | static const struct alc_fixup alc662_fixups[] = { | 19466 | static const struct alc_fixup alc662_fixups[] = { |
19398 | [ALC662_FIXUP_ASPIRE] = { | 19467 | [ALC662_FIXUP_ASPIRE] = { |
19399 | .pins = (const struct alc_pincfg[]) { | 19468 | .type = ALC_FIXUP_PINS, |
19469 | .v.pins = (const struct alc_pincfg[]) { | ||
19400 | { 0x15, 0x99130112 }, /* subwoofer */ | 19470 | { 0x15, 0x99130112 }, /* subwoofer */ |
19401 | { } | 19471 | { } |
19402 | } | 19472 | } |
19403 | }, | 19473 | }, |
19404 | [ALC662_FIXUP_IDEAPAD] = { | 19474 | [ALC662_FIXUP_IDEAPAD] = { |
19405 | .pins = (const struct alc_pincfg[]) { | 19475 | .type = ALC_FIXUP_PINS, |
19476 | .v.pins = (const struct alc_pincfg[]) { | ||
19406 | { 0x17, 0x99130112 }, /* subwoofer */ | 19477 | { 0x17, 0x99130112 }, /* subwoofer */ |
19407 | { } | 19478 | { } |
19408 | } | 19479 | } |
19409 | }, | 19480 | }, |
19410 | [ALC272_FIXUP_MARIO] = { | 19481 | [ALC272_FIXUP_MARIO] = { |
19411 | .func = alc272_fixup_mario, | 19482 | .type = ALC_FIXUP_FUNC, |
19483 | .v.func = alc272_fixup_mario, | ||
19412 | } | 19484 | } |
19413 | }; | 19485 | }; |
19414 | 19486 | ||
@@ -19462,7 +19534,9 @@ static int patch_alc662(struct hda_codec *codec) | |||
19462 | } | 19534 | } |
19463 | 19535 | ||
19464 | if (board_config == ALC662_AUTO) { | 19536 | if (board_config == ALC662_AUTO) { |
19465 | alc_pick_fixup(codec, alc662_fixup_tbl, alc662_fixups, 1); | 19537 | alc_pick_fixup(codec, alc662_fixup_models, |
19538 | alc662_fixup_tbl, alc662_fixups); | ||
19539 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
19466 | /* automatic parse from the BIOS config */ | 19540 | /* automatic parse from the BIOS config */ |
19467 | err = alc662_parse_auto_config(codec); | 19541 | err = alc662_parse_auto_config(codec); |
19468 | if (err < 0) { | 19542 | if (err < 0) { |
@@ -19520,12 +19594,11 @@ static int patch_alc662(struct hda_codec *codec) | |||
19520 | } | 19594 | } |
19521 | spec->vmaster_nid = 0x02; | 19595 | spec->vmaster_nid = 0x02; |
19522 | 19596 | ||
19597 | alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE); | ||
19598 | |||
19523 | codec->patch_ops = alc_patch_ops; | 19599 | codec->patch_ops = alc_patch_ops; |
19524 | if (board_config == ALC662_AUTO) { | 19600 | if (board_config == ALC662_AUTO) |
19525 | spec->init_hook = alc662_auto_init; | 19601 | spec->init_hook = alc662_auto_init; |
19526 | alc_pick_fixup_model(codec, alc662_fixup_models, | ||
19527 | alc662_fixup_tbl, alc662_fixups, 0); | ||
19528 | } | ||
19529 | 19602 | ||
19530 | alc_init_jacks(codec); | 19603 | alc_init_jacks(codec); |
19531 | 19604 | ||
@@ -19913,7 +19986,7 @@ static void alc680_auto_init(struct hda_codec *codec) | |||
19913 | /* | 19986 | /* |
19914 | * configuration and preset | 19987 | * configuration and preset |
19915 | */ | 19988 | */ |
19916 | static const char *alc680_models[ALC680_MODEL_LAST] = { | 19989 | static const char * const alc680_models[ALC680_MODEL_LAST] = { |
19917 | [ALC680_BASE] = "base", | 19990 | [ALC680_BASE] = "base", |
19918 | [ALC680_AUTO] = "auto", | 19991 | [ALC680_AUTO] = "auto", |
19919 | }; | 19992 | }; |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 4ab019d0924e..9ea48b425d0b 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -266,7 +266,7 @@ struct sigmatel_spec { | |||
266 | struct sigmatel_mic_route int_mic; | 266 | struct sigmatel_mic_route int_mic; |
267 | struct sigmatel_mic_route dock_mic; | 267 | struct sigmatel_mic_route dock_mic; |
268 | 268 | ||
269 | const char **spdif_labels; | 269 | const char * const *spdif_labels; |
270 | 270 | ||
271 | hda_nid_t dig_in_nid; | 271 | hda_nid_t dig_in_nid; |
272 | hda_nid_t mono_nid; | 272 | hda_nid_t mono_nid; |
@@ -524,7 +524,7 @@ static unsigned long stac927x_capsws[] = { | |||
524 | HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT), | 524 | HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT), |
525 | }; | 525 | }; |
526 | 526 | ||
527 | static const char *stac927x_spdif_labels[5] = { | 527 | static const char * const stac927x_spdif_labels[5] = { |
528 | "Digital Playback", "ADAT", "Analog Mux 1", | 528 | "Digital Playback", "ADAT", "Analog Mux 1", |
529 | "Analog Mux 2", "Analog Mux 3" | 529 | "Analog Mux 2", "Analog Mux 3" |
530 | }; | 530 | }; |
@@ -1062,7 +1062,7 @@ static struct snd_kcontrol_new stac_smux_mixer = { | |||
1062 | .put = stac92xx_smux_enum_put, | 1062 | .put = stac92xx_smux_enum_put, |
1063 | }; | 1063 | }; |
1064 | 1064 | ||
1065 | static const char *slave_vols[] = { | 1065 | static const char * const slave_vols[] = { |
1066 | "Front Playback Volume", | 1066 | "Front Playback Volume", |
1067 | "Surround Playback Volume", | 1067 | "Surround Playback Volume", |
1068 | "Center Playback Volume", | 1068 | "Center Playback Volume", |
@@ -1073,7 +1073,7 @@ static const char *slave_vols[] = { | |||
1073 | NULL | 1073 | NULL |
1074 | }; | 1074 | }; |
1075 | 1075 | ||
1076 | static const char *slave_sws[] = { | 1076 | static const char * const slave_sws[] = { |
1077 | "Front Playback Switch", | 1077 | "Front Playback Switch", |
1078 | "Surround Playback Switch", | 1078 | "Surround Playback Switch", |
1079 | "Center Playback Switch", | 1079 | "Center Playback Switch", |
@@ -1354,7 +1354,7 @@ static unsigned int *stac9200_brd_tbl[STAC_9200_MODELS] = { | |||
1354 | [STAC_9200_PANASONIC] = ref9200_pin_configs, | 1354 | [STAC_9200_PANASONIC] = ref9200_pin_configs, |
1355 | }; | 1355 | }; |
1356 | 1356 | ||
1357 | static const char *stac9200_models[STAC_9200_MODELS] = { | 1357 | static const char * const stac9200_models[STAC_9200_MODELS] = { |
1358 | [STAC_AUTO] = "auto", | 1358 | [STAC_AUTO] = "auto", |
1359 | [STAC_REF] = "ref", | 1359 | [STAC_REF] = "ref", |
1360 | [STAC_9200_OQO] = "oqo", | 1360 | [STAC_9200_OQO] = "oqo", |
@@ -1500,7 +1500,7 @@ static unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = { | |||
1500 | [STAC_M6] = stac925xM6_pin_configs, | 1500 | [STAC_M6] = stac925xM6_pin_configs, |
1501 | }; | 1501 | }; |
1502 | 1502 | ||
1503 | static const char *stac925x_models[STAC_925x_MODELS] = { | 1503 | static const char * const stac925x_models[STAC_925x_MODELS] = { |
1504 | [STAC_925x_AUTO] = "auto", | 1504 | [STAC_925x_AUTO] = "auto", |
1505 | [STAC_REF] = "ref", | 1505 | [STAC_REF] = "ref", |
1506 | [STAC_M1] = "m1", | 1506 | [STAC_M1] = "m1", |
@@ -1574,7 +1574,7 @@ static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = { | |||
1574 | [STAC_92HD73XX_INTEL] = intel_dg45id_pin_configs, | 1574 | [STAC_92HD73XX_INTEL] = intel_dg45id_pin_configs, |
1575 | }; | 1575 | }; |
1576 | 1576 | ||
1577 | static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = { | 1577 | static const char * const stac92hd73xx_models[STAC_92HD73XX_MODELS] = { |
1578 | [STAC_92HD73XX_AUTO] = "auto", | 1578 | [STAC_92HD73XX_AUTO] = "auto", |
1579 | [STAC_92HD73XX_NO_JD] = "no-jd", | 1579 | [STAC_92HD73XX_NO_JD] = "no-jd", |
1580 | [STAC_92HD73XX_REF] = "ref", | 1580 | [STAC_92HD73XX_REF] = "ref", |
@@ -1660,7 +1660,7 @@ static unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = { | |||
1660 | [STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs, | 1660 | [STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs, |
1661 | }; | 1661 | }; |
1662 | 1662 | ||
1663 | static const char *stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = { | 1663 | static const char * const stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = { |
1664 | [STAC_92HD83XXX_AUTO] = "auto", | 1664 | [STAC_92HD83XXX_AUTO] = "auto", |
1665 | [STAC_92HD83XXX_REF] = "ref", | 1665 | [STAC_92HD83XXX_REF] = "ref", |
1666 | [STAC_92HD83XXX_PWR_REF] = "mic-ref", | 1666 | [STAC_92HD83XXX_PWR_REF] = "mic-ref", |
@@ -1722,7 +1722,7 @@ static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = { | |||
1722 | [STAC_HP_DV4_1222NR] = NULL, | 1722 | [STAC_HP_DV4_1222NR] = NULL, |
1723 | }; | 1723 | }; |
1724 | 1724 | ||
1725 | static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = { | 1725 | static const char * const stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = { |
1726 | [STAC_92HD71BXX_AUTO] = "auto", | 1726 | [STAC_92HD71BXX_AUTO] = "auto", |
1727 | [STAC_92HD71BXX_REF] = "ref", | 1727 | [STAC_92HD71BXX_REF] = "ref", |
1728 | [STAC_DELL_M4_1] = "dell-m4-1", | 1728 | [STAC_DELL_M4_1] = "dell-m4-1", |
@@ -1915,7 +1915,7 @@ static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = { | |||
1915 | [STAC_922X_DELL_M82] = dell_922x_m82_pin_configs, | 1915 | [STAC_922X_DELL_M82] = dell_922x_m82_pin_configs, |
1916 | }; | 1916 | }; |
1917 | 1917 | ||
1918 | static const char *stac922x_models[STAC_922X_MODELS] = { | 1918 | static const char * const stac922x_models[STAC_922X_MODELS] = { |
1919 | [STAC_922X_AUTO] = "auto", | 1919 | [STAC_922X_AUTO] = "auto", |
1920 | [STAC_D945_REF] = "ref", | 1920 | [STAC_D945_REF] = "ref", |
1921 | [STAC_D945GTP5] = "5stack", | 1921 | [STAC_D945GTP5] = "5stack", |
@@ -2077,7 +2077,7 @@ static unsigned int *stac927x_brd_tbl[STAC_927X_MODELS] = { | |||
2077 | [STAC_927X_VOLKNOB] = NULL, | 2077 | [STAC_927X_VOLKNOB] = NULL, |
2078 | }; | 2078 | }; |
2079 | 2079 | ||
2080 | static const char *stac927x_models[STAC_927X_MODELS] = { | 2080 | static const char * const stac927x_models[STAC_927X_MODELS] = { |
2081 | [STAC_927X_AUTO] = "auto", | 2081 | [STAC_927X_AUTO] = "auto", |
2082 | [STAC_D965_REF_NO_JD] = "ref-no-jd", | 2082 | [STAC_D965_REF_NO_JD] = "ref-no-jd", |
2083 | [STAC_D965_REF] = "ref", | 2083 | [STAC_D965_REF] = "ref", |
@@ -2180,7 +2180,7 @@ static unsigned int *stac9205_brd_tbl[STAC_9205_MODELS] = { | |||
2180 | [STAC_9205_EAPD] = NULL, | 2180 | [STAC_9205_EAPD] = NULL, |
2181 | }; | 2181 | }; |
2182 | 2182 | ||
2183 | static const char *stac9205_models[STAC_9205_MODELS] = { | 2183 | static const char * const stac9205_models[STAC_9205_MODELS] = { |
2184 | [STAC_9205_AUTO] = "auto", | 2184 | [STAC_9205_AUTO] = "auto", |
2185 | [STAC_9205_REF] = "ref", | 2185 | [STAC_9205_REF] = "ref", |
2186 | [STAC_9205_DELL_M42] = "dell-m42", | 2186 | [STAC_9205_DELL_M42] = "dell-m42", |
@@ -3123,7 +3123,7 @@ static int create_multi_out_ctls(struct hda_codec *codec, int num_outs, | |||
3123 | int type) | 3123 | int type) |
3124 | { | 3124 | { |
3125 | struct sigmatel_spec *spec = codec->spec; | 3125 | struct sigmatel_spec *spec = codec->spec; |
3126 | static const char *chname[4] = { | 3126 | static const char * const chname[4] = { |
3127 | "Front", "Surround", NULL /*CLFE*/, "Side" | 3127 | "Front", "Surround", NULL /*CLFE*/, "Side" |
3128 | }; | 3128 | }; |
3129 | hda_nid_t nid; | 3129 | hda_nid_t nid; |
@@ -3256,7 +3256,7 @@ static int stac92xx_auto_create_hp_ctls(struct hda_codec *codec, | |||
3256 | } | 3256 | } |
3257 | 3257 | ||
3258 | /* labels for mono mux outputs */ | 3258 | /* labels for mono mux outputs */ |
3259 | static const char *stac92xx_mono_labels[4] = { | 3259 | static const char * const stac92xx_mono_labels[4] = { |
3260 | "DAC0", "DAC1", "Mixer", "DAC2" | 3260 | "DAC0", "DAC1", "Mixer", "DAC2" |
3261 | }; | 3261 | }; |
3262 | 3262 | ||
@@ -3380,7 +3380,7 @@ static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec) | |||
3380 | return 0; | 3380 | return 0; |
3381 | }; | 3381 | }; |
3382 | 3382 | ||
3383 | static const char *stac92xx_spdif_labels[3] = { | 3383 | static const char * const stac92xx_spdif_labels[3] = { |
3384 | "Digital Playback", "Analog Mux 1", "Analog Mux 2", | 3384 | "Digital Playback", "Analog Mux 1", "Analog Mux 2", |
3385 | }; | 3385 | }; |
3386 | 3386 | ||
@@ -3388,7 +3388,7 @@ static int stac92xx_auto_create_spdif_mux_ctls(struct hda_codec *codec) | |||
3388 | { | 3388 | { |
3389 | struct sigmatel_spec *spec = codec->spec; | 3389 | struct sigmatel_spec *spec = codec->spec; |
3390 | struct hda_input_mux *spdif_mux = &spec->private_smux; | 3390 | struct hda_input_mux *spdif_mux = &spec->private_smux; |
3391 | const char **labels = spec->spdif_labels; | 3391 | const char * const *labels = spec->spdif_labels; |
3392 | int i, num_cons; | 3392 | int i, num_cons; |
3393 | hda_nid_t con_lst[HDA_MAX_NUM_INPUTS]; | 3393 | hda_nid_t con_lst[HDA_MAX_NUM_INPUTS]; |
3394 | 3394 | ||
@@ -3409,7 +3409,7 @@ static int stac92xx_auto_create_spdif_mux_ctls(struct hda_codec *codec) | |||
3409 | } | 3409 | } |
3410 | 3410 | ||
3411 | /* labels for dmic mux inputs */ | 3411 | /* labels for dmic mux inputs */ |
3412 | static const char *stac92xx_dmic_labels[5] = { | 3412 | static const char * const stac92xx_dmic_labels[5] = { |
3413 | "Analog Inputs", "Digital Mic 1", "Digital Mic 2", | 3413 | "Analog Inputs", "Digital Mic 1", "Digital Mic 2", |
3414 | "Digital Mic 3", "Digital Mic 4" | 3414 | "Digital Mic 3", "Digital Mic 4" |
3415 | }; | 3415 | }; |
@@ -5333,7 +5333,7 @@ again: | |||
5333 | return 0; | 5333 | return 0; |
5334 | } | 5334 | } |
5335 | 5335 | ||
5336 | static int stac92hd83xxx_set_system_btl_amp(struct hda_codec *codec) | 5336 | static int hp_bnb2011_with_dock(struct hda_codec *codec) |
5337 | { | 5337 | { |
5338 | if (codec->vendor_id != 0x111d7605 && | 5338 | if (codec->vendor_id != 0x111d7605 && |
5339 | codec->vendor_id != 0x111d76d1) | 5339 | codec->vendor_id != 0x111d76d1) |
@@ -5348,10 +5348,6 @@ static int stac92hd83xxx_set_system_btl_amp(struct hda_codec *codec) | |||
5348 | case 0x103c161d: | 5348 | case 0x103c161d: |
5349 | case 0x103c161e: | 5349 | case 0x103c161e: |
5350 | case 0x103c161f: | 5350 | case 0x103c161f: |
5351 | case 0x103c1620: | ||
5352 | case 0x103c1621: | ||
5353 | case 0x103c1622: | ||
5354 | case 0x103c1623: | ||
5355 | 5351 | ||
5356 | case 0x103c162a: | 5352 | case 0x103c162a: |
5357 | case 0x103c162b: | 5353 | case 0x103c162b: |
@@ -5360,41 +5356,9 @@ static int stac92hd83xxx_set_system_btl_amp(struct hda_codec *codec) | |||
5360 | case 0x103c1631: | 5356 | case 0x103c1631: |
5361 | 5357 | ||
5362 | case 0x103c1633: | 5358 | case 0x103c1633: |
5363 | 5359 | case 0x103c1634: | |
5364 | case 0x103c1635: | 5360 | case 0x103c1635: |
5365 | 5361 | ||
5366 | case 0x103c164f: | ||
5367 | |||
5368 | case 0x103c1676: | ||
5369 | case 0x103c1677: | ||
5370 | case 0x103c1678: | ||
5371 | case 0x103c1679: | ||
5372 | case 0x103c167a: | ||
5373 | case 0x103c167b: | ||
5374 | case 0x103c167c: | ||
5375 | case 0x103c167d: | ||
5376 | case 0x103c167e: | ||
5377 | case 0x103c167f: | ||
5378 | case 0x103c1680: | ||
5379 | case 0x103c1681: | ||
5380 | case 0x103c1682: | ||
5381 | case 0x103c1683: | ||
5382 | case 0x103c1684: | ||
5383 | case 0x103c1685: | ||
5384 | case 0x103c1686: | ||
5385 | case 0x103c1687: | ||
5386 | case 0x103c1688: | ||
5387 | case 0x103c1689: | ||
5388 | case 0x103c168a: | ||
5389 | case 0x103c168b: | ||
5390 | case 0x103c168c: | ||
5391 | case 0x103c168d: | ||
5392 | case 0x103c168e: | ||
5393 | case 0x103c168f: | ||
5394 | case 0x103c1690: | ||
5395 | case 0x103c1691: | ||
5396 | case 0x103c1692: | ||
5397 | |||
5398 | case 0x103c3587: | 5362 | case 0x103c3587: |
5399 | case 0x103c3588: | 5363 | case 0x103c3588: |
5400 | case 0x103c3589: | 5364 | case 0x103c3589: |
@@ -5402,9 +5366,9 @@ static int stac92hd83xxx_set_system_btl_amp(struct hda_codec *codec) | |||
5402 | 5366 | ||
5403 | case 0x103c3667: | 5367 | case 0x103c3667: |
5404 | case 0x103c3668: | 5368 | case 0x103c3668: |
5405 | /* set BTL amp level to 13.43dB for louder speaker output */ | 5369 | case 0x103c3669: |
5406 | return snd_hda_codec_write_cache(codec, codec->afg, 0, | 5370 | |
5407 | 0x7F4, 0x14); | 5371 | return 1; |
5408 | } | 5372 | } |
5409 | return 0; | 5373 | return 0; |
5410 | } | 5374 | } |
@@ -5420,6 +5384,11 @@ static int patch_stac92hd83xxx(struct hda_codec *codec) | |||
5420 | if (spec == NULL) | 5384 | if (spec == NULL) |
5421 | return -ENOMEM; | 5385 | return -ENOMEM; |
5422 | 5386 | ||
5387 | if (hp_bnb2011_with_dock(codec)) { | ||
5388 | snd_hda_codec_set_pincfg(codec, 0xa, 0x2101201f); | ||
5389 | snd_hda_codec_set_pincfg(codec, 0xf, 0x2181205e); | ||
5390 | } | ||
5391 | |||
5423 | /* reset pin power-down; Windows may leave these bits after reboot */ | 5392 | /* reset pin power-down; Windows may leave these bits after reboot */ |
5424 | snd_hda_codec_write_cache(codec, codec->afg, 0, 0x7EC, 0); | 5393 | snd_hda_codec_write_cache(codec, codec->afg, 0, 0x7EC, 0); |
5425 | snd_hda_codec_write_cache(codec, codec->afg, 0, 0x7ED, 0); | 5394 | snd_hda_codec_write_cache(codec, codec->afg, 0, 0x7ED, 0); |
@@ -5546,8 +5515,6 @@ again: | |||
5546 | AC_VERB_SET_CONNECT_SEL, num_dacs); | 5515 | AC_VERB_SET_CONNECT_SEL, num_dacs); |
5547 | } | 5516 | } |
5548 | 5517 | ||
5549 | stac92hd83xxx_set_system_btl_amp(codec); | ||
5550 | |||
5551 | codec->proc_widget_hook = stac92hd_proc_hook; | 5518 | codec->proc_widget_hook = stac92hd_proc_hook; |
5552 | 5519 | ||
5553 | return 0; | 5520 | return 0; |
@@ -6270,7 +6237,7 @@ static unsigned int stac9872_vaio_pin_configs[9] = { | |||
6270 | 0x90a7013e | 6237 | 0x90a7013e |
6271 | }; | 6238 | }; |
6272 | 6239 | ||
6273 | static const char *stac9872_models[STAC_9872_MODELS] = { | 6240 | static const char * const stac9872_models[STAC_9872_MODELS] = { |
6274 | [STAC_9872_AUTO] = "auto", | 6241 | [STAC_9872_AUTO] = "auto", |
6275 | [STAC_9872_VAIO] = "vaio", | 6242 | [STAC_9872_VAIO] = "vaio", |
6276 | }; | 6243 | }; |
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 7f4852a478a1..a76c3260d941 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c | |||
@@ -2281,7 +2281,9 @@ static int vt1708_auto_create_multi_out_ctls(struct via_spec *spec, | |||
2281 | const struct auto_pin_cfg *cfg) | 2281 | const struct auto_pin_cfg *cfg) |
2282 | { | 2282 | { |
2283 | char name[32]; | 2283 | char name[32]; |
2284 | static const char *chname[4] = { "Front", "Surround", "C/LFE", "Side" }; | 2284 | static const char * const chname[4] = { |
2285 | "Front", "Surround", "C/LFE", "Side" | ||
2286 | }; | ||
2285 | hda_nid_t nid, nid_vol, nid_vols[] = {0x17, 0x19, 0x1a, 0x1b}; | 2287 | hda_nid_t nid, nid_vol, nid_vols[] = {0x17, 0x19, 0x1a, 0x1b}; |
2286 | int i, err; | 2288 | int i, err; |
2287 | 2289 | ||
@@ -2370,7 +2372,7 @@ static void create_hp_imux(struct via_spec *spec) | |||
2370 | { | 2372 | { |
2371 | int i; | 2373 | int i; |
2372 | struct hda_input_mux *imux = &spec->private_imux[1]; | 2374 | struct hda_input_mux *imux = &spec->private_imux[1]; |
2373 | static const char *texts[] = { "OFF", "ON", NULL}; | 2375 | static const char * const texts[] = { "OFF", "ON", NULL}; |
2374 | 2376 | ||
2375 | /* for hp mode select */ | 2377 | /* for hp mode select */ |
2376 | for (i = 0; texts[i]; i++) | 2378 | for (i = 0; texts[i]; i++) |
@@ -2890,7 +2892,9 @@ static int vt1709_auto_create_multi_out_ctls(struct via_spec *spec, | |||
2890 | const struct auto_pin_cfg *cfg) | 2892 | const struct auto_pin_cfg *cfg) |
2891 | { | 2893 | { |
2892 | char name[32]; | 2894 | char name[32]; |
2893 | static const char *chname[4] = { "Front", "Surround", "C/LFE", "Side" }; | 2895 | static const char * const chname[4] = { |
2896 | "Front", "Surround", "C/LFE", "Side" | ||
2897 | }; | ||
2894 | hda_nid_t nid, nid_vol, nid_vols[] = {0x18, 0x1a, 0x1b, 0x29}; | 2898 | hda_nid_t nid, nid_vol, nid_vols[] = {0x18, 0x1a, 0x1b, 0x29}; |
2895 | int i, err; | 2899 | int i, err; |
2896 | 2900 | ||
@@ -3433,7 +3437,9 @@ static int vt1708B_auto_create_multi_out_ctls(struct via_spec *spec, | |||
3433 | const struct auto_pin_cfg *cfg) | 3437 | const struct auto_pin_cfg *cfg) |
3434 | { | 3438 | { |
3435 | char name[32]; | 3439 | char name[32]; |
3436 | static const char *chname[4] = { "Front", "Surround", "C/LFE", "Side" }; | 3440 | static const char * const chname[4] = { |
3441 | "Front", "Surround", "C/LFE", "Side" | ||
3442 | }; | ||
3437 | hda_nid_t nid_vols[] = {0x16, 0x18, 0x26, 0x27}; | 3443 | hda_nid_t nid_vols[] = {0x16, 0x18, 0x26, 0x27}; |
3438 | hda_nid_t nid, nid_vol = 0; | 3444 | hda_nid_t nid, nid_vol = 0; |
3439 | int i, err; | 3445 | int i, err; |
@@ -3861,7 +3867,9 @@ static int vt1708S_auto_create_multi_out_ctls(struct via_spec *spec, | |||
3861 | const struct auto_pin_cfg *cfg) | 3867 | const struct auto_pin_cfg *cfg) |
3862 | { | 3868 | { |
3863 | char name[32]; | 3869 | char name[32]; |
3864 | static const char *chname[4] = { "Front", "Surround", "C/LFE", "Side" }; | 3870 | static const char * const chname[4] = { |
3871 | "Front", "Surround", "C/LFE", "Side" | ||
3872 | }; | ||
3865 | hda_nid_t nid_vols[] = {0x10, 0x11, 0x24, 0x25}; | 3873 | hda_nid_t nid_vols[] = {0x10, 0x11, 0x24, 0x25}; |
3866 | hda_nid_t nid_mutes[] = {0x1C, 0x18, 0x26, 0x27}; | 3874 | hda_nid_t nid_mutes[] = {0x1C, 0x18, 0x26, 0x27}; |
3867 | hda_nid_t nid, nid_vol, nid_mute; | 3875 | hda_nid_t nid, nid_vol, nid_mute; |
@@ -4304,7 +4312,7 @@ static int vt1702_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) | |||
4304 | { | 4312 | { |
4305 | int err, i; | 4313 | int err, i; |
4306 | struct hda_input_mux *imux; | 4314 | struct hda_input_mux *imux; |
4307 | static const char *texts[] = { "ON", "OFF", NULL}; | 4315 | static const char * const texts[] = { "ON", "OFF", NULL}; |
4308 | if (!pin) | 4316 | if (!pin) |
4309 | return 0; | 4317 | return 0; |
4310 | spec->multiout.hp_nid = 0x1D; | 4318 | spec->multiout.hp_nid = 0x1D; |
@@ -4615,7 +4623,9 @@ static int vt1718S_auto_create_multi_out_ctls(struct via_spec *spec, | |||
4615 | const struct auto_pin_cfg *cfg) | 4623 | const struct auto_pin_cfg *cfg) |
4616 | { | 4624 | { |
4617 | char name[32]; | 4625 | char name[32]; |
4618 | static const char *chname[4] = { "Front", "Surround", "C/LFE", "Side" }; | 4626 | static const char * const chname[4] = { |
4627 | "Front", "Surround", "C/LFE", "Side" | ||
4628 | }; | ||
4619 | hda_nid_t nid_vols[] = {0x8, 0x9, 0xa, 0xb}; | 4629 | hda_nid_t nid_vols[] = {0x8, 0x9, 0xa, 0xb}; |
4620 | hda_nid_t nid_mutes[] = {0x24, 0x25, 0x26, 0x27}; | 4630 | hda_nid_t nid_mutes[] = {0x24, 0x25, 0x26, 0x27}; |
4621 | hda_nid_t nid, nid_vol, nid_mute = 0; | 4631 | hda_nid_t nid, nid_vol, nid_mute = 0; |
@@ -5064,7 +5074,9 @@ static int vt1716S_auto_create_multi_out_ctls(struct via_spec *spec, | |||
5064 | const struct auto_pin_cfg *cfg) | 5074 | const struct auto_pin_cfg *cfg) |
5065 | { | 5075 | { |
5066 | char name[32]; | 5076 | char name[32]; |
5067 | static const char *chname[3] = { "Front", "Surround", "C/LFE" }; | 5077 | static const char * const chname[3] = { |
5078 | "Front", "Surround", "C/LFE" | ||
5079 | }; | ||
5068 | hda_nid_t nid_vols[] = {0x10, 0x11, 0x25}; | 5080 | hda_nid_t nid_vols[] = {0x10, 0x11, 0x25}; |
5069 | hda_nid_t nid_mutes[] = {0x1C, 0x18, 0x27}; | 5081 | hda_nid_t nid_mutes[] = {0x1C, 0x18, 0x27}; |
5070 | hda_nid_t nid, nid_vol, nid_mute; | 5082 | hda_nid_t nid, nid_vol, nid_mute; |
diff --git a/sound/pci/oxygen/xonar_dg.c b/sound/pci/oxygen/xonar_dg.c index e4de0b8d087a..e1fa602eba79 100644 --- a/sound/pci/oxygen/xonar_dg.c +++ b/sound/pci/oxygen/xonar_dg.c | |||
@@ -75,7 +75,7 @@ static void cs4245_write(struct oxygen *chip, unsigned int reg, u8 value) | |||
75 | OXYGEN_SPI_CEN_LATCH_CLOCK_HI, | 75 | OXYGEN_SPI_CEN_LATCH_CLOCK_HI, |
76 | CS4245_SPI_ADDRESS | | 76 | CS4245_SPI_ADDRESS | |
77 | CS4245_SPI_WRITE | | 77 | CS4245_SPI_WRITE | |
78 | (value << 8) | reg); | 78 | (reg << 8) | value); |
79 | data->cs4245_regs[reg] = value; | 79 | data->cs4245_regs[reg] = value; |
80 | } | 80 | } |
81 | 81 | ||
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 883a312bb293..c48b23c1d4fc 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig | |||
@@ -44,7 +44,7 @@ config SND_SOC_ALL_CODECS | |||
44 | select SND_SOC_TWL6040 if TWL4030_CORE | 44 | select SND_SOC_TWL6040 if TWL4030_CORE |
45 | select SND_SOC_UDA134X | 45 | select SND_SOC_UDA134X |
46 | select SND_SOC_UDA1380 if I2C | 46 | select SND_SOC_UDA1380 if I2C |
47 | select SND_SOC_WL1273 if WL1273_CORE | 47 | select SND_SOC_WL1273 if RADIO_WL1273 |
48 | select SND_SOC_WM2000 if I2C | 48 | select SND_SOC_WM2000 if I2C |
49 | select SND_SOC_WM8350 if MFD_WM8350 | 49 | select SND_SOC_WM8350 if MFD_WM8350 |
50 | select SND_SOC_WM8400 if MFD_WM8400 | 50 | select SND_SOC_WM8400 if MFD_WM8400 |
diff --git a/sound/soc/codecs/wl1273.c b/sound/soc/codecs/wl1273.c index d3ffa2f0122a..861b28f543d2 100644 --- a/sound/soc/codecs/wl1273.c +++ b/sound/soc/codecs/wl1273.c | |||
@@ -42,7 +42,7 @@ struct wl1273_priv { | |||
42 | static int snd_wl1273_fm_set_i2s_mode(struct wl1273_core *core, | 42 | static int snd_wl1273_fm_set_i2s_mode(struct wl1273_core *core, |
43 | int rate, int width) | 43 | int rate, int width) |
44 | { | 44 | { |
45 | struct device *dev = &core->i2c_dev->dev; | 45 | struct device *dev = &core->client->dev; |
46 | int r = 0; | 46 | int r = 0; |
47 | u16 mode; | 47 | u16 mode; |
48 | 48 | ||
@@ -123,13 +123,13 @@ static int snd_wl1273_fm_set_i2s_mode(struct wl1273_core *core, | |||
123 | dev_dbg(dev, "mode: 0x%04x\n", mode); | 123 | dev_dbg(dev, "mode: 0x%04x\n", mode); |
124 | 124 | ||
125 | if (core->i2s_mode != mode) { | 125 | if (core->i2s_mode != mode) { |
126 | r = wl1273_fm_write_cmd(core, WL1273_I2S_MODE_CONFIG_SET, mode); | 126 | r = core->write(core, WL1273_I2S_MODE_CONFIG_SET, mode); |
127 | if (r) | 127 | if (r) |
128 | goto out; | 128 | goto out; |
129 | 129 | ||
130 | core->i2s_mode = mode; | 130 | core->i2s_mode = mode; |
131 | r = wl1273_fm_write_cmd(core, WL1273_AUDIO_ENABLE, | 131 | r = core->write(core, WL1273_AUDIO_ENABLE, |
132 | WL1273_AUDIO_ENABLE_I2S); | 132 | WL1273_AUDIO_ENABLE_I2S); |
133 | if (r) | 133 | if (r) |
134 | goto out; | 134 | goto out; |
135 | } | 135 | } |
@@ -142,8 +142,7 @@ out: | |||
142 | static int snd_wl1273_fm_set_channel_number(struct wl1273_core *core, | 142 | static int snd_wl1273_fm_set_channel_number(struct wl1273_core *core, |
143 | int channel_number) | 143 | int channel_number) |
144 | { | 144 | { |
145 | struct i2c_client *client = core->i2c_dev; | 145 | struct device *dev = &core->client->dev; |
146 | struct device *dev = &client->dev; | ||
147 | int r = 0; | 146 | int r = 0; |
148 | 147 | ||
149 | dev_dbg(dev, "%s\n", __func__); | 148 | dev_dbg(dev, "%s\n", __func__); |
@@ -154,17 +153,13 @@ static int snd_wl1273_fm_set_channel_number(struct wl1273_core *core, | |||
154 | goto out; | 153 | goto out; |
155 | 154 | ||
156 | if (channel_number == 1 && core->mode == WL1273_MODE_RX) | 155 | if (channel_number == 1 && core->mode == WL1273_MODE_RX) |
157 | r = wl1273_fm_write_cmd(core, WL1273_MOST_MODE_SET, | 156 | r = core->write(core, WL1273_MOST_MODE_SET, WL1273_RX_MONO); |
158 | WL1273_RX_MONO); | ||
159 | else if (channel_number == 1 && core->mode == WL1273_MODE_TX) | 157 | else if (channel_number == 1 && core->mode == WL1273_MODE_TX) |
160 | r = wl1273_fm_write_cmd(core, WL1273_MONO_SET, | 158 | r = core->write(core, WL1273_MONO_SET, WL1273_TX_MONO); |
161 | WL1273_TX_MONO); | ||
162 | else if (channel_number == 2 && core->mode == WL1273_MODE_RX) | 159 | else if (channel_number == 2 && core->mode == WL1273_MODE_RX) |
163 | r = wl1273_fm_write_cmd(core, WL1273_MOST_MODE_SET, | 160 | r = core->write(core, WL1273_MOST_MODE_SET, WL1273_RX_STEREO); |
164 | WL1273_RX_STEREO); | ||
165 | else if (channel_number == 2 && core->mode == WL1273_MODE_TX) | 161 | else if (channel_number == 2 && core->mode == WL1273_MODE_TX) |
166 | r = wl1273_fm_write_cmd(core, WL1273_MONO_SET, | 162 | r = core->write(core, WL1273_MONO_SET, WL1273_TX_STEREO); |
167 | WL1273_TX_STEREO); | ||
168 | else | 163 | else |
169 | r = -EINVAL; | 164 | r = -EINVAL; |
170 | out: | 165 | out: |
@@ -237,7 +232,7 @@ static int snd_wl1273_fm_audio_put(struct snd_kcontrol *kcontrol, | |||
237 | if (wl1273->core->audio_mode == val) | 232 | if (wl1273->core->audio_mode == val) |
238 | return 0; | 233 | return 0; |
239 | 234 | ||
240 | r = wl1273_fm_set_audio(wl1273->core, val); | 235 | r = wl1273->core->set_audio(wl1273->core, val); |
241 | if (r < 0) | 236 | if (r < 0) |
242 | return r; | 237 | return r; |
243 | 238 | ||
@@ -272,8 +267,8 @@ static int snd_wl1273_fm_volume_put(struct snd_kcontrol *kcontrol, | |||
272 | 267 | ||
273 | dev_dbg(codec->dev, "%s: enter.\n", __func__); | 268 | dev_dbg(codec->dev, "%s: enter.\n", __func__); |
274 | 269 | ||
275 | r = wl1273_fm_set_volume(wl1273->core, | 270 | r = wl1273->core->set_volume(wl1273->core, |
276 | ucontrol->value.integer.value[0]); | 271 | ucontrol->value.integer.value[0]); |
277 | if (r) | 272 | if (r) |
278 | return r; | 273 | return r; |
279 | 274 | ||
diff --git a/sound/soc/codecs/wl1273.h b/sound/soc/codecs/wl1273.h index 14ed027fdcfc..43ec7e668c51 100644 --- a/sound/soc/codecs/wl1273.h +++ b/sound/soc/codecs/wl1273.h | |||
@@ -25,77 +25,6 @@ | |||
25 | #ifndef __WL1273_CODEC_H__ | 25 | #ifndef __WL1273_CODEC_H__ |
26 | #define __WL1273_CODEC_H__ | 26 | #define __WL1273_CODEC_H__ |
27 | 27 | ||
28 | /* I2S protocol, left channel first, data width 16 bits */ | ||
29 | #define WL1273_PCM_DEF_MODE 0x00 | ||
30 | |||
31 | /* Rx */ | ||
32 | #define WL1273_AUDIO_ENABLE_I2S (1 << 0) | ||
33 | #define WL1273_AUDIO_ENABLE_ANALOG (1 << 1) | ||
34 | |||
35 | /* Tx */ | ||
36 | #define WL1273_AUDIO_IO_SET_ANALOG 0 | ||
37 | #define WL1273_AUDIO_IO_SET_I2S 1 | ||
38 | |||
39 | #define WL1273_POWER_SET_OFF 0 | ||
40 | #define WL1273_POWER_SET_FM (1 << 0) | ||
41 | #define WL1273_POWER_SET_RDS (1 << 1) | ||
42 | #define WL1273_POWER_SET_RETENTION (1 << 4) | ||
43 | |||
44 | #define WL1273_PUPD_SET_OFF 0x00 | ||
45 | #define WL1273_PUPD_SET_ON 0x01 | ||
46 | #define WL1273_PUPD_SET_RETENTION 0x10 | ||
47 | |||
48 | /* I2S mode */ | ||
49 | #define WL1273_IS2_WIDTH_32 0x0 | ||
50 | #define WL1273_IS2_WIDTH_40 0x1 | ||
51 | #define WL1273_IS2_WIDTH_22_23 0x2 | ||
52 | #define WL1273_IS2_WIDTH_23_22 0x3 | ||
53 | #define WL1273_IS2_WIDTH_48 0x4 | ||
54 | #define WL1273_IS2_WIDTH_50 0x5 | ||
55 | #define WL1273_IS2_WIDTH_60 0x6 | ||
56 | #define WL1273_IS2_WIDTH_64 0x7 | ||
57 | #define WL1273_IS2_WIDTH_80 0x8 | ||
58 | #define WL1273_IS2_WIDTH_96 0x9 | ||
59 | #define WL1273_IS2_WIDTH_128 0xa | ||
60 | #define WL1273_IS2_WIDTH 0xf | ||
61 | |||
62 | #define WL1273_IS2_FORMAT_STD (0x0 << 4) | ||
63 | #define WL1273_IS2_FORMAT_LEFT (0x1 << 4) | ||
64 | #define WL1273_IS2_FORMAT_RIGHT (0x2 << 4) | ||
65 | #define WL1273_IS2_FORMAT_USER (0x3 << 4) | ||
66 | |||
67 | #define WL1273_IS2_MASTER (0x0 << 6) | ||
68 | #define WL1273_IS2_SLAVEW (0x1 << 6) | ||
69 | |||
70 | #define WL1273_IS2_TRI_AFTER_SENDING (0x0 << 7) | ||
71 | #define WL1273_IS2_TRI_ALWAYS_ACTIVE (0x1 << 7) | ||
72 | |||
73 | #define WL1273_IS2_SDOWS_RR (0x0 << 8) | ||
74 | #define WL1273_IS2_SDOWS_RF (0x1 << 8) | ||
75 | #define WL1273_IS2_SDOWS_FR (0x2 << 8) | ||
76 | #define WL1273_IS2_SDOWS_FF (0x3 << 8) | ||
77 | |||
78 | #define WL1273_IS2_TRI_OPT (0x0 << 10) | ||
79 | #define WL1273_IS2_TRI_ALWAYS (0x1 << 10) | ||
80 | |||
81 | #define WL1273_IS2_RATE_48K (0x0 << 12) | ||
82 | #define WL1273_IS2_RATE_44_1K (0x1 << 12) | ||
83 | #define WL1273_IS2_RATE_32K (0x2 << 12) | ||
84 | #define WL1273_IS2_RATE_22_05K (0x4 << 12) | ||
85 | #define WL1273_IS2_RATE_16K (0x5 << 12) | ||
86 | #define WL1273_IS2_RATE_12K (0x8 << 12) | ||
87 | #define WL1273_IS2_RATE_11_025 (0x9 << 12) | ||
88 | #define WL1273_IS2_RATE_8K (0xa << 12) | ||
89 | #define WL1273_IS2_RATE (0xf << 12) | ||
90 | |||
91 | #define WL1273_I2S_DEF_MODE (WL1273_IS2_WIDTH_32 | \ | ||
92 | WL1273_IS2_FORMAT_STD | \ | ||
93 | WL1273_IS2_MASTER | \ | ||
94 | WL1273_IS2_TRI_AFTER_SENDING | \ | ||
95 | WL1273_IS2_SDOWS_RR | \ | ||
96 | WL1273_IS2_TRI_OPT | \ | ||
97 | WL1273_IS2_RATE_48K) | ||
98 | |||
99 | int wl1273_get_format(struct snd_soc_codec *codec, unsigned int *fmt); | 28 | int wl1273_get_format(struct snd_soc_codec *codec, unsigned int *fmt); |
100 | 29 | ||
101 | #endif /* End of __WL1273_CODEC_H__ */ | 30 | #endif /* End of __WL1273_CODEC_H__ */ |
diff --git a/sound/soc/codecs/wm8990.c b/sound/soc/codecs/wm8990.c index 5c87a634fc04..100aeee5ba96 100644 --- a/sound/soc/codecs/wm8990.c +++ b/sound/soc/codecs/wm8990.c | |||
@@ -1183,7 +1183,7 @@ static int wm8990_set_bias_level(struct snd_soc_codec *codec, | |||
1183 | WM8990_VMIDTOG); | 1183 | WM8990_VMIDTOG); |
1184 | 1184 | ||
1185 | /* Delay to allow output caps to discharge */ | 1185 | /* Delay to allow output caps to discharge */ |
1186 | msleep(msecs_to_jiffies(300)); | 1186 | msleep(300); |
1187 | 1187 | ||
1188 | /* Disable VMIDTOG */ | 1188 | /* Disable VMIDTOG */ |
1189 | snd_soc_write(codec, WM8990_ANTIPOP2, WM8990_SOFTST | | 1189 | snd_soc_write(codec, WM8990_ANTIPOP2, WM8990_SOFTST | |
@@ -1195,17 +1195,17 @@ static int wm8990_set_bias_level(struct snd_soc_codec *codec, | |||
1195 | /* Enable outputs */ | 1195 | /* Enable outputs */ |
1196 | snd_soc_write(codec, WM8990_POWER_MANAGEMENT_1, 0x1b00); | 1196 | snd_soc_write(codec, WM8990_POWER_MANAGEMENT_1, 0x1b00); |
1197 | 1197 | ||
1198 | msleep(msecs_to_jiffies(50)); | 1198 | msleep(50); |
1199 | 1199 | ||
1200 | /* Enable VMID at 2x50k */ | 1200 | /* Enable VMID at 2x50k */ |
1201 | snd_soc_write(codec, WM8990_POWER_MANAGEMENT_1, 0x1f02); | 1201 | snd_soc_write(codec, WM8990_POWER_MANAGEMENT_1, 0x1f02); |
1202 | 1202 | ||
1203 | msleep(msecs_to_jiffies(100)); | 1203 | msleep(100); |
1204 | 1204 | ||
1205 | /* Enable VREF */ | 1205 | /* Enable VREF */ |
1206 | snd_soc_write(codec, WM8990_POWER_MANAGEMENT_1, 0x1f03); | 1206 | snd_soc_write(codec, WM8990_POWER_MANAGEMENT_1, 0x1f03); |
1207 | 1207 | ||
1208 | msleep(msecs_to_jiffies(600)); | 1208 | msleep(600); |
1209 | 1209 | ||
1210 | /* Enable BUFIOEN */ | 1210 | /* Enable BUFIOEN */ |
1211 | snd_soc_write(codec, WM8990_ANTIPOP2, WM8990_SOFTST | | 1211 | snd_soc_write(codec, WM8990_ANTIPOP2, WM8990_SOFTST | |
@@ -1250,7 +1250,7 @@ static int wm8990_set_bias_level(struct snd_soc_codec *codec, | |||
1250 | /* Disable VMID */ | 1250 | /* Disable VMID */ |
1251 | snd_soc_write(codec, WM8990_POWER_MANAGEMENT_1, 0x1f01); | 1251 | snd_soc_write(codec, WM8990_POWER_MANAGEMENT_1, 0x1f01); |
1252 | 1252 | ||
1253 | msleep(msecs_to_jiffies(300)); | 1253 | msleep(300); |
1254 | 1254 | ||
1255 | /* Enable all output discharge bits */ | 1255 | /* Enable all output discharge bits */ |
1256 | snd_soc_write(codec, WM8990_ANTIPOP1, WM8990_DIS_LLINE | | 1256 | snd_soc_write(codec, WM8990_ANTIPOP1, WM8990_DIS_LLINE | |
diff --git a/sound/soc/ep93xx/ep93xx-i2s.c b/sound/soc/ep93xx/ep93xx-i2s.c index 9ac93f6b4f85..fff579a1c134 100644 --- a/sound/soc/ep93xx/ep93xx-i2s.c +++ b/sound/soc/ep93xx/ep93xx-i2s.c | |||
@@ -267,14 +267,16 @@ static int ep93xx_i2s_hw_params(struct snd_pcm_substream *substream, | |||
267 | ep93xx_i2s_write_reg(info, EP93XX_I2S_RXWRDLEN, word_len); | 267 | ep93xx_i2s_write_reg(info, EP93XX_I2S_RXWRDLEN, word_len); |
268 | 268 | ||
269 | /* | 269 | /* |
270 | * Calculate the sdiv (bit clock) and lrdiv (left/right clock) values. | 270 | * EP93xx I2S module can be setup so SCLK / LRCLK value can be |
271 | * If the lrclk is pulse length is larger than the word size, then the | 271 | * 32, 64, 128. MCLK / SCLK value can be 2 and 4. |
272 | * bit clock will be gated for the unused bits. | 272 | * We set LRCLK equal to `rate' and minimum SCLK / LRCLK |
273 | * value is 64, because our sample size is 32 bit * 2 channels. | ||
274 | * I2S standard permits us to transmit more bits than | ||
275 | * the codec uses. | ||
273 | */ | 276 | */ |
274 | div = (clk_get_rate(info->mclk) / params_rate(params)) * | 277 | div = clk_get_rate(info->mclk) / params_rate(params); |
275 | params_channels(params); | ||
276 | for (sdiv = 2; sdiv <= 4; sdiv += 2) | 278 | for (sdiv = 2; sdiv <= 4; sdiv += 2) |
277 | for (lrdiv = 32; lrdiv <= 128; lrdiv <<= 1) | 279 | for (lrdiv = 64; lrdiv <= 128; lrdiv <<= 1) |
278 | if (sdiv * lrdiv == div) { | 280 | if (sdiv * lrdiv == div) { |
279 | found = 1; | 281 | found = 1; |
280 | goto out; | 282 | goto out; |
@@ -341,9 +343,7 @@ static struct snd_soc_dai_ops ep93xx_i2s_dai_ops = { | |||
341 | .set_fmt = ep93xx_i2s_set_dai_fmt, | 343 | .set_fmt = ep93xx_i2s_set_dai_fmt, |
342 | }; | 344 | }; |
343 | 345 | ||
344 | #define EP93XX_I2S_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ | 346 | #define EP93XX_I2S_FORMATS (SNDRV_PCM_FMTBIT_S32_LE) |
345 | SNDRV_PCM_FMTBIT_S24_LE | \ | ||
346 | SNDRV_PCM_FMTBIT_S32_LE) | ||
347 | 347 | ||
348 | static struct snd_soc_dai_driver ep93xx_i2s_dai = { | 348 | static struct snd_soc_dai_driver ep93xx_i2s_dai = { |
349 | .symmetric_rates= 1, | 349 | .symmetric_rates= 1, |
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index df6064ad9bf2..fcd29e8af29f 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
@@ -936,6 +936,8 @@ int cmd_record(int argc, const char **argv, const char *prefix __used) | |||
936 | list_for_each_entry(pos, &evsel_list, node) { | 936 | list_for_each_entry(pos, &evsel_list, node) { |
937 | if (perf_evsel__alloc_fd(pos, cpus->nr, threads->nr) < 0) | 937 | if (perf_evsel__alloc_fd(pos, cpus->nr, threads->nr) < 0) |
938 | goto out_free_fd; | 938 | goto out_free_fd; |
939 | if (perf_header__push_event(pos->attr.config, event_name(pos))) | ||
940 | goto out_free_fd; | ||
939 | } | 941 | } |
940 | event_array = malloc((sizeof(struct pollfd) * MAX_NR_CPUS * | 942 | event_array = malloc((sizeof(struct pollfd) * MAX_NR_CPUS * |
941 | MAX_COUNTERS * threads->nr)); | 943 | MAX_COUNTERS * threads->nr)); |
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 5cb6f4bde905..bc2732ee23eb 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c | |||
@@ -490,32 +490,6 @@ parse_multiple_tracepoint_event(char *sys_name, const char *evt_exp, | |||
490 | return EVT_HANDLED_ALL; | 490 | return EVT_HANDLED_ALL; |
491 | } | 491 | } |
492 | 492 | ||
493 | static int store_event_type(const char *orgname) | ||
494 | { | ||
495 | char filename[PATH_MAX], *c; | ||
496 | FILE *file; | ||
497 | int id, n; | ||
498 | |||
499 | sprintf(filename, "%s/", debugfs_path); | ||
500 | strncat(filename, orgname, strlen(orgname)); | ||
501 | strcat(filename, "/id"); | ||
502 | |||
503 | c = strchr(filename, ':'); | ||
504 | if (c) | ||
505 | *c = '/'; | ||
506 | |||
507 | file = fopen(filename, "r"); | ||
508 | if (!file) | ||
509 | return 0; | ||
510 | n = fscanf(file, "%i", &id); | ||
511 | fclose(file); | ||
512 | if (n < 1) { | ||
513 | pr_err("cannot store event ID\n"); | ||
514 | return -EINVAL; | ||
515 | } | ||
516 | return perf_header__push_event(id, orgname); | ||
517 | } | ||
518 | |||
519 | static enum event_result parse_tracepoint_event(const char **strp, | 493 | static enum event_result parse_tracepoint_event(const char **strp, |
520 | struct perf_event_attr *attr) | 494 | struct perf_event_attr *attr) |
521 | { | 495 | { |
@@ -555,13 +529,10 @@ static enum event_result parse_tracepoint_event(const char **strp, | |||
555 | if (evt_length >= MAX_EVENT_LENGTH) | 529 | if (evt_length >= MAX_EVENT_LENGTH) |
556 | return EVT_FAILED; | 530 | return EVT_FAILED; |
557 | if (strpbrk(evt_name, "*?")) { | 531 | if (strpbrk(evt_name, "*?")) { |
558 | *strp += strlen(sys_name) + evt_length; | 532 | *strp += strlen(sys_name) + evt_length + 1; /* 1 == the ':' */ |
559 | return parse_multiple_tracepoint_event(sys_name, evt_name, | 533 | return parse_multiple_tracepoint_event(sys_name, evt_name, |
560 | flags); | 534 | flags); |
561 | } else { | 535 | } else { |
562 | if (store_event_type(evt_name) < 0) | ||
563 | return EVT_FAILED; | ||
564 | |||
565 | return parse_single_tracepoint_event(sys_name, evt_name, | 536 | return parse_single_tracepoint_event(sys_name, evt_name, |
566 | evt_length, attr, strp); | 537 | evt_length, attr, strp); |
567 | } | 538 | } |