Commit | Line | Data |
---|---|---|
a09e091a JB |
1 | #ifdef HAVE_XORG_CONFIG_H |
2 | #include <xorg-config.h> | |
3 | #endif | |
4 | ||
5 | #include "xf86.h" | |
6 | #include "xf86i2c.h" | |
7 | #include "tda9850.h" | |
8 | #include "i2c_def.h" | |
9 | ||
10 | #define TDA9850(a,b) { \ | |
11 | data[0]=a; \ | |
12 | data[1]=b; \ | |
13 | I2C_WriteRead(&(t->d), data, 2, NULL, 0); \ | |
14 | } | |
15 | ||
16 | TDA9850Ptr | |
17 | Detect_tda9850(I2CBusPtr b, I2CSlaveAddr addr) | |
18 | { | |
19 | TDA9850Ptr t; | |
20 | I2CByte a; | |
21 | ||
22 | t = calloc(1, sizeof(TDA9850Rec)); | |
23 | if (t == NULL) | |
24 | return NULL; | |
25 | switch (addr) { | |
26 | case TDA9850_ADDR_1: | |
27 | t->d.DevName = "TDA9850 BTSC Stereo+SAP Audio Processor"; | |
28 | break; | |
29 | default: | |
30 | t->d.DevName = "Generic TDAxxxx"; | |
31 | break; | |
32 | } | |
33 | t->d.SlaveAddr = addr; | |
34 | t->d.pI2CBus = b; | |
35 | t->d.NextDev = NULL; | |
36 | t->d.StartTimeout = b->StartTimeout; | |
37 | t->d.BitTimeout = b->BitTimeout; | |
38 | t->d.AcknTimeout = b->AcknTimeout; | |
39 | t->d.ByteTimeout = b->ByteTimeout; | |
40 | ||
41 | if (!I2C_WriteRead(&(t->d), NULL, 0, &a, 1)) { | |
42 | free(t); | |
43 | return NULL; | |
44 | } | |
45 | ||
46 | /* set default parameters */ | |
47 | if (!I2CDevInit(&(t->d))) { | |
48 | free(t); | |
49 | return NULL; | |
50 | } | |
51 | ||
52 | return t; | |
53 | } | |
54 | ||
55 | Bool | |
56 | tda9850_init(TDA9850Ptr t) | |
57 | { | |
58 | t->stereo = 1; | |
59 | t->sap = 0; | |
60 | t->mute = TRUE; | |
61 | t->sap_mute = TRUE; | |
62 | tda9850_setaudio(t); | |
63 | return TRUE; | |
64 | } | |
65 | ||
66 | void | |
67 | tda9850_setaudio(TDA9850Ptr t) | |
68 | { | |
69 | CARD8 data[2]; | |
70 | ||
71 | if (t->mux == 2) { | |
72 | TDA9850(0x04, 0x0F); | |
73 | TDA9850(0x05, 0x0F); | |
74 | TDA9850(0x06, 0x58); | |
75 | TDA9850(0x07, 0x07); | |
76 | TDA9850(0x08, 0x00); | |
77 | TDA9850(0x09, 0x00); | |
78 | TDA9850(0x0A, 0x03); | |
79 | } | |
80 | else { | |
81 | TDA9850(0x04, 0x07); | |
82 | TDA9850(0x05, 0x07); | |
83 | TDA9850(0x06, 0x58); | |
84 | TDA9850(0x07, 0x07); | |
85 | TDA9850(0x08, 0x10); | |
86 | TDA9850(0x09, 0x10); | |
87 | TDA9850(0x0A, 0x03); | |
88 | } | |
89 | ||
90 | TDA9850(0x06, | |
91 | (t->stereo << 6) | (t->sap << 7) | (t->mute ? 0x8 : 0) | (t-> | |
92 | sap_mute ? | |
93 | 0x10 : | |
94 | 0x0)); | |
95 | } | |
96 | ||
97 | void | |
98 | tda9850_mute(TDA9850Ptr t, Bool mute) | |
99 | { | |
100 | CARD8 data[2]; | |
101 | ||
102 | xf86DrvMsg(t->d.pI2CBus->scrnIndex, X_INFO, "tda9850_mute %s\n", | |
103 | mute ? "on" : "off"); | |
104 | t->mute = mute; | |
105 | ||
106 | TDA9850(0x06, | |
107 | (t->stereo << 6) | (t->sap << 7) | (t->mute ? 0x8 : 0x0) | (t-> | |
108 | sap_mute | |
109 | ? 0x10 : | |
110 | 0x0)); | |
111 | } | |
112 | ||
113 | void | |
114 | tda9850_sap_mute(TDA9850Ptr t, Bool sap_mute) | |
115 | { | |
116 | CARD8 data[2]; | |
117 | ||
118 | xf86DrvMsg(t->d.pI2CBus->scrnIndex, X_INFO, "tda9850_sap_mute %s\n", | |
119 | sap_mute ? "on" : "off"); | |
120 | t->sap_mute = sap_mute; | |
121 | ||
122 | TDA9850(0x06, | |
123 | (t->stereo << 6) | (t->sap << 7) | (t->mute ? 0x8 : 0x0) | (t-> | |
124 | sap_mute | |
125 | ? 0x10 : | |
126 | 0x0)); | |
127 | } | |
128 | ||
129 | CARD16 | |
130 | tda9850_getstatus(TDA9850Ptr t) | |
131 | { | |
132 | CARD16 status; | |
133 | ||
134 | I2C_WriteRead(&(t->d), NULL, 0, (I2CByte *) &status, 2); | |
135 | return status; | |
136 | } |