git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vserver 2.0 rc7
[linux-2.6.git]
/
drivers
/
media
/
video
/
msp3400.c
diff --git
a/drivers/media/video/msp3400.c
b/drivers/media/video/msp3400.c
index
040d931
..
7fbb858
100644
(file)
--- a/
drivers/media/video/msp3400.c
+++ b/
drivers/media/video/msp3400.c
@@
-380,7
+380,9
@@
static void msp3400c_setvolume(struct i2c_client *client,
int val = 0, bal = 0;
if (!muted) {
int val = 0, bal = 0;
if (!muted) {
- val = (volume * 0x7F / 65535) << 8;
+ /* 0x7f instead if 0x73 here has sound quality issues,
+ * probably due to overmodulation + clipping ... */
+ val = (volume * 0x73 / 65535) << 8;
}
if (val) {
bal = (balance / 256) - 128;
}
if (val) {
bal = (balance / 256) - 128;
@@
-734,6
+736,7
@@
static int msp34xx_sleep(struct msp3400c *msp, int timeout)
{
DECLARE_WAITQUEUE(wait, current);
{
DECLARE_WAITQUEUE(wait, current);
+again:
add_wait_queue(&msp->wq, &wait);
if (!kthread_should_stop()) {
if (timeout < 0) {
add_wait_queue(&msp->wq, &wait);
if (!kthread_should_stop()) {
if (timeout < 0) {
@@
-749,9
+752,12
@@
static int msp34xx_sleep(struct msp3400c *msp, int timeout)
#endif
}
}
#endif
}
}
- if (current->flags & PF_FREEZE)
- refrigerator(PF_FREEZE);
+
remove_wait_queue(&msp->wq, &wait);
remove_wait_queue(&msp->wq, &wait);
+
+ if (try_to_freeze(PF_FREEZE))
+ goto again;
+
return msp->restart;
}
return msp->restart;
}
@@
-993,7
+999,13
@@
static int msp34xx_modus(int norm)
{
switch (norm) {
case VIDEO_MODE_PAL:
{
switch (norm) {
case VIDEO_MODE_PAL:
+#if 1
+ /* experimental: not sure this works with all chip versions */
+ return 0x7003;
+#else
+ /* previous value, try this if it breaks ... */
return 0x1003;
return 0x1003;
+#endif
case VIDEO_MODE_NTSC: /* BTSC */
return 0x2003;
case VIDEO_MODE_SECAM:
case VIDEO_MODE_NTSC: /* BTSC */
return 0x2003;
case VIDEO_MODE_SECAM:
@@
-1260,6
+1272,7
@@
static int msp34xxg_thread(void *data)
int val, std, i;
printk("msp34xxg: daemon started\n");
int val, std, i;
printk("msp34xxg: daemon started\n");
+ msp->source = 1; /* default */
for (;;) {
d2printk(KERN_DEBUG "msp34xxg: thread: sleep\n");
msp34xx_sleep(msp,-1);
for (;;) {
d2printk(KERN_DEBUG "msp34xxg: thread: sleep\n");
msp34xx_sleep(msp,-1);
@@
-1330,8
+1343,9
@@
static void msp34xxg_set_source(struct i2c_client *client, int source)
/* fix matrix mode to stereo and let the msp choose what
* to output according to 'source', as recommended
/* fix matrix mode to stereo and let the msp choose what
* to output according to 'source', as recommended
+ * for MONO (source==0) downmixing set bit[7:0] to 0x30
*/
*/
- int value = (source&0x07)<<8|(source==0 ? 0x
0
0:0x20);
+ int value = (source&0x07)<<8|(source==0 ? 0x
3
0:0x20);
dprintk("msp34xxg: set source to %d (0x%x)\n", source, value);
msp3400c_write(client,
I2C_MSP3400C_DFP,
dprintk("msp34xxg: set source to %d (0x%x)\n", source, value);
msp3400c_write(client,
I2C_MSP3400C_DFP,
@@
-1355,7
+1369,7
@@
static void msp34xxg_set_source(struct i2c_client *client, int source)
msp3400c_write(client,
I2C_MSP3400C_DEM,
0x22, /* a2 threshold for stereo/bilingual */
msp3400c_write(client,
I2C_MSP3400C_DEM,
0x22, /* a2 threshold for stereo/bilingual */
- s
ource==0 ? 0x7f0:s
tereo_threshold);
+ stereo_threshold);
msp->source=source;
}
msp->source=source;
}
@@
-1390,7
+1404,7
@@
static void msp34xxg_detect_stereo(struct i2c_client *client)
static void msp34xxg_set_audmode(struct i2c_client *client, int audmode)
{
struct msp3400c *msp = i2c_get_clientdata(client);
static void msp34xxg_set_audmode(struct i2c_client *client, int audmode)
{
struct msp3400c *msp = i2c_get_clientdata(client);
- int source
= 0
;
+ int source;
switch (audmode) {
case V4L2_TUNER_MODE_MONO:
switch (audmode) {
case V4L2_TUNER_MODE_MONO:
@@
-1406,9
+1420,10
@@
static void msp34xxg_set_audmode(struct i2c_client *client, int audmode)
case V4L2_TUNER_MODE_LANG2:
source=4; /* stereo or B */
break;
case V4L2_TUNER_MODE_LANG2:
source=4; /* stereo or B */
break;
- default:
/* doing nothing: a safe, sane default */
+ default:
audmode = 0;
audmode = 0;
- return;
+ source = 1;
+ break;
}
msp->audmode = audmode;
msp34xxg_set_source(client, source);
}
msp->audmode = audmode;
msp34xxg_set_source(client, source);
@@
-1422,7
+1437,7
@@
static int msp_detach(struct i2c_client *client);
static int msp_probe(struct i2c_adapter *adap);
static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg);
static int msp_probe(struct i2c_adapter *adap);
static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg);
-static int msp_suspend(struct device * dev,
u32
state, u32 level);
+static int msp_suspend(struct device * dev,
pm_message_t
state, u32 level);
static int msp_resume(struct device * dev, u32 level);
static void msp_wake_thread(struct i2c_client *client);
static int msp_resume(struct device * dev, u32 level);
static void msp_wake_thread(struct i2c_client *client);
@@
-1510,12
+1525,9
@@
static int msp_attach(struct i2c_adapter *adap, int addr, int kind)
msp->opmode = opmode;
if (OPMODE_AUTO == msp->opmode) {
msp->opmode = opmode;
if (OPMODE_AUTO == msp->opmode) {
-#if 0 /* seems to work for ivtv only, disable by default for now ... */
if (HAVE_SIMPLER(msp))
msp->opmode = OPMODE_SIMPLER;
if (HAVE_SIMPLER(msp))
msp->opmode = OPMODE_SIMPLER;
- else
-#endif
- if (HAVE_SIMPLE(msp))
+ else if (HAVE_SIMPLE(msp))
msp->opmode = OPMODE_SIMPLE;
else
msp->opmode = OPMODE_MANUAL;
msp->opmode = OPMODE_SIMPLE;
else
msp->opmode = OPMODE_MANUAL;
@@
-1830,7
+1842,7
@@
static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
return 0;
}
return 0;
}
-static int msp_suspend(struct device * dev,
u32
state, u32 level)
+static int msp_suspend(struct device * dev,
pm_message_t
state, u32 level)
{
struct i2c_client *c = container_of(dev, struct i2c_client, dev);
{
struct i2c_client *c = container_of(dev, struct i2c_client, dev);