aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/cs5535audio/cs5535audio.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/pci/cs5535audio/cs5535audio.c')
-rw-r--r--sound/pci/cs5535audio/cs5535audio.c34
1 files changed, 13 insertions, 21 deletions
diff --git a/sound/pci/cs5535audio/cs5535audio.c b/sound/pci/cs5535audio/cs5535audio.c
index 920c857fc223..3f4379da4d26 100644
--- a/sound/pci/cs5535audio/cs5535audio.c
+++ b/sound/pci/cs5535audio/cs5535audio.c
@@ -55,7 +55,7 @@ MODULE_DEVICE_TABLE(pci, snd_cs5535audio_ids);
55 55
56static void wait_till_cmd_acked(cs5535audio_t *cs5535au, unsigned long timeout) 56static void wait_till_cmd_acked(cs5535audio_t *cs5535au, unsigned long timeout)
57{ 57{
58 unsigned long tmp; 58 unsigned int tmp;
59 do { 59 do {
60 tmp = cs_readl(cs5535au, ACC_CODEC_CNTL); 60 tmp = cs_readl(cs5535au, ACC_CODEC_CNTL);
61 if (!(tmp & CMD_NEW)) 61 if (!(tmp & CMD_NEW))
@@ -69,11 +69,11 @@ static void wait_till_cmd_acked(cs5535audio_t *cs5535au, unsigned long timeout)
69static unsigned short snd_cs5535audio_codec_read(cs5535audio_t *cs5535au, 69static unsigned short snd_cs5535audio_codec_read(cs5535audio_t *cs5535au,
70 unsigned short reg) 70 unsigned short reg)
71{ 71{
72 unsigned long regdata; 72 unsigned int regdata;
73 unsigned long timeout; 73 int timeout;
74 unsigned long val; 74 unsigned int val;
75 75
76 regdata = ((unsigned long) reg) << 24; 76 regdata = ((unsigned int) reg) << 24;
77 regdata |= ACC_CODEC_CNTL_RD_CMD; 77 regdata |= ACC_CODEC_CNTL_RD_CMD;
78 regdata |= CMD_NEW; 78 regdata |= CMD_NEW;
79 79
@@ -83,24 +83,23 @@ static unsigned short snd_cs5535audio_codec_read(cs5535audio_t *cs5535au,
83 timeout = 50; 83 timeout = 50;
84 do { 84 do {
85 val = cs_readl(cs5535au, ACC_CODEC_STATUS); 85 val = cs_readl(cs5535au, ACC_CODEC_STATUS);
86 if ( (val & STS_NEW) && 86 if ((val & STS_NEW) && reg == (val >> 24))
87 ((unsigned long) reg == ((0xFF000000 & val)>>24)) )
88 break; 87 break;
89 msleep(10); 88 msleep(10);
90 } while (--timeout); 89 } while (--timeout);
91 if (!timeout) 90 if (!timeout)
92 snd_printk(KERN_ERR "Failure reading cs5535 codec\n"); 91 snd_printk(KERN_ERR "Failure reading cs5535 codec\n");
93 92
94 return ((unsigned short) val); 93 return (unsigned short) val;
95} 94}
96 95
97static void snd_cs5535audio_codec_write(cs5535audio_t *cs5535au, 96static void snd_cs5535audio_codec_write(cs5535audio_t *cs5535au,
98 unsigned short reg, unsigned short val) 97 unsigned short reg, unsigned short val)
99{ 98{
100 unsigned long regdata; 99 unsigned int regdata;
101 100
102 regdata = ((unsigned long) reg) << 24; 101 regdata = ((unsigned int) reg) << 24;
103 regdata |= (unsigned long) val; 102 regdata |= val;
104 regdata &= CMD_MASK; 103 regdata &= CMD_MASK;
105 regdata |= CMD_NEW; 104 regdata |= CMD_NEW;
106 regdata &= ACC_CODEC_CNTL_WR_CMD; 105 regdata &= ACC_CODEC_CNTL_WR_CMD;
@@ -123,12 +122,6 @@ static unsigned short snd_cs5535audio_ac97_codec_read(ac97_t *ac97,
123 return snd_cs5535audio_codec_read(cs5535au, reg); 122 return snd_cs5535audio_codec_read(cs5535au, reg);
124} 123}
125 124
126static void snd_cs5535audio_mixer_free_ac97(ac97_t *ac97)
127{
128 cs5535audio_t *cs5535audio = ac97->private_data;
129 cs5535audio->ac97 = NULL;
130}
131
132static int snd_cs5535audio_mixer(cs5535audio_t *cs5535au) 125static int snd_cs5535audio_mixer(cs5535audio_t *cs5535au)
133{ 126{
134 snd_card_t *card = cs5535au->card; 127 snd_card_t *card = cs5535au->card;
@@ -147,10 +140,9 @@ static int snd_cs5535audio_mixer(cs5535audio_t *cs5535au)
147 ac97.scaps = AC97_SCAP_AUDIO|AC97_SCAP_SKIP_MODEM; 140 ac97.scaps = AC97_SCAP_AUDIO|AC97_SCAP_SKIP_MODEM;
148 ac97.private_data = cs5535au; 141 ac97.private_data = cs5535au;
149 ac97.pci = cs5535au->pci; 142 ac97.pci = cs5535au->pci;
150 ac97.private_free = snd_cs5535audio_mixer_free_ac97;
151 143
152 if ((err = snd_ac97_mixer(pbus, &ac97, &cs5535au->ac97)) < 0) { 144 if ((err = snd_ac97_mixer(pbus, &ac97, &cs5535au->ac97)) < 0) {
153 snd_printk("mixer failed\n"); 145 snd_printk(KERN_ERR "mixer failed\n");
154 return err; 146 return err;
155 } 147 }
156 148
@@ -201,8 +193,8 @@ static irqreturn_t snd_cs5535audio_interrupt(int irq, void *dev_id,
201 193
202 if (!acc_irq_stat) 194 if (!acc_irq_stat)
203 return IRQ_NONE; 195 return IRQ_NONE;
204 for (count=0; count < 10; count++) { 196 for (count = 0; count < 10; count++) {
205 if (acc_irq_stat & (1<<count)) { 197 if (acc_irq_stat & (1 << count)) {
206 switch (count) { 198 switch (count) {
207 case IRQ_STS: 199 case IRQ_STS:
208 cs_readl(cs5535au, ACC_GPIO_STATUS); 200 cs_readl(cs5535au, ACC_GPIO_STATUS);