|
@@ -87,6 +87,7 @@
|
|
|
#include <sound/core.h>
|
|
|
#include <sound/wss.h>
|
|
|
#include <sound/asoundef.h>
|
|
|
+#include <sound/initval.h>
|
|
|
|
|
|
/*
|
|
|
*
|
|
@@ -264,7 +265,10 @@ static void snd_cs4236_resume(struct snd_wss *chip)
|
|
|
}
|
|
|
|
|
|
#endif /* CONFIG_PM */
|
|
|
-
|
|
|
+/*
|
|
|
+ * This function does no fail if the chip is not CS4236B or compatible.
|
|
|
+ * It just an equivalent to the snd_wss_create() then.
|
|
|
+ */
|
|
|
int snd_cs4236_create(struct snd_card *card,
|
|
|
unsigned long port,
|
|
|
unsigned long cport,
|
|
@@ -281,21 +285,17 @@ int snd_cs4236_create(struct snd_card *card,
|
|
|
*rchip = NULL;
|
|
|
if (hardware == WSS_HW_DETECT)
|
|
|
hardware = WSS_HW_DETECT3;
|
|
|
- if (cport < 0x100) {
|
|
|
- snd_printk(KERN_ERR "please, specify control port "
|
|
|
- "for CS4236+ chips\n");
|
|
|
- return -ENODEV;
|
|
|
- }
|
|
|
+
|
|
|
err = snd_wss_create(card, port, cport,
|
|
|
irq, dma1, dma2, hardware, hwshare, &chip);
|
|
|
if (err < 0)
|
|
|
return err;
|
|
|
|
|
|
- if (!(chip->hardware & WSS_HW_CS4236B_MASK)) {
|
|
|
- snd_printk(KERN_ERR "CS4236+: MODE3 and extended registers "
|
|
|
- "not available, hardware=0x%x\n", chip->hardware);
|
|
|
- snd_device_free(card, chip);
|
|
|
- return -ENODEV;
|
|
|
+ if ((chip->hardware & WSS_HW_CS4236B_MASK) == 0) {
|
|
|
+ snd_printd("chip is not CS4236+, hardware=0x%x\n",
|
|
|
+ chip->hardware);
|
|
|
+ *rchip = chip;
|
|
|
+ return 0;
|
|
|
}
|
|
|
#if 0
|
|
|
{
|
|
@@ -308,9 +308,16 @@ int snd_cs4236_create(struct snd_card *card,
|
|
|
idx, snd_cs4236_ctrl_in(chip, idx));
|
|
|
}
|
|
|
#endif
|
|
|
+ if (cport < 0x100 || cport == SNDRV_AUTO_PORT) {
|
|
|
+ snd_printk(KERN_ERR "please, specify control port "
|
|
|
+ "for CS4236+ chips\n");
|
|
|
+ snd_device_free(card, chip);
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
ver1 = snd_cs4236_ctrl_in(chip, 1);
|
|
|
ver2 = snd_cs4236_ext_in(chip, CS4236_VERSION);
|
|
|
- snd_printdd("CS4236: [0x%lx] C1 (version) = 0x%x, ext = 0x%x\n", cport, ver1, ver2);
|
|
|
+ snd_printdd("CS4236: [0x%lx] C1 (version) = 0x%x, ext = 0x%x\n",
|
|
|
+ cport, ver1, ver2);
|
|
|
if (ver1 != ver2) {
|
|
|
snd_printk(KERN_ERR "CS4236+ chip detected, but "
|
|
|
"control port 0x%lx is not valid\n", cport);
|
|
@@ -321,13 +328,17 @@ int snd_cs4236_create(struct snd_card *card,
|
|
|
snd_cs4236_ctrl_out(chip, 2, 0xff);
|
|
|
snd_cs4236_ctrl_out(chip, 3, 0x00);
|
|
|
snd_cs4236_ctrl_out(chip, 4, 0x80);
|
|
|
- snd_cs4236_ctrl_out(chip, 5, ((IEC958_AES1_CON_PCM_CODER & 3) << 6) | IEC958_AES0_CON_EMPHASIS_NONE);
|
|
|
+ reg = ((IEC958_AES1_CON_PCM_CODER & 3) << 6) |
|
|
|
+ IEC958_AES0_CON_EMPHASIS_NONE;
|
|
|
+ snd_cs4236_ctrl_out(chip, 5, reg);
|
|
|
snd_cs4236_ctrl_out(chip, 6, IEC958_AES1_CON_PCM_CODER >> 2);
|
|
|
snd_cs4236_ctrl_out(chip, 7, 0x00);
|
|
|
- /* 0x8c for C8 is valid for Turtle Beach Malibu - the IEC-958 output */
|
|
|
- /* is working with this setup, other hardware should have */
|
|
|
- /* different signal paths and this value should be selectable */
|
|
|
- /* in the future */
|
|
|
+ /*
|
|
|
+ * 0x8c for C8 is valid for Turtle Beach Malibu - the IEC-958
|
|
|
+ * output is working with this setup, other hardware should
|
|
|
+ * have different signal paths and this value should be
|
|
|
+ * selectable in the future
|
|
|
+ */
|
|
|
snd_cs4236_ctrl_out(chip, 8, 0x8c);
|
|
|
chip->rate_constraint = snd_cs4236_xrate;
|
|
|
chip->set_playback_format = snd_cs4236_playback_format;
|
|
@@ -339,9 +350,10 @@ int snd_cs4236_create(struct snd_card *card,
|
|
|
|
|
|
/* initialize extended registers */
|
|
|
for (reg = 0; reg < sizeof(snd_cs4236_ext_map); reg++)
|
|
|
- snd_cs4236_ext_out(chip, CS4236_I23VAL(reg), snd_cs4236_ext_map[reg]);
|
|
|
+ snd_cs4236_ext_out(chip, CS4236_I23VAL(reg),
|
|
|
+ snd_cs4236_ext_map[reg]);
|
|
|
|
|
|
- /* initialize compatible but more featured registers */
|
|
|
+ /* initialize compatible but more featured registers */
|
|
|
snd_wss_out(chip, CS4231_LEFT_INPUT, 0x40);
|
|
|
snd_wss_out(chip, CS4231_RIGHT_INPUT, 0x40);
|
|
|
snd_wss_out(chip, CS4231_AUX1_LEFT_INPUT, 0xff);
|