提交 2a03f034 编写于 作者: A Andy Walls 提交者: Mauro Carvalho Chehab

V4L/DVB (13088): cx25840: Convert chip/core family checks to static inline functions

Change logic to check for various chip or core families to inline functions.
Checks for specific chips should be made against the state->id field now.  This
is in preparation for chip/core specific code for setting up PLLs for the
CX2388[578] family of cores, that all run with different crystal frequencies.
Signed-off-by: NAndy Walls <awalls@radix.net>
Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
上级 c7dd1ecd
...@@ -32,19 +32,19 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) ...@@ -32,19 +32,19 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
/* common for all inputs and rates */ /* common for all inputs and rates */
/* SA_MCLK_SEL=1, SA_MCLK_DIV=0x10 */ /* SA_MCLK_SEL=1, SA_MCLK_DIV=0x10 */
if (!state->is_cx23885 && !state->is_cx231xx) if (!is_cx2388x(state) && !is_cx231xx(state))
cx25840_write(client, 0x127, 0x50); cx25840_write(client, 0x127, 0x50);
if (state->aud_input != CX25840_AUDIO_SERIAL) { if (state->aud_input != CX25840_AUDIO_SERIAL) {
switch (freq) { switch (freq) {
case 32000: case 32000:
if (state->is_cx23885) { if (is_cx2388x(state)) {
/* We don't have register values /* We don't have register values
* so avoid destroying registers. */ * so avoid destroying registers. */
break; break;
} }
if (!state->is_cx231xx) { if (!is_cx231xx(state)) {
/* VID_PLL and AUX_PLL */ /* VID_PLL and AUX_PLL */
cx25840_write4(client, 0x108, 0x1006040f); cx25840_write4(client, 0x108, 0x1006040f);
...@@ -52,7 +52,7 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) ...@@ -52,7 +52,7 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
cx25840_write4(client, 0x110, 0x01bb39ee); cx25840_write4(client, 0x110, 0x01bb39ee);
} }
if (state->is_cx25836) if (is_cx2583x(state))
break; break;
/* src3/4/6_ctl = 0x0801f77f */ /* src3/4/6_ctl = 0x0801f77f */
...@@ -62,13 +62,13 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) ...@@ -62,13 +62,13 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
break; break;
case 44100: case 44100:
if (state->is_cx23885) { if (is_cx2388x(state)) {
/* We don't have register values /* We don't have register values
* so avoid destroying registers. */ * so avoid destroying registers. */
break; break;
} }
if (!state->is_cx231xx) { if (!is_cx231xx(state)) {
/* VID_PLL and AUX_PLL */ /* VID_PLL and AUX_PLL */
cx25840_write4(client, 0x108, 0x1009040f); cx25840_write4(client, 0x108, 0x1009040f);
...@@ -76,7 +76,7 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) ...@@ -76,7 +76,7 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
cx25840_write4(client, 0x110, 0x00ec6bd6); cx25840_write4(client, 0x110, 0x00ec6bd6);
} }
if (state->is_cx25836) if (is_cx2583x(state))
break; break;
/* src3/4/6_ctl = 0x08016d59 */ /* src3/4/6_ctl = 0x08016d59 */
...@@ -86,13 +86,13 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) ...@@ -86,13 +86,13 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
break; break;
case 48000: case 48000:
if (state->is_cx23885) { if (is_cx2388x(state)) {
/* We don't have register values /* We don't have register values
* so avoid destroying registers. */ * so avoid destroying registers. */
break; break;
} }
if (!state->is_cx231xx) { if (!is_cx231xx(state)) {
/* VID_PLL and AUX_PLL */ /* VID_PLL and AUX_PLL */
cx25840_write4(client, 0x108, 0x100a040f); cx25840_write4(client, 0x108, 0x100a040f);
...@@ -100,7 +100,7 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) ...@@ -100,7 +100,7 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
cx25840_write4(client, 0x110, 0x0098d6e5); cx25840_write4(client, 0x110, 0x0098d6e5);
} }
if (state->is_cx25836) if (is_cx2583x(state))
break; break;
/* src3/4/6_ctl = 0x08014faa */ /* src3/4/6_ctl = 0x08014faa */
...@@ -112,13 +112,13 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) ...@@ -112,13 +112,13 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
} else { } else {
switch (freq) { switch (freq) {
case 32000: case 32000:
if (state->is_cx23885) { if (is_cx2388x(state)) {
/* We don't have register values /* We don't have register values
* so avoid destroying registers. */ * so avoid destroying registers. */
break; break;
} }
if (!state->is_cx231xx) { if (!is_cx231xx(state)) {
/* VID_PLL and AUX_PLL */ /* VID_PLL and AUX_PLL */
cx25840_write4(client, 0x108, 0x1e08040f); cx25840_write4(client, 0x108, 0x1e08040f);
...@@ -126,7 +126,7 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) ...@@ -126,7 +126,7 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
cx25840_write4(client, 0x110, 0x012a0869); cx25840_write4(client, 0x110, 0x012a0869);
} }
if (state->is_cx25836) if (is_cx2583x(state))
break; break;
/* src1_ctl = 0x08010000 */ /* src1_ctl = 0x08010000 */
...@@ -142,14 +142,14 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) ...@@ -142,14 +142,14 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
break; break;
case 44100: case 44100:
if (state->is_cx23885) { if (is_cx2388x(state)) {
/* We don't have register values /* We don't have register values
* so avoid destroying registers. */ * so avoid destroying registers. */
break; break;
} }
if (!state->is_cx231xx) { if (!is_cx231xx(state)) {
/* VID_PLL and AUX_PLL */ /* VID_PLL and AUX_PLL */
cx25840_write4(client, 0x108, 0x1809040f); cx25840_write4(client, 0x108, 0x1809040f);
...@@ -157,7 +157,7 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) ...@@ -157,7 +157,7 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
cx25840_write4(client, 0x110, 0x00ec6bd6); cx25840_write4(client, 0x110, 0x00ec6bd6);
} }
if (state->is_cx25836) if (is_cx2583x(state))
break; break;
/* src1_ctl = 0x08010000 */ /* src1_ctl = 0x08010000 */
...@@ -170,7 +170,7 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) ...@@ -170,7 +170,7 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
break; break;
case 48000: case 48000:
if (!state->is_cx23885 && !state->is_cx231xx) { if (!is_cx2388x(state) && !is_cx231xx(state)) {
/* VID_PLL and AUX_PLL */ /* VID_PLL and AUX_PLL */
cx25840_write4(client, 0x108, 0x180a040f); cx25840_write4(client, 0x108, 0x180a040f);
...@@ -178,10 +178,10 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq) ...@@ -178,10 +178,10 @@ static int set_audclk_freq(struct i2c_client *client, u32 freq)
cx25840_write4(client, 0x110, 0x0098d6e5); cx25840_write4(client, 0x110, 0x0098d6e5);
} }
if (state->is_cx25836) if (is_cx2583x(state))
break; break;
if (!state->is_cx23885 && !state->is_cx231xx) { if (!is_cx2388x(state) && !is_cx231xx(state)) {
/* src1_ctl */ /* src1_ctl */
cx25840_write4(client, 0x8f8, 0x08018000); cx25840_write4(client, 0x8f8, 0x08018000);
...@@ -243,7 +243,7 @@ void cx25840_audio_set_path(struct i2c_client *client) ...@@ -243,7 +243,7 @@ void cx25840_audio_set_path(struct i2c_client *client)
cx25840_and_or(client, 0x810, ~0x1, 0x00); cx25840_and_or(client, 0x810, ~0x1, 0x00);
/* Ensure the controller is running when we exit */ /* Ensure the controller is running when we exit */
if (state->is_cx23885 || state->is_cx231xx) if (is_cx2388x(state) || is_cx231xx(state))
cx25840_and_or(client, 0x803, ~0x10, 0x10); cx25840_and_or(client, 0x803, ~0x10, 0x10);
} }
...@@ -383,7 +383,7 @@ int cx25840_s_clock_freq(struct v4l2_subdev *sd, u32 freq) ...@@ -383,7 +383,7 @@ int cx25840_s_clock_freq(struct v4l2_subdev *sd, u32 freq)
struct cx25840_state *state = to_state(sd); struct cx25840_state *state = to_state(sd);
int retval; int retval;
if (!state->is_cx25836) if (!is_cx2583x(state))
cx25840_and_or(client, 0x810, ~0x1, 1); cx25840_and_or(client, 0x810, ~0x1, 1);
if (state->aud_input != CX25840_AUDIO_SERIAL) { if (state->aud_input != CX25840_AUDIO_SERIAL) {
cx25840_and_or(client, 0x803, ~0x10, 0); cx25840_and_or(client, 0x803, ~0x10, 0);
...@@ -392,7 +392,7 @@ int cx25840_s_clock_freq(struct v4l2_subdev *sd, u32 freq) ...@@ -392,7 +392,7 @@ int cx25840_s_clock_freq(struct v4l2_subdev *sd, u32 freq)
retval = set_audclk_freq(client, freq); retval = set_audclk_freq(client, freq);
if (state->aud_input != CX25840_AUDIO_SERIAL) if (state->aud_input != CX25840_AUDIO_SERIAL)
cx25840_and_or(client, 0x803, ~0x10, 0x10); cx25840_and_or(client, 0x803, ~0x10, 0x10);
if (!state->is_cx25836) if (!is_cx2583x(state))
cx25840_and_or(client, 0x810, ~0x1, 0); cx25840_and_or(client, 0x810, ~0x1, 0);
return retval; return retval;
} }
......
...@@ -494,7 +494,7 @@ void cx25840_std_setup(struct i2c_client *client) ...@@ -494,7 +494,7 @@ void cx25840_std_setup(struct i2c_client *client)
} }
/* DEBUG: Displays configured PLL frequency */ /* DEBUG: Displays configured PLL frequency */
if (!state->is_cx231xx) { if (!is_cx231xx(state)) {
pll_int = cx25840_read(client, 0x108); pll_int = cx25840_read(client, 0x108);
pll_frac = cx25840_read4(client, 0x10c) & 0x1ffffff; pll_frac = cx25840_read4(client, 0x10c) & 0x1ffffff;
pll_post = cx25840_read(client, 0x109); pll_post = cx25840_read(client, 0x109);
...@@ -678,7 +678,7 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp ...@@ -678,7 +678,7 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
* configuration in reg (for the cx23885) so we have no * configuration in reg (for the cx23885) so we have no
* need to attempt to flip bits for earlier av decoders. * need to attempt to flip bits for earlier av decoders.
*/ */
if (!state->is_cx23885 && !state->is_cx231xx) { if (!is_cx2388x(state) && !is_cx231xx(state)) {
switch (aud_input) { switch (aud_input) {
case CX25840_AUDIO_SERIAL: case CX25840_AUDIO_SERIAL:
/* do nothing, use serial audio input */ /* do nothing, use serial audio input */
...@@ -701,7 +701,7 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp ...@@ -701,7 +701,7 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
/* Set INPUT_MODE to Composite (0) or S-Video (1) */ /* Set INPUT_MODE to Composite (0) or S-Video (1) */
cx25840_and_or(client, 0x401, ~0x6, is_composite ? 0 : 0x02); cx25840_and_or(client, 0x401, ~0x6, is_composite ? 0 : 0x02);
if (!state->is_cx23885 && !state->is_cx231xx) { if (!is_cx2388x(state) && !is_cx231xx(state)) {
/* Set CH_SEL_ADC2 to 1 if input comes from CH3 */ /* Set CH_SEL_ADC2 to 1 if input comes from CH3 */
cx25840_and_or(client, 0x102, ~0x2, (reg & 0x80) == 0 ? 2 : 0); cx25840_and_or(client, 0x102, ~0x2, (reg & 0x80) == 0 ? 2 : 0);
/* Set DUAL_MODE_ADC2 to 1 if input comes from both CH2&CH3 */ /* Set DUAL_MODE_ADC2 to 1 if input comes from both CH2&CH3 */
...@@ -720,12 +720,12 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp ...@@ -720,12 +720,12 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
state->vid_input = vid_input; state->vid_input = vid_input;
state->aud_input = aud_input; state->aud_input = aud_input;
if (!state->is_cx25836) { if (!is_cx2583x(state)) {
cx25840_audio_set_path(client); cx25840_audio_set_path(client);
input_change(client); input_change(client);
} }
if (state->is_cx23885) { if (is_cx2388x(state)) {
/* Audio channel 1 src : Parallel 1 */ /* Audio channel 1 src : Parallel 1 */
cx25840_write(client, 0x124, 0x03); cx25840_write(client, 0x124, 0x03);
...@@ -741,7 +741,7 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp ...@@ -741,7 +741,7 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
*/ */
cx25840_write(client, 0x918, 0xa0); cx25840_write(client, 0x918, 0xa0);
cx25840_write(client, 0x919, 0x01); cx25840_write(client, 0x919, 0x01);
} else if (state->is_cx231xx) { } else if (is_cx231xx(state)) {
/* Audio channel 1 src : Parallel 1 */ /* Audio channel 1 src : Parallel 1 */
cx25840_write(client, 0x124, 0x03); cx25840_write(client, 0x124, 0x03);
...@@ -805,7 +805,7 @@ static int set_v4lstd(struct i2c_client *client) ...@@ -805,7 +805,7 @@ static int set_v4lstd(struct i2c_client *client)
cx25840_and_or(client, 0x400, ~0xf, fmt); cx25840_and_or(client, 0x400, ~0xf, fmt);
cx25840_and_or(client, 0x403, ~0x3, pal_m); cx25840_and_or(client, 0x403, ~0x3, pal_m);
cx25840_std_setup(client); cx25840_std_setup(client);
if (!state->is_cx25836) if (!is_cx2583x(state))
input_change(client); input_change(client);
return 0; return 0;
} }
...@@ -868,7 +868,7 @@ static int cx25840_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl) ...@@ -868,7 +868,7 @@ static int cx25840_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
case V4L2_CID_AUDIO_TREBLE: case V4L2_CID_AUDIO_TREBLE:
case V4L2_CID_AUDIO_BALANCE: case V4L2_CID_AUDIO_BALANCE:
case V4L2_CID_AUDIO_MUTE: case V4L2_CID_AUDIO_MUTE:
if (state->is_cx25836) if (is_cx2583x(state))
return -EINVAL; return -EINVAL;
return cx25840_audio_s_ctrl(sd, ctrl); return cx25840_audio_s_ctrl(sd, ctrl);
...@@ -905,7 +905,7 @@ static int cx25840_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl) ...@@ -905,7 +905,7 @@ static int cx25840_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
case V4L2_CID_AUDIO_TREBLE: case V4L2_CID_AUDIO_TREBLE:
case V4L2_CID_AUDIO_BALANCE: case V4L2_CID_AUDIO_BALANCE:
case V4L2_CID_AUDIO_MUTE: case V4L2_CID_AUDIO_MUTE:
if (state->is_cx25836) if (is_cx2583x(state))
return -EINVAL; return -EINVAL;
return cx25840_audio_g_ctrl(sd, ctrl); return cx25840_audio_g_ctrl(sd, ctrl);
default: default:
...@@ -1209,11 +1209,11 @@ static int cx25840_load_fw(struct v4l2_subdev *sd) ...@@ -1209,11 +1209,11 @@ static int cx25840_load_fw(struct v4l2_subdev *sd)
if (!state->is_initialized) { if (!state->is_initialized) {
/* initialize and load firmware */ /* initialize and load firmware */
state->is_initialized = 1; state->is_initialized = 1;
if (state->is_cx25836) if (is_cx2583x(state))
cx25836_initialize(client); cx25836_initialize(client);
else if (state->is_cx23885) else if (is_cx2388x(state))
cx23885_initialize(client); cx23885_initialize(client);
else if (state->is_cx231xx) else if (is_cx231xx(state))
cx231xx_initialize(client); cx231xx_initialize(client);
else else
cx25840_initialize(client); cx25840_initialize(client);
...@@ -1256,17 +1256,17 @@ static int cx25840_s_stream(struct v4l2_subdev *sd, int enable) ...@@ -1256,17 +1256,17 @@ static int cx25840_s_stream(struct v4l2_subdev *sd, int enable)
v4l_dbg(1, cx25840_debug, client, "%s output\n", v4l_dbg(1, cx25840_debug, client, "%s output\n",
enable ? "enable" : "disable"); enable ? "enable" : "disable");
if (enable) { if (enable) {
if (state->is_cx23885 || state->is_cx231xx) { if (is_cx2388x(state) || is_cx231xx(state)) {
u8 v = (cx25840_read(client, 0x421) | 0x0b); u8 v = (cx25840_read(client, 0x421) | 0x0b);
cx25840_write(client, 0x421, v); cx25840_write(client, 0x421, v);
} else { } else {
cx25840_write(client, 0x115, cx25840_write(client, 0x115,
state->is_cx25836 ? 0x0c : 0x8c); is_cx2583x(state) ? 0x0c : 0x8c);
cx25840_write(client, 0x116, cx25840_write(client, 0x116,
state->is_cx25836 ? 0x04 : 0x07); is_cx2583x(state) ? 0x04 : 0x07);
} }
} else { } else {
if (state->is_cx23885 || state->is_cx231xx) { if (is_cx2388x(state) || is_cx231xx(state)) {
u8 v = cx25840_read(client, 0x421) & ~(0x0b); u8 v = cx25840_read(client, 0x421) & ~(0x0b);
cx25840_write(client, 0x421, v); cx25840_write(client, 0x421, v);
} else { } else {
...@@ -1292,7 +1292,7 @@ static int cx25840_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc) ...@@ -1292,7 +1292,7 @@ static int cx25840_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
default: default:
break; break;
} }
if (state->is_cx25836) if (is_cx2583x(state))
return -EINVAL; return -EINVAL;
switch (qc->id) { switch (qc->id) {
...@@ -1346,7 +1346,7 @@ static int cx25840_s_audio_routing(struct v4l2_subdev *sd, ...@@ -1346,7 +1346,7 @@ static int cx25840_s_audio_routing(struct v4l2_subdev *sd,
struct cx25840_state *state = to_state(sd); struct cx25840_state *state = to_state(sd);
struct i2c_client *client = v4l2_get_subdevdata(sd); struct i2c_client *client = v4l2_get_subdevdata(sd);
if (state->is_cx25836) if (is_cx2583x(state))
return -EINVAL; return -EINVAL;
return set_input(client, state->vid_input, input); return set_input(client, state->vid_input, input);
} }
...@@ -1356,7 +1356,7 @@ static int cx25840_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *fr ...@@ -1356,7 +1356,7 @@ static int cx25840_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *fr
struct cx25840_state *state = to_state(sd); struct cx25840_state *state = to_state(sd);
struct i2c_client *client = v4l2_get_subdevdata(sd); struct i2c_client *client = v4l2_get_subdevdata(sd);
if (!state->is_cx25836) if (!is_cx2583x(state))
input_change(client); input_change(client);
return 0; return 0;
} }
...@@ -1373,7 +1373,7 @@ static int cx25840_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt) ...@@ -1373,7 +1373,7 @@ static int cx25840_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
return 0; return 0;
vt->signal = vpres ? 0xffff : 0x0; vt->signal = vpres ? 0xffff : 0x0;
if (state->is_cx25836) if (is_cx2583x(state))
return 0; return 0;
vt->capability |= vt->capability |=
...@@ -1404,7 +1404,7 @@ static int cx25840_s_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt) ...@@ -1404,7 +1404,7 @@ static int cx25840_s_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
struct cx25840_state *state = to_state(sd); struct cx25840_state *state = to_state(sd);
struct i2c_client *client = v4l2_get_subdevdata(sd); struct i2c_client *client = v4l2_get_subdevdata(sd);
if (state->radio || state->is_cx25836) if (state->radio || is_cx2583x(state))
return 0; return 0;
switch (vt->audmode) { switch (vt->audmode) {
...@@ -1445,11 +1445,11 @@ static int cx25840_reset(struct v4l2_subdev *sd, u32 val) ...@@ -1445,11 +1445,11 @@ static int cx25840_reset(struct v4l2_subdev *sd, u32 val)
struct cx25840_state *state = to_state(sd); struct cx25840_state *state = to_state(sd);
struct i2c_client *client = v4l2_get_subdevdata(sd); struct i2c_client *client = v4l2_get_subdevdata(sd);
if (state->is_cx25836) if (is_cx2583x(state))
cx25836_initialize(client); cx25836_initialize(client);
else if (state->is_cx23885) else if (is_cx2388x(state))
cx23885_initialize(client); cx23885_initialize(client);
else if (state->is_cx231xx) else if (is_cx231xx(state))
cx231xx_initialize(client); cx231xx_initialize(client);
else else
cx25840_initialize(client); cx25840_initialize(client);
...@@ -1470,7 +1470,7 @@ static int cx25840_log_status(struct v4l2_subdev *sd) ...@@ -1470,7 +1470,7 @@ static int cx25840_log_status(struct v4l2_subdev *sd)
struct i2c_client *client = v4l2_get_subdevdata(sd); struct i2c_client *client = v4l2_get_subdevdata(sd);
log_video_status(client); log_video_status(client);
if (!state->is_cx25836) if (!is_cx2583x(state))
log_audio_status(client); log_audio_status(client);
return 0; return 0;
} }
...@@ -1594,22 +1594,18 @@ static int cx25840_probe(struct i2c_client *client, ...@@ -1594,22 +1594,18 @@ static int cx25840_probe(struct i2c_client *client,
v4l2_i2c_subdev_init(sd, client, &cx25840_ops); v4l2_i2c_subdev_init(sd, client, &cx25840_ops);
switch (id) { switch (id) {
case V4L2_IDENT_CX23885_AV: case V4L2_IDENT_CX23885_AV:
state->is_cx23885 = 1;
v4l_info(client, "cx23885 A/V decoder found @ 0x%x (%s)\n", v4l_info(client, "cx23885 A/V decoder found @ 0x%x (%s)\n",
client->addr << 1, client->adapter->name); client->addr << 1, client->adapter->name);
break; break;
case V4L2_IDENT_CX23887_AV: case V4L2_IDENT_CX23887_AV:
state->is_cx23885 = 1;
v4l_info(client, "cx23887 A/V decoder found @ 0x%x (%s)\n", v4l_info(client, "cx23887 A/V decoder found @ 0x%x (%s)\n",
client->addr << 1, client->adapter->name); client->addr << 1, client->adapter->name);
break; break;
case V4L2_IDENT_CX23888_AV: case V4L2_IDENT_CX23888_AV:
state->is_cx23885 = 1;
v4l_info(client, "cx23888 A/V decoder found @ 0x%x (%s)\n", v4l_info(client, "cx23888 A/V decoder found @ 0x%x (%s)\n",
client->addr << 1, client->adapter->name); client->addr << 1, client->adapter->name);
break; break;
case V4L2_IDENT_CX2310X_AV: case V4L2_IDENT_CX2310X_AV:
state->is_cx231xx = 1;
v4l_info(client, "cx%d A/V decoder found @ 0x%x (%s)\n", v4l_info(client, "cx%d A/V decoder found @ 0x%x (%s)\n",
device_id, client->addr << 1, client->adapter->name); device_id, client->addr << 1, client->adapter->name);
break; break;
...@@ -1627,7 +1623,6 @@ static int cx25840_probe(struct i2c_client *client, ...@@ -1627,7 +1623,6 @@ static int cx25840_probe(struct i2c_client *client,
break; break;
case V4L2_IDENT_CX25836: case V4L2_IDENT_CX25836:
case V4L2_IDENT_CX25837: case V4L2_IDENT_CX25837:
state->is_cx25836 = 1;
default: default:
v4l_info(client, "cx25%3x-%x found @ 0x%x (%s)\n", v4l_info(client, "cx25%3x-%x found @ 0x%x (%s)\n",
(device_id & 0xfff0) >> 4, device_id & 0x0f, (device_id & 0xfff0) >> 4, device_id & 0x0f,
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <media/v4l2-device.h> #include <media/v4l2-device.h>
#include <media/v4l2-chip-ident.h>
#include <linux/i2c.h> #include <linux/i2c.h>
/* ENABLE_PVR150_WORKAROUND activates a workaround for a hardware bug that is /* ENABLE_PVR150_WORKAROUND activates a workaround for a hardware bug that is
...@@ -48,9 +49,6 @@ struct cx25840_state { ...@@ -48,9 +49,6 @@ struct cx25840_state {
int vbi_line_offset; int vbi_line_offset;
u32 id; u32 id;
u32 rev; u32 rev;
int is_cx25836;
int is_cx23885;
int is_cx231xx;
int is_initialized; int is_initialized;
wait_queue_head_t fw_wait; /* wake up when the fw load is finished */ wait_queue_head_t fw_wait; /* wake up when the fw load is finished */
struct work_struct fw_work; /* work entry for fw load */ struct work_struct fw_work; /* work entry for fw load */
...@@ -61,6 +59,24 @@ static inline struct cx25840_state *to_state(struct v4l2_subdev *sd) ...@@ -61,6 +59,24 @@ static inline struct cx25840_state *to_state(struct v4l2_subdev *sd)
return container_of(sd, struct cx25840_state, sd); return container_of(sd, struct cx25840_state, sd);
} }
static inline bool is_cx2583x(struct cx25840_state *state)
{
return state->id == V4L2_IDENT_CX25836 ||
state->id == V4L2_IDENT_CX25837;
}
static inline bool is_cx231xx(struct cx25840_state *state)
{
return state->id == V4L2_IDENT_CX2310X_AV;
}
static inline bool is_cx2388x(struct cx25840_state *state)
{
return state->id == V4L2_IDENT_CX23885_AV ||
state->id == V4L2_IDENT_CX23887_AV ||
state->id == V4L2_IDENT_CX23888_AV;
}
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
/* cx25850-core.c */ /* cx25850-core.c */
int cx25840_write(struct i2c_client *client, u16 addr, u8 value); int cx25840_write(struct i2c_client *client, u16 addr, u8 value);
......
...@@ -67,9 +67,9 @@ static const char *get_fw_name(struct i2c_client *client) ...@@ -67,9 +67,9 @@ static const char *get_fw_name(struct i2c_client *client)
if (firmware[0]) if (firmware[0])
return firmware; return firmware;
if (state->is_cx23885) if (is_cx2388x(state))
return "v4l-cx23885-avcore-01.fw"; return "v4l-cx23885-avcore-01.fw";
if (state->is_cx231xx) if (is_cx231xx(state))
return "v4l-cx231xx-avcore-01.fw"; return "v4l-cx231xx-avcore-01.fw";
return "v4l-cx25840.fw"; return "v4l-cx25840.fw";
} }
...@@ -112,13 +112,13 @@ int cx25840_loadfw(struct i2c_client *client) ...@@ -112,13 +112,13 @@ int cx25840_loadfw(struct i2c_client *client)
int MAX_BUF_SIZE = FWSEND; int MAX_BUF_SIZE = FWSEND;
u32 gpio_oe = 0, gpio_da = 0; u32 gpio_oe = 0, gpio_da = 0;
if (state->is_cx23885) { if (is_cx2388x(state)) {
/* Preserve the GPIO OE and output bits */ /* Preserve the GPIO OE and output bits */
gpio_oe = cx25840_read(client, 0x160); gpio_oe = cx25840_read(client, 0x160);
gpio_da = cx25840_read(client, 0x164); gpio_da = cx25840_read(client, 0x164);
} }
if ((state->is_cx231xx) && MAX_BUF_SIZE > 16) { if (is_cx231xx(state) && MAX_BUF_SIZE > 16) {
v4l_err(client, " Firmware download size changed to 16 bytes max length\n"); v4l_err(client, " Firmware download size changed to 16 bytes max length\n");
MAX_BUF_SIZE = 16; /* cx231xx cannot accept more than 16 bytes at a time */ MAX_BUF_SIZE = 16; /* cx231xx cannot accept more than 16 bytes at a time */
} }
...@@ -156,7 +156,7 @@ int cx25840_loadfw(struct i2c_client *client) ...@@ -156,7 +156,7 @@ int cx25840_loadfw(struct i2c_client *client)
size = fw->size; size = fw->size;
release_firmware(fw); release_firmware(fw);
if (state->is_cx23885) { if (is_cx2388x(state)) {
/* Restore GPIO configuration after f/w load */ /* Restore GPIO configuration after f/w load */
cx25840_write(client, 0x160, gpio_oe); cx25840_write(client, 0x160, gpio_oe);
cx25840_write(client, 0x164, gpio_da); cx25840_write(client, 0x164, gpio_da);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册