Build for AROS..
[AROS.git] / workbench / devs / AHI / Drivers / HDAudio / hdaudio.c
blob6e23c346c2261b09692cec979c514d0e2d003b9f
1 #include <config.h>
3 #include <devices/ahi.h>
4 #include <exec/memory.h>
5 #include <libraries/ahi_sub.h>
6 #include <math.h>
8 #include <proto/ahi_sub.h>
9 #include <proto/exec.h>
10 #include <proto/dos.h>
11 #include <proto/utility.h>
12 #ifdef __AROS__
13 #include <aros/debug.h>
14 #define DebugPrintF bug
15 #endif
16 #include <string.h>
18 #include "library.h"
19 #include "regs.h"
20 #include "misc.h"
21 #include "pci_wrapper.h"
25 extern int z, timer;
28 /******************************************************************************
29 ** Globals ********************************************************************
30 ******************************************************************************/
32 static BOOL build_buffer_descriptor_list(struct HDAudioChip *card, ULONG nr_of_buffers, ULONG buffer_size, struct Stream *stream);
33 static void free_buffer_descriptor_list(struct HDAudioChip *card, ULONG nr_of_buffers, struct Stream *stream);
34 static BOOL stream_reset(struct Stream *stream, struct HDAudioChip *card);
35 void set_converter_format(struct HDAudioChip *card, UBYTE nid);
38 static const char *Inputs[INPUTS] =
40 "Line in",
41 "Mic 1",
42 "Mic 2",
43 "CD",
44 "Mixer"
48 #define OUTPUTS 1
51 static const char *Outputs[OUTPUTS] =
53 "Line",
58 #define uint32 unsigned int
61 /******************************************************************************
62 ** AHIsub_AllocAudio **********************************************************
63 ******************************************************************************/
65 ULONG _AHIsub_AllocAudio(struct TagItem* taglist,
66 struct AHIAudioCtrlDrv* AudioCtrl,
67 struct DriverBase* AHIsubBase)
69 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
71 int card_num;
72 ULONG ret;
73 ULONG i;
75 card_num = (GetTagData(AHIDB_AudioID, 0, taglist) & 0x0000f000) >> 12;
77 if (card_num >= card_base->cards_found ||
78 card_base->driverdatas[card_num] == NULL)
80 DebugPrintF("no data for card = %ld\n", card_num);
81 Req("No HDAudioChip for card %ld.", card_num);
82 return AHISF_ERROR;
84 else
86 BOOL in_use;
87 struct PCIDevice *dev;
88 struct HDAudioChip *card;
89 unsigned short uval;
91 card = card_base->driverdatas[card_num];
92 AudioCtrl->ahiac_DriverData = card;
94 ObtainSemaphore(&card_base->semaphore);
95 in_use = (card->audioctrl != NULL);
96 if (!in_use)
98 card->audioctrl = AudioCtrl;
100 ReleaseSemaphore(&card_base->semaphore);
102 if (in_use)
104 return AHISF_ERROR;
107 dev = card->pci_dev;
109 //bug("AudioCtrl->ahiac_MixFreq = %lu\n", AudioCtrl->ahiac_MixFreq);
110 if (AudioCtrl->ahiac_MixFreq < card->frequencies[0].frequency)
111 AudioCtrl->ahiac_MixFreq = card->frequencies[0].frequency;
113 card->selected_freq_index = 0;
114 for (i = 1; i < card->nr_of_frequencies; i++)
116 if ((ULONG) card->frequencies[i].frequency >= AudioCtrl->ahiac_MixFreq)
118 if ((AudioCtrl->ahiac_MixFreq - (LONG) card->frequencies[i - 1].frequency)
119 < ((LONG) card->frequencies[i].frequency - AudioCtrl->ahiac_MixFreq))
121 card->selected_freq_index = i - 1;
122 break;
124 else
126 card->selected_freq_index = i;
127 break;
132 //bug("card->selected_freq_index = %lu\n", card->selected_freq_index);
134 ret = AHISF_KNOWHIFI | AHISF_KNOWSTEREO | AHISF_MIXING | AHISF_TIMING;
136 for (i = 0; i < card->nr_of_frequencies; i++)
138 if (AudioCtrl->ahiac_MixFreq == card->frequencies[i].frequency)
140 ret |= AHISF_CANRECORD;
141 break;
145 return ret;
151 /******************************************************************************
152 ** AHIsub_FreeAudio ***********************************************************
153 ******************************************************************************/
155 void _AHIsub_FreeAudio(struct AHIAudioCtrlDrv* AudioCtrl,
156 struct DriverBase* AHIsubBase)
158 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
159 struct HDAudioChip* card = (struct HDAudioChip*) AudioCtrl->ahiac_DriverData;
161 if (card != NULL)
163 ObtainSemaphore(&card_base->semaphore);
164 if (card->audioctrl == AudioCtrl)
166 // Release it if we own it.
167 card->audioctrl = NULL;
170 ReleaseSemaphore(&card_base->semaphore);
172 AudioCtrl->ahiac_DriverData = NULL;
177 /******************************************************************************
178 ** AHIsub_Disable *************************************************************
179 ******************************************************************************/
181 void _AHIsub_Disable(struct AHIAudioCtrlDrv* AudioCtrl,
182 struct DriverBase* AHIsubBase)
184 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
186 // V6 drivers do not have to preserve all registers
188 Disable();
192 /******************************************************************************
193 ** AHIsub_Enable **************************************************************
194 ******************************************************************************/
196 void _AHIsub_Enable(struct AHIAudioCtrlDrv* AudioCtrl,
197 struct DriverBase* AHIsubBase)
199 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
201 // V6 drivers do not have to preserve all registers
203 Enable();
207 /******************************************************************************
208 ** AHIsub_Start ***************************************************************
209 ******************************************************************************/
211 ULONG _AHIsub_Start(ULONG flags,
212 struct AHIAudioCtrlDrv* AudioCtrl,
213 struct DriverBase* AHIsubBase)
215 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
216 struct HDAudioChip* card = (struct HDAudioChip*) AudioCtrl->ahiac_DriverData;
217 struct PCIDevice *dev = card->pci_dev;
218 UWORD PlayCtrlFlags = 0, RecCtrlFlags = 0;
219 ULONG dma_buffer_size = 0;
220 int i;
221 unsigned short uval;
222 UBYTE input_streams = 0;
223 struct Stream *input_stream = &(card->streams[0]);
224 struct Stream *output_stream = &(card->streams[card->nr_of_input_streams]);
225 UBYTE old_rirb_wp;
227 if (flags & AHISF_PLAY)
229 ULONG dma_sample_frame_size;
230 int i;
231 unsigned short cod, ChannelsFlag = 0;
233 detect_headphone_change(card);
235 card->mix_buffer = (APTR) AllocVec(AudioCtrl->ahiac_BuffSize, MEMF_PUBLIC | MEMF_CLEAR);
237 if (card->mix_buffer == NULL)
239 bug("Unable to allocate %ld bytes for mixing buffer.", AudioCtrl->ahiac_BuffSize);
240 return AHIE_NOMEM;
243 /* Allocate a buffer large enough for 32-bit double-buffered playback (mono or stereo) */
244 if (AudioCtrl->ahiac_Flags & AHIACF_STEREO)
246 dma_sample_frame_size = 4 * 2;
247 dma_buffer_size = AudioCtrl->ahiac_MaxBuffSamples * dma_sample_frame_size;
249 else
251 dma_sample_frame_size = 4;
252 dma_buffer_size = AudioCtrl->ahiac_MaxBuffSamples * dma_sample_frame_size;
255 //bug("dma_buffer_size = %ld, %lx, freq = %d\n", dma_buffer_size, dma_buffer_size, AudioCtrl->ahiac_MixFreq);
256 build_buffer_descriptor_list(card, 2, dma_buffer_size, output_stream);
258 card->playback_buffer1 = (APTR) output_stream->bdl[0].lower_address;
259 card->playback_buffer2 = (APTR) output_stream->bdl[1].lower_address;
261 //bug("BDLE[0] = %lx, BDLE[1] = %lx\n", output_stream->bdl[0].lower_address, output_stream->bdl[1].lower_address);
262 if (stream_reset(output_stream, card) == FALSE)
264 return AHISF_ERROR;
267 // 4.5.3 Starting Streams
268 outb_setbits((output_stream->tag << 4), output_stream->sd_reg_offset + HD_SD_OFFSET_CONTROL + 2, card); // set stream number
269 pci_outl(dma_buffer_size * 2, output_stream->sd_reg_offset + HD_SD_OFFSET_CYCLIC_BUFFER_LEN, card);
270 pci_outw(1, output_stream->sd_reg_offset + HD_SD_OFFSET_LAST_VALID_INDEX, card); // 2 buffers, last valid index = 1
272 // set sample rate and format
273 pci_outw(((card->frequencies[card->selected_freq_index].base44100 > 0) ? BASE44 : 0) | // base freq: 48 or 44.1 kHz
274 (card->frequencies[card->selected_freq_index].mult << 11) | // multiplier
275 (card->frequencies[card->selected_freq_index].div << 8) | // divisor
276 FORMAT_24BITS | // set to 24-bit for now
277 FORMAT_STEREO,
278 output_stream->sd_reg_offset + HD_SD_OFFSET_FORMAT, card);
280 send_command_4(card->codecnr, card->dac_nid, VERB_SET_CONVERTER_FORMAT,
281 ((card->frequencies[card->selected_freq_index].base44100 > 0) ? BASE44 : 0) | // base freq: 48 or 44.1 kHz
282 (card->frequencies[card->selected_freq_index].mult << 11) | // multiplier
283 (card->frequencies[card->selected_freq_index].div << 8) | // divisor
284 FORMAT_24BITS | // set to 24-bit for now
285 FORMAT_STEREO , card); // stereo
287 send_command_4(card->codecnr, card->dac_nid, 0xA, 0, card);
290 // set BDL for scatter/gather
291 pci_outl((ULONG) output_stream->bdl, output_stream->sd_reg_offset + HD_SD_OFFSET_BDL_ADDR_LOW, card);
292 pci_outl(0, output_stream->sd_reg_offset + HD_SD_OFFSET_BDL_ADDR_HIGH, card);
294 // set stream ID and channel for DAC
295 send_command_12(card->codecnr, card->dac_nid, VERB_SET_CONVERTER_STREAM_CHANNEL, (output_stream->tag << 4), card); // stream 1, channel 0
297 card->current_bytesize = dma_buffer_size;
298 card->current_frames = AudioCtrl->ahiac_MaxBuffSamples;
299 card->current_buffer = card->playback_buffer1;
300 card->flip = 1;
301 card->is_playing = TRUE;
304 if (flags & AHISF_RECORD)
306 dma_buffer_size = RECORD_BUFFER_SAMPLES * 4;
308 build_buffer_descriptor_list(card, 2, dma_buffer_size, input_stream);
310 card->record_buffer1 = (APTR) input_stream->bdl[0].lower_address;
311 card->record_buffer2 = (APTR) input_stream->bdl[1].lower_address;
313 if (stream_reset(input_stream, card) == FALSE)
315 return AHISF_ERROR;
318 // 4.5.3 Starting Streams
319 outb_setbits((input_stream->tag << 4), input_stream->sd_reg_offset + HD_SD_OFFSET_CONTROL + 2, card); // set stream number
320 pci_outl(dma_buffer_size * 2, input_stream->sd_reg_offset + HD_SD_OFFSET_CYCLIC_BUFFER_LEN, card);
321 pci_outw(1, input_stream->sd_reg_offset + HD_SD_OFFSET_LAST_VALID_INDEX, card); // 2 buffers, last valid index = 1
323 // set sample rate and format
324 pci_outw(((card->frequencies[card->selected_freq_index].base44100 > 0) ? BASE44 : 0) | // base freq: 48 or 44.1 kHz
325 (card->frequencies[card->selected_freq_index].mult << 11) | // multiplier
326 (card->frequencies[card->selected_freq_index].div << 8) | // divisor
327 FORMAT_16BITS | // set to 16-bit for now
328 FORMAT_STEREO,
329 input_stream->sd_reg_offset + HD_SD_OFFSET_FORMAT, card);
331 send_command_4(card->codecnr, card->adc_nid, VERB_SET_CONVERTER_FORMAT,
332 ((card->frequencies[card->selected_freq_index].base44100 > 0) ? BASE44 : 0) | // base freq: 48 or 44.1 kHz
333 (card->frequencies[card->selected_freq_index].mult << 11) | // multiplier
334 (card->frequencies[card->selected_freq_index].div << 8) | // divisor
335 FORMAT_16BITS | // set to 16-bit for now
336 FORMAT_STEREO , card); // stereo
338 // set BDL for scatter/gather
339 pci_outl((ULONG) input_stream->bdl, input_stream->sd_reg_offset + HD_SD_OFFSET_BDL_ADDR_LOW, card);
340 pci_outl(0, input_stream->sd_reg_offset + HD_SD_OFFSET_BDL_ADDR_HIGH, card);
342 // set stream ID and channel for ADC
343 send_command_12(card->codecnr, card->adc_nid, VERB_SET_CONVERTER_STREAM_CHANNEL, (input_stream->tag << 4), card);
345 bug("RECORD\n");
346 codec_discovery(card); // tbd < --------------------
348 card->current_record_bytesize = dma_buffer_size;
349 card->current_record_buffer = card->record_buffer1;
350 card->recflip = 1;
351 card->is_recording = TRUE;
354 if (flags & AHISF_PLAY)
356 // enable irq's
357 z = 0;
358 timer = 0; // for demo/test
360 //bug("GOING TO PLAY\n");
361 outl_setbits((1 << output_stream->index), HD_INTCTL, card);
362 outl_setbits(HD_SD_CONTROL_STREAM_RUN | HD_SD_STATUS_MASK, output_stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card); // Stream Run
366 if (flags & AHISF_RECORD)
368 // enable irq's
369 outl_setbits((1 << input_stream->index), HD_INTCTL, card);
370 outl_setbits(HD_SD_CONTROL_STREAM_RUN | HD_SD_STATUS_MASK, input_stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card); // Stream Run
374 return AHIE_OK;
378 /******************************************************************************
379 ** AHIsub_Update **************************************************************
380 ******************************************************************************/
382 void _AHIsub_Update(ULONG flags,
383 struct AHIAudioCtrlDrv* AudioCtrl,
384 struct DriverBase* AHIsubBase)
386 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
387 struct HDAudioChip* card = (struct HDAudioChip*) AudioCtrl->ahiac_DriverData;
389 card->current_frames = AudioCtrl->ahiac_BuffSamples;
391 if (AudioCtrl->ahiac_Flags & AHIACF_STEREO)
393 card->current_bytesize = card->current_frames * 4;
395 else
397 card->current_bytesize = card->current_frames * 2;
402 /******************************************************************************
403 ** AHIsub_Stop ****************************************************************
404 ******************************************************************************/
406 void _AHIsub_Stop(ULONG flags,
407 struct AHIAudioCtrlDrv* AudioCtrl,
408 struct DriverBase* AHIsubBase)
410 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
411 struct HDAudioChip* card = (struct HDAudioChip*) AudioCtrl->ahiac_DriverData;
412 struct PCIDevice *dev = card->pci_dev;
414 unsigned char val;
416 //bug("Stop\n");
418 if ((flags & AHISF_PLAY) && card->is_playing)
420 struct Stream *output_stream = &(card->streams[card->nr_of_input_streams]);
421 outl_clearbits(HD_SD_CONTROL_STREAM_RUN, output_stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card);
422 card->is_playing = FALSE;
424 card->current_bytesize = 0;
425 card->current_frames = 0;
426 card->current_buffer = NULL;
428 if (card->mix_buffer)
430 FreeVec(card->mix_buffer);
432 card->mix_buffer = NULL;
434 free_buffer_descriptor_list(card, 2, output_stream);
436 //#ifdef TIME_LIMITED
437 bug("HDAUDIO: IRQ's received was %d\n", z);
438 //#endif
441 if ((flags & AHISF_RECORD) && card->is_recording)
443 struct Stream *input_stream = &(card->streams[0]);
444 outl_clearbits(HD_SD_CONTROL_STREAM_RUN, input_stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card);
446 card->record_buffer1 = NULL;
447 card->record_buffer2 = NULL;
448 card->current_record_bytesize = 0;
450 card->is_recording = FALSE;
452 free_buffer_descriptor_list(card, 2, input_stream);
455 card->current_bytesize = 0;
459 /******************************************************************************
460 ** AHIsub_GetAttr *************************************************************
461 ******************************************************************************/
463 LONG _AHIsub_GetAttr(ULONG attribute,
464 LONG argument,
465 LONG def,
466 struct TagItem* taglist,
467 struct AHIAudioCtrlDrv* AudioCtrl,
468 struct DriverBase* AHIsubBase)
470 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
471 struct HDAudioChip* card = card_base->driverdatas[0];
472 ULONG i;
474 switch(attribute)
476 case AHIDB_Bits:
477 return 16;
479 case AHIDB_Frequencies:
481 return card->nr_of_frequencies;
484 case AHIDB_Frequency: // Index->Frequency
485 return (LONG) card->frequencies[argument].frequency;
487 case AHIDB_Index: // Frequency->Index
489 if (argument <= (LONG) card->frequencies[0].frequency)
491 return 0;
494 if (argument >= (LONG) card->frequencies[card->nr_of_frequencies - 1].frequency)
496 return card->nr_of_frequencies - 1;
499 for (i = 1; i < card->nr_of_frequencies; i++)
501 if ((LONG) card->frequencies[i].frequency > argument)
503 if ((argument - (LONG) card->frequencies[i - 1].frequency) < ((LONG) card->frequencies[i].frequency - argument))
505 return i-1;
507 else
509 return i;
514 return 0; // Will not happen
517 case AHIDB_Author:
518 return (LONG) "Davy Wentzler";
520 case AHIDB_Copyright:
521 return (LONG) "(C) 2011 The AROS Dev Team";
523 case AHIDB_Version:
524 return (LONG) LibIDString;
526 case AHIDB_Annotation:
527 return (LONG)
528 "AROS HD Audio driver";
530 case AHIDB_Record:
531 return TRUE;
533 case AHIDB_FullDuplex:
534 return TRUE;
536 case AHIDB_Realtime:
537 return TRUE;
539 case AHIDB_MaxRecordSamples:
540 return RECORD_BUFFER_SAMPLES;
542 /* formula's:
543 #include <math.h>
545 unsigned long res = (unsigned long) (0x10000 * pow (10.0, dB / 20.0));
546 double dB = 20.0 * log10(0xVALUE / 65536.0);
548 printf("dB = %f, res = %lx\n", dB, res);*/
550 case AHIDB_MinMonitorVolume:
551 return (unsigned long) (0x10000 * pow (10.0, -34.5 / 20.0)); // -34.5 dB
553 case AHIDB_MaxMonitorVolume:
554 return (unsigned long) (0x10000 * pow (10.0, 12.0 / 20.0)); // 12 dB
556 case AHIDB_MinInputGain:
557 return (unsigned long) (0x10000 * pow (10.0, card->adc_min_gain / 20.0));
559 case AHIDB_MaxInputGain:
560 return (unsigned long) (0x10000 * pow (10.0, card->adc_max_gain / 20.0));
562 case AHIDB_MinOutputVolume:
563 return (unsigned long) (0x10000 * pow (10.0, card->dac_min_gain / 20.0));
565 case AHIDB_MaxOutputVolume:
566 return (unsigned long) (0x10000 * pow (10.0, card->dac_max_gain / 20.0));
568 case AHIDB_Inputs:
569 return INPUTS;
571 case AHIDB_Input:
572 return (LONG) Inputs[argument];
574 case AHIDB_Outputs:
575 return OUTPUTS;
577 case AHIDB_Output:
578 return (LONG) Outputs[argument];
580 default:
581 return def;
586 /******************************************************************************
587 ** AHIsub_HardwareControl *****************************************************
588 ******************************************************************************/
590 ULONG _AHIsub_HardwareControl(ULONG attribute,
591 LONG argument,
592 struct AHIAudioCtrlDrv* AudioCtrl,
593 struct DriverBase* AHIsubBase)
595 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
596 struct HDAudioChip* card = card_base->driverdatas[0];
598 switch(attribute)
600 case AHIC_MonitorVolume:
602 double dB = 20.0 * log10(argument / 65536.0);
604 card->monitor_volume = argument;
605 set_monitor_volumes(card, dB);
607 return TRUE;
610 case AHIC_MonitorVolume_Query:
612 return card->monitor_volume;
615 case AHIC_InputGain:
617 double dB = 20.0 * log10(argument / 65536.0);
618 card->input_gain = argument;
620 set_adc_gain(card, dB);
621 return TRUE;
624 case AHIC_InputGain_Query:
625 return card->input_gain;
627 case AHIC_OutputVolume:
629 double dB = 20.0 * log10(argument / 65536.0);
630 card->output_volume = argument;
632 set_dac_gain(card, dB);
634 return TRUE;
637 case AHIC_OutputVolume_Query:
638 return card->output_volume;
640 case AHIC_Input:
641 card->input = argument;
642 set_adc_input(card);
644 return TRUE;
646 case AHIC_Input_Query:
647 return card->input;
649 case AHIC_Output:
650 card->output = argument;
652 return TRUE;
654 case AHIC_Output_Query:
655 return card->output;
657 default:
658 return FALSE;
663 static BOOL build_buffer_descriptor_list(struct HDAudioChip *card, ULONG nr_of_buffers, ULONG buffer_size, struct Stream *stream)
665 unsigned int entry;
667 stream->bdl = pci_alloc_consistent(nr_of_buffers * sizeof(struct BDLE), &(stream->bdl_nonaligned), 128);
668 stream->bdl_nonaligned_addresses = (APTR) AllocVec(nr_of_buffers * 8, MEMF_PUBLIC | MEMF_CLEAR);
670 for (entry = 0; entry < nr_of_buffers; entry++)
672 APTR non_aligned_address = 0;
674 stream->bdl[entry].lower_address = (ULONG) pci_alloc_consistent(buffer_size, &non_aligned_address, 128);
675 stream->bdl[entry].upper_address = 0;
676 stream->bdl[entry].length = buffer_size;
677 stream->bdl[entry].reserved_ioc = 1;
679 stream->bdl_nonaligned_addresses[entry] = non_aligned_address;
681 //bug("BDL %d = %lx\n", entry, stream->bdl[entry].lower_address);
684 return TRUE;
688 static void free_buffer_descriptor_list(struct HDAudioChip *card, ULONG nr_of_buffers, struct Stream *stream)
690 unsigned int entry;
692 stream->bdl = pci_alloc_consistent(nr_of_buffers * sizeof(struct BDLE), &(stream->bdl_nonaligned), 128);
693 stream->bdl_nonaligned_addresses = (APTR) AllocVec(nr_of_buffers * 8, MEMF_PUBLIC | MEMF_CLEAR);
695 for (entry = 0; entry < nr_of_buffers; entry++)
697 pci_free_consistent(stream->bdl_nonaligned_addresses[entry]);
698 stream->bdl[entry].lower_address = 0;
699 stream->bdl_nonaligned_addresses[entry] = NULL;
702 pci_free_consistent(stream->bdl_nonaligned);
703 stream->bdl_nonaligned = NULL;
705 FreeVec(stream->bdl_nonaligned_addresses);
706 stream->bdl_nonaligned_addresses = NULL;
710 static BOOL stream_reset(struct Stream *stream, struct HDAudioChip *card)
712 int i;
713 UBYTE control;
715 outb_clearbits(HD_SD_CONTROL_STREAM_RUN, stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card); // stop stream run
717 outb_setbits(0x1C, stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card);
718 outb_setbits(0x1C, stream->sd_reg_offset + HD_SD_OFFSET_STATUS, card);
719 outb_setbits(0x1, stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card); // stream reset
721 for (i = 0; i < 1000; i++)
723 if ((pci_inb(stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card) & 0x1) == 0x1)
725 break;
728 udelay(100);
731 if (i == 1000)
733 bug("Stream reset not ok\n");
734 return FALSE;
737 outb_clearbits(0x1, stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card); // stream reset
738 udelay(10);
739 for (i = 0; i < 1000; i++)
741 if ((pci_inb(stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card) & 0x1) == 0x0)
743 break;
746 udelay(100);
749 if (i == 1000)
751 bug("Stream reset 2 not ok\n");
752 return FALSE;
755 outb_clearbits(HD_SD_CONTROL_STREAM_RUN, stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card); // stop stream run
757 control = pci_inb(stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card);
758 if ((control & 0x1) == 1)
760 return FALSE;
763 return TRUE;
767 void set_converter_format(struct HDAudioChip *card, UBYTE nid)
769 send_command_4(card->codecnr, nid, VERB_SET_CONVERTER_FORMAT, (1 << 14) | (0x3 << 4) | 1, card); // 44.1kHz 24-bits stereo