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