aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorHans Verkuil <hverkuil@xs4all.nl>2006-01-09 15:21:32 -0500
committerMauro Carvalho Chehab <mchehab@brturbo.com.br>2006-01-09 15:21:32 -0500
commit7560d7a4f9add362d60d4513033cf522c37adeea (patch)
treeca408b9b374f641373f57650bd5f462a64b810fe /drivers
parent3d7d027a9bf41437aa93baf14a1aada521ad9b12 (diff)
V4L/DVB (3317): msp3400: use v4l2_std_id and determine chip capabilities.
- Replace old norm by the v4l2_std_id values. - Add code to correctly detect the various capabilities of the various msp chips. It's not yet used, that's going to be the next step. Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/msp3400-driver.c120
-rw-r--r--drivers/media/video/msp3400-kthreads.c33
-rw-r--r--drivers/media/video/msp3400.h23
3 files changed, 98 insertions, 78 deletions
diff --git a/drivers/media/video/msp3400-driver.c b/drivers/media/video/msp3400-driver.c
index fbd85120c331..0c2ab7e9d1cc 100644
--- a/drivers/media/video/msp3400-driver.c
+++ b/drivers/media/video/msp3400-driver.c
@@ -312,10 +312,16 @@ void msp_set_audio(struct i2c_client *client)
312 msp_write_dsp(client, 0x0003, treble); /* loudspeaker */ 312 msp_write_dsp(client, 0x0003, treble); /* loudspeaker */
313} 313}
314 314
315int msp_modus(struct i2c_client *client, int norm) 315int msp_modus(struct i2c_client *client)
316{ 316{
317 switch (norm) { 317 struct msp_state *state = i2c_get_clientdata(client);
318 case VIDEO_MODE_PAL: 318
319 if (state->radio) {
320 v4l_dbg(1, client, "video mode selected to Radio\n");
321 return 0x0003;
322 }
323
324 if (state->std & V4L2_STD_PAL) {
319 v4l_dbg(1, client, "video mode selected to PAL\n"); 325 v4l_dbg(1, client, "video mode selected to PAL\n");
320 326
321#if 1 327#if 1
@@ -325,37 +331,16 @@ int msp_modus(struct i2c_client *client, int norm)
325 /* previous value, try this if it breaks ... */ 331 /* previous value, try this if it breaks ... */
326 return 0x1003; 332 return 0x1003;
327#endif 333#endif
328 case VIDEO_MODE_NTSC: /* BTSC */ 334 }
335 if (state->std & V4L2_STD_NTSC) {
329 v4l_dbg(1, client, "video mode selected to NTSC\n"); 336 v4l_dbg(1, client, "video mode selected to NTSC\n");
330 return 0x2003; 337 return 0x2003;
331 case VIDEO_MODE_SECAM: 338 }
339 if (state->std & V4L2_STD_SECAM) {
332 v4l_dbg(1, client, "video mode selected to SECAM\n"); 340 v4l_dbg(1, client, "video mode selected to SECAM\n");
333 return 0x0003; 341 return 0x0003;
334 case VIDEO_MODE_RADIO:
335 v4l_dbg(1, client, "video mode selected to Radio\n");
336 return 0x0003;
337 case VIDEO_MODE_AUTO:
338 v4l_dbg(1, client, "video mode selected to Auto\n");
339 return 0x2003;
340 default:
341 return 0x0003;
342 }
343}
344
345int msp_standard(int norm)
346{
347 switch (norm) {
348 case VIDEO_MODE_PAL:
349 return 1;
350 case VIDEO_MODE_NTSC: /* BTSC */
351 return 0x0020;
352 case VIDEO_MODE_SECAM:
353 return 1;
354 case VIDEO_MODE_RADIO:
355 return 0x0040;
356 default:
357 return 1;
358 } 342 }
343 return 0x0003;
359} 344}
360 345
361/* ------------------------------------------------------------------------ */ 346/* ------------------------------------------------------------------------ */
@@ -617,7 +602,7 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
617 break; 602 break;
618 603
619 case AUDC_SET_RADIO: 604 case AUDC_SET_RADIO:
620 state->norm = VIDEO_MODE_RADIO; 605 state->radio = 1;
621 v4l_dbg(1, client, "switching to radio mode\n"); 606 v4l_dbg(1, client, "switching to radio mode\n");
622 state->watch_stereo = 0; 607 state->watch_stereo = 0;
623 switch (state->opmode) { 608 switch (state->opmode) {
@@ -673,7 +658,7 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
673 state->treble = va->treble; 658 state->treble = va->treble;
674 msp_set_audio(client); 659 msp_set_audio(client);
675 660
676 if (va->mode != 0 && state->norm != VIDEO_MODE_RADIO) 661 if (va->mode != 0 && state->radio == 0)
677 msp_any_set_audmode(client, msp_mode_v4l1_to_v4l2(va->mode)); 662 msp_any_set_audmode(client, msp_mode_v4l1_to_v4l2(va->mode));
678 break; 663 break;
679 } 664 }
@@ -682,7 +667,13 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
682 { 667 {
683 struct video_channel *vc = arg; 668 struct video_channel *vc = arg;
684 669
685 state->norm = vc->norm; 670 state->radio = 0;
671 if (vc->norm == VIDEO_MODE_PAL)
672 state->std = V4L2_STD_PAL;
673 else if (vc->norm == VIDEO_MODE_SECAM)
674 state->std = V4L2_STD_SECAM;
675 else
676 state->std = V4L2_STD_NTSC;
686 msp_wake_thread(client); 677 msp_wake_thread(client);
687 break; 678 break;
688 } 679 }
@@ -709,15 +700,8 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
709 { 700 {
710 v4l2_std_id *id = arg; 701 v4l2_std_id *id = arg;
711 702
712 /*FIXME: use V4L2 mode flags on msp3400 instead of V4L1*/ 703 state->std = *id;
713 if (*id & V4L2_STD_PAL) { 704 state->radio = 0;
714 state->norm = VIDEO_MODE_PAL;
715 } else if (*id & V4L2_STD_SECAM) {
716 state->norm = VIDEO_MODE_SECAM;
717 } else {
718 state->norm = VIDEO_MODE_NTSC;
719 }
720
721 msp_wake_thread(client); 705 msp_wake_thread(client);
722 return 0; 706 return 0;
723 } 707 }
@@ -965,6 +949,11 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind)
965 struct i2c_client *client; 949 struct i2c_client *client;
966 struct msp_state *state; 950 struct msp_state *state;
967 int (*thread_func)(void *data) = NULL; 951 int (*thread_func)(void *data) = NULL;
952 int msp_hard;
953 int msp_family;
954 int msp_revision;
955 int msp_product, msp_prod_hi, msp_prod_lo;
956 int msp_rom;
968 957
969 client = kmalloc(sizeof(*client), GFP_KERNEL); 958 client = kmalloc(sizeof(*client), GFP_KERNEL);
970 if (client == NULL) 959 if (client == NULL)
@@ -989,7 +978,7 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind)
989 i2c_set_clientdata(client, state); 978 i2c_set_clientdata(client, state);
990 979
991 memset(state, 0, sizeof(*state)); 980 memset(state, 0, sizeof(*state));
992 state->norm = VIDEO_MODE_NTSC; 981 state->std = V4L2_STD_NTSC;
993 state->volume = 58880; /* 0db gain */ 982 state->volume = 58880; /* 0db gain */
994 state->balance = 32768; /* 0db gain */ 983 state->balance = 32768; /* 0db gain */
995 state->bass = 32768; 984 state->bass = 32768;
@@ -1012,20 +1001,45 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind)
1012 1001
1013 msp_set_audio(client); 1002 msp_set_audio(client);
1014 1003
1015 snprintf(client->name, sizeof(client->name), "MSP%c4%02d%c-%c%d", 1004 msp_family = ((state->rev1 >> 4) & 0x0f) + 3;
1016 ((state->rev1 >> 4) & 0x0f) + '3', 1005 msp_product = (state->rev2 >> 8) & 0xff;
1017 (state->rev2 >> 8) & 0xff, 1006 msp_prod_hi = msp_product / 10;
1018 (state->rev1 & 0x0f) + '@', 1007 msp_prod_lo = msp_product % 10;
1019 ((state->rev1 >> 8) & 0xff) + '@', 1008 msp_revision = (state->rev1 & 0x0f) + '@';
1020 state->rev2 & 0x1f); 1009 msp_hard = ((state->rev1 >> 8) & 0xff) + '@';
1010 msp_rom = state->rev2 & 0x1f;
1011 snprintf(client->name, sizeof(client->name), "MSP%d4%02d%c-%c%d",
1012 msp_family, msp_product,
1013 msp_revision, msp_hard, msp_rom);
1014
1015 /* Has NICAM support: all mspx41x and mspx45x products have NICAM */
1016 state->has_nicam = msp_prod_hi == 1 || msp_prod_hi == 5;
1017 /* Has radio support: was added with revision G */
1018 state->has_radio = msp_revision >= 'G';
1019 /* Has headphones output: not for stripped down products */
1020 state->has_headphones = msp_prod_lo < 5;
1021 /* Has scart4 input: not in pre D revisions, not in stripped D revs */
1022 state->has_scart4 = msp_family >= 4 || (msp_revision >= 'D' && msp_prod_lo < 5);
1023 /* Has scart2 and scart3 inputs and scart2 output: not in stripped
1024 down products of the '3' family */
1025 state->has_scart23_in_scart2_out = msp_family >= 4 || msp_prod_lo < 5;
1026 /* Has subwoofer output: not in pre-D revs and not in stripped down products */
1027 state->has_subwoofer = msp_revision >= 'D' && msp_prod_lo < 5;
1028 /* Has soundprocessing (bass/treble/balance/loudness/equalizer): not in
1029 stripped down products */
1030 state->has_sound_processing = msp_prod_lo < 7;
1031 /* Has Virtual Dolby Surround: only in msp34x1 */
1032 state->has_virtual_dolby_surround = msp_revision == 'G' && msp_prod_lo == 1;
1033 /* Has Virtual Dolby Surround & Dolby Pro Logic: only in msp34x2 */
1034 state->has_dolby_pro_logic = msp_revision == 'G' && msp_prod_lo == 2;
1021 1035
1022 state->opmode = opmode; 1036 state->opmode = opmode;
1023 if (state->opmode == OPMODE_AUTO) { 1037 if (state->opmode == OPMODE_AUTO) {
1024 /* MSP revision G and up have both autodetect and autoselect */ 1038 /* MSP revision G and up have both autodetect and autoselect */
1025 if ((state->rev1 & 0x0f) >= 'G'-'@') 1039 if (msp_revision >= 'G')
1026 state->opmode = OPMODE_AUTOSELECT; 1040 state->opmode = OPMODE_AUTOSELECT;
1027 /* MSP revision D and up have autodetect */ 1041 /* MSP revision D and up have autodetect */
1028 else if ((state->rev1 & 0x0f) >= 'D'-'@') 1042 else if (msp_revision >= 'D')
1029 state->opmode = OPMODE_AUTODETECT; 1043 state->opmode = OPMODE_AUTODETECT;
1030 else 1044 else
1031 state->opmode = OPMODE_MANUAL; 1045 state->opmode = OPMODE_MANUAL;
@@ -1034,11 +1048,11 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind)
1034 /* hello world :-) */ 1048 /* hello world :-) */
1035 v4l_info(client, "%s found @ 0x%x (%s)\n", client->name, address << 1, adapter->name); 1049 v4l_info(client, "%s found @ 0x%x (%s)\n", client->name, address << 1, adapter->name);
1036 v4l_info(client, "%s ", client->name); 1050 v4l_info(client, "%s ", client->name);
1037 if (HAVE_NICAM(state) && HAVE_RADIO(state)) 1051 if (state->has_nicam && state->has_radio)
1038 printk("supports nicam and radio, "); 1052 printk("supports nicam and radio, ");
1039 else if (HAVE_NICAM(state)) 1053 else if (state->has_nicam)
1040 printk("supports nicam, "); 1054 printk("supports nicam, ");
1041 else if (HAVE_RADIO(state)) 1055 else if (state->has_radio)
1042 printk("supports radio, "); 1056 printk("supports radio, ");
1043 printk("mode is "); 1057 printk("mode is ");
1044 1058
diff --git a/drivers/media/video/msp3400-kthreads.c b/drivers/media/video/msp3400-kthreads.c
index 934f0d3b9138..4ecbf56b008e 100644
--- a/drivers/media/video/msp3400-kthreads.c
+++ b/drivers/media/video/msp3400-kthreads.c
@@ -203,7 +203,7 @@ void msp3400c_setmode(struct i2c_client *client, int type)
203 msp_write_dsp(client, 0x000a, msp3400c_init_data[type].dsp_src); 203 msp_write_dsp(client, 0x000a, msp3400c_init_data[type].dsp_src);
204 msp_write_dsp(client, 0x000e, msp3400c_init_data[type].dsp_matrix); 204 msp_write_dsp(client, 0x000e, msp3400c_init_data[type].dsp_matrix);
205 205
206 if (HAVE_NICAM(state)) { 206 if (state->has_nicam) {
207 /* nicam prescale */ 207 /* nicam prescale */
208 msp_write_dsp(client, 0x0010, 0x5a00); /* was: 0x3000 */ 208 msp_write_dsp(client, 0x0010, 0x5a00); /* was: 0x3000 */
209 } 209 }
@@ -487,8 +487,7 @@ int msp3400c_thread(void *data)
487 if (kthread_should_stop()) 487 if (kthread_should_stop())
488 break; 488 break;
489 489
490 if (VIDEO_MODE_RADIO == state->norm || 490 if (state->radio || MSP_MODE_EXTERN == state->mode) {
491 MSP_MODE_EXTERN == state->mode) {
492 /* no carrier scan, just unmute */ 491 /* no carrier scan, just unmute */
493 v4l_dbg(1, client, "thread: no carrier scan\n"); 492 v4l_dbg(1, client, "thread: no carrier scan\n");
494 msp_set_audio(client); 493 msp_set_audio(client);
@@ -510,7 +509,7 @@ int msp3400c_thread(void *data)
510 cd = msp3400c_carrier_detect_main; 509 cd = msp3400c_carrier_detect_main;
511 count = ARRAY_SIZE(msp3400c_carrier_detect_main); 510 count = ARRAY_SIZE(msp3400c_carrier_detect_main);
512 511
513 if (amsound && (state->norm == VIDEO_MODE_SECAM)) { 512 if (amsound && (state->std & V4L2_STD_SECAM)) {
514 /* autodetect doesn't work well with AM ... */ 513 /* autodetect doesn't work well with AM ... */
515 max1 = 3; 514 max1 = 3;
516 count = 0; 515 count = 0;
@@ -547,7 +546,7 @@ int msp3400c_thread(void *data)
547 break; 546 break;
548 } 547 }
549 548
550 if (amsound && (state->norm == VIDEO_MODE_SECAM)) { 549 if (amsound && (state->std & V4L2_STD_SECAM)) {
551 /* autodetect doesn't work well with AM ... */ 550 /* autodetect doesn't work well with AM ... */
552 cd = NULL; 551 cd = NULL;
553 count = 0; 552 count = 0;
@@ -576,7 +575,7 @@ int msp3400c_thread(void *data)
576 state->nicam_on = 0; 575 state->nicam_on = 0;
577 msp3400c_setstereo(client, V4L2_TUNER_MODE_MONO); 576 msp3400c_setstereo(client, V4L2_TUNER_MODE_MONO);
578 state->watch_stereo = 1; 577 state->watch_stereo = 1;
579 } else if (max2 == 1 && HAVE_NICAM(state)) { 578 } else if (max2 == 1 && state->has_nicam) {
580 /* B/G NICAM */ 579 /* B/G NICAM */
581 state->second = msp3400c_carrier_detect_55[max2].cdo; 580 state->second = msp3400c_carrier_detect_55[max2].cdo;
582 msp3400c_setmode(client, MSP_MODE_FM_NICAM1); 581 msp3400c_setmode(client, MSP_MODE_FM_NICAM1);
@@ -603,8 +602,7 @@ int msp3400c_thread(void *data)
603 state->nicam_on = 0; 602 state->nicam_on = 0;
604 msp3400c_setstereo(client, V4L2_TUNER_MODE_MONO); 603 msp3400c_setstereo(client, V4L2_TUNER_MODE_MONO);
605 state->watch_stereo = 1; 604 state->watch_stereo = 1;
606 } else if (max2 == 0 && 605 } else if (max2 == 0 && (state->std & V4L2_STD_SECAM)) {
607 state->norm == VIDEO_MODE_SECAM) {
608 /* L NICAM or AM-mono */ 606 /* L NICAM or AM-mono */
609 state->second = msp3400c_carrier_detect_65[max2].cdo; 607 state->second = msp3400c_carrier_detect_65[max2].cdo;
610 msp3400c_setmode(client, MSP_MODE_AM_NICAM); 608 msp3400c_setmode(client, MSP_MODE_AM_NICAM);
@@ -614,7 +612,7 @@ int msp3400c_thread(void *data)
614 /* volume prescale for SCART (AM mono input) */ 612 /* volume prescale for SCART (AM mono input) */
615 msp_write_dsp(client, 0x000d, 0x1900); 613 msp_write_dsp(client, 0x000d, 0x1900);
616 state->watch_stereo = 1; 614 state->watch_stereo = 1;
617 } else if (max2 == 0 && HAVE_NICAM(state)) { 615 } else if (max2 == 0 && state->has_nicam) {
618 /* D/K NICAM */ 616 /* D/K NICAM */
619 state->second = msp3400c_carrier_detect_65[max2].cdo; 617 state->second = msp3400c_carrier_detect_65[max2].cdo;
620 msp3400c_setmode(client, MSP_MODE_FM_NICAM1); 618 msp3400c_setmode(client, MSP_MODE_FM_NICAM1);
@@ -689,8 +687,8 @@ int msp3410d_thread(void *data)
689 goto restart; 687 goto restart;
690 688
691 /* start autodetect */ 689 /* start autodetect */
692 mode = msp_modus(client, state->norm); 690 mode = msp_modus(client);
693 std = msp_standard(state->norm); 691 std = (state->std & V4L2_STD_NTSC) ? 0x20 : 1;
694 msp_write_dem(client, 0x30, mode); 692 msp_write_dem(client, 0x30, mode);
695 msp_write_dem(client, 0x20, std); 693 msp_write_dem(client, 0x20, std);
696 state->watch_stereo = 0; 694 state->watch_stereo = 0;
@@ -723,7 +721,7 @@ int msp3410d_thread(void *data)
723 state->main = msp_modelist[i].main; 721 state->main = msp_modelist[i].main;
724 state->second = msp_modelist[i].second; 722 state->second = msp_modelist[i].second;
725 723
726 if (amsound && (state->norm == VIDEO_MODE_SECAM) && (val != 0x0009)) { 724 if (amsound && (state->std & V4L2_STD_SECAM) && (val != 0x0009)) {
727 /* autodetection has failed, let backup */ 725 /* autodetection has failed, let backup */
728 v4l_dbg(1, client, "autodetection failed," 726 v4l_dbg(1, client, "autodetection failed,"
729 " switching to backup mode: %s (0x%04x)\n", 727 " switching to backup mode: %s (0x%04x)\n",
@@ -767,12 +765,12 @@ int msp3410d_thread(void *data)
767 msp3400c_setstereo(client,V4L2_TUNER_MODE_STEREO); 765 msp3400c_setstereo(client,V4L2_TUNER_MODE_STEREO);
768 break; 766 break;
769 case 0x0040: /* FM radio */ 767 case 0x0040: /* FM radio */
770 state->mode = MSP_MODE_FM_RADIO; 768 state->mode = MSP_MODE_FM_RADIO;
771 state->rxsubchans = V4L2_TUNER_SUB_STEREO; 769 state->rxsubchans = V4L2_TUNER_SUB_STEREO;
772 state->audmode = V4L2_TUNER_MODE_STEREO; 770 state->audmode = V4L2_TUNER_MODE_STEREO;
773 state->nicam_on = 0; 771 state->nicam_on = 0;
774 state->watch_stereo = 0; 772 state->watch_stereo = 0;
775 /* not needed in theory if HAVE_RADIO(), but 773 /* not needed in theory if we have radio, but
776 short programming enables carrier mute */ 774 short programming enables carrier mute */
777 msp3400c_setmode(client,MSP_MODE_FM_RADIO); 775 msp3400c_setmode(client,MSP_MODE_FM_RADIO);
778 msp3400c_setcarrier(client, MSP_CARRIER(10.7), 776 msp3400c_setcarrier(client, MSP_CARRIER(10.7),
@@ -872,8 +870,11 @@ static int msp34xxg_reset(struct i2c_client *client)
872 msp_write_dem(client, 0x40, state->i2s_mode); 870 msp_write_dem(client, 0x40, state->i2s_mode);
873 871
874 /* step-by-step initialisation, as described in the manual */ 872 /* step-by-step initialisation, as described in the manual */
875 modus = msp_modus(client, state->norm); 873 modus = msp_modus(client);
876 std = msp_standard(state->norm); 874 if (state->radio)
875 std = 0x40;
876 else
877 std = (state->std & V4L2_STD_NTSC) ? 0x20 : 1;
877 modus &= ~0x03; /* STATUS_CHANGE = 0 */ 878 modus &= ~0x03; /* STATUS_CHANGE = 0 */
878 modus |= 0x01; /* AUTOMATIC_SOUND_DETECTION = 1 */ 879 modus |= 0x01; /* AUTOMATIC_SOUND_DETECTION = 1 */
879 if (msp_write_dem(client, 0x30, modus)) 880 if (msp_write_dem(client, 0x30, modus))
diff --git a/drivers/media/video/msp3400.h b/drivers/media/video/msp3400.h
index a88a22e37e64..70327506f895 100644
--- a/drivers/media/video/msp3400.h
+++ b/drivers/media/video/msp3400.h
@@ -57,10 +57,21 @@ extern int stereo_threshold;
57 57
58struct msp_state { 58struct msp_state {
59 int rev1, rev2; 59 int rev1, rev2;
60 60 int has_nicam;
61 int has_radio;
62 int has_headphones;
63 int has_ntsc_jp_d_k3;
64 int has_scart4;
65 int has_scart23_in_scart2_out;
66 int has_subwoofer;
67 int has_sound_processing;
68 int has_virtual_dolby_surround;
69 int has_dolby_pro_logic;
70
71 int radio;
61 int opmode; 72 int opmode;
62 int mode; 73 int mode;
63 int norm; 74 v4l2_std_id std;
64 int stereo; 75 int stereo;
65 int nicam_on; 76 int nicam_on;
66 int acb; 77 int acb;
@@ -85,11 +96,6 @@ struct msp_state {
85 int watch_stereo:1; 96 int watch_stereo:1;
86}; 97};
87 98
88#define VIDEO_MODE_RADIO 16 /* norm magic for radio mode */
89
90#define HAVE_NICAM(state) (((state->rev2 >> 8) & 0xff) != 0)
91#define HAVE_RADIO(state) ((state->rev1 & 0x0f) >= 'G'-'@')
92
93/* msp3400-driver.c */ 99/* msp3400-driver.c */
94int msp_write_dem(struct i2c_client *client, int addr, int val); 100int msp_write_dem(struct i2c_client *client, int addr, int val);
95int msp_write_dsp(struct i2c_client *client, int addr, int val); 101int msp_write_dsp(struct i2c_client *client, int addr, int val);
@@ -99,8 +105,7 @@ int msp_reset(struct i2c_client *client);
99void msp_set_scart(struct i2c_client *client, int in, int out); 105void msp_set_scart(struct i2c_client *client, int in, int out);
100void msp_set_mute(struct i2c_client *client); 106void msp_set_mute(struct i2c_client *client);
101void msp_set_audio(struct i2c_client *client); 107void msp_set_audio(struct i2c_client *client);
102int msp_modus(struct i2c_client *client, int norm); 108int msp_modus(struct i2c_client *client);
103int msp_standard(int norm);
104int msp_sleep(struct msp_state *state, int timeout); 109int msp_sleep(struct msp_state *state, int timeout);
105 110
106/* msp3400-kthreads.c */ 111/* msp3400-kthreads.c */