1706f2543Smrg#ifdef HAVE_XORG_CONFIG_H
2706f2543Smrg#include <xorg-config.h>
3706f2543Smrg#endif
4706f2543Smrg
5706f2543Smrg#include "xf86.h"
6706f2543Smrg#include "xf86i2c.h"
7706f2543Smrg#include "tda9850.h"
8706f2543Smrg#include "i2c_def.h"
9706f2543Smrg
10706f2543Smrg#define TDA9850(a,b)	{ \
11706f2543Smrg		data[0]=a; \
12706f2543Smrg		data[1]=b; \
13706f2543Smrg		I2C_WriteRead(&(t->d), data, 2, NULL, 0); \
14706f2543Smrg		}
15706f2543Smrg
16706f2543SmrgTDA9850Ptr Detect_tda9850(I2CBusPtr b, I2CSlaveAddr addr)
17706f2543Smrg{
18706f2543Smrg  TDA9850Ptr t;
19706f2543Smrg  I2CByte a;
20706f2543Smrg
21706f2543Smrg  t = calloc(1, sizeof(TDA9850Rec));
22706f2543Smrg  if(t == NULL) return NULL;
23706f2543Smrg  switch(addr)
24706f2543Smrg  {
25706f2543Smrg      case TDA9850_ADDR_1:
26706f2543Smrg	  t->d.DevName = "TDA9850 BTSC Stereo+SAP Audio Processor";
27706f2543Smrg	  break;
28706f2543Smrg      default:
29706f2543Smrg          t->d.DevName = "Generic TDAxxxx";
30706f2543Smrg	  break;
31706f2543Smrg  }
32706f2543Smrg  t->d.SlaveAddr = addr;
33706f2543Smrg  t->d.pI2CBus = b;
34706f2543Smrg  t->d.NextDev = NULL;
35706f2543Smrg  t->d.StartTimeout = b->StartTimeout;
36706f2543Smrg  t->d.BitTimeout = b->BitTimeout;
37706f2543Smrg  t->d.AcknTimeout = b->AcknTimeout;
38706f2543Smrg  t->d.ByteTimeout = b->ByteTimeout;
39706f2543Smrg
40706f2543Smrg  if(!I2C_WriteRead(&(t->d), NULL, 0, &a, 1))
41706f2543Smrg  {
42706f2543Smrg     free(t);
43706f2543Smrg     return NULL;
44706f2543Smrg  }
45706f2543Smrg
46706f2543Smrg  /* set default parameters */
47706f2543Smrg  if(!I2CDevInit(&(t->d)))
48706f2543Smrg  {
49706f2543Smrg     free(t);
50706f2543Smrg     return NULL;
51706f2543Smrg  }
52706f2543Smrg
53706f2543Smrg  return t;
54706f2543Smrg}
55706f2543Smrg
56706f2543SmrgBool tda9850_init(TDA9850Ptr t)
57706f2543Smrg{
58706f2543Smrg  t->stereo = 1;
59706f2543Smrg  t->sap = 0;
60706f2543Smrg  t->mute = TRUE;
61706f2543Smrg  t->sap_mute = TRUE;
62706f2543Smrg  tda9850_setaudio(t);
63706f2543Smrg  return TRUE;
64706f2543Smrg}
65706f2543Smrg
66706f2543Smrgvoid tda9850_setaudio(TDA9850Ptr t)
67706f2543Smrg{
68706f2543SmrgCARD8 data[2];
69706f2543Smrg
70706f2543Smrgif(t->mux==2)
71706f2543Smrg{
72706f2543Smrg   TDA9850(0x04,0x0F); TDA9850(0x05,0x0F); TDA9850(0x06, 0x58);
73706f2543Smrg   TDA9850(0x07,0x07); TDA9850(0x08,0x00);
74706f2543Smrg   TDA9850(0x09,0x00); TDA9850(0x0A,0x03);
75706f2543Smrg} else
76706f2543Smrg{
77706f2543Smrg  TDA9850(0x04,0x07); TDA9850(0x05,0x07);
78706f2543Smrg  TDA9850(0x06,0x58); TDA9850(0x07,0x07);
79706f2543Smrg  TDA9850(0x08,0x10); TDA9850(0x09,0x10);
80706f2543Smrg  TDA9850(0x0A,0x03);
81706f2543Smrg}
82706f2543Smrg
83706f2543SmrgTDA9850(0x06,(t->stereo<<6)|(t->sap<<7)|(t->mute?0x8:0)|(t->sap_mute?0x10:0x0));
84706f2543Smrg}
85706f2543Smrg
86706f2543Smrgvoid tda9850_mute(TDA9850Ptr t, Bool mute)
87706f2543Smrg{
88706f2543SmrgCARD8 data[2];
89706f2543Smrg
90706f2543Smrgxf86DrvMsg(t->d.pI2CBus->scrnIndex, X_INFO, "tda9850_mute %s\n", mute ? "on" : "off");
91706f2543Smrgt->mute = mute;
92706f2543Smrg
93706f2543SmrgTDA9850(0x06,(t->stereo<<6)|(t->sap<<7)|(t->mute?0x8:0x0)|(t->sap_mute?0x10:0x0));
94706f2543Smrg}
95706f2543Smrg
96706f2543Smrgvoid tda9850_sap_mute(TDA9850Ptr t, Bool sap_mute)
97706f2543Smrg{
98706f2543SmrgCARD8 data[2];
99706f2543Smrg
100706f2543Smrgxf86DrvMsg(t->d.pI2CBus->scrnIndex, X_INFO, "tda9850_sap_mute %s\n", sap_mute ? "on" : "off");
101706f2543Smrgt->sap_mute = sap_mute;
102706f2543Smrg
103706f2543SmrgTDA9850(0x06,(t->stereo<<6)|(t->sap<<7)|(t->mute?0x8:0x0)|(t->sap_mute?0x10:0x0));
104706f2543Smrg}
105706f2543Smrg
106706f2543SmrgCARD16 tda9850_getstatus(TDA9850Ptr t)
107706f2543Smrg{
108706f2543SmrgCARD16 status;
109706f2543Smrg
110706f2543SmrgI2C_WriteRead(&(t->d), NULL, 0, (I2CByte *)&status, 2);
111706f2543Smrgreturn status;
112706f2543Smrg}
113