[media] Add support for AUX_PLL on cx2583x chips
This adds support for the AUX_PLL in cx2583x chips which is available in those although the audio part of the chip is not. The AUX_PLL is used at least by Terratec in their Grabster AV400 device. Signed-off-by: Sven Barth <pascaldragon@googlemail.com> Acked-by: Mike Isely <isely@pobox.com> Reviewed-by: Andy Walls <awalls@md.metrocast.net> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
9439943137
commit
5af79f86db
|
@ -437,41 +437,45 @@ void cx25840_audio_set_path(struct i2c_client *client)
|
|||
{
|
||||
struct cx25840_state *state = to_state(i2c_get_clientdata(client));
|
||||
|
||||
/* assert soft reset */
|
||||
cx25840_and_or(client, 0x810, ~0x1, 0x01);
|
||||
if (!is_cx2583x(state)) {
|
||||
/* assert soft reset */
|
||||
cx25840_and_or(client, 0x810, ~0x1, 0x01);
|
||||
|
||||
/* stop microcontroller */
|
||||
cx25840_and_or(client, 0x803, ~0x10, 0);
|
||||
/* stop microcontroller */
|
||||
cx25840_and_or(client, 0x803, ~0x10, 0);
|
||||
|
||||
/* Mute everything to prevent the PFFT! */
|
||||
cx25840_write(client, 0x8d3, 0x1f);
|
||||
/* Mute everything to prevent the PFFT! */
|
||||
cx25840_write(client, 0x8d3, 0x1f);
|
||||
|
||||
if (state->aud_input == CX25840_AUDIO_SERIAL) {
|
||||
/* Set Path1 to Serial Audio Input */
|
||||
cx25840_write4(client, 0x8d0, 0x01011012);
|
||||
if (state->aud_input == CX25840_AUDIO_SERIAL) {
|
||||
/* Set Path1 to Serial Audio Input */
|
||||
cx25840_write4(client, 0x8d0, 0x01011012);
|
||||
|
||||
/* The microcontroller should not be started for the
|
||||
* non-tuner inputs: autodetection is specific for
|
||||
* TV audio. */
|
||||
} else {
|
||||
/* Set Path1 to Analog Demod Main Channel */
|
||||
cx25840_write4(client, 0x8d0, 0x1f063870);
|
||||
/* The microcontroller should not be started for the
|
||||
* non-tuner inputs: autodetection is specific for
|
||||
* TV audio. */
|
||||
} else {
|
||||
/* Set Path1 to Analog Demod Main Channel */
|
||||
cx25840_write4(client, 0x8d0, 0x1f063870);
|
||||
}
|
||||
}
|
||||
|
||||
set_audclk_freq(client, state->audclk_freq);
|
||||
|
||||
if (state->aud_input != CX25840_AUDIO_SERIAL) {
|
||||
/* When the microcontroller detects the
|
||||
* audio format, it will unmute the lines */
|
||||
cx25840_and_or(client, 0x803, ~0x10, 0x10);
|
||||
if (!is_cx2583x(state)) {
|
||||
if (state->aud_input != CX25840_AUDIO_SERIAL) {
|
||||
/* When the microcontroller detects the
|
||||
* audio format, it will unmute the lines */
|
||||
cx25840_and_or(client, 0x803, ~0x10, 0x10);
|
||||
}
|
||||
|
||||
/* deassert soft reset */
|
||||
cx25840_and_or(client, 0x810, ~0x1, 0x00);
|
||||
|
||||
/* Ensure the controller is running when we exit */
|
||||
if (is_cx2388x(state) || is_cx231xx(state))
|
||||
cx25840_and_or(client, 0x803, ~0x10, 0x10);
|
||||
}
|
||||
|
||||
/* deassert soft reset */
|
||||
cx25840_and_or(client, 0x810, ~0x1, 0x00);
|
||||
|
||||
/* Ensure the controller is running when we exit */
|
||||
if (is_cx2388x(state) || is_cx231xx(state))
|
||||
cx25840_and_or(client, 0x803, ~0x10, 0x10);
|
||||
}
|
||||
|
||||
static void set_volume(struct i2c_client *client, int volume)
|
||||
|
|
|
@ -870,6 +870,11 @@ static void input_change(struct i2c_client *client)
|
|||
}
|
||||
cx25840_and_or(client, 0x401, ~0x60, 0);
|
||||
cx25840_and_or(client, 0x401, ~0x60, 0x60);
|
||||
|
||||
/* Don't write into audio registers on cx2583x chips */
|
||||
if (is_cx2583x(state))
|
||||
return;
|
||||
|
||||
cx25840_and_or(client, 0x810, ~0x01, 1);
|
||||
|
||||
if (state->radio) {
|
||||
|
@ -1028,10 +1033,8 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
|
|||
|
||||
state->vid_input = vid_input;
|
||||
state->aud_input = aud_input;
|
||||
if (!is_cx2583x(state)) {
|
||||
cx25840_audio_set_path(client);
|
||||
input_change(client);
|
||||
}
|
||||
cx25840_audio_set_path(client);
|
||||
input_change(client);
|
||||
|
||||
if (is_cx2388x(state)) {
|
||||
/* Audio channel 1 src : Parallel 1 */
|
||||
|
@ -1552,8 +1555,6 @@ static int cx25840_s_audio_routing(struct v4l2_subdev *sd,
|
|||
struct cx25840_state *state = to_state(sd);
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
|
||||
if (is_cx2583x(state))
|
||||
return -EINVAL;
|
||||
return set_input(client, state->vid_input, input);
|
||||
}
|
||||
|
||||
|
@ -1562,8 +1563,7 @@ static int cx25840_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *fr
|
|||
struct cx25840_state *state = to_state(sd);
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
|
||||
if (!is_cx2583x(state))
|
||||
input_change(client);
|
||||
input_change(client);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue