Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 65729
b: refs/heads/master
c: 87410da
h: refs/heads/master
i:
  65727: b364090
v: v3
  • Loading branch information
Hans Verkuil authored and Mauro Carvalho Chehab committed Oct 10, 2007
1 parent 858e780 commit b991457
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 24 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 372978055dd564d97ca1b4099c99296eaff1fe19
refs/heads/master: 87410dab1238623e082e9a78a62f1bbeb6c475e3
53 changes: 32 additions & 21 deletions trunk/drivers/media/video/cx25840/cx25840-audio.c
Original file line number Diff line number Diff line change
Expand Up @@ -194,19 +194,34 @@ void cx25840_audio_set_path(struct i2c_client *client)

static int get_volume(struct i2c_client *client)
{
struct cx25840_state *state = i2c_get_clientdata(client);
int vol;

if (state->unmute_volume >= 0)
return state->unmute_volume;

/* Volume runs +18dB to -96dB in 1/2dB steps
* change to fit the msp3400 -114dB to +12dB range */

/* check PATH1_VOLUME */
int vol = 228 - cx25840_read(client, 0x8d4);
vol = 228 - cx25840_read(client, 0x8d4);
vol = (vol / 2) + 23;
return vol << 9;
}

static void set_volume(struct i2c_client *client, int volume)
{
/* First convert the volume to msp3400 values (0-127) */
int vol = volume >> 9;
struct cx25840_state *state = i2c_get_clientdata(client);
int vol;

if (state->unmute_volume >= 0) {
state->unmute_volume = volume;
return;
}

/* Convert the volume to msp3400 values (0-127) */
vol = volume >> 9;

/* now scale it up to cx25840 values
* -114dB to -96dB maps to 0
* this should be 19, but in my testing that was 4dB too loud */
Expand Down Expand Up @@ -284,30 +299,26 @@ static void set_balance(struct i2c_client *client, int balance)

static int get_mute(struct i2c_client *client)
{
/* check SRC1_MUTE_EN */
return cx25840_read(client, 0x8d3) & 0x2 ? 1 : 0;
struct cx25840_state *state = i2c_get_clientdata(client);

return state->unmute_volume >= 0;
}

static void set_mute(struct i2c_client *client, int mute)
{
struct cx25840_state *state = i2c_get_clientdata(client);

if (state->aud_input != CX25840_AUDIO_SERIAL) {
/* Must turn off microcontroller in order to mute sound.
* Not sure if this is the best method, but it does work.
* If the microcontroller is running, then it will undo any
* changes to the mute register. */
if (mute) {
/* disable microcontroller */
cx25840_and_or(client, 0x803, ~0x10, 0x00);
cx25840_write(client, 0x8d3, 0x1f);
} else {
/* enable microcontroller */
cx25840_and_or(client, 0x803, ~0x10, 0x10);
}
} else {
/* SRC1_MUTE_EN */
cx25840_and_or(client, 0x8d3, ~0x2, mute ? 0x02 : 0x00);
if (mute && state->unmute_volume == -1) {
int vol = get_volume(client);

set_volume(client, 0);
state->unmute_volume = vol;
}
else if (!mute && state->unmute_volume != -1) {
int vol = state->unmute_volume;

state->unmute_volume = -1;
set_volume(client, vol);
}
}

Expand Down
6 changes: 4 additions & 2 deletions trunk/drivers/media/video/cx25840/cx25840-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -915,6 +915,7 @@ static int cx25840_detect_client(struct i2c_adapter *adapter, int address,
state->audclk_freq = 48000;
state->pvr150_workaround = 0;
state->audmode = V4L2_TUNER_MODE_LANG1;
state->unmute_volume = -1;
state->vbi_line_offset = 8;
state->id = id;
state->rev = device_id;
Expand Down Expand Up @@ -1066,9 +1067,10 @@ static void log_audio_status(struct i2c_client *client)
}
v4l_info(client, "Detected audio standard: %s\n", p);
v4l_info(client, "Audio muted: %s\n",
(mute_ctl & 0x2) ? "yes" : "no");
(state->unmute_volume >= 0) ? "yes" : "no");
v4l_info(client, "Audio microcontroller: %s\n",
(download_ctl & 0x10) ? "running" : "stopped");
(download_ctl & 0x10) ?
((mute_ctl & 0x2) ? "detecting" : "running") : "stopped");

switch (audio_config >> 4) {
case 0x00: p = "undefined"; break;
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/media/video/cx25840/cx25840-core.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ struct cx25840_state {
enum cx25840_audio_input aud_input;
u32 audclk_freq;
int audmode;
int unmute_volume; /* -1 if not muted */
int vbi_line_offset;
u32 id;
u32 rev;
Expand Down

0 comments on commit b991457

Please sign in to comment.