diff options
Diffstat (limited to 'drivers/media/video/msp3400-kthreads.c')
-rw-r--r-- | drivers/media/video/msp3400-kthreads.c | 40 |
1 files changed, 15 insertions, 25 deletions
diff --git a/drivers/media/video/msp3400-kthreads.c b/drivers/media/video/msp3400-kthreads.c index 4ecbf56b008..14a425a6ff8 100644 --- a/drivers/media/video/msp3400-kthreads.c +++ b/drivers/media/video/msp3400-kthreads.c | |||
@@ -209,24 +209,10 @@ void msp3400c_setmode(struct i2c_client *client, int type) | |||
209 | } | 209 | } |
210 | } | 210 | } |
211 | 211 | ||
212 | /* given a bitmask of VIDEO_SOUND_XXX returns the "best" in the bitmask */ | ||
213 | static int msp3400c_best_video_sound(int rxsubchans) | ||
214 | { | ||
215 | if (rxsubchans & V4L2_TUNER_SUB_STEREO) | ||
216 | return V4L2_TUNER_MODE_STEREO; | ||
217 | if (rxsubchans & V4L2_TUNER_SUB_LANG1) | ||
218 | return V4L2_TUNER_MODE_LANG1; | ||
219 | if (rxsubchans & V4L2_TUNER_SUB_LANG2) | ||
220 | return V4L2_TUNER_MODE_LANG2; | ||
221 | return V4L2_TUNER_MODE_MONO; | ||
222 | } | ||
223 | |||
224 | /* turn on/off nicam + stereo */ | 212 | /* turn on/off nicam + stereo */ |
225 | void msp3400c_setstereo(struct i2c_client *client, int mode) | 213 | void msp3400c_setstereo(struct i2c_client *client, int mode) |
226 | { | 214 | { |
227 | static char *strmode[] = { "0", "mono", "stereo", "3", | 215 | static char *strmode[] = { "mono", "stereo", "lang2", "lang1" }; |
228 | "lang1", "5", "6", "7", "lang2" | ||
229 | }; | ||
230 | struct msp_state *state = i2c_get_clientdata(client); | 216 | struct msp_state *state = i2c_get_clientdata(client); |
231 | int nicam = 0; /* channel source: FM/AM or nicam */ | 217 | int nicam = 0; /* channel source: FM/AM or nicam */ |
232 | int src = 0; | 218 | int src = 0; |
@@ -244,7 +230,7 @@ void msp3400c_setstereo(struct i2c_client *client, int mode) | |||
244 | switch (state->mode) { | 230 | switch (state->mode) { |
245 | case MSP_MODE_FM_TERRA: | 231 | case MSP_MODE_FM_TERRA: |
246 | v4l_dbg(1, client, "FM setstereo: %s\n", strmode[mode]); | 232 | v4l_dbg(1, client, "FM setstereo: %s\n", strmode[mode]); |
247 | msp3400c_setcarrier(client,state->second,state->main); | 233 | msp3400c_setcarrier(client, state->second, state->main); |
248 | switch (mode) { | 234 | switch (mode) { |
249 | case V4L2_TUNER_MODE_STEREO: | 235 | case V4L2_TUNER_MODE_STEREO: |
250 | msp_write_dsp(client, 0x000e, 0x3001); | 236 | msp_write_dsp(client, 0x000e, 0x3001); |
@@ -298,7 +284,7 @@ void msp3400c_setstereo(struct i2c_client *client, int mode) | |||
298 | } | 284 | } |
299 | 285 | ||
300 | /* switch audio */ | 286 | /* switch audio */ |
301 | switch (msp3400c_best_video_sound(mode)) { | 287 | switch (mode) { |
302 | case V4L2_TUNER_MODE_STEREO: | 288 | case V4L2_TUNER_MODE_STEREO: |
303 | src = 0x0020 | nicam; | 289 | src = 0x0020 | nicam; |
304 | break; | 290 | break; |
@@ -330,6 +316,9 @@ void msp3400c_setstereo(struct i2c_client *client, int mode) | |||
330 | msp_write_dsp(client, 0x0009, src); | 316 | msp_write_dsp(client, 0x0009, src); |
331 | msp_write_dsp(client, 0x000a, src); | 317 | msp_write_dsp(client, 0x000a, src); |
332 | msp_write_dsp(client, 0x000b, src); | 318 | msp_write_dsp(client, 0x000b, src); |
319 | msp_write_dsp(client, 0x000c, src); | ||
320 | if (state->has_scart23_in_scart2_out) | ||
321 | msp_write_dsp(client, 0x0041, src); | ||
333 | } | 322 | } |
334 | } | 323 | } |
335 | 324 | ||
@@ -455,9 +444,9 @@ static void watch_stereo(struct i2c_client *client) | |||
455 | struct msp_state *state = i2c_get_clientdata(client); | 444 | struct msp_state *state = i2c_get_clientdata(client); |
456 | 445 | ||
457 | if (autodetect_stereo(client)) { | 446 | if (autodetect_stereo(client)) { |
458 | if (state->stereo & V4L2_TUNER_MODE_STEREO) | 447 | if (state->rxsubchans & V4L2_TUNER_SUB_STEREO) |
459 | msp3400c_setstereo(client, V4L2_TUNER_MODE_STEREO); | 448 | msp3400c_setstereo(client, V4L2_TUNER_MODE_STEREO); |
460 | else if (state->stereo & VIDEO_SOUND_LANG1) | 449 | else if (state->rxsubchans & V4L2_TUNER_SUB_LANG1) |
461 | msp3400c_setstereo(client, V4L2_TUNER_MODE_LANG1); | 450 | msp3400c_setstereo(client, V4L2_TUNER_MODE_LANG1); |
462 | else | 451 | else |
463 | msp3400c_setstereo(client, V4L2_TUNER_MODE_MONO); | 452 | msp3400c_setstereo(client, V4L2_TUNER_MODE_MONO); |
@@ -657,7 +646,7 @@ int msp3410d_thread(void *data) | |||
657 | { | 646 | { |
658 | struct i2c_client *client = data; | 647 | struct i2c_client *client = data; |
659 | struct msp_state *state = i2c_get_clientdata(client); | 648 | struct msp_state *state = i2c_get_clientdata(client); |
660 | int mode,val,i,std; | 649 | int val, i, std; |
661 | 650 | ||
662 | v4l_dbg(1, client, "msp3410 daemon started\n"); | 651 | v4l_dbg(1, client, "msp3410 daemon started\n"); |
663 | 652 | ||
@@ -687,10 +676,11 @@ int msp3410d_thread(void *data) | |||
687 | goto restart; | 676 | goto restart; |
688 | 677 | ||
689 | /* start autodetect */ | 678 | /* start autodetect */ |
690 | mode = msp_modus(client); | 679 | std = 1; |
691 | std = (state->std & V4L2_STD_NTSC) ? 0x20 : 1; | 680 | if (state->std & V4L2_STD_NTSC) |
692 | msp_write_dem(client, 0x30, mode); | 681 | std = 0x20; |
693 | msp_write_dem(client, 0x20, std); | 682 | else |
683 | msp_write_dem(client, 0x20, std); | ||
694 | state->watch_stereo = 0; | 684 | state->watch_stereo = 0; |
695 | 685 | ||
696 | if (debug) | 686 | if (debug) |
@@ -703,7 +693,7 @@ int msp3410d_thread(void *data) | |||
703 | } else { | 693 | } else { |
704 | /* triggered autodetect */ | 694 | /* triggered autodetect */ |
705 | for (;;) { | 695 | for (;;) { |
706 | if (msp_sleep(state,100)) | 696 | if (msp_sleep(state, 100)) |
707 | goto restart; | 697 | goto restart; |
708 | 698 | ||
709 | /* check results */ | 699 | /* check results */ |