Commit 81cb727d authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

V4L/DVB (8167): cx18: set correct audio inputs for tuner and line-in 2.

Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent f313da11
...@@ -26,13 +26,17 @@ ...@@ -26,13 +26,17 @@
#include "cx18-cards.h" #include "cx18-cards.h"
#include "cx18-audio.h" #include "cx18-audio.h"
#define CX18_AUDIO_ENABLE 0xc72014
/* Selects the audio input and output according to the current /* Selects the audio input and output according to the current
settings. */ settings. */
int cx18_audio_set_io(struct cx18 *cx) int cx18_audio_set_io(struct cx18 *cx)
{ {
struct v4l2_routing route; struct v4l2_routing route;
u32 audio_input; u32 audio_input;
u32 val;
int mux_input; int mux_input;
int err;
/* Determine which input to use */ /* Determine which input to use */
if (test_bit(CX18_F_I_RADIO_USER, &cx->i_flags)) { if (test_bit(CX18_F_I_RADIO_USER, &cx->i_flags)) {
...@@ -51,8 +55,17 @@ int cx18_audio_set_io(struct cx18 *cx) ...@@ -51,8 +55,17 @@ int cx18_audio_set_io(struct cx18 *cx)
cx18_i2c_hw(cx, cx->card->hw_muxer, VIDIOC_INT_S_AUDIO_ROUTING, &route); cx18_i2c_hw(cx, cx->card->hw_muxer, VIDIOC_INT_S_AUDIO_ROUTING, &route);
route.input = audio_input; route.input = audio_input;
return cx18_i2c_hw(cx, cx->card->hw_audio_ctrl, err = cx18_i2c_hw(cx, cx->card->hw_audio_ctrl,
VIDIOC_INT_S_AUDIO_ROUTING, &route); VIDIOC_INT_S_AUDIO_ROUTING, &route);
if (err)
return err;
val = read_reg(CX18_AUDIO_ENABLE) & ~0x30;
val |= (audio_input > CX18_AV_AUDIO_SERIAL2) ? 0x20 :
(audio_input << 4);
write_reg(val | 0xb00, CX18_AUDIO_ENABLE);
cx18_vapi(cx, CX18_APU_RESETAI, 1, 0);
return 0;
} }
void cx18_audio_set_route(struct cx18 *cx, struct v4l2_routing *route) void cx18_audio_set_route(struct cx18 *cx, struct v4l2_routing *route)
......
...@@ -34,7 +34,7 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq) ...@@ -34,7 +34,7 @@ static int set_audclk_freq(struct cx18 *cx, u32 freq)
/* SA_MCLK_SEL=1, SA_MCLK_DIV=0x10 */ /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x10 */
cx18_av_write(cx, 0x127, 0x50); cx18_av_write(cx, 0x127, 0x50);
if (state->aud_input != CX18_AV_AUDIO_SERIAL) { if (state->aud_input > CX18_AV_AUDIO_SERIAL2) {
switch (freq) { switch (freq) {
case 32000: case 32000:
/* VID_PLL and AUX_PLL */ /* VID_PLL and AUX_PLL */
...@@ -148,7 +148,7 @@ void cx18_av_audio_set_path(struct cx18 *cx) ...@@ -148,7 +148,7 @@ void cx18_av_audio_set_path(struct cx18 *cx)
/* Mute everything to prevent the PFFT! */ /* Mute everything to prevent the PFFT! */
cx18_av_write(cx, 0x8d3, 0x1f); cx18_av_write(cx, 0x8d3, 0x1f);
if (state->aud_input == CX18_AV_AUDIO_SERIAL) { if (state->aud_input <= CX18_AV_AUDIO_SERIAL2) {
/* Set Path1 to Serial Audio Input */ /* Set Path1 to Serial Audio Input */
cx18_av_write4(cx, 0x8d0, 0x01011012); cx18_av_write4(cx, 0x8d0, 0x01011012);
...@@ -165,7 +165,7 @@ void cx18_av_audio_set_path(struct cx18 *cx) ...@@ -165,7 +165,7 @@ void cx18_av_audio_set_path(struct cx18 *cx)
/* deassert soft reset */ /* deassert soft reset */
cx18_av_and_or(cx, 0x810, ~0x1, 0x00); cx18_av_and_or(cx, 0x810, ~0x1, 0x00);
if (state->aud_input != CX18_AV_AUDIO_SERIAL) { if (state->aud_input > CX18_AV_AUDIO_SERIAL2) {
/* When the microcontroller detects the /* When the microcontroller detects the
* audio format, it will unmute the lines */ * audio format, it will unmute the lines */
cx18_av_and_or(cx, 0x803, ~0x10, 0x10); cx18_av_and_or(cx, 0x803, ~0x10, 0x10);
...@@ -271,7 +271,7 @@ static void set_mute(struct cx18 *cx, int mute) ...@@ -271,7 +271,7 @@ static void set_mute(struct cx18 *cx, int mute)
{ {
struct cx18_av_state *state = &cx->av_state; struct cx18_av_state *state = &cx->av_state;
if (state->aud_input != CX18_AV_AUDIO_SERIAL) { if (state->aud_input > CX18_AV_AUDIO_SERIAL2) {
/* Must turn off microcontroller in order to mute sound. /* Must turn off microcontroller in order to mute sound.
* Not sure if this is the best method, but it does work. * Not sure if this is the best method, but it does work.
* If the microcontroller is running, then it will undo any * If the microcontroller is running, then it will undo any
...@@ -298,14 +298,14 @@ int cx18_av_audio(struct cx18 *cx, unsigned int cmd, void *arg) ...@@ -298,14 +298,14 @@ int cx18_av_audio(struct cx18 *cx, unsigned int cmd, void *arg)
switch (cmd) { switch (cmd) {
case VIDIOC_INT_AUDIO_CLOCK_FREQ: case VIDIOC_INT_AUDIO_CLOCK_FREQ:
if (state->aud_input != CX18_AV_AUDIO_SERIAL) { if (state->aud_input > CX18_AV_AUDIO_SERIAL2) {
cx18_av_and_or(cx, 0x803, ~0x10, 0); cx18_av_and_or(cx, 0x803, ~0x10, 0);
cx18_av_write(cx, 0x8d3, 0x1f); cx18_av_write(cx, 0x8d3, 0x1f);
} }
cx18_av_and_or(cx, 0x810, ~0x1, 1); cx18_av_and_or(cx, 0x810, ~0x1, 1);
retval = set_audclk_freq(cx, *(u32 *)arg); retval = set_audclk_freq(cx, *(u32 *)arg);
cx18_av_and_or(cx, 0x810, ~0x1, 0); cx18_av_and_or(cx, 0x810, ~0x1, 0);
if (state->aud_input != CX18_AV_AUDIO_SERIAL) if (state->aud_input > CX18_AV_AUDIO_SERIAL2)
cx18_av_and_or(cx, 0x803, ~0x10, 0x10); cx18_av_and_or(cx, 0x803, ~0x10, 0x10);
return retval; return retval;
......
...@@ -241,7 +241,8 @@ static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input, ...@@ -241,7 +241,8 @@ static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input,
} }
switch (aud_input) { switch (aud_input) {
case CX18_AV_AUDIO_SERIAL: case CX18_AV_AUDIO_SERIAL1:
case CX18_AV_AUDIO_SERIAL2:
/* do nothing, use serial audio input */ /* do nothing, use serial audio input */
break; break;
case CX18_AV_AUDIO4: reg &= ~0x30; break; case CX18_AV_AUDIO4: reg &= ~0x30; break;
......
...@@ -62,7 +62,8 @@ enum cx18_av_video_input { ...@@ -62,7 +62,8 @@ enum cx18_av_video_input {
enum cx18_av_audio_input { enum cx18_av_audio_input {
/* Audio inputs: serial or In4-In8 */ /* Audio inputs: serial or In4-In8 */
CX18_AV_AUDIO_SERIAL, CX18_AV_AUDIO_SERIAL1,
CX18_AV_AUDIO_SERIAL2,
CX18_AV_AUDIO4 = 4, CX18_AV_AUDIO4 = 4,
CX18_AV_AUDIO5, CX18_AV_AUDIO5,
CX18_AV_AUDIO6, CX18_AV_AUDIO6,
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "cx18-driver.h" #include "cx18-driver.h"
#include <linux/firmware.h> #include <linux/firmware.h>
#define CX18_AUDIO_ENABLE 0xc72014
#define FWFILE "v4l-cx23418-dig.fw" #define FWFILE "v4l-cx23418-dig.fw"
int cx18_av_loadfw(struct cx18 *cx) int cx18_av_loadfw(struct cx18 *cx)
...@@ -118,7 +119,6 @@ int cx18_av_loadfw(struct cx18 *cx) ...@@ -118,7 +119,6 @@ int cx18_av_loadfw(struct cx18 *cx)
have a name in the spec. */ have a name in the spec. */
cx18_av_write4(cx, 0x09CC, 1); cx18_av_write4(cx, 0x09CC, 1);
#define CX18_AUDIO_ENABLE 0xc72014
v = read_reg(CX18_AUDIO_ENABLE); v = read_reg(CX18_AUDIO_ENABLE);
/* If bit 11 is 1 */ /* If bit 11 is 1 */
if (v & 0x800) if (v & 0x800)
......
...@@ -67,12 +67,12 @@ static const struct cx18_card cx18_card_hvr1600_esmt = { ...@@ -67,12 +67,12 @@ static const struct cx18_card cx18_card_hvr1600_esmt = {
{ CX18_CARD_INPUT_AUD_TUNER, { CX18_CARD_INPUT_AUD_TUNER,
CX18_AV_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 }, CX18_AV_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 },
{ CX18_CARD_INPUT_LINE_IN1, { CX18_CARD_INPUT_LINE_IN1,
CX18_AV_AUDIO_SERIAL, CS5345_IN_2 }, CX18_AV_AUDIO_SERIAL1, CS5345_IN_2 },
{ CX18_CARD_INPUT_LINE_IN2, { CX18_CARD_INPUT_LINE_IN2,
CX18_AV_AUDIO_SERIAL, CS5345_IN_3 }, CX18_AV_AUDIO_SERIAL1, CS5345_IN_3 },
}, },
.radio_input = { CX18_CARD_INPUT_AUD_TUNER, .radio_input = { CX18_CARD_INPUT_AUD_TUNER,
CX18_AV_AUDIO_SERIAL, CS5345_IN_4 }, CX18_AV_AUDIO_SERIAL1, CS5345_IN_4 },
.ddr = { .ddr = {
/* ESMT M13S128324A-5B memory */ /* ESMT M13S128324A-5B memory */
.chip_config = 0x003, .chip_config = 0x003,
...@@ -112,12 +112,12 @@ static const struct cx18_card cx18_card_hvr1600_samsung = { ...@@ -112,12 +112,12 @@ static const struct cx18_card cx18_card_hvr1600_samsung = {
{ CX18_CARD_INPUT_AUD_TUNER, { CX18_CARD_INPUT_AUD_TUNER,
CX18_AV_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 }, CX18_AV_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 },
{ CX18_CARD_INPUT_LINE_IN1, { CX18_CARD_INPUT_LINE_IN1,
CX18_AV_AUDIO_SERIAL, CS5345_IN_2 }, CX18_AV_AUDIO_SERIAL1, CS5345_IN_2 },
{ CX18_CARD_INPUT_LINE_IN2, { CX18_CARD_INPUT_LINE_IN2,
CX18_AV_AUDIO_SERIAL, CS5345_IN_3 }, CX18_AV_AUDIO_SERIAL1, CS5345_IN_3 },
}, },
.radio_input = { CX18_CARD_INPUT_AUD_TUNER, .radio_input = { CX18_CARD_INPUT_AUD_TUNER,
CX18_AV_AUDIO_SERIAL, CS5345_IN_4 }, CX18_AV_AUDIO_SERIAL1, CS5345_IN_4 },
.ddr = { .ddr = {
/* Samsung K4D263238G-VC33 memory */ /* Samsung K4D263238G-VC33 memory */
.chip_config = 0x003, .chip_config = 0x003,
...@@ -163,10 +163,10 @@ static const struct cx18_card cx18_card_h900 = { ...@@ -163,10 +163,10 @@ static const struct cx18_card cx18_card_h900 = {
{ CX18_CARD_INPUT_AUD_TUNER, { CX18_CARD_INPUT_AUD_TUNER,
CX18_AV_AUDIO8, 0 }, CX18_AV_AUDIO8, 0 },
{ CX18_CARD_INPUT_LINE_IN1, { CX18_CARD_INPUT_LINE_IN1,
CX18_AV_AUDIO_SERIAL, 0 }, CX18_AV_AUDIO_SERIAL1, 0 },
}, },
.radio_input = { CX18_CARD_INPUT_AUD_TUNER, .radio_input = { CX18_CARD_INPUT_AUD_TUNER,
CX18_AV_AUDIO_SERIAL, 0 }, CX18_AV_AUDIO_SERIAL1, 0 },
.tuners = { .tuners = {
{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 }, { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
}, },
...@@ -211,11 +211,11 @@ static const struct cx18_card cx18_card_mpc718 = { ...@@ -211,11 +211,11 @@ static const struct cx18_card cx18_card_mpc718 = {
{ CX18_CARD_INPUT_COMPOSITE3, 2, CX18_AV_COMPOSITE3 }, { CX18_CARD_INPUT_COMPOSITE3, 2, CX18_AV_COMPOSITE3 },
}, },
.audio_inputs = { .audio_inputs = {
{ CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 0 }, { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 0 },
{ CX18_CARD_INPUT_LINE_IN1, CX18_AV_AUDIO_SERIAL, 0 }, { CX18_CARD_INPUT_LINE_IN1, CX18_AV_AUDIO_SERIAL1, 0 },
{ CX18_CARD_INPUT_LINE_IN2, CX18_AV_AUDIO_SERIAL, 0 }, { CX18_CARD_INPUT_LINE_IN2, CX18_AV_AUDIO_SERIAL1, 0 },
}, },
.radio_input = { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO_SERIAL, 0 }, .radio_input = { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO_SERIAL1, 0 },
.tuners = { .tuners = {
/* XC3028 tuner */ /* XC3028 tuner */
{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 }, { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
...@@ -261,14 +261,14 @@ static const struct cx18_card cx18_card_cnxt_raptor_pal = { ...@@ -261,14 +261,14 @@ static const struct cx18_card cx18_card_cnxt_raptor_pal = {
{ CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE6 }, { CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE6 },
}, },
.audio_inputs = { .audio_inputs = {
{ CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO_SERIAL, 0 }, { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 0 },
{ CX18_CARD_INPUT_LINE_IN1, CX18_AV_AUDIO_SERIAL, 1 }, { CX18_CARD_INPUT_LINE_IN1, CX18_AV_AUDIO_SERIAL1, 1 },
{ CX18_CARD_INPUT_LINE_IN2, CX18_AV_AUDIO_SERIAL, 1 }, { CX18_CARD_INPUT_LINE_IN2, CX18_AV_AUDIO_SERIAL2, 1 },
}, },
.tuners = { .tuners = {
{ .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216ME_MK3 }, { .std = V4L2_STD_PAL_SECAM, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
}, },
.radio_input = { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO_SERIAL, 2 }, .radio_input = { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO_SERIAL1, 2 },
.ddr = { .ddr = {
/* MT 46V16M16 memory */ /* MT 46V16M16 memory */
.chip_config = 0x50306, .chip_config = 0x50306,
......
...@@ -41,9 +41,6 @@ ...@@ -41,9 +41,6 @@
#define CX18_REG_BUS_TIMEOUT_EN 0xc72024 #define CX18_REG_BUS_TIMEOUT_EN 0xc72024
#define CX18_AUDIO_ENABLE 0xc72014
#define CX18_REG_BUS_TIMEOUT_EN 0xc72024
#define CX18_FAST_CLOCK_PLL_INT 0xc78000 #define CX18_FAST_CLOCK_PLL_INT 0xc78000
#define CX18_FAST_CLOCK_PLL_FRAC 0xc78004 #define CX18_FAST_CLOCK_PLL_FRAC 0xc78004
#define CX18_FAST_CLOCK_PLL_POST 0xc78008 #define CX18_FAST_CLOCK_PLL_POST 0xc78008
......
...@@ -81,6 +81,7 @@ static const struct cx18_api_info api_info[] = { ...@@ -81,6 +81,7 @@ static const struct cx18_api_info api_info[] = {
API_ENTRY(CPU, CX18_CPU_GET_ENC_PTS, 0), API_ENTRY(CPU, CX18_CPU_GET_ENC_PTS, 0),
API_ENTRY(CPU, CX18_CPU_DE_SET_MDL_ACK, 0), API_ENTRY(CPU, CX18_CPU_DE_SET_MDL_ACK, 0),
API_ENTRY(CPU, CX18_CPU_DE_SET_MDL, API_FAST), API_ENTRY(CPU, CX18_CPU_DE_SET_MDL, API_FAST),
API_ENTRY(CPU, CX18_APU_RESETAI, API_FAST),
API_ENTRY(0, 0, 0), API_ENTRY(0, 0, 0),
}; };
......
...@@ -52,6 +52,11 @@ ...@@ -52,6 +52,11 @@
#define EPU_CMD_MASK_DEBUG (EPU_CMD_MASK | 0x000000) #define EPU_CMD_MASK_DEBUG (EPU_CMD_MASK | 0x000000)
#define EPU_CMD_MASK_DE (EPU_CMD_MASK | 0x040000) #define EPU_CMD_MASK_DE (EPU_CMD_MASK | 0x040000)
#define APU_CMD_MASK 0x10000000
#define APU_CMD_MASK_ACK (APU_CMD_MASK | 0x80000000)
#define CX18_APU_RESETAI (APU_CMD_MASK | 0x05)
/* Description: This command indicates that a Memory Descriptor List has been /* Description: This command indicates that a Memory Descriptor List has been
filled with the requested channel type filled with the requested channel type
IN[0] - Task handle. Handle of the task IN[0] - Task handle. Handle of the task
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment