xref: /haiku/src/add-ons/kernel/drivers/audio/ac97/es1370/io.c (revision 8195a5a835117ab2da405e0d477153570b75d921)
1 /*
2  * ES1370 Haiku Driver for ES1370 audio
3  *
4  * Copyright 2002-2007, Haiku, Inc.
5  * Distributed under the terms of the MIT License.
6  *
7  * Authors:
8  *		Marcus Overhagen, marcus@overhagen.de
9  *		Jerome Duval, jerome.duval@free.fr
10  */
11 #include <KernelExport.h>
12 #include <OS.h>
13 #include "io.h"
14 #include "es1370reg.h"
15 #include "debug.h"
16 #include <PCI.h>
17 
18 extern pci_module_info  *pci;
19 
20 uint8
21 es1370_reg_read_8(device_config *config, int regno)
22 {
23 	ASSERT(regno >= 0);
24 	return pci->read_io_8(config->base + regno);
25 }
26 
27 uint16
28 es1370_reg_read_16(device_config *config, int regno)
29 {
30 	ASSERT(regno >= 0);
31 	return pci->read_io_16(config->base + regno);
32 }
33 
34 uint32
35 es1370_reg_read_32(device_config *config, int regno)
36 {
37 	ASSERT(regno >= 0);
38 	return pci->read_io_32(config->base + regno);
39 }
40 
41 void
42 es1370_reg_write_8(device_config *config, int regno, uint8 value)
43 {
44 	ASSERT(regno >= 0);
45 	pci->write_io_8(config->base + regno, value);
46 }
47 
48 void
49 es1370_reg_write_16(device_config *config, int regno, uint16 value)
50 {
51 	ASSERT(regno >= 0);
52 	pci->write_io_16(config->base + regno, value);
53 }
54 
55 void
56 es1370_reg_write_32(device_config *config, int regno, uint32 value)
57 {
58 	ASSERT(regno >= 0);
59 	pci->write_io_32(config->base + regno, value);
60 }
61 
62 /* codec */
63 static int
64 es1370_codec_wait(device_config *config)
65 {
66 	int i;
67 	for (i = 0; i < 1100; i++) {
68 		if ((es1370_reg_read_32(config, ES1370_REG_STATUS) & STAT_CWRIP) == 0)
69 			return B_OK;
70 		if (i > 100)
71 			spin(1);
72 	}
73 	return B_TIMED_OUT;
74 }
75 
76 uint16
77 es1370_codec_read(device_config *config, int regno)
78 {
79 	ASSERT(regno >= 0);
80 	if(es1370_codec_wait(config)!=B_OK) {
81 		PRINT(("codec busy (2)\n"));
82 		return -1;
83 	}
84 
85 	return pci->read_io_32(config->base + ES1370_REG_CODEC);
86 }
87 
88 void
89 es1370_codec_write(device_config *config, int regno, uint16 value)
90 {
91 	ASSERT(regno >= 0);
92 	if(es1370_codec_wait(config)!=B_OK) {
93 		PRINT(("codec busy (4)\n"));
94 		return;
95 	}
96 	pci->write_io_32(config->base + ES1370_REG_CODEC, (regno << 8) | value);
97 }
98