1#ifdef HAVE_XORG_CONFIG_H 2#include <xorg-config.h> 3#endif 4 5#include "xf86.h" 6#include "xf86i2c.h" 7#include "tda9885.h" 8#include "i2c_def.h" 9 10 11TDA9885Ptr Detect_tda9885(I2CBusPtr b, I2CSlaveAddr addr) 12{ 13 TDA9885Ptr t; 14 I2CByte a; 15 16 t = calloc(1, sizeof(TDA9885Rec)); 17 if(t == NULL) return NULL; 18 switch(addr) 19 { 20 case TDA9885_ADDR_1: 21 case TDA9885_ADDR_2: 22 case TDA9885_ADDR_3: 23 case TDA9885_ADDR_4: 24 t->d.DevName = "TDA9885 Alignment-free IF-PLL"; 25 break; 26 default: 27 t->d.DevName = "Generic TDAxxxx"; 28 break; 29 } 30 t->d.SlaveAddr = addr; 31 t->d.pI2CBus = b; 32 t->d.NextDev = NULL; 33 t->d.StartTimeout = b->StartTimeout; 34 t->d.BitTimeout = b->BitTimeout; 35 t->d.AcknTimeout = b->AcknTimeout; 36 t->d.ByteTimeout = b->ByteTimeout; 37 38 if(!I2C_WriteRead(&(t->d), NULL, 0, &a, 1)) 39 { 40 free(t); 41 return NULL; 42 } 43 44 /* set default parameters */ 45 if(!I2CDevInit(&(t->d))) 46 { 47 free(t); 48 return NULL; 49 } 50 51 return t; 52} 53 54Bool tda9885_init(TDA9885Ptr t) 55{ 56 t->forced_mute_audio=1; 57 return TRUE; 58} 59 60void tda9885_getstatus(TDA9885Ptr t) 61{ 62CARD8 value; 63 64I2C_WriteRead(&(t->d), NULL, 0, &value, 1); 65t->after_reset=value & 1; 66t->afc_status=(value >> 1) & 0xf; 67t->fm_carrier=(value>>5)& 1; 68t->vif_level=(value >>6) & 1; 69t->afc_win=(value >> 7)&1; 70} 71 72void tda9885_setparameters(TDA9885Ptr t) 73{ 74CARD8 data[4]; 75 76data[0]=0; /* start with subaddress 0 */ 77data[1]=(t->sound_trap & 1) | 78 ((t->auto_mute_fm &1)<<1) | 79 ((t->carrier_mode &1)<<2) | 80 ((t->modulation &3)<<3) | 81 ((t->forced_mute_audio &1)<<5) | 82 ((t->port1 & 1)<<6) | 83 ((t->port2 &1)<<7); /* B data */ 84data[2]=(t->top_adjustment & 0x1f) | 85 ((t->deemphasis & 0x3)<<5) | 86 ((t->audio_gain & 1) << 7); /* C data */ 87data[3]=(t->standard_sound_carrier & 0x3) | 88 ((t->standard_video_if & 0x07)<<2) | 89 ((t->minimum_gain & 0x01)<<5) | 90 ((t->gating & 0x01)<<6) | 91 ((t->vif_agc & 0x01)<<7); /* E data */ 92 93I2C_WriteRead(&(t->d), data, 4, NULL, 0); 94 95xf86DrvMsg(t->d.pI2CBus->scrnIndex,X_INFO,"TDA9885 setparam: B data: %x, C data: %x, E data: %x\n", data[1], data[2], data[3]); 96} 97 98void tda9885_dumpstatus(TDA9885Ptr t) 99{ 100xf86DrvMsg(t->d.pI2CBus->scrnIndex,X_INFO,"TDA9885 status: after_reset=%d afc_status=%d (%3.1f kHz off) fm_carrier=%d vif_level=%d afc_win=%d %s\n", 101 t->after_reset, t->afc_status, 102 (t->afc_status<8)?-12.5-t->afc_status*25.0:-12.5+(16-t->afc_status)*25.0, 103 t->fm_carrier, t->vif_level, t->afc_win, t->afc_win?"VCO in": "VCO out"); 104} 105