aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/ice1712/revo.c45
-rw-r--r--sound/pci/ice1712/revo.h4
2 files changed, 45 insertions, 4 deletions
diff --git a/sound/pci/ice1712/revo.c b/sound/pci/ice1712/revo.c
index 664b738bb647..b5754b32b802 100644
--- a/sound/pci/ice1712/revo.c
+++ b/sound/pci/ice1712/revo.c
@@ -61,7 +61,7 @@ static void revo_set_rate_val(struct snd_akm4xxx *ak, unsigned int rate)
61 else 61 else
62 dfs = 0; 62 dfs = 0;
63 63
64 if (ak->type == SND_AK4355) { 64 if (ak->type == SND_AK4355 || ak->type == SND_AK4358) {
65 reg = 2; 65 reg = 2;
66 shift = 4; 66 shift = 4;
67 } else { 67 } else {
@@ -128,6 +128,26 @@ static struct snd_ak4xxx_private akm_revo_surround_priv __devinitdata = {
128 .mask_flags = 0, 128 .mask_flags = 0,
129}; 129};
130 130
131static struct snd_akm4xxx akm_revo51 __devinitdata = {
132 .type = SND_AK4358,
133 .num_dacs = 6,
134 .ops = {
135 .set_rate_val = revo_set_rate_val
136 }
137};
138
139static struct snd_ak4xxx_private akm_revo51_priv __devinitdata = {
140 .caddr = 2,
141 .cif = 0,
142 .data_mask = VT1724_REVO_CDOUT,
143 .clk_mask = VT1724_REVO_CCLK,
144 .cs_mask = VT1724_REVO_CS0 | VT1724_REVO_CS1 | VT1724_REVO_CS2,
145 .cs_addr = 0,
146 .cs_none = VT1724_REVO_CS0 | VT1724_REVO_CS1 | VT1724_REVO_CS2,
147 .add_flags = VT1724_REVO_CCLK, /* high at init */
148 .mask_flags = 0,
149};
150
131static int __devinit revo_init(struct snd_ice1712 *ice) 151static int __devinit revo_init(struct snd_ice1712 *ice)
132{ 152{
133 struct snd_akm4xxx *ak; 153 struct snd_akm4xxx *ak;
@@ -138,14 +158,17 @@ static int __devinit revo_init(struct snd_ice1712 *ice)
138 case VT1724_SUBDEVICE_REVOLUTION71: 158 case VT1724_SUBDEVICE_REVOLUTION71:
139 ice->num_total_dacs = 8; 159 ice->num_total_dacs = 8;
140 ice->num_total_adcs = 2; 160 ice->num_total_adcs = 2;
161 ice->gpio.i2s_mclk_changed = revo_i2s_mclk_changed;
162 break;
163 case VT1724_SUBDEVICE_REVOLUTION51:
164 ice->num_total_dacs = 6;
165 ice->num_total_adcs = 2;
141 break; 166 break;
142 default: 167 default:
143 snd_BUG(); 168 snd_BUG();
144 return -EINVAL; 169 return -EINVAL;
145 } 170 }
146 171
147 ice->gpio.i2s_mclk_changed = revo_i2s_mclk_changed;
148
149 /* second stage of initialization, analog parts and others */ 172 /* second stage of initialization, analog parts and others */
150 ak = ice->akm = kcalloc(2, sizeof(struct snd_akm4xxx), GFP_KERNEL); 173 ak = ice->akm = kcalloc(2, sizeof(struct snd_akm4xxx), GFP_KERNEL);
151 if (! ak) 174 if (! ak)
@@ -153,6 +176,7 @@ static int __devinit revo_init(struct snd_ice1712 *ice)
153 ice->akm_codecs = 2; 176 ice->akm_codecs = 2;
154 switch (ice->eeprom.subvendor) { 177 switch (ice->eeprom.subvendor) {
155 case VT1724_SUBDEVICE_REVOLUTION71: 178 case VT1724_SUBDEVICE_REVOLUTION71:
179 ice->akm_codecs = 2;
156 if ((err = snd_ice1712_akm4xxx_init(ak, &akm_revo_front, &akm_revo_front_priv, ice)) < 0) 180 if ((err = snd_ice1712_akm4xxx_init(ak, &akm_revo_front, &akm_revo_front_priv, ice)) < 0)
157 return err; 181 return err;
158 if ((err = snd_ice1712_akm4xxx_init(ak + 1, &akm_revo_surround, &akm_revo_surround_priv, ice)) < 0) 182 if ((err = snd_ice1712_akm4xxx_init(ak + 1, &akm_revo_surround, &akm_revo_surround_priv, ice)) < 0)
@@ -160,6 +184,13 @@ static int __devinit revo_init(struct snd_ice1712 *ice)
160 /* unmute all codecs */ 184 /* unmute all codecs */
161 snd_ice1712_gpio_write_bits(ice, VT1724_REVO_MUTE, VT1724_REVO_MUTE); 185 snd_ice1712_gpio_write_bits(ice, VT1724_REVO_MUTE, VT1724_REVO_MUTE);
162 break; 186 break;
187 case VT1724_SUBDEVICE_REVOLUTION51:
188 ice->akm_codecs = 1;
189 if ((err = snd_ice1712_akm4xxx_init(ak, &akm_revo51, &akm_revo51_priv, ice)) < 0)
190 return err;
191 /* unmute all codecs - needed! */
192 snd_ice1712_gpio_write_bits(ice, VT1724_REVO_MUTE, VT1724_REVO_MUTE);
193 break;
163 } 194 }
164 195
165 return 0; 196 return 0;
@@ -172,6 +203,7 @@ static int __devinit revo_add_controls(struct snd_ice1712 *ice)
172 203
173 switch (ice->eeprom.subvendor) { 204 switch (ice->eeprom.subvendor) {
174 case VT1724_SUBDEVICE_REVOLUTION71: 205 case VT1724_SUBDEVICE_REVOLUTION71:
206 case VT1724_SUBDEVICE_REVOLUTION51:
175 err = snd_ice1712_akm4xxx_build_controls(ice); 207 err = snd_ice1712_akm4xxx_build_controls(ice);
176 if (err < 0) 208 if (err < 0)
177 return err; 209 return err;
@@ -188,5 +220,12 @@ struct snd_ice1712_card_info snd_vt1724_revo_cards[] __devinitdata = {
188 .chip_init = revo_init, 220 .chip_init = revo_init,
189 .build_controls = revo_add_controls, 221 .build_controls = revo_add_controls,
190 }, 222 },
223 {
224 .subvendor = VT1724_SUBDEVICE_REVOLUTION51,
225 .name = "M Audio Revolution-5.1",
226 .model = "revo51",
227 .chip_init = revo_init,
228 .build_controls = revo_add_controls,
229 },
191 { } /* terminator */ 230 { } /* terminator */
192}; 231};
diff --git a/sound/pci/ice1712/revo.h b/sound/pci/ice1712/revo.h
index ca4420b5e3ec..dea52ea219df 100644
--- a/sound/pci/ice1712/revo.h
+++ b/sound/pci/ice1712/revo.h
@@ -25,9 +25,11 @@
25 */ 25 */
26 26
27#define REVO_DEVICE_DESC \ 27#define REVO_DEVICE_DESC \
28 "{MidiMan M Audio,Revolution 7.1}," 28 "{MidiMan M Audio,Revolution 7.1},"\
29 "{MidiMan M Audio,Revolution 5.1},"
29 30
30#define VT1724_SUBDEVICE_REVOLUTION71 0x12143036 31#define VT1724_SUBDEVICE_REVOLUTION71 0x12143036
32#define VT1724_SUBDEVICE_REVOLUTION51 0x12143136
31 33
32/* entry point */ 34/* entry point */
33extern struct snd_ice1712_card_info snd_vt1724_revo_cards[]; 35extern struct snd_ice1712_card_info snd_vt1724_revo_cards[];