Imported Upstream version 1.15.1
[deb_xorg-server.git] / hw / xfree86 / i2c / tda9850.c
CommitLineData
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
16TDA9850Ptr
17Detect_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
55Bool
56tda9850_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
66void
67tda9850_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
97void
98tda9850_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
113void
114tda9850_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
129CARD16
130tda9850_getstatus(TDA9850Ptr t)
131{
132 CARD16 status;
133
134 I2C_WriteRead(&(t->d), NULL, 0, (I2CByte *) &status, 2);
135 return status;
136}