1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
Index: linux-2.6.17-rc5/sound/pci/ac97/ac97_codec.c
===================================================================
--- linux-2.6.17-rc5.orig/sound/pci/ac97/ac97_codec.c
+++ linux-2.6.17-rc5/sound/pci/ac97/ac97_codec.c
@@ -151,7 +151,7 @@ static const struct ac97_codec_id snd_ac
{ 0x4e534300, 0xffffffff, "LM4540,43,45,46,48", NULL, NULL }, // only guess --jk
{ 0x4e534331, 0xffffffff, "LM4549", NULL, NULL },
{ 0x4e534350, 0xffffffff, "LM4550", patch_lm4550, NULL }, // volume wrap fix
-{ 0x50534304, 0xffffffff, "UCB1400", NULL, NULL },
+{ 0x50534304, 0xffffffff, "UCB1400", patch_ucb1400, NULL, AC97_HAS_NO_STD_PCM },
{ 0x53494c20, 0xffffffe0, "Si3036,8", mpatch_si3036, mpatch_si3036, AC97_MODEM_PATCH },
{ 0x54524102, 0xffffffff, "TR28022", NULL, NULL },
{ 0x54524106, 0xffffffff, "TR28026", NULL, NULL },
Index: linux-2.6.17-rc5/sound/pci/ac97/ac97_patch.c
===================================================================
--- linux-2.6.17-rc5.orig/sound/pci/ac97/ac97_patch.c
+++ linux-2.6.17-rc5/sound/pci/ac97/ac97_patch.c
@@ -375,7 +375,57 @@ int patch_yamaha_ymf753(struct snd_ac97
ac97->caps |= 0x04 << 10; /* Yamaha 3D enhancement */
return 0;
}
+/*
+ * UCB1400 codec
+ */
+
+#define AC97_UCB1400_FCSR1 0x6a
+#define AC97_UCB1400_FCSR2 0x6c
+
+static const snd_kcontrol_new_t ucb1400_snd_ac97_controls[] = {
+ AC97_SINGLE("Tone Control - Bass", AC97_UCB1400_FCSR1, 11, 4, 0),
+ AC97_SINGLE("Tone Control - Treble", AC97_UCB1400_FCSR1, 9, 2, 0),
+ AC97_SINGLE("Headphone Playback Switch", AC97_UCB1400_FCSR1, 6, 1, 0),
+ AC97_SINGLE("De-emphasis", AC97_UCB1400_FCSR1, 5, 1, 0),
+ AC97_SINGLE("DC Filter", AC97_UCB1400_FCSR1, 4, 1, 0),
+ AC97_SINGLE("Hi-pass Filter", AC97_UCB1400_FCSR1, 3, 1, 0),
+ AC97_SINGLE("ADC Filter", AC97_UCB1400_FCSR2, 12, 1, 0),
+};
+
+int patch_ucb1400(ac97_t * ac97)
+{
+ int err, i;
+ for(i = 0; i < ARRAY_SIZE(ucb1400_snd_ac97_controls); i++) {
+ if((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&ucb1400_snd_ac97_controls[i], ac97))) < 0)
+ return err;
+ }
+
+ snd_ac97_write_cache(ac97, AC97_UCB1400_FCSR1,
+ (0 << 11) | // 0 base boost
+ (0 << 9) | // 0 treble boost
+ (0 << 7) | // Mode = flat
+ (1 << 6) | // Headphones enable
+ (0 << 5) | // De-emphasis disabled
+ (1 << 4) | // DC filter enabled
+ (1 << 3) | // Hi-pass filter enabled
+ (0 << 2) | // disable interrupt signalling via GPIO_INT
+ (1 << 0) // clear ADC overflow status if set
+ );
+
+ snd_ac97_write_cache(ac97, AC97_UCB1400_FCSR2,
+ (0 << 15) | // must be 0
+ (0 << 13) | // must be 0
+ (1 << 12) | // ADC filter enabled
+ (0 << 10) | // must be 0
+ (0 << 4) | // Smart low power mode on neither Codec nor PLL
+ (0 << 0) // must be 0
+ );
+
+ return 0;
+}
+
+/*
/*
* May 2, 2003 Liam Girdwood <liam.girdwood@wolfsonmicro.com>
* removed broken wolfson00 patch.
Index: linux-2.6.17-rc5/sound/pci/ac97/ac97_patch.h
===================================================================
--- linux-2.6.17-rc5.orig/sound/pci/ac97/ac97_patch.h
+++ linux-2.6.17-rc5/sound/pci/ac97/ac97_patch.h
@@ -58,5 +58,6 @@ int patch_cm9780(struct snd_ac97 * ac97)
int patch_vt1616(struct snd_ac97 * ac97);
int patch_vt1617a(struct snd_ac97 * ac97);
int patch_it2646(struct snd_ac97 * ac97);
+int patch_ucb1400(ac97_t * ac97);
int mpatch_si3036(struct snd_ac97 * ac97);
int patch_lm4550(struct snd_ac97 * ac97);
|