upload tizen2.0 source
[framework/uifw/xorg/server/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 }