aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/sound/ad1848.h32
-rw-r--r--include/sound/wss.h6
-rw-r--r--sound/isa/ad1848/ad1848.c2
-rw-r--r--sound/isa/ad1848/ad1848_lib.c48
-rw-r--r--sound/isa/cmi8330.c4
-rw-r--r--sound/isa/opti9xx/opti92x-ad1848.c2
-rw-r--r--sound/isa/sc6000.c2
-rw-r--r--sound/isa/sgalaxy.c2
8 files changed, 42 insertions, 56 deletions
diff --git a/include/sound/ad1848.h b/include/sound/ad1848.h
index d740e633e81b..a881d5173c64 100644
--- a/include/sound/ad1848.h
+++ b/include/sound/ad1848.h
@@ -106,24 +106,6 @@
106#define AD1848_CALIB_IN_PROGRESS 0x20 /* auto calibrate in progress */ 106#define AD1848_CALIB_IN_PROGRESS 0x20 /* auto calibrate in progress */
107#define AD1848_DMA_REQUEST 0x10 /* DMA request in progress */ 107#define AD1848_DMA_REQUEST 0x10 /* DMA request in progress */
108 108
109/* defines for codec.mode */
110
111#define AD1848_MODE_NONE 0x0000
112#define AD1848_MODE_PLAY 0x0001
113#define AD1848_MODE_CAPTURE 0x0002
114#define AD1848_MODE_TIMER 0x0004
115#define AD1848_MODE_OPEN (AD1848_MODE_PLAY|AD1848_MODE_CAPTURE|AD1848_MODE_TIMER)
116#define AD1848_MODE_RUNNING 0x0010
117
118/* defines for codec.hardware */
119
120#define AD1848_HW_DETECT 0x0000 /* let AD1848 driver detect chip */
121#define AD1848_HW_AD1847 0x0001 /* AD1847 chip */
122#define AD1848_HW_AD1848 0x0002 /* AD1848 chip */
123#define AD1848_HW_CS4248 0x0003 /* CS4248 chip */
124#define AD1848_HW_CMI8330 0x0004 /* CMI8330 chip */
125#define AD1848_HW_THINKPAD 0x0005 /* Thinkpad 360/750/755 */
126
127/* IBM Thinkpad specific stuff */ 109/* IBM Thinkpad specific stuff */
128#define AD1848_THINKPAD_CTL_PORT1 0x15e8 110#define AD1848_THINKPAD_CTL_PORT1 0x15e8
129#define AD1848_THINKPAD_CTL_PORT2 0x15e9 111#define AD1848_THINKPAD_CTL_PORT2 0x15e9
@@ -167,26 +149,12 @@ struct ad1848_mix_elem {
167 .type = AD1848_MIX_SINGLE, \ 149 .type = AD1848_MIX_SINGLE, \
168 .private_value = AD1848_MIXVAL_SINGLE(reg, shift, mask, invert) } 150 .private_value = AD1848_MIXVAL_SINGLE(reg, shift, mask, invert) }
169 151
170#define AD1848_SINGLE_TLV(xname, xindex, reg, shift, mask, invert, xtlv) \
171{ .name = xname, \
172 .index = xindex, \
173 .type = AD1848_MIX_SINGLE, \
174 .private_value = AD1848_MIXVAL_SINGLE(reg, shift, mask, invert), \
175 .tlv = xtlv }
176
177#define AD1848_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \ 152#define AD1848_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \
178{ .name = xname, \ 153{ .name = xname, \
179 .index = xindex, \ 154 .index = xindex, \
180 .type = AD1848_MIX_DOUBLE, \ 155 .type = AD1848_MIX_DOUBLE, \
181 .private_value = AD1848_MIXVAL_DOUBLE(left_reg, right_reg, shift_left, shift_right, mask, invert) } 156 .private_value = AD1848_MIXVAL_DOUBLE(left_reg, right_reg, shift_left, shift_right, mask, invert) }
182 157
183#define AD1848_DOUBLE_TLV(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert, xtlv) \
184{ .name = xname, \
185 .index = xindex, \
186 .type = AD1848_MIX_DOUBLE, \
187 .private_value = AD1848_MIXVAL_DOUBLE(left_reg, right_reg, shift_left, shift_right, mask, invert), \
188 .tlv = xtlv }
189
190int snd_ad1848_add_ctl_elem(struct snd_wss *chip, 158int snd_ad1848_add_ctl_elem(struct snd_wss *chip,
191 const struct ad1848_mix_elem *c); 159 const struct ad1848_mix_elem *c);
192 160
diff --git a/include/sound/wss.h b/include/sound/wss.h
index 1e0dc77f0d25..2cc1f1462d8e 100644
--- a/include/sound/wss.h
+++ b/include/sound/wss.h
@@ -55,6 +55,12 @@
55#define WSS_HW_CS4237B 0x0402 /* CS4237B - SRS 3D */ 55#define WSS_HW_CS4237B 0x0402 /* CS4237B - SRS 3D */
56#define WSS_HW_CS4238B 0x0403 /* CS4238B - QSOUND 3D */ 56#define WSS_HW_CS4238B 0x0403 /* CS4238B - QSOUND 3D */
57#define WSS_HW_CS4239 0x0404 /* CS4239 - Crystal Clear (tm) stereo enhancement */ 57#define WSS_HW_CS4239 0x0404 /* CS4239 - Crystal Clear (tm) stereo enhancement */
58#define WSS_HW_AD1848_MASK 0x0800 /* AD1848 serie (half duplex) */
59#define WSS_HW_AD1847 0x0801 /* AD1847 chip */
60#define WSS_HW_AD1848 0x0802 /* AD1848 chip */
61#define WSS_HW_CS4248 0x0803 /* CS4248 chip */
62#define WSS_HW_CMI8330 0x0804 /* CMI8330 chip */
63#define WSS_HW_THINKPAD 0x0805 /* Thinkpad 360/750/755 */
58/* compatible, but clones */ 64/* compatible, but clones */
59#define WSS_HW_INTERWAVE 0x1000 /* InterWave chip */ 65#define WSS_HW_INTERWAVE 0x1000 /* InterWave chip */
60#define WSS_HW_OPL3SA2 0x1101 /* OPL3-SA2 chip, similar to cs4231 */ 66#define WSS_HW_OPL3SA2 0x1101 /* OPL3-SA2 chip, similar to cs4231 */
diff --git a/sound/isa/ad1848/ad1848.c b/sound/isa/ad1848/ad1848.c
index 74db24ae6509..40de24b280d3 100644
--- a/sound/isa/ad1848/ad1848.c
+++ b/sound/isa/ad1848/ad1848.c
@@ -96,7 +96,7 @@ static int __devinit snd_ad1848_probe(struct device *dev, unsigned int n)
96 return -EINVAL; 96 return -EINVAL;
97 97
98 error = snd_ad1848_create(card, port[n], irq[n], dma1[n], 98 error = snd_ad1848_create(card, port[n], irq[n], dma1[n],
99 thinkpad[n] ? AD1848_HW_THINKPAD : AD1848_HW_DETECT, &chip); 99 thinkpad[n] ? WSS_HW_THINKPAD : WSS_HW_DETECT, &chip);
100 if (error < 0) 100 if (error < 0)
101 goto out; 101 goto out;
102 102
diff --git a/sound/isa/ad1848/ad1848_lib.c b/sound/isa/ad1848/ad1848_lib.c
index e25fadffdb55..5aa8f6dae75b 100644
--- a/sound/isa/ad1848/ad1848_lib.c
+++ b/sound/isa/ad1848/ad1848_lib.c
@@ -283,14 +283,12 @@ static int snd_ad1848_trigger(struct snd_wss *chip, unsigned char what,
283 return 0; 283 return 0;
284 } 284 }
285 snd_ad1848_out(chip, AD1848_IFACE_CTRL, chip->image[AD1848_IFACE_CTRL] |= what); 285 snd_ad1848_out(chip, AD1848_IFACE_CTRL, chip->image[AD1848_IFACE_CTRL] |= what);
286 chip->mode |= AD1848_MODE_RUNNING;
287 } else if (cmd == SNDRV_PCM_TRIGGER_STOP) { 286 } else if (cmd == SNDRV_PCM_TRIGGER_STOP) {
288 if (!(chip->image[AD1848_IFACE_CTRL] & what)) { 287 if (!(chip->image[AD1848_IFACE_CTRL] & what)) {
289 spin_unlock(&chip->reg_lock); 288 spin_unlock(&chip->reg_lock);
290 return 0; 289 return 0;
291 } 290 }
292 snd_ad1848_out(chip, AD1848_IFACE_CTRL, chip->image[AD1848_IFACE_CTRL] &= ~what); 291 snd_ad1848_out(chip, AD1848_IFACE_CTRL, chip->image[AD1848_IFACE_CTRL] &= ~what);
293 chip->mode &= ~AD1848_MODE_RUNNING;
294 } else { 292 } else {
295 result = -EINVAL; 293 result = -EINVAL;
296 } 294 }
@@ -378,7 +376,7 @@ static int snd_ad1848_open(struct snd_wss *chip, unsigned int mode)
378{ 376{
379 unsigned long flags; 377 unsigned long flags;
380 378
381 if (chip->mode & AD1848_MODE_OPEN) 379 if (chip->mode & WSS_MODE_OPEN)
382 return -EAGAIN; 380 return -EAGAIN;
383 381
384 snd_ad1848_mce_down(chip); 382 snd_ad1848_mce_down(chip);
@@ -570,11 +568,9 @@ static irqreturn_t snd_ad1848_interrupt(int irq, void *dev_id)
570{ 568{
571 struct snd_wss *chip = dev_id; 569 struct snd_wss *chip = dev_id;
572 570
573 if ((chip->mode & AD1848_MODE_PLAY) && chip->playback_substream && 571 if ((chip->mode & WSS_MODE_PLAY) && chip->playback_substream)
574 (chip->mode & AD1848_MODE_RUNNING))
575 snd_pcm_period_elapsed(chip->playback_substream); 572 snd_pcm_period_elapsed(chip->playback_substream);
576 if ((chip->mode & AD1848_MODE_CAPTURE) && chip->capture_substream && 573 if ((chip->mode & WSS_MODE_RECORD) && chip->capture_substream)
577 (chip->mode & AD1848_MODE_RUNNING))
578 snd_pcm_period_elapsed(chip->capture_substream); 574 snd_pcm_period_elapsed(chip->capture_substream);
579 outb(0, AD1848P(chip, STATUS)); /* clear global interrupt bit */ 575 outb(0, AD1848P(chip, STATUS)); /* clear global interrupt bit */
580 return IRQ_HANDLED; 576 return IRQ_HANDLED;
@@ -690,19 +686,19 @@ static int snd_ad1848_probe(struct snd_wss *chip)
690 } 686 }
691 if (id != 1) 687 if (id != 1)
692 return -ENODEV; /* no valid device found */ 688 return -ENODEV; /* no valid device found */
693 if (chip->hardware == AD1848_HW_DETECT) { 689 if (chip->hardware == WSS_HW_DETECT) {
694 if (ad1847) { 690 if (ad1847) {
695 chip->hardware = AD1848_HW_AD1847; 691 chip->hardware = WSS_HW_AD1847;
696 } else { 692 } else {
697 chip->hardware = AD1848_HW_AD1848; 693 chip->hardware = WSS_HW_AD1848;
698 rev = snd_ad1848_in(chip, AD1848_MISC_INFO); 694 rev = snd_ad1848_in(chip, AD1848_MISC_INFO);
699 if (rev & 0x80) { 695 if (rev & 0x80) {
700 chip->hardware = AD1848_HW_CS4248; 696 chip->hardware = WSS_HW_CS4248;
701 } else if ((rev & 0x0f) == 0x0a) { 697 } else if ((rev & 0x0f) == 0x0a) {
702 snd_ad1848_out(chip, AD1848_MISC_INFO, 0x40); 698 snd_ad1848_out(chip, AD1848_MISC_INFO, 0x40);
703 for (i = 0; i < 16; ++i) { 699 for (i = 0; i < 16; ++i) {
704 if (snd_ad1848_in(chip, i) != snd_ad1848_in(chip, i + 16)) { 700 if (snd_ad1848_in(chip, i) != snd_ad1848_in(chip, i + 16)) {
705 chip->hardware = AD1848_HW_CMI8330; 701 chip->hardware = WSS_HW_CMI8330;
706 break; 702 break;
707 } 703 }
708 } 704 }
@@ -782,7 +778,8 @@ static int snd_ad1848_playback_open(struct snd_pcm_substream *substream)
782 struct snd_pcm_runtime *runtime = substream->runtime; 778 struct snd_pcm_runtime *runtime = substream->runtime;
783 int err; 779 int err;
784 780
785 if ((err = snd_ad1848_open(chip, AD1848_MODE_PLAY)) < 0) 781 err = snd_ad1848_open(chip, WSS_MODE_PLAY);
782 if (err < 0)
786 return err; 783 return err;
787 chip->playback_substream = substream; 784 chip->playback_substream = substream;
788 runtime->hw = snd_ad1848_playback; 785 runtime->hw = snd_ad1848_playback;
@@ -798,7 +795,8 @@ static int snd_ad1848_capture_open(struct snd_pcm_substream *substream)
798 struct snd_pcm_runtime *runtime = substream->runtime; 795 struct snd_pcm_runtime *runtime = substream->runtime;
799 int err; 796 int err;
800 797
801 if ((err = snd_ad1848_open(chip, AD1848_MODE_CAPTURE)) < 0) 798 err = snd_ad1848_open(chip, WSS_MODE_RECORD);
799 if (err < 0)
802 return err; 800 return err;
803 chip->capture_substream = substream; 801 chip->capture_substream = substream;
804 runtime->hw = snd_ad1848_capture; 802 runtime->hw = snd_ad1848_capture;
@@ -812,7 +810,7 @@ static int snd_ad1848_playback_close(struct snd_pcm_substream *substream)
812{ 810{
813 struct snd_wss *chip = snd_pcm_substream_chip(substream); 811 struct snd_wss *chip = snd_pcm_substream_chip(substream);
814 812
815 chip->mode &= ~AD1848_MODE_PLAY; 813 chip->mode &= ~WSS_MODE_PLAY;
816 chip->playback_substream = NULL; 814 chip->playback_substream = NULL;
817 snd_ad1848_close(chip); 815 snd_ad1848_close(chip);
818 return 0; 816 return 0;
@@ -822,7 +820,7 @@ static int snd_ad1848_capture_close(struct snd_pcm_substream *substream)
822{ 820{
823 struct snd_wss *chip = snd_pcm_substream_chip(substream); 821 struct snd_wss *chip = snd_pcm_substream_chip(substream);
824 822
825 chip->mode &= ~AD1848_MODE_CAPTURE; 823 chip->mode &= ~WSS_MODE_RECORD;
826 chip->capture_substream = NULL; 824 chip->capture_substream = NULL;
827 snd_ad1848_close(chip); 825 snd_ad1848_close(chip);
828 return 0; 826 return 0;
@@ -903,9 +901,9 @@ int snd_ad1848_create(struct snd_card *card,
903 chip->dma1 = dma; 901 chip->dma1 = dma;
904 chip->dma2 = dma; 902 chip->dma2 = dma;
905 903
906 if (hardware == AD1848_HW_THINKPAD) { 904 if (hardware == WSS_HW_THINKPAD) {
907 chip->thinkpad_flag = 1; 905 chip->thinkpad_flag = 1;
908 chip->hardware = AD1848_HW_DETECT; /* reset */ 906 chip->hardware = WSS_HW_DETECT; /* reset */
909 snd_ad1848_thinkpad_twiddle(chip, 1); 907 snd_ad1848_thinkpad_twiddle(chip, 1);
910 } 908 }
911 909
@@ -1214,6 +1212,20 @@ static const DECLARE_TLV_DB_SCALE(db_scale_6bit, -9450, 150, 0);
1214static const DECLARE_TLV_DB_SCALE(db_scale_5bit_12db_max, -3450, 150, 0); 1212static const DECLARE_TLV_DB_SCALE(db_scale_5bit_12db_max, -3450, 150, 0);
1215static const DECLARE_TLV_DB_SCALE(db_scale_rec_gain, 0, 150, 0); 1213static const DECLARE_TLV_DB_SCALE(db_scale_rec_gain, 0, 150, 0);
1216 1214
1215#define AD1848_SINGLE_TLV(xname, xindex, reg, shift, mask, invert, xtlv) \
1216{ .name = xname, \
1217 .index = xindex, \
1218 .type = AD1848_MIX_SINGLE, \
1219 .private_value = AD1848_MIXVAL_SINGLE(reg, shift, mask, invert), \
1220 .tlv = xtlv }
1221
1222#define AD1848_DOUBLE_TLV(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert, xtlv) \
1223{ .name = xname, \
1224 .index = xindex, \
1225 .type = AD1848_MIX_DOUBLE, \
1226 .private_value = AD1848_MIXVAL_DOUBLE(left_reg, right_reg, shift_left, shift_right, mask, invert), \
1227 .tlv = xtlv }
1228
1217static struct ad1848_mix_elem snd_ad1848_controls[] = { 1229static struct ad1848_mix_elem snd_ad1848_controls[] = {
1218AD1848_DOUBLE("PCM Playback Switch", 0, AD1848_LEFT_OUTPUT, AD1848_RIGHT_OUTPUT, 7, 7, 1, 1), 1230AD1848_DOUBLE("PCM Playback Switch", 0, AD1848_LEFT_OUTPUT, AD1848_RIGHT_OUTPUT, 7, 7, 1, 1),
1219AD1848_DOUBLE_TLV("PCM Playback Volume", 0, AD1848_LEFT_OUTPUT, AD1848_RIGHT_OUTPUT, 0, 0, 63, 1, 1231AD1848_DOUBLE_TLV("PCM Playback Volume", 0, AD1848_LEFT_OUTPUT, AD1848_RIGHT_OUTPUT, 0, 0, 63, 1,
diff --git a/sound/isa/cmi8330.c b/sound/isa/cmi8330.c
index aefd2f4a0572..af6ba129910e 100644
--- a/sound/isa/cmi8330.c
+++ b/sound/isa/cmi8330.c
@@ -465,12 +465,12 @@ static int __devinit snd_cmi8330_probe(struct snd_card *card, int dev)
465 wssport[dev] + 4, 465 wssport[dev] + 4,
466 wssirq[dev], 466 wssirq[dev],
467 wssdma[dev], 467 wssdma[dev],
468 AD1848_HW_DETECT, 468 WSS_HW_DETECT,
469 &acard->wss)) < 0) { 469 &acard->wss)) < 0) {
470 snd_printk(KERN_ERR PFX "(AD1848) device busy??\n"); 470 snd_printk(KERN_ERR PFX "(AD1848) device busy??\n");
471 return err; 471 return err;
472 } 472 }
473 if (acard->wss->hardware != AD1848_HW_CMI8330) { 473 if (acard->wss->hardware != WSS_HW_CMI8330) {
474 snd_printk(KERN_ERR PFX "(AD1848) not found during probe\n"); 474 snd_printk(KERN_ERR PFX "(AD1848) not found during probe\n");
475 return -ENODEV; 475 return -ENODEV;
476 } 476 }
diff --git a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c
index ff9baf751b22..1f6d6fcd6e57 100644
--- a/sound/isa/opti9xx/opti92x-ad1848.c
+++ b/sound/isa/opti9xx/opti92x-ad1848.c
@@ -775,7 +775,7 @@ static int __devinit snd_opti9xx_probe(struct snd_card *card)
775#else 775#else
776 if ((error = snd_ad1848_create(card, chip->wss_base + 4, 776 if ((error = snd_ad1848_create(card, chip->wss_base + 4,
777 chip->irq, chip->dma1, 777 chip->irq, chip->dma1,
778 AD1848_HW_DETECT, &codec)) < 0) 778 WSS_HW_DETECT, &codec)) < 0)
779 return error; 779 return error;
780 if ((error = snd_ad1848_pcm(codec, 0, &pcm)) < 0) 780 if ((error = snd_ad1848_pcm(codec, 0, &pcm)) < 0)
781 return error; 781 return error;
diff --git a/sound/isa/sc6000.c b/sound/isa/sc6000.c
index 1771f15d6d3c..0b6cf472ddcb 100644
--- a/sound/isa/sc6000.c
+++ b/sound/isa/sc6000.c
@@ -549,7 +549,7 @@ static int __devinit snd_sc6000_probe(struct device *devptr, unsigned int dev)
549 goto err_unmap2; 549 goto err_unmap2;
550 550
551 err = snd_ad1848_create(card, mss_port[dev] + 4, xirq, xdma, 551 err = snd_ad1848_create(card, mss_port[dev] + 4, xirq, xdma,
552 AD1848_HW_DETECT, &chip); 552 WSS_HW_DETECT, &chip);
553 if (err < 0) 553 if (err < 0)
554 goto err_unmap2; 554 goto err_unmap2;
555 card->private_data = chip; 555 card->private_data = chip;
diff --git a/sound/isa/sgalaxy.c b/sound/isa/sgalaxy.c
index 879c00c566ba..9a5a7cc0e607 100644
--- a/sound/isa/sgalaxy.c
+++ b/sound/isa/sgalaxy.c
@@ -265,7 +265,7 @@ static int __devinit snd_sgalaxy_probe(struct device *devptr, unsigned int dev)
265 265
266 if ((err = snd_ad1848_create(card, wssport[dev] + 4, 266 if ((err = snd_ad1848_create(card, wssport[dev] + 4,
267 xirq, xdma1, 267 xirq, xdma1,
268 AD1848_HW_DETECT, &chip)) < 0) 268 WSS_HW_DETECT, &chip)) < 0)
269 goto _err; 269 goto _err;
270 card->private_data = chip; 270 card->private_data = chip;
271 271