Ticket #5066: ali5451_091203.patch
File ali5451_091203.patch, 10.5 KB (added by , 14 years ago) |
---|
-
src/add-ons/kernel/drivers/audio/ac97/ali5451/ali_multi.c
12 12 #include <hmulti_audio.h> 13 13 #include <string.h> 14 14 15 #include "ac97.h" 15 16 #include "queue.h" 16 17 #include "driver.h" 17 18 #include "util.h" … … 63 64 #define ALI_ALL_MIXERS (ALI_OUTPUT_MIXERS + ALI_INPUT_MIXERS) 64 65 65 66 static const ali_ac97_mixer_info ali_ac97_mixers[ALI_ALL_MIXERS] = { 66 {S_MASTER, NULL, AC97_M IX_MASTER, -46.5f, 0.0f, ALI_MIX_FT_STEREO | ALI_MIX_FT_MUTE},67 {S_WAVE, NULL, AC97_ MIX_PCM, -34.5f, 12.0f, ALI_MIX_FT_STEREO | ALI_MIX_FT_MUTE},68 {S_HEADPHONE, NULL, AC97_ MIX_HEADPHONE, -34.5f, 12.0f, ALI_MIX_FT_STEREO | ALI_MIX_FT_MUTE},69 {S_CD, NULL, AC97_ MIX_CD, -34.5f, 12.0f, ALI_MIX_FT_STEREO | ALI_MIX_FT_MUTE},70 {S_LINE, NULL, AC97_ MIX_LINEIN, -34.5f, 12.0f, ALI_MIX_FT_STEREO | ALI_MIX_FT_MUTE},71 {S_MIC, NULL, AC97_MI X_MIC, -34.5f, 12.0f, ALI_MIX_FT_MUTE | ALI_MIX_FT_MICBST},72 {S_AUX, NULL, AC97_ MIX_AUX, -34.5f, 12.0f, ALI_MIX_FT_STEREO | ALI_MIX_FT_MUTE},73 {S_null, "Record", AC97_ MIX_RECORDGAIN, 0.0f, 22.5f,67 {S_MASTER, NULL, AC97_MASTER_VOLUME, -46.5f, 0.0f, ALI_MIX_FT_STEREO | ALI_MIX_FT_MUTE}, 68 {S_WAVE, NULL, AC97_PCM_OUT_VOLUME, -34.5f, 12.0f, ALI_MIX_FT_STEREO | ALI_MIX_FT_MUTE}, 69 {S_HEADPHONE, NULL, AC97_AUX_OUT_VOLUME, -34.5f, 12.0f, ALI_MIX_FT_STEREO | ALI_MIX_FT_MUTE}, 70 {S_CD, NULL, AC97_CD_VOLUME, -34.5f, 12.0f, ALI_MIX_FT_STEREO | ALI_MIX_FT_MUTE}, 71 {S_LINE, NULL, AC97_LINE_IN_VOLUME, -34.5f, 12.0f, ALI_MIX_FT_STEREO | ALI_MIX_FT_MUTE}, 72 {S_MIC, NULL, AC97_MIC_VOLUME, -34.5f, 12.0f, ALI_MIX_FT_MUTE | ALI_MIX_FT_MICBST}, 73 {S_AUX, NULL, AC97_AUX_IN_VOLUME, -34.5f, 12.0f, ALI_MIX_FT_STEREO | ALI_MIX_FT_MUTE}, 74 {S_null, "Record", AC97_RECORD_GAIN, 0.0f, 22.5f, 74 75 ALI_MIX_FT_STEREO | ALI_MIX_FT_MUTE | ALI_MIX_FT_GAIN | ALI_MIX_FT_INSEL}, 75 76 }; 76 77 … … 210 211 211 212 switch (gadget_id) { 212 213 case ALI_MIX_MUTE_ID: 213 mmv->u.enable = ((ac97_re ad(card, mixer_info->reg) & 0x8000)214 == 0x8000);214 mmv->u.enable = ((ac97_reg_cached_read(card->codec, mixer_info->reg) 215 & 0x8000) == 0x8000); 215 216 break; 216 217 217 218 case ALI_MIX_LEFT_ID: 218 219 case ALI_MIX_RIGHT_ID: 219 220 { 220 221 float val = (ALI_MIXER_GRANULARITY 221 * ((ac97_re ad(card, mixer_info->reg) >>222 ((gadget_id==ALI_MIX_LEFT_ID)?8:0)) & 0x1f));222 * ((ac97_reg_cached_read(card->codec, mixer_info->reg) 223 >> ((gadget_id==ALI_MIX_LEFT_ID)?8:0)) & 0x1f)); 223 224 mmv->u.gain = ((mixer_info->features&ALI_MIX_FT_GAIN) 224 225 ? mixer_info->min_gain+val:mixer_info->max_gain-val); 225 226 } 226 227 break; 227 228 228 229 case ALI_MIX_MIC_BOOST_ID: 229 mmv->u.enable = ((ac97_read(card, mixer_info->reg) & 0x40) == 0x40); 230 mmv->u.enable = ((ac97_reg_cached_read(card->codec, mixer_info->reg) 231 & 0x40) == 0x40); 230 232 break; 231 233 232 234 case ALI_MIX_INPUT_SELECTOR_ID: 233 mmv->u.mux = (ac97_read(card, AC97_MIX_RECORDSELECT) & 0x7); 235 mmv->u.mux = (ac97_reg_cached_read(card->codec, 236 AC97_RECORD_SELECT) & 0x7); 234 237 if (ALI_MUX_INPUTS <= mmv->u.mux) { 235 238 mmv->u.mux = 0x2; 236 ac97_ write(card, AC97_MIX_RECORDSELECT, 0x202);239 ac97_reg_cached_write(card->codec, AC97_RECORD_SELECT, 0x202); 237 240 } 238 241 break; 239 242 } … … 266 269 267 270 switch (gadget_id) { 268 271 case ALI_MIX_MUTE_ID: 269 val = ac97_re ad(card, mixer_info->reg);272 val = ac97_reg_cached_read(card->codec, mixer_info->reg); 270 273 val = mmv->u.enable ? val | 0x8000 : val & 0x7fff; 271 ac97_ write(card, mixer_info->reg, val);274 ac97_reg_cached_write(card->codec, mixer_info->reg, val); 272 275 break; 273 276 274 277 case ALI_MIX_LEFT_ID: 275 278 case ALI_MIX_RIGHT_ID: 276 val = ac97_re ad(card, mixer_info->reg);279 val = ac97_reg_cached_read(card->codec, mixer_info->reg); 277 280 val &= (gadget_id == ALI_MIX_LEFT_ID) ? 0x805f : 0x9f00; 278 281 val |= (uint16) (((mixer_info->features&ALI_MIX_FT_GAIN) 279 282 ? mixer_info->min_gain+mmv->u.gain 280 283 : mixer_info->max_gain-mmv->u.gain) 281 284 / ALI_MIXER_GRANULARITY) << 282 285 ((gadget_id == ALI_MIX_LEFT_ID) ? 8 : 0); 283 ac97_ write(card, mixer_info->reg, val);286 ac97_reg_cached_write(card->codec, mixer_info->reg, val); 284 287 break; 285 288 286 289 case ALI_MIX_MIC_BOOST_ID: 287 val = ac97_re ad(card, mixer_info->reg);290 val = ac97_reg_cached_read(card->codec, mixer_info->reg); 288 291 val = mmv->u.enable ? val | 0x40 : val & 0xffbf; 289 ac97_ write(card, mixer_info->reg, val);292 ac97_reg_cached_write(card->codec, mixer_info->reg, val); 290 293 break; 291 294 292 295 case ALI_MIX_INPUT_SELECTOR_ID: 293 296 val = (mmv->u.mux << 8) | mmv->u.mux; 294 ac97_ write(card, AC97_MIX_RECORDSELECT, val);297 ac97_reg_cached_write(card->codec, AC97_RECORD_SELECT, val); 295 298 break; 296 299 } 297 300 } -
src/add-ons/kernel/drivers/audio/ac97/ali5451/driver.h
73 73 ulong io_base; 74 74 uint8 irq; 75 75 76 ac97_dev *codec; 77 76 78 spinlock lock_hw; 77 79 spinlock lock_sts; 78 80 spinlock lock_voices; -
src/add-ons/kernel/drivers/audio/ac97/ali5451/ali_hardware.c
11 11 #include <drivers/PCI.h> 12 12 #include <hmulti_audio.h> 13 13 14 #include "ac97.h" 14 15 #include "queue.h" 15 16 #include "driver.h" 16 17 #include "util.h" … … 19 20 20 21 21 22 #define ALI_5451_V02 0x02 22 #define ALI_AC97_CODEC_ID 0x4144537423 #define ALI_AC97_CAPS_HEAD 0x1024 23 25 24 // ALI registers 26 25 … … 137 136 } 138 137 139 138 140 uint16141 ac97_read( ali_dev *card, uint8 reg)139 static uint16 140 ac97_read(void *cookie, uint8 reg) 142 141 { 142 ali_dev *card = (ali_dev *) cookie; 143 143 uint32 ac_reg; 144 144 145 145 ac_reg = (card->info.revision == ALI_5451_V02)?ALI_ACR0:ALI_ACR1; … … 156 156 } 157 157 158 158 159 void160 ac97_write( ali_dev *card, uint8 reg, uint16 val)159 static void 160 ac97_write(void *cookie, uint8 reg, uint16 val) 161 161 { 162 ali_dev *card = (ali_dev *) cookie; 162 163 uint32 dw_val; 163 164 164 165 if (!ac97_is_ready(card, ALI_ACR0) || !ac97_is_stimer_ready(card)) … … 173 174 174 175 175 176 static bool 176 ac97_init(ali_dev *card)177 {178 uint16 capabilities;179 uint32 id;180 181 // ac97 reset182 ac97_write(card, AC97_REG_POWER, 0);183 ac97_write(card, AC97_REG_RESET, 0);184 snooze(100000);185 ac97_write(card, AC97_REG_POWER, 0);186 ac97_write(card, AC97_REG_GEN, 0);187 188 capabilities = ac97_read(card, AC97_REG_RESET);189 TRACE("ac97 capabilities: %04x\n", capabilities & 0x3ff);190 191 id = (uint32) ac97_read(card, AC97_REG_ID1) << 16192 | ac97_read(card, AC97_REG_ID2);193 TRACE("ac97 id: %08x\n", (uint) id);194 if (id != ALI_AC97_CODEC_ID)195 return false;196 197 if ((capabilities & ALI_AC97_CAPS_HEAD) != 0)198 ac97_write(card, AC97_JACK_SENSE, (uint16) 1 << 10);199 // enable headphone jack sense200 201 // some sane default values202 ac97_write(card, AC97_MIX_MASTER, 0x707);203 ac97_write(card, AC97_MIX_PCM, 0x707);204 ac97_write(card, AC97_MIX_HEADPHONE, 0x707);205 206 return true;207 }208 209 210 static bool211 177 hardware_reset(ali_dev *card) 212 178 { 213 179 uint32 cmd_reg; 214 uint16 val;215 180 uint8 bval; 216 181 217 182 // pci reset … … 235 200 io_write8(card, ALI_ACR2, bval); 236 201 snooze(15000); 237 202 238 cmd_reg = 200;239 while (cmd_reg--) {240 val = ac97_read(card, AC97_REG_POWER);241 if ((val & 0xf) == 0xf)242 break;243 snooze(5000);244 }245 if (cmd_reg == 0xffffffff) {246 TRACE("hardware reset: not ready\n");247 return false;248 }249 250 203 return true; 251 204 } 252 205 … … 271 224 272 225 UNLOCK(card->lock_hw); 273 226 274 if (!ac97_init(card))275 return B_ERROR;227 ac97_attach(&card->codec, ac97_read, ac97_write, card, 228 card->info.u.h0.subsystem_vendor_id, card->info.u.h0.subsystem_id); 276 229 277 230 TRACE("hardware init ok\n"); 278 231 return B_OK; … … 290 243 // clr voice interrupt flags 291 244 292 245 UNLOCK(card->lock_hw); 246 247 ac97_detach(card->codec); 293 248 } 294 249 295 250 -
src/add-ons/kernel/drivers/audio/ac97/ali5451/Jamfile
4 4 5 5 UsePrivateHeaders media ; 6 6 7 SubDirHdrs [ FDirName $(SUBDIR) $(DOTDOT) ] ; 8 SEARCH_SOURCE += [ FDirName $(SUBDIR) $(DOTDOT) ] ; 9 7 10 KernelAddon ali5451 : 8 11 driver.c 9 12 ali_multi.c 10 13 ali_hardware.c 11 14 util.c 15 ac97.c 12 16 ; -
src/add-ons/kernel/drivers/audio/ac97/ali5451/ali_hardware.h
8 8 #define _ALI_HARDWARE_H 9 9 10 10 11 // AC97 codec registers12 13 #define AC97_REG_RESET 0x0014 #define AC97_MIX_MASTER 0x0215 #define AC97_MIX_HEADPHONE 0x0416 #define AC97_MIX_MONO 0x0617 #define AC97_MIX_PHONE 0x0c18 #define AC97_MIX_MIC 0x0e19 #define AC97_MIX_LINEIN 0x1020 #define AC97_MIX_CD 0x1221 #define AC97_MIX_AUX 0x1622 #define AC97_MIX_PCM 0x1823 #define AC97_MIX_RECORDSELECT 0x1a24 #define AC97_MIX_RECORDGAIN 0x1c25 #define AC97_REG_GEN 0x2026 #define AC97_REG_POWER 0x2627 #define AC97_FRONT_DAC_SR 0x2c28 #define AC97_ADC_RATE 0x3229 #define AC97_JACK_SENSE 0x7230 #define AC97_REG_ID1 0x7c31 #define AC97_REG_ID2 0x7e32 33 34 uint16 ac97_read(ali_dev *card, uint8 reg);35 void ac97_write(ali_dev *card, uint8 reg, uint16 val);36 37 11 status_t hardware_init(ali_dev *card); 38 12 void hardware_terminate(ali_dev *card); 39 13 -
src/add-ons/kernel/drivers/audio/ac97/ali5451/driver.c
13 13 #include <string.h> 14 14 #include <unistd.h> 15 15 16 #include "ac97.h" 16 17 #include "queue.h" 17 18 #include "ali_multi.h" 18 19 #include "driver.h" … … 293 294 card->irq = card->info.u.h0.interrupt_line; 294 295 TRACE("setup: irq is: %02x\n", card->irq); 295 296 297 card->codec = NULL; 296 298 card->lock_hw = 0; 297 299 card->lock_sts = 0; 298 300 card->lock_voices = 0; -
src/add-ons/kernel/drivers/audio/ac97/ali5451/util.c
15 15 #include <hmulti_audio.h> 16 16 #include <string.h> 17 17 18 #include "ac97.h" 18 19 #include "queue.h" 19 20 #include "driver.h" 20 21 #include "util.h"