add placeholder for classic magicmenu pull-down-on-titlebar behaviour when using...
[AROS.git] / workbench / devs / AHI / Drivers / HDAudio / main.c
blob9075b4cdf77a8831a075e759b55d3fcf99e3ea00
1 /*
2 The contents of this file are subject to the AROS Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
3 http://www.aros.org/license.html
5 Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
6 ANY KIND, either express or implied. See the License for the specific language governing rights and
7 limitations under the License.
9 (C) Copyright xxxx-2009 Davy Wentzler.
10 (C) Copyright 2009-2010 Stephen Jones.
12 The Initial Developer of the Original Code is Davy Wentzler.
14 All Rights Reserved.
17 #include <config.h>
19 #include <devices/ahi.h>
20 #include <exec/memory.h>
21 #include <libraries/ahi_sub.h>
22 #include <math.h>
24 #include <proto/ahi_sub.h>
25 #include <proto/exec.h>
26 #include <proto/dos.h>
27 #include <proto/utility.h>
28 #ifdef __AROS__
29 #include <aros/debug.h>
30 #endif
31 #include <string.h>
33 #include "library.h"
34 #include "regs.h"
35 #include "misc.h"
36 #include "pci_wrapper.h"
40 extern int z, timer;
43 /******************************************************************************
44 ** Globals ********************************************************************
45 ******************************************************************************/
47 static BOOL build_buffer_descriptor_list(struct HDAudioChip *card, ULONG nr_of_buffers, ULONG buffer_size, struct Stream *stream);
48 static void free_buffer_descriptor_list(struct HDAudioChip *card, ULONG nr_of_buffers, struct Stream *stream);
49 static BOOL stream_reset(struct Stream *stream, struct HDAudioChip *card);
50 void set_converter_format(struct HDAudioChip *card, UBYTE nid);
53 static const char *Inputs[INPUTS] =
55 "Line in",
56 "Mic 1",
57 "Mic 2",
58 "CD",
59 "Mixer"
63 #define OUTPUTS 1
66 static const char *Outputs[OUTPUTS] =
68 "Line",
73 #define uint32 unsigned int
76 /******************************************************************************
77 ** AHIsub_AllocAudio **********************************************************
78 ******************************************************************************/
80 ULONG _AHIsub_AllocAudio(struct TagItem* taglist,
81 struct AHIAudioCtrlDrv* AudioCtrl,
82 struct DriverBase* AHIsubBase)
84 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
86 int card_num;
87 ULONG ret;
88 ULONG i;
90 card_num = (GetTagData(AHIDB_AudioID, 0, taglist) & 0x0000f000) >> 12;
92 if (card_num >= card_base->cards_found ||
93 card_base->driverdatas[card_num] == NULL)
95 D(bug("[HDAudio] no data for card = %ld\n", card_num));
96 Req("No HDAudioChip for card %ld.", card_num);
97 return AHISF_ERROR;
99 else
101 BOOL in_use;
102 struct PCIDevice *dev;
103 struct HDAudioChip *card;
104 unsigned short uval;
106 card = card_base->driverdatas[card_num];
107 AudioCtrl->ahiac_DriverData = card;
109 ObtainSemaphore(&card_base->semaphore);
110 in_use = (card->audioctrl != NULL);
111 if (!in_use)
113 card->audioctrl = AudioCtrl;
115 ReleaseSemaphore(&card_base->semaphore);
117 if (in_use)
119 return AHISF_ERROR;
122 dev = card->pci_dev;
124 //bug("AudioCtrl->ahiac_MixFreq = %lu\n", AudioCtrl->ahiac_MixFreq);
125 if (AudioCtrl->ahiac_MixFreq < card->frequencies[0].frequency)
126 AudioCtrl->ahiac_MixFreq = card->frequencies[0].frequency;
128 card->selected_freq_index = 0;
129 for (i = 1; i < card->nr_of_frequencies; i++)
131 if ((ULONG) card->frequencies[i].frequency >= AudioCtrl->ahiac_MixFreq)
133 if ((AudioCtrl->ahiac_MixFreq - (LONG) card->frequencies[i - 1].frequency)
134 < ((LONG) card->frequencies[i].frequency - AudioCtrl->ahiac_MixFreq))
136 card->selected_freq_index = i - 1;
137 break;
139 else
141 card->selected_freq_index = i;
142 break;
147 //bug("card->selected_freq_index = %lu\n", card->selected_freq_index);
149 ret = AHISF_KNOWHIFI | AHISF_KNOWSTEREO | AHISF_MIXING | AHISF_TIMING;
151 for (i = 0; i < card->nr_of_frequencies; i++)
153 if (AudioCtrl->ahiac_MixFreq == card->frequencies[i].frequency)
155 ret |= AHISF_CANRECORD;
156 break;
160 return ret;
166 /******************************************************************************
167 ** AHIsub_FreeAudio ***********************************************************
168 ******************************************************************************/
170 void _AHIsub_FreeAudio(struct AHIAudioCtrlDrv* AudioCtrl,
171 struct DriverBase* AHIsubBase)
173 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
174 struct HDAudioChip* card = (struct HDAudioChip*) AudioCtrl->ahiac_DriverData;
176 if (card != NULL)
178 ObtainSemaphore(&card_base->semaphore);
179 if (card->audioctrl == AudioCtrl)
181 // Release it if we own it.
182 card->audioctrl = NULL;
185 ReleaseSemaphore(&card_base->semaphore);
187 AudioCtrl->ahiac_DriverData = NULL;
192 /******************************************************************************
193 ** AHIsub_Disable *************************************************************
194 ******************************************************************************/
196 void _AHIsub_Disable(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 Disable();
207 /******************************************************************************
208 ** AHIsub_Enable **************************************************************
209 ******************************************************************************/
211 void _AHIsub_Enable(struct AHIAudioCtrlDrv* AudioCtrl,
212 struct DriverBase* AHIsubBase)
214 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
216 // V6 drivers do not have to preserve all registers
218 Enable();
222 /******************************************************************************
223 ** AHIsub_Start ***************************************************************
224 ******************************************************************************/
226 ULONG _AHIsub_Start(ULONG flags,
227 struct AHIAudioCtrlDrv* AudioCtrl,
228 struct DriverBase* AHIsubBase)
230 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
231 struct HDAudioChip* card = (struct HDAudioChip*) AudioCtrl->ahiac_DriverData;
232 struct PCIDevice *dev = card->pci_dev;
233 UWORD PlayCtrlFlags = 0, RecCtrlFlags = 0;
234 ULONG dma_buffer_size = 0;
235 int i;
236 unsigned short uval;
237 UBYTE input_streams = 0;
238 struct Stream *input_stream = &(card->streams[0]);
239 struct Stream *output_stream = &(card->streams[card->nr_of_input_streams]);
240 UBYTE old_rirb_wp;
242 if (flags & AHISF_PLAY)
244 ULONG dma_sample_frame_size;
245 int i;
246 unsigned short cod, ChannelsFlag = 0;
248 detect_headphone_change(card);
250 card->mix_buffer = (APTR) AllocVec(AudioCtrl->ahiac_BuffSize, MEMF_PUBLIC | MEMF_CLEAR);
252 if (card->mix_buffer == NULL)
254 D(bug("[HDAudio] Unable to allocate %ld bytes for mixing buffer.", AudioCtrl->ahiac_BuffSize));
255 return AHIE_NOMEM;
258 /* Allocate a buffer large enough for 32-bit double-buffered playback (mono or stereo) */
259 if (AudioCtrl->ahiac_Flags & AHIACF_STEREO)
261 dma_sample_frame_size = 4 * 2;
262 dma_buffer_size = AudioCtrl->ahiac_MaxBuffSamples * dma_sample_frame_size;
264 else
266 dma_sample_frame_size = 4;
267 dma_buffer_size = AudioCtrl->ahiac_MaxBuffSamples * dma_sample_frame_size;
270 //bug("dma_buffer_size = %ld, %lx, freq = %d\n", dma_buffer_size, dma_buffer_size, AudioCtrl->ahiac_MixFreq);
271 build_buffer_descriptor_list(card, 2, dma_buffer_size, output_stream);
273 card->playback_buffer1 = (APTR) output_stream->bdl[0].lower_address;
274 card->playback_buffer2 = (APTR) output_stream->bdl[1].lower_address;
276 //bug("BDLE[0] = %lx, BDLE[1] = %lx\n", output_stream->bdl[0].lower_address, output_stream->bdl[1].lower_address);
277 if (stream_reset(output_stream, card) == FALSE)
279 return AHISF_ERROR;
282 // 4.5.3 Starting Streams
283 outb_setbits((output_stream->tag << 4), output_stream->sd_reg_offset + HD_SD_OFFSET_CONTROL + 2, card); // set stream number
284 pci_outl(dma_buffer_size * 2, output_stream->sd_reg_offset + HD_SD_OFFSET_CYCLIC_BUFFER_LEN, card);
285 pci_outw(1, output_stream->sd_reg_offset + HD_SD_OFFSET_LAST_VALID_INDEX, card); // 2 buffers, last valid index = 1
287 // set sample rate and format
288 pci_outw(((card->frequencies[card->selected_freq_index].base44100 > 0) ? BASE44 : 0) | // base freq: 48 or 44.1 kHz
289 (card->frequencies[card->selected_freq_index].mult << 11) | // multiplier
290 (card->frequencies[card->selected_freq_index].div << 8) | // divisor
291 FORMAT_24BITS | // set to 24-bit for now
292 FORMAT_STEREO,
293 output_stream->sd_reg_offset + HD_SD_OFFSET_FORMAT, card);
295 send_command_4(card->codecnr, card->dac_nid, VERB_SET_CONVERTER_FORMAT,
296 ((card->frequencies[card->selected_freq_index].base44100 > 0) ? BASE44 : 0) | // base freq: 48 or 44.1 kHz
297 (card->frequencies[card->selected_freq_index].mult << 11) | // multiplier
298 (card->frequencies[card->selected_freq_index].div << 8) | // divisor
299 FORMAT_24BITS | // set to 24-bit for now
300 FORMAT_STEREO , card); // stereo
302 send_command_4(card->codecnr, card->dac_nid, 0xA, 0, card);
305 // set BDL for scatter/gather
306 pci_outl((ULONG) output_stream->bdl, output_stream->sd_reg_offset + HD_SD_OFFSET_BDL_ADDR_LOW, card);
307 pci_outl(0, output_stream->sd_reg_offset + HD_SD_OFFSET_BDL_ADDR_HIGH, card);
309 // set stream ID and channel for DAC
310 send_command_12(card->codecnr, card->dac_nid, VERB_SET_CONVERTER_STREAM_CHANNEL, (output_stream->tag << 4), card); // stream 1, channel 0
312 card->current_bytesize = dma_buffer_size;
313 card->current_frames = AudioCtrl->ahiac_MaxBuffSamples;
314 card->current_buffer = card->playback_buffer1;
315 card->flip = 1;
316 card->is_playing = TRUE;
319 if (flags & AHISF_RECORD)
321 dma_buffer_size = RECORD_BUFFER_SAMPLES * 4;
323 build_buffer_descriptor_list(card, 2, dma_buffer_size, input_stream);
325 card->record_buffer1 = (APTR) input_stream->bdl[0].lower_address;
326 card->record_buffer2 = (APTR) input_stream->bdl[1].lower_address;
328 if (stream_reset(input_stream, card) == FALSE)
330 return AHISF_ERROR;
333 // 4.5.3 Starting Streams
334 outb_setbits((input_stream->tag << 4), input_stream->sd_reg_offset + HD_SD_OFFSET_CONTROL + 2, card); // set stream number
335 pci_outl(dma_buffer_size * 2, input_stream->sd_reg_offset + HD_SD_OFFSET_CYCLIC_BUFFER_LEN, card);
336 pci_outw(1, input_stream->sd_reg_offset + HD_SD_OFFSET_LAST_VALID_INDEX, card); // 2 buffers, last valid index = 1
338 // set sample rate and format
339 pci_outw(((card->frequencies[card->selected_freq_index].base44100 > 0) ? BASE44 : 0) | // base freq: 48 or 44.1 kHz
340 (card->frequencies[card->selected_freq_index].mult << 11) | // multiplier
341 (card->frequencies[card->selected_freq_index].div << 8) | // divisor
342 FORMAT_16BITS | // set to 16-bit for now
343 FORMAT_STEREO,
344 input_stream->sd_reg_offset + HD_SD_OFFSET_FORMAT, card);
346 send_command_4(card->codecnr, card->adc_nid, VERB_SET_CONVERTER_FORMAT,
347 ((card->frequencies[card->selected_freq_index].base44100 > 0) ? BASE44 : 0) | // base freq: 48 or 44.1 kHz
348 (card->frequencies[card->selected_freq_index].mult << 11) | // multiplier
349 (card->frequencies[card->selected_freq_index].div << 8) | // divisor
350 FORMAT_16BITS | // set to 16-bit for now
351 FORMAT_STEREO , card); // stereo
353 // set BDL for scatter/gather
354 pci_outl((ULONG) input_stream->bdl, input_stream->sd_reg_offset + HD_SD_OFFSET_BDL_ADDR_LOW, card);
355 pci_outl(0, input_stream->sd_reg_offset + HD_SD_OFFSET_BDL_ADDR_HIGH, card);
357 // set stream ID and channel for ADC
358 send_command_12(card->codecnr, card->adc_nid, VERB_SET_CONVERTER_STREAM_CHANNEL, (input_stream->tag << 4), card);
360 D(bug("[HDAudio] RECORD\n"));
361 codec_discovery(card); // tbd < --------------------
363 card->current_record_bytesize = dma_buffer_size;
364 card->current_record_buffer = card->record_buffer1;
365 card->recflip = 1;
366 card->is_recording = TRUE;
369 if (flags & AHISF_PLAY)
371 // enable irq's
372 z = 0;
373 timer = 0; // for demo/test
375 //bug("GOING TO PLAY\n");
376 outl_setbits((1 << output_stream->index), HD_INTCTL, card);
377 outl_setbits(HD_SD_CONTROL_STREAM_RUN | HD_SD_STATUS_MASK, output_stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card); // Stream Run
381 if (flags & AHISF_RECORD)
383 // enable irq's
384 outl_setbits((1 << input_stream->index), HD_INTCTL, card);
385 outl_setbits(HD_SD_CONTROL_STREAM_RUN | HD_SD_STATUS_MASK, input_stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card); // Stream Run
389 return AHIE_OK;
393 /******************************************************************************
394 ** AHIsub_Update **************************************************************
395 ******************************************************************************/
397 void _AHIsub_Update(ULONG flags,
398 struct AHIAudioCtrlDrv* AudioCtrl,
399 struct DriverBase* AHIsubBase)
401 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
402 struct HDAudioChip* card = (struct HDAudioChip*) AudioCtrl->ahiac_DriverData;
404 card->current_frames = AudioCtrl->ahiac_BuffSamples;
406 if (AudioCtrl->ahiac_Flags & AHIACF_STEREO)
408 card->current_bytesize = card->current_frames * 4;
410 else
412 card->current_bytesize = card->current_frames * 2;
417 /******************************************************************************
418 ** AHIsub_Stop ****************************************************************
419 ******************************************************************************/
421 void _AHIsub_Stop(ULONG flags,
422 struct AHIAudioCtrlDrv* AudioCtrl,
423 struct DriverBase* AHIsubBase)
425 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
426 struct HDAudioChip* card = (struct HDAudioChip*) AudioCtrl->ahiac_DriverData;
427 struct PCIDevice *dev = card->pci_dev;
429 unsigned char val;
431 //bug("Stop\n");
433 if ((flags & AHISF_PLAY) && card->is_playing)
435 struct Stream *output_stream = &(card->streams[card->nr_of_input_streams]);
436 outl_clearbits(HD_SD_CONTROL_STREAM_RUN, output_stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card);
437 card->is_playing = FALSE;
439 card->current_bytesize = 0;
440 card->current_frames = 0;
441 card->current_buffer = NULL;
443 if (card->mix_buffer)
445 FreeVec(card->mix_buffer);
447 card->mix_buffer = NULL;
449 free_buffer_descriptor_list(card, 2, output_stream);
451 D(bug("[HDAudio] IRQ's received was %d\n", z));
454 if ((flags & AHISF_RECORD) && card->is_recording)
456 struct Stream *input_stream = &(card->streams[0]);
457 outl_clearbits(HD_SD_CONTROL_STREAM_RUN, input_stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card);
459 card->record_buffer1 = NULL;
460 card->record_buffer2 = NULL;
461 card->current_record_bytesize = 0;
463 card->is_recording = FALSE;
465 free_buffer_descriptor_list(card, 2, input_stream);
468 card->current_bytesize = 0;
472 /******************************************************************************
473 ** AHIsub_GetAttr *************************************************************
474 ******************************************************************************/
476 LONG _AHIsub_GetAttr(ULONG attribute,
477 LONG argument,
478 LONG def,
479 struct TagItem* taglist,
480 struct AHIAudioCtrlDrv* AudioCtrl,
481 struct DriverBase* AHIsubBase)
483 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
484 struct HDAudioChip* card = card_base->driverdatas[0];
485 ULONG i;
487 switch(attribute)
489 case AHIDB_Bits:
490 return 16;
492 case AHIDB_Frequencies:
494 return card->nr_of_frequencies;
497 case AHIDB_Frequency: // Index->Frequency
498 return (LONG) card->frequencies[argument].frequency;
500 case AHIDB_Index: // Frequency->Index
502 if (argument <= (LONG) card->frequencies[0].frequency)
504 return 0;
507 if (argument >= (LONG) card->frequencies[card->nr_of_frequencies - 1].frequency)
509 return card->nr_of_frequencies - 1;
512 for (i = 1; i < card->nr_of_frequencies; i++)
514 if ((LONG) card->frequencies[i].frequency > argument)
516 if ((argument - (LONG) card->frequencies[i - 1].frequency) < ((LONG) card->frequencies[i].frequency - argument))
518 return i-1;
520 else
522 return i;
527 return 0; // Will not happen
530 case AHIDB_Author:
531 return (LONG) "Davy Wentzler";
533 case AHIDB_Copyright:
534 return (LONG) "(C) 2010 Stephen Jones, (C) 2010-2011 The AROS Dev Team";
536 case AHIDB_Version:
537 return (LONG) LibIDString;
539 case AHIDB_Annotation:
540 return (LONG) "HD Audio driver";
542 case AHIDB_Record:
543 return TRUE;
545 case AHIDB_FullDuplex:
546 return TRUE;
548 case AHIDB_Realtime:
549 return TRUE;
551 case AHIDB_MaxRecordSamples:
552 return RECORD_BUFFER_SAMPLES;
554 /* formula's:
555 #include <math.h>
557 unsigned long res = (unsigned long) (0x10000 * pow (10.0, dB / 20.0));
558 double dB = 20.0 * log10(0xVALUE / 65536.0);
560 printf("dB = %f, res = %lx\n", dB, res);*/
562 case AHIDB_MinMonitorVolume:
563 return (unsigned long) (0x10000 * pow (10.0, -34.5 / 20.0)); // -34.5 dB
565 case AHIDB_MaxMonitorVolume:
566 return (unsigned long) (0x10000 * pow (10.0, 12.0 / 20.0)); // 12 dB
568 case AHIDB_MinInputGain:
569 return (unsigned long) (0x10000 * pow (10.0, card->adc_min_gain / 20.0));
571 case AHIDB_MaxInputGain:
572 return (unsigned long) (0x10000 * pow (10.0, card->adc_max_gain / 20.0));
574 case AHIDB_MinOutputVolume:
575 return (unsigned long) (0x10000 * pow (10.0, card->dac_min_gain / 20.0));
577 case AHIDB_MaxOutputVolume:
578 return (unsigned long) (0x10000 * pow (10.0, card->dac_max_gain / 20.0));
580 case AHIDB_Inputs:
581 return INPUTS;
583 case AHIDB_Input:
584 return (LONG) Inputs[argument];
586 case AHIDB_Outputs:
587 return OUTPUTS;
589 case AHIDB_Output:
590 return (LONG) Outputs[argument];
592 default:
593 return def;
598 /******************************************************************************
599 ** AHIsub_HardwareControl *****************************************************
600 ******************************************************************************/
602 ULONG _AHIsub_HardwareControl(ULONG attribute,
603 LONG argument,
604 struct AHIAudioCtrlDrv* AudioCtrl,
605 struct DriverBase* AHIsubBase)
607 struct HDAudioBase* card_base = (struct HDAudioBase*) AHIsubBase;
608 struct HDAudioChip* card = card_base->driverdatas[0];
610 switch(attribute)
612 case AHIC_MonitorVolume:
614 double dB = 20.0 * log10(argument / 65536.0);
616 card->monitor_volume = argument;
617 set_monitor_volumes(card, dB);
619 return TRUE;
622 case AHIC_MonitorVolume_Query:
624 return card->monitor_volume;
627 case AHIC_InputGain:
629 double dB = 20.0 * log10(argument / 65536.0);
630 card->input_gain = argument;
632 set_adc_gain(card, dB);
633 return TRUE;
636 case AHIC_InputGain_Query:
637 return card->input_gain;
639 case AHIC_OutputVolume:
641 double dB = 20.0 * log10(argument / 65536.0);
642 card->output_volume = argument;
644 set_dac_gain(card, dB);
646 return TRUE;
649 case AHIC_OutputVolume_Query:
650 return card->output_volume;
652 case AHIC_Input:
653 card->input = argument;
654 set_adc_input(card);
656 return TRUE;
658 case AHIC_Input_Query:
659 return card->input;
661 case AHIC_Output:
662 card->output = argument;
664 return TRUE;
666 case AHIC_Output_Query:
667 return card->output;
669 default:
670 return FALSE;
675 static BOOL build_buffer_descriptor_list(struct HDAudioChip *card, ULONG nr_of_buffers, ULONG buffer_size, struct Stream *stream)
677 unsigned int entry;
679 stream->bdl = pci_alloc_consistent(nr_of_buffers * sizeof(struct BDLE), &(stream->bdl_nonaligned), 128);
680 stream->bdl_nonaligned_addresses = (APTR) AllocVec(nr_of_buffers * 8, MEMF_PUBLIC | MEMF_CLEAR);
682 for (entry = 0; entry < nr_of_buffers; entry++)
684 APTR non_aligned_address = 0;
686 stream->bdl[entry].lower_address = (ULONG) pci_alloc_consistent(buffer_size, &non_aligned_address, 128);
687 stream->bdl[entry].upper_address = 0;
688 stream->bdl[entry].length = buffer_size;
689 stream->bdl[entry].reserved_ioc = 1;
691 stream->bdl_nonaligned_addresses[entry] = non_aligned_address;
693 //bug("BDL %d = %lx\n", entry, stream->bdl[entry].lower_address);
696 return TRUE;
700 static void free_buffer_descriptor_list(struct HDAudioChip *card, ULONG nr_of_buffers, struct Stream *stream)
702 unsigned int entry;
704 stream->bdl = pci_alloc_consistent(nr_of_buffers * sizeof(struct BDLE), &(stream->bdl_nonaligned), 128);
705 stream->bdl_nonaligned_addresses = (APTR) AllocVec(nr_of_buffers * 8, MEMF_PUBLIC | MEMF_CLEAR);
707 for (entry = 0; entry < nr_of_buffers; entry++)
709 pci_free_consistent(stream->bdl_nonaligned_addresses[entry]);
710 stream->bdl[entry].lower_address = 0;
711 stream->bdl_nonaligned_addresses[entry] = NULL;
714 pci_free_consistent(stream->bdl_nonaligned);
715 stream->bdl_nonaligned = NULL;
717 FreeVec(stream->bdl_nonaligned_addresses);
718 stream->bdl_nonaligned_addresses = NULL;
722 static BOOL stream_reset(struct Stream *stream, struct HDAudioChip *card)
724 int i;
725 UBYTE control;
727 outb_clearbits(HD_SD_CONTROL_STREAM_RUN, stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card); // stop stream run
729 outb_setbits(0x1C, stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card);
730 outb_setbits(0x1C, stream->sd_reg_offset + HD_SD_OFFSET_STATUS, card);
731 outb_setbits(0x1, stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card); // stream reset
733 for (i = 0; i < 1000; i++)
735 if ((pci_inb(stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card) & 0x1) == 0x1)
737 break;
740 udelay(100);
743 if (i == 1000)
745 D(bug("[HDAudio] Stream reset not ok\n"));
746 return FALSE;
749 outb_clearbits(0x1, stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card); // stream reset
750 udelay(10);
751 for (i = 0; i < 1000; i++)
753 if ((pci_inb(stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card) & 0x1) == 0x0)
755 break;
758 udelay(100);
761 if (i == 1000)
763 D(bug("[HDAudio] Stream reset 2 not ok\n"));
764 return FALSE;
767 outb_clearbits(HD_SD_CONTROL_STREAM_RUN, stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card); // stop stream run
769 control = pci_inb(stream->sd_reg_offset + HD_SD_OFFSET_CONTROL, card);
770 if ((control & 0x1) == 1)
772 return FALSE;
775 return TRUE;
779 void set_converter_format(struct HDAudioChip *card, UBYTE nid)
781 send_command_4(card->codecnr, nid, VERB_SET_CONVERTER_FORMAT, (1 << 14) | (0x3 << 4) | 1, card); // 44.1kHz 24-bits stereo