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.
19 #include <devices/ahi.h>
20 #include <exec/memory.h>
21 #include <libraries/ahi_sub.h>
24 #include <proto/ahi_sub.h>
25 #include <proto/exec.h>
26 #include <proto/dos.h>
27 #include <proto/utility.h>
29 #include <aros/debug.h>
36 #include "pci_wrapper.h"
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
] =
66 static const char *Outputs
[OUTPUTS
] =
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
;
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
);
102 struct PCIDevice
*dev
;
103 struct HDAudioChip
*card
;
106 card
= card_base
->driverdatas
[card_num
];
107 AudioCtrl
->ahiac_DriverData
= card
;
109 ObtainSemaphore(&card_base
->semaphore
);
110 in_use
= (card
->audioctrl
!= NULL
);
113 card
->audioctrl
= AudioCtrl
;
115 ReleaseSemaphore(&card_base
->semaphore
);
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;
141 card
->selected_freq_index
= i
;
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
;
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
;
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
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
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;
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
]);
242 if (flags
& AHISF_PLAY
)
244 ULONG dma_sample_frame_size
;
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
));
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
;
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
)
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
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
;
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
)
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
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
;
366 card
->is_recording
= TRUE
;
369 if (flags
& AHISF_PLAY
)
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
)
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
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;
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
;
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
,
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];
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
)
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
))
527 return 0; // Will not happen
531 return (LONG
) "Davy Wentzler";
533 case AHIDB_Copyright
:
534 return (LONG
) "(C) 2010 Stephen Jones, (C) 2010-2011 The AROS Dev Team";
537 return (LONG
) LibIDString
;
539 case AHIDB_Annotation
:
540 return (LONG
) "HD Audio driver";
545 case AHIDB_FullDuplex
:
551 case AHIDB_MaxRecordSamples
:
552 return RECORD_BUFFER_SAMPLES
;
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));
584 return (LONG
) Inputs
[argument
];
590 return (LONG
) Outputs
[argument
];
598 /******************************************************************************
599 ** AHIsub_HardwareControl *****************************************************
600 ******************************************************************************/
602 ULONG
_AHIsub_HardwareControl(ULONG attribute
,
604 struct AHIAudioCtrlDrv
* AudioCtrl
,
605 struct DriverBase
* AHIsubBase
)
607 struct HDAudioBase
* card_base
= (struct HDAudioBase
*) AHIsubBase
;
608 struct HDAudioChip
* card
= card_base
->driverdatas
[0];
612 case AHIC_MonitorVolume
:
614 double dB
= 20.0 * log10(argument
/ 65536.0);
616 card
->monitor_volume
= argument
;
617 set_monitor_volumes(card
, dB
);
622 case AHIC_MonitorVolume_Query
:
624 return card
->monitor_volume
;
629 double dB
= 20.0 * log10(argument
/ 65536.0);
630 card
->input_gain
= argument
;
632 set_adc_gain(card
, dB
);
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
);
649 case AHIC_OutputVolume_Query
:
650 return card
->output_volume
;
653 card
->input
= argument
;
658 case AHIC_Input_Query
:
662 card
->output
= argument
;
666 case AHIC_Output_Query
:
675 static BOOL
build_buffer_descriptor_list(struct HDAudioChip
*card
, ULONG nr_of_buffers
, ULONG buffer_size
, struct Stream
*stream
)
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);
700 static void free_buffer_descriptor_list(struct HDAudioChip
*card
, ULONG nr_of_buffers
, struct Stream
*stream
)
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
)
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)
745 D(bug("[HDAudio] Stream reset not ok\n"));
749 outb_clearbits(0x1, stream
->sd_reg_offset
+ HD_SD_OFFSET_CONTROL
, card
); // stream reset
751 for (i
= 0; i
< 1000; i
++)
753 if ((pci_inb(stream
->sd_reg_offset
+ HD_SD_OFFSET_CONTROL
, card
) & 0x1) == 0x0)
763 D(bug("[HDAudio] Stream reset 2 not ok\n"));
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)
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