#ifdef HAVE_XORG_CONFIG_H #include #endif #include "xf86.h" #include "xf86i2c.h" #include "tda9850.h" #include "i2c_def.h" #define TDA9850(a,b) { \ data[0]=a; \ data[1]=b; \ I2C_WriteRead(&(t->d), data, 2, NULL, 0); \ } TDA9850Ptr Detect_tda9850(I2CBusPtr b, I2CSlaveAddr addr) { TDA9850Ptr t; I2CByte a; t = calloc(1, sizeof(TDA9850Rec)); if(t == NULL) return NULL; switch(addr) { case TDA9850_ADDR_1: t->d.DevName = "TDA9850 BTSC Stereo+SAP Audio Processor"; break; default: t->d.DevName = "Generic TDAxxxx"; break; } t->d.SlaveAddr = addr; t->d.pI2CBus = b; t->d.NextDev = NULL; t->d.StartTimeout = b->StartTimeout; t->d.BitTimeout = b->BitTimeout; t->d.AcknTimeout = b->AcknTimeout; t->d.ByteTimeout = b->ByteTimeout; if(!I2C_WriteRead(&(t->d), NULL, 0, &a, 1)) { free(t); return NULL; } /* set default parameters */ if(!I2CDevInit(&(t->d))) { free(t); return NULL; } return t; } Bool tda9850_init(TDA9850Ptr t) { t->stereo = 1; t->sap = 0; t->mute = TRUE; t->sap_mute = TRUE; tda9850_setaudio(t); return TRUE; } void tda9850_setaudio(TDA9850Ptr t) { CARD8 data[2]; if(t->mux==2) { TDA9850(0x04,0x0F); TDA9850(0x05,0x0F); TDA9850(0x06, 0x58); TDA9850(0x07,0x07); TDA9850(0x08,0x00); TDA9850(0x09,0x00); TDA9850(0x0A,0x03); } else { TDA9850(0x04,0x07); TDA9850(0x05,0x07); TDA9850(0x06,0x58); TDA9850(0x07,0x07); TDA9850(0x08,0x10); TDA9850(0x09,0x10); TDA9850(0x0A,0x03); } TDA9850(0x06,(t->stereo<<6)|(t->sap<<7)|(t->mute?0x8:0)|(t->sap_mute?0x10:0x0)); } void tda9850_mute(TDA9850Ptr t, Bool mute) { CARD8 data[2]; xf86DrvMsg(t->d.pI2CBus->scrnIndex, X_INFO, "tda9850_mute %s\n", mute ? "on" : "off"); t->mute = mute; TDA9850(0x06,(t->stereo<<6)|(t->sap<<7)|(t->mute?0x8:0x0)|(t->sap_mute?0x10:0x0)); } void tda9850_sap_mute(TDA9850Ptr t, Bool sap_mute) { CARD8 data[2]; xf86DrvMsg(t->d.pI2CBus->scrnIndex, X_INFO, "tda9850_sap_mute %s\n", sap_mute ? "on" : "off"); t->sap_mute = sap_mute; TDA9850(0x06,(t->stereo<<6)|(t->sap<<7)|(t->mute?0x8:0x0)|(t->sap_mute?0x10:0x0)); } CARD16 tda9850_getstatus(TDA9850Ptr t) { CARD16 status; I2C_WriteRead(&(t->d), NULL, 0, (I2CByte *)&status, 2); return status; }