3 #include <devices/ahi.h>
4 #include <exec/memory.h>
5 #include <libraries/ahi_sub.h>
8 #include <proto/ahi_sub.h>
9 #include <proto/exec.h>
10 #include <proto/dos.h>
11 #include <proto/utility.h>
13 #include <aros/debug.h>
14 #define DebugPrintF bug
21 #include "pci_wrapper.h"
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
] =
51 static const char *Outputs
[OUTPUTS
] =
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
;
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
);
87 struct PCIDevice
*dev
;
88 struct HDAudioChip
*card
;
91 card
= card_base
->driverdatas
[card_num
];
92 AudioCtrl
->ahiac_DriverData
= card
;
94 ObtainSemaphore(&card_base
->semaphore
);
95 in_use
= (card
->audioctrl
!= NULL
);
98 card
->audioctrl
= AudioCtrl
;
100 ReleaseSemaphore(&card_base
->semaphore
);
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;
126 card
->selected_freq_index
= i
;
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
;
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
;
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
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
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;
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
]);
227 if (flags
& AHISF_PLAY
)
229 ULONG dma_sample_frame_size
;
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
);
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
;
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
)
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
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
;
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
)
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
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
);
346 codec_discovery(card
); // tbd < --------------------
348 card
->current_record_bytesize
= dma_buffer_size
;
349 card
->current_record_buffer
= card
->record_buffer1
;
351 card
->is_recording
= TRUE
;
354 if (flags
& AHISF_PLAY
)
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
)
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
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;
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
;
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
);
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
,
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];
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
)
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
))
514 return 0; // Will not happen
518 return (LONG
) "Davy Wentzler";
520 case AHIDB_Copyright
:
521 return (LONG
) "(C) 2011 The AROS Dev Team";
524 return (LONG
) LibIDString
;
526 case AHIDB_Annotation
:
528 "AROS HD Audio driver";
533 case AHIDB_FullDuplex
:
539 case AHIDB_MaxRecordSamples
:
540 return RECORD_BUFFER_SAMPLES
;
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));
572 return (LONG
) Inputs
[argument
];
578 return (LONG
) Outputs
[argument
];
586 /******************************************************************************
587 ** AHIsub_HardwareControl *****************************************************
588 ******************************************************************************/
590 ULONG
_AHIsub_HardwareControl(ULONG attribute
,
592 struct AHIAudioCtrlDrv
* AudioCtrl
,
593 struct DriverBase
* AHIsubBase
)
595 struct HDAudioBase
* card_base
= (struct HDAudioBase
*) AHIsubBase
;
596 struct HDAudioChip
* card
= card_base
->driverdatas
[0];
600 case AHIC_MonitorVolume
:
602 double dB
= 20.0 * log10(argument
/ 65536.0);
604 card
->monitor_volume
= argument
;
605 set_monitor_volumes(card
, dB
);
610 case AHIC_MonitorVolume_Query
:
612 return card
->monitor_volume
;
617 double dB
= 20.0 * log10(argument
/ 65536.0);
618 card
->input_gain
= argument
;
620 set_adc_gain(card
, dB
);
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
);
637 case AHIC_OutputVolume_Query
:
638 return card
->output_volume
;
641 card
->input
= argument
;
646 case AHIC_Input_Query
:
650 card
->output
= argument
;
654 case AHIC_Output_Query
:
663 static BOOL
build_buffer_descriptor_list(struct HDAudioChip
*card
, ULONG nr_of_buffers
, ULONG buffer_size
, struct Stream
*stream
)
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);
688 static void free_buffer_descriptor_list(struct HDAudioChip
*card
, ULONG nr_of_buffers
, struct Stream
*stream
)
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
)
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)
733 bug("Stream reset not ok\n");
737 outb_clearbits(0x1, stream
->sd_reg_offset
+ HD_SD_OFFSET_CONTROL
, card
); // stream reset
739 for (i
= 0; i
< 1000; i
++)
741 if ((pci_inb(stream
->sd_reg_offset
+ HD_SD_OFFSET_CONTROL
, card
) & 0x1) == 0x0)
751 bug("Stream reset 2 not ok\n");
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)
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