Imported Upstream version 1.15.1
[deb_xorg-server.git] / hw / xfree86 / i2c / tda9850.c
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 }