|
|
|
@ -44,8 +44,13 @@ MODULE_LICENSE("GPL"); |
|
|
|
|
/* ---------------------------------------------------------------------- */ |
|
|
|
|
|
|
|
|
|
#define UNSET (-1U) |
|
|
|
|
#define PREFIX "tda9885/6/7: " |
|
|
|
|
#define dprintk if (debug) printk |
|
|
|
|
#define tda9887_info(fmt, arg...) do {\ |
|
|
|
|
printk(KERN_INFO "%s %d-%04x: " fmt, t->client.name, \
|
|
|
|
|
i2c_adapter_id(t->client.adapter), t->client.addr , ##arg); } while (0) |
|
|
|
|
#define tda9887_dbg(fmt, arg...) do {\ |
|
|
|
|
if (debug) \
|
|
|
|
|
printk(KERN_INFO "%s %d-%04x: " fmt, t->client.name, \
|
|
|
|
|
i2c_adapter_id(t->client.adapter), t->client.addr , ##arg); } while (0) |
|
|
|
|
|
|
|
|
|
struct tda9887 { |
|
|
|
|
struct i2c_client client; |
|
|
|
@ -237,7 +242,7 @@ static struct tvnorm radio_mono = { |
|
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------------- */ |
|
|
|
|
|
|
|
|
|
static void dump_read_message(unsigned char *buf) |
|
|
|
|
static void dump_read_message(struct tda9887 *t, unsigned char *buf) |
|
|
|
|
{ |
|
|
|
|
static char *afc[16] = { |
|
|
|
|
"- 12.5 kHz", |
|
|
|
@ -257,15 +262,15 @@ static void dump_read_message(unsigned char *buf) |
|
|
|
|
"+ 37.5 kHz", |
|
|
|
|
"+ 12.5 kHz", |
|
|
|
|
}; |
|
|
|
|
printk(PREFIX "read: 0x%2x\n", buf[0]); |
|
|
|
|
printk(" after power on : %s\n", (buf[0] & 0x01) ? "yes" : "no"); |
|
|
|
|
printk(" afc : %s\n", afc[(buf[0] >> 1) & 0x0f]); |
|
|
|
|
printk(" fmif level : %s\n", (buf[0] & 0x20) ? "high" : "low"); |
|
|
|
|
printk(" afc window : %s\n", (buf[0] & 0x40) ? "in" : "out"); |
|
|
|
|
printk(" vfi level : %s\n", (buf[0] & 0x80) ? "high" : "low"); |
|
|
|
|
tda9887_info("read: 0x%2x\n", buf[0]); |
|
|
|
|
tda9887_info(" after power on : %s\n", (buf[0] & 0x01) ? "yes" : "no"); |
|
|
|
|
tda9887_info(" afc : %s\n", afc[(buf[0] >> 1) & 0x0f]); |
|
|
|
|
tda9887_info(" fmif level : %s\n", (buf[0] & 0x20) ? "high" : "low"); |
|
|
|
|
tda9887_info(" afc window : %s\n", (buf[0] & 0x40) ? "in" : "out"); |
|
|
|
|
tda9887_info(" vfi level : %s\n", (buf[0] & 0x80) ? "high" : "low"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void dump_write_message(unsigned char *buf) |
|
|
|
|
static void dump_write_message(struct tda9887 *t, unsigned char *buf) |
|
|
|
|
{ |
|
|
|
|
static char *sound[4] = { |
|
|
|
|
"AM/TV", |
|
|
|
@ -305,58 +310,58 @@ static void dump_write_message(unsigned char *buf) |
|
|
|
|
"44 MHz", |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
printk(PREFIX "write: byte B 0x%02x\n",buf[1]); |
|
|
|
|
printk(" B0 video mode : %s\n", |
|
|
|
|
tda9887_info("write: byte B 0x%02x\n",buf[1]); |
|
|
|
|
tda9887_info(" B0 video mode : %s\n", |
|
|
|
|
(buf[1] & 0x01) ? "video trap" : "sound trap"); |
|
|
|
|
printk(" B1 auto mute fm : %s\n", |
|
|
|
|
tda9887_info(" B1 auto mute fm : %s\n", |
|
|
|
|
(buf[1] & 0x02) ? "yes" : "no"); |
|
|
|
|
printk(" B2 carrier mode : %s\n", |
|
|
|
|
tda9887_info(" B2 carrier mode : %s\n", |
|
|
|
|
(buf[1] & 0x04) ? "QSS" : "Intercarrier"); |
|
|
|
|
printk(" B3-4 tv sound/radio : %s\n", |
|
|
|
|
tda9887_info(" B3-4 tv sound/radio : %s\n", |
|
|
|
|
sound[(buf[1] & 0x18) >> 3]); |
|
|
|
|
printk(" B5 force mute audio: %s\n", |
|
|
|
|
tda9887_info(" B5 force mute audio: %s\n", |
|
|
|
|
(buf[1] & 0x20) ? "yes" : "no"); |
|
|
|
|
printk(" B6 output port 1 : %s\n", |
|
|
|
|
tda9887_info(" B6 output port 1 : %s\n", |
|
|
|
|
(buf[1] & 0x40) ? "high (inactive)" : "low (active)"); |
|
|
|
|
printk(" B7 output port 2 : %s\n", |
|
|
|
|
tda9887_info(" B7 output port 2 : %s\n", |
|
|
|
|
(buf[1] & 0x80) ? "high (inactive)" : "low (active)"); |
|
|
|
|
|
|
|
|
|
printk(PREFIX "write: byte C 0x%02x\n",buf[2]); |
|
|
|
|
printk(" C0-4 top adjustment : %s dB\n", adjust[buf[2] & 0x1f]); |
|
|
|
|
printk(" C5-6 de-emphasis : %s\n", deemph[(buf[2] & 0x60) >> 5]); |
|
|
|
|
printk(" C7 audio gain : %s\n", |
|
|
|
|
tda9887_info("write: byte C 0x%02x\n",buf[2]); |
|
|
|
|
tda9887_info(" C0-4 top adjustment : %s dB\n", adjust[buf[2] & 0x1f]); |
|
|
|
|
tda9887_info(" C5-6 de-emphasis : %s\n", deemph[(buf[2] & 0x60) >> 5]); |
|
|
|
|
tda9887_info(" C7 audio gain : %s\n", |
|
|
|
|
(buf[2] & 0x80) ? "-6" : "0"); |
|
|
|
|
|
|
|
|
|
printk(PREFIX "write: byte E 0x%02x\n",buf[3]); |
|
|
|
|
printk(" E0-1 sound carrier : %s\n", |
|
|
|
|
tda9887_info("write: byte E 0x%02x\n",buf[3]); |
|
|
|
|
tda9887_info(" E0-1 sound carrier : %s\n", |
|
|
|
|
carrier[(buf[3] & 0x03)]); |
|
|
|
|
printk(" E6 l pll gating : %s\n", |
|
|
|
|
tda9887_info(" E6 l pll gating : %s\n", |
|
|
|
|
(buf[3] & 0x40) ? "36" : "13"); |
|
|
|
|
|
|
|
|
|
if (buf[1] & 0x08) { |
|
|
|
|
/* radio */ |
|
|
|
|
printk(" E2-4 video if : %s\n", |
|
|
|
|
tda9887_info(" E2-4 video if : %s\n", |
|
|
|
|
rif[(buf[3] & 0x0c) >> 2]); |
|
|
|
|
printk(" E7 vif agc output : %s\n", |
|
|
|
|
tda9887_info(" E7 vif agc output : %s\n", |
|
|
|
|
(buf[3] & 0x80) |
|
|
|
|
? ((buf[3] & 0x10) ? "fm-agc radio" : "sif-agc radio") |
|
|
|
|
: "fm radio carrier afc"); |
|
|
|
|
} else { |
|
|
|
|
/* video */ |
|
|
|
|
printk(" E2-4 video if : %s\n", |
|
|
|
|
tda9887_info(" E2-4 video if : %s\n", |
|
|
|
|
vif[(buf[3] & 0x1c) >> 2]); |
|
|
|
|
printk(" E5 tuner gain : %s\n", |
|
|
|
|
tda9887_info(" E5 tuner gain : %s\n", |
|
|
|
|
(buf[3] & 0x80) |
|
|
|
|
? ((buf[3] & 0x20) ? "external" : "normal") |
|
|
|
|
: ((buf[3] & 0x20) ? "minimum" : "normal")); |
|
|
|
|
printk(" E7 vif agc output : %s\n", |
|
|
|
|
tda9887_info(" E7 vif agc output : %s\n", |
|
|
|
|
(buf[3] & 0x80) |
|
|
|
|
? ((buf[3] & 0x20) |
|
|
|
|
? "pin3 port, pin22 vif agc out" |
|
|
|
|
: "pin22 port, pin3 vif acg ext in") |
|
|
|
|
: "pin3+pin22 port"); |
|
|
|
|
} |
|
|
|
|
printk("--\n"); |
|
|
|
|
tda9887_info("--\n"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------------- */ |
|
|
|
@ -380,11 +385,11 @@ static int tda9887_set_tvnorm(struct tda9887 *t, char *buf) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (NULL == norm) { |
|
|
|
|
dprintk(PREFIX "Unsupported tvnorm entry - audio muted\n"); |
|
|
|
|
tda9887_dbg("Unsupported tvnorm entry - audio muted\n"); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
dprintk(PREFIX "configure for: %s\n",norm->name); |
|
|
|
|
tda9887_dbg("configure for: %s\n",norm->name); |
|
|
|
|
buf[1] = norm->b; |
|
|
|
|
buf[2] = norm->c; |
|
|
|
|
buf[3] = norm->e; |
|
|
|
@ -506,26 +511,26 @@ static int tda9887_fixup_std(struct tda9887 *t) |
|
|
|
|
case 'B': |
|
|
|
|
case 'g': |
|
|
|
|
case 'G': |
|
|
|
|
dprintk(PREFIX "insmod fixup: PAL => PAL-BG\n"); |
|
|
|
|
tda9887_dbg("insmod fixup: PAL => PAL-BG\n"); |
|
|
|
|
t->std = V4L2_STD_PAL_BG; |
|
|
|
|
break; |
|
|
|
|
case 'i': |
|
|
|
|
case 'I': |
|
|
|
|
dprintk(PREFIX "insmod fixup: PAL => PAL-I\n"); |
|
|
|
|
tda9887_dbg("insmod fixup: PAL => PAL-I\n"); |
|
|
|
|
t->std = V4L2_STD_PAL_I; |
|
|
|
|
break; |
|
|
|
|
case 'd': |
|
|
|
|
case 'D': |
|
|
|
|
case 'k': |
|
|
|
|
case 'K': |
|
|
|
|
dprintk(PREFIX "insmod fixup: PAL => PAL-DK\n"); |
|
|
|
|
tda9887_dbg("insmod fixup: PAL => PAL-DK\n"); |
|
|
|
|
t->std = V4L2_STD_PAL_DK; |
|
|
|
|
break; |
|
|
|
|
case '-': |
|
|
|
|
/* default parameter, do nothing */ |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
printk(PREFIX "pal= argument not recognised\n"); |
|
|
|
|
tda9887_info("pal= argument not recognised\n"); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -535,19 +540,19 @@ static int tda9887_fixup_std(struct tda9887 *t) |
|
|
|
|
case 'D': |
|
|
|
|
case 'k': |
|
|
|
|
case 'K': |
|
|
|
|
dprintk(PREFIX "insmod fixup: SECAM => SECAM-DK\n"); |
|
|
|
|
tda9887_dbg("insmod fixup: SECAM => SECAM-DK\n"); |
|
|
|
|
t->std = V4L2_STD_SECAM_DK; |
|
|
|
|
break; |
|
|
|
|
case 'l': |
|
|
|
|
case 'L': |
|
|
|
|
dprintk(PREFIX "insmod fixup: SECAM => SECAM-L\n"); |
|
|
|
|
tda9887_dbg("insmod fixup: SECAM => SECAM-L\n"); |
|
|
|
|
t->std = V4L2_STD_SECAM_L; |
|
|
|
|
break; |
|
|
|
|
case '-': |
|
|
|
|
/* default parameter, do nothing */ |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
printk(PREFIX "secam= argument not recognised\n"); |
|
|
|
|
tda9887_info("secam= argument not recognised\n"); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -561,8 +566,8 @@ static int tda9887_status(struct tda9887 *t) |
|
|
|
|
|
|
|
|
|
memset(buf,0,sizeof(buf)); |
|
|
|
|
if (1 != (rc = i2c_master_recv(&t->client,buf,1))) |
|
|
|
|
printk(PREFIX "i2c i/o error: rc == %d (should be 1)\n",rc); |
|
|
|
|
dump_read_message(buf); |
|
|
|
|
tda9887_info("i2c i/o error: rc == %d (should be 1)\n",rc); |
|
|
|
|
dump_read_message(t, buf); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -588,13 +593,13 @@ static int tda9887_configure(struct tda9887 *t) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dprintk(PREFIX "writing: b=0x%02x c=0x%02x e=0x%02x\n", |
|
|
|
|
tda9887_dbg("writing: b=0x%02x c=0x%02x e=0x%02x\n", |
|
|
|
|
buf[1],buf[2],buf[3]); |
|
|
|
|
if (debug > 1) |
|
|
|
|
dump_write_message(buf); |
|
|
|
|
dump_write_message(t, buf); |
|
|
|
|
|
|
|
|
|
if (4 != (rc = i2c_master_send(&t->client,buf,4))) |
|
|
|
|
printk(PREFIX "i2c i/o error: rc == %d (should be 4)\n",rc); |
|
|
|
|
tda9887_info("i2c i/o error: rc == %d (should be 4)\n",rc); |
|
|
|
|
|
|
|
|
|
if (debug > 2) { |
|
|
|
|
msleep_interruptible(1000); |
|
|
|
@ -612,8 +617,6 @@ static int tda9887_attach(struct i2c_adapter *adap, int addr, int kind) |
|
|
|
|
client_template.adapter = adap; |
|
|
|
|
client_template.addr = addr; |
|
|
|
|
|
|
|
|
|
printk(PREFIX "chip found @ 0x%x\n", addr<<1); |
|
|
|
|
|
|
|
|
|
if (NULL == (t = kmalloc(sizeof(*t), GFP_KERNEL))) |
|
|
|
|
return -ENOMEM; |
|
|
|
|
memset(t,0,sizeof(*t)); |
|
|
|
@ -623,6 +626,8 @@ static int tda9887_attach(struct i2c_adapter *adap, int addr, int kind) |
|
|
|
|
t->pinnacle_id = UNSET; |
|
|
|
|
t->radio_mode = V4L2_TUNER_MODE_STEREO; |
|
|
|
|
|
|
|
|
|
tda9887_info("chip found @ 0x%x (%s)\n", addr<<1, adap->name); |
|
|
|
|
|
|
|
|
|
i2c_set_clientdata(&t->client, t); |
|
|
|
|
i2c_attach_client(&t->client); |
|
|
|
|
|
|
|
|
@ -656,10 +661,10 @@ static int tda9887_detach(struct i2c_client *client) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#define SWITCH_V4L2 if (!t->using_v4l2 && debug) \ |
|
|
|
|
printk(PREFIX "switching to v4l2\n"); \
|
|
|
|
|
tda9887_info("switching to v4l2\n"); \
|
|
|
|
|
t->using_v4l2 = 1; |
|
|
|
|
#define CHECK_V4L2 if (t->using_v4l2) { if (debug) \ |
|
|
|
|
printk(PREFIX "ignore v4l1 call\n"); \
|
|
|
|
|
tda9887_info("ignore v4l1 call\n"); \
|
|
|
|
|
return 0; } |
|
|
|
|
|
|
|
|
|
static int |
|
|
|
@ -787,7 +792,10 @@ tda9887_command(struct i2c_client *client, unsigned int cmd, void *arg) |
|
|
|
|
|
|
|
|
|
static int tda9887_suspend(struct device * dev, pm_message_t state) |
|
|
|
|
{ |
|
|
|
|
dprintk("tda9887: suspend\n"); |
|
|
|
|
struct i2c_client *c = container_of(dev, struct i2c_client, dev); |
|
|
|
|
struct tda9887 *t = i2c_get_clientdata(c); |
|
|
|
|
|
|
|
|
|
tda9887_dbg("suspend\n"); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -796,7 +804,7 @@ static int tda9887_resume(struct device * dev) |
|
|
|
|
struct i2c_client *c = container_of(dev, struct i2c_client, dev); |
|
|
|
|
struct tda9887 *t = i2c_get_clientdata(c); |
|
|
|
|
|
|
|
|
|
dprintk("tda9887: resume\n"); |
|
|
|
|
tda9887_dbg("resume\n"); |
|
|
|
|
tda9887_configure(t); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|