diff options
author | Hans Verkuil <hverkuil@xs4all.nl> | 2007-12-12 06:25:18 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-01-25 16:04:06 -0500 |
commit | d52c7385ec8d4d2081b0db47e309723ce3eae816 (patch) | |
tree | af05ca1d3a625a6cf6ec825b45d5e73e79503775 /drivers/media/video/msp3400-driver.c | |
parent | 35df38c015866b3c28bfb1914b14eba92086cdd1 (diff) |
V4L/DVB (6866): msp3400: CodingStyle cleanups
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video/msp3400-driver.c')
-rw-r--r-- | drivers/media/video/msp3400-driver.c | 167 |
1 files changed, 97 insertions, 70 deletions
diff --git a/drivers/media/video/msp3400-driver.c b/drivers/media/video/msp3400-driver.c index f4c14604b0b9..7a11f3159e32 100644 --- a/drivers/media/video/msp3400-driver.c +++ b/drivers/media/video/msp3400-driver.c | |||
@@ -42,7 +42,8 @@ | |||
42 | * | 42 | * |
43 | * You should have received a copy of the GNU General Public License | 43 | * You should have received a copy of the GNU General Public License |
44 | * along with this program; if not, write to the Free Software | 44 | * along with this program; if not, write to the Free Software |
45 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 45 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
46 | * 02110-1301, USA. | ||
46 | */ | 47 | */ |
47 | 48 | ||
48 | 49 | ||
@@ -72,7 +73,8 @@ int msp_debug; /* msp_debug output */ | |||
72 | int msp_once; /* no continous stereo monitoring */ | 73 | int msp_once; /* no continous stereo monitoring */ |
73 | int msp_amsound; /* hard-wire AM sound at 6.5 Hz (france), | 74 | int msp_amsound; /* hard-wire AM sound at 6.5 Hz (france), |
74 | the autoscan seems work well only with FM... */ | 75 | the autoscan seems work well only with FM... */ |
75 | int msp_standard = 1; /* Override auto detect of audio msp_standard, if needed. */ | 76 | int msp_standard = 1; /* Override auto detect of audio msp_standard, |
77 | if needed. */ | ||
76 | int msp_dolby; | 78 | int msp_dolby; |
77 | 79 | ||
78 | int msp_stereo_thresh = 0x190; /* a2 threshold for stereo/bilingual | 80 | int msp_stereo_thresh = 0x190; /* a2 threshold for stereo/bilingual |
@@ -82,12 +84,12 @@ int msp_stereo_thresh = 0x190; /* a2 threshold for stereo/bilingual | |||
82 | module_param(opmode, int, 0444); | 84 | module_param(opmode, int, 0444); |
83 | 85 | ||
84 | /* read-write */ | 86 | /* read-write */ |
85 | module_param_named(once,msp_once, bool, 0644); | 87 | module_param_named(once, msp_once, bool, 0644); |
86 | module_param_named(debug,msp_debug, int, 0644); | 88 | module_param_named(debug, msp_debug, int, 0644); |
87 | module_param_named(stereo_threshold,msp_stereo_thresh, int, 0644); | 89 | module_param_named(stereo_threshold, msp_stereo_thresh, int, 0644); |
88 | module_param_named(standard,msp_standard, int, 0644); | 90 | module_param_named(standard, msp_standard, int, 0644); |
89 | module_param_named(amsound,msp_amsound, bool, 0644); | 91 | module_param_named(amsound, msp_amsound, bool, 0644); |
90 | module_param_named(dolby,msp_dolby, bool, 0644); | 92 | module_param_named(dolby, msp_dolby, bool, 0644); |
91 | 93 | ||
92 | MODULE_PARM_DESC(opmode, "Forces a MSP3400 opmode. 0=Manual, 1=Autodetect, 2=Autodetect and autoselect"); | 94 | MODULE_PARM_DESC(opmode, "Forces a MSP3400 opmode. 0=Manual, 1=Autodetect, 2=Autodetect and autoselect"); |
93 | MODULE_PARM_DESC(once, "No continuous stereo monitoring"); | 95 | MODULE_PARM_DESC(once, "No continuous stereo monitoring"); |
@@ -161,12 +163,13 @@ static int msp_read(struct i2c_client *client, int dev, int addr) | |||
161 | schedule_timeout_interruptible(msecs_to_jiffies(10)); | 163 | schedule_timeout_interruptible(msecs_to_jiffies(10)); |
162 | } | 164 | } |
163 | if (err == 3) { | 165 | if (err == 3) { |
164 | v4l_warn(client, "giving up, resetting chip. Sound will go off, sorry folks :-|\n"); | 166 | v4l_warn(client, "resetting chip, sound will go off.\n"); |
165 | msp_reset(client); | 167 | msp_reset(client); |
166 | return -1; | 168 | return -1; |
167 | } | 169 | } |
168 | retval = read[0] << 8 | read[1]; | 170 | retval = read[0] << 8 | read[1]; |
169 | v4l_dbg(3, msp_debug, client, "msp_read(0x%x, 0x%x): 0x%x\n", dev, addr, retval); | 171 | v4l_dbg(3, msp_debug, client, "msp_read(0x%x, 0x%x): 0x%x\n", |
172 | dev, addr, retval); | ||
170 | return retval; | 173 | return retval; |
171 | } | 174 | } |
172 | 175 | ||
@@ -191,7 +194,8 @@ static int msp_write(struct i2c_client *client, int dev, int addr, int val) | |||
191 | buffer[3] = val >> 8; | 194 | buffer[3] = val >> 8; |
192 | buffer[4] = val & 0xff; | 195 | buffer[4] = val & 0xff; |
193 | 196 | ||
194 | v4l_dbg(3, msp_debug, client, "msp_write(0x%x, 0x%x, 0x%x)\n", dev, addr, val); | 197 | v4l_dbg(3, msp_debug, client, "msp_write(0x%x, 0x%x, 0x%x)\n", |
198 | dev, addr, val); | ||
195 | for (err = 0; err < 3; err++) { | 199 | for (err = 0; err < 3; err++) { |
196 | if (i2c_master_send(client, buffer, 5) == 5) | 200 | if (i2c_master_send(client, buffer, 5) == 5) |
197 | break; | 201 | break; |
@@ -200,7 +204,7 @@ static int msp_write(struct i2c_client *client, int dev, int addr, int val) | |||
200 | schedule_timeout_interruptible(msecs_to_jiffies(10)); | 204 | schedule_timeout_interruptible(msecs_to_jiffies(10)); |
201 | } | 205 | } |
202 | if (err == 3) { | 206 | if (err == 3) { |
203 | v4l_warn(client, "giving up, resetting chip. Sound will go off, sorry folks :-|\n"); | 207 | v4l_warn(client, "resetting chip, sound will go off.\n"); |
204 | msp_reset(client); | 208 | msp_reset(client); |
205 | return -1; | 209 | return -1; |
206 | } | 210 | } |
@@ -274,7 +278,7 @@ void msp_set_scart(struct i2c_client *client, int in, int out) | |||
274 | state->acb = 0xf60; /* Mute Input and SCART 1 Output */ | 278 | state->acb = 0xf60; /* Mute Input and SCART 1 Output */ |
275 | 279 | ||
276 | v4l_dbg(1, msp_debug, client, "scart switch: %s => %d (ACB=0x%04x)\n", | 280 | v4l_dbg(1, msp_debug, client, "scart switch: %s => %d (ACB=0x%04x)\n", |
277 | scart_names[in], out, state->acb); | 281 | scart_names[in], out, state->acb); |
278 | msp_write_dsp(client, 0x13, state->acb); | 282 | msp_write_dsp(client, 0x13, state->acb); |
279 | 283 | ||
280 | /* Sets I2S speed 0 = 1.024 Mbps, 1 = 2.048 Mbps */ | 284 | /* Sets I2S speed 0 = 1.024 Mbps, 1 = 2.048 Mbps */ |
@@ -293,7 +297,8 @@ void msp_set_audio(struct i2c_client *client) | |||
293 | val = (state->volume * 0x7f / 65535) << 8; | 297 | val = (state->volume * 0x7f / 65535) << 8; |
294 | 298 | ||
295 | v4l_dbg(1, msp_debug, client, "mute=%s scanning=%s volume=%d\n", | 299 | v4l_dbg(1, msp_debug, client, "mute=%s scanning=%s volume=%d\n", |
296 | state->muted ? "on" : "off", state->scan_in_progress ? "yes" : "no", | 300 | state->muted ? "on" : "off", |
301 | state->scan_in_progress ? "yes" : "no", | ||
297 | state->volume); | 302 | state->volume); |
298 | 303 | ||
299 | msp_write_dsp(client, 0x0000, val); | 304 | msp_write_dsp(client, 0x0000, val); |
@@ -682,14 +687,14 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
682 | v4l_dbg(1, msp_debug, client, "Setting I2S speed to %d\n", *a); | 687 | v4l_dbg(1, msp_debug, client, "Setting I2S speed to %d\n", *a); |
683 | 688 | ||
684 | switch (*a) { | 689 | switch (*a) { |
685 | case 1024000: | 690 | case 1024000: |
686 | state->i2s_mode = 0; | 691 | state->i2s_mode = 0; |
687 | break; | 692 | break; |
688 | case 2048000: | 693 | case 2048000: |
689 | state->i2s_mode = 1; | 694 | state->i2s_mode = 1; |
690 | break; | 695 | break; |
691 | default: | 696 | default: |
692 | return -EINVAL; | 697 | return -EINVAL; |
693 | } | 698 | } |
694 | break; | 699 | break; |
695 | } | 700 | } |
@@ -699,22 +704,22 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
699 | struct v4l2_queryctrl *qc = arg; | 704 | struct v4l2_queryctrl *qc = arg; |
700 | 705 | ||
701 | switch (qc->id) { | 706 | switch (qc->id) { |
702 | case V4L2_CID_AUDIO_VOLUME: | 707 | case V4L2_CID_AUDIO_VOLUME: |
703 | case V4L2_CID_AUDIO_MUTE: | 708 | case V4L2_CID_AUDIO_MUTE: |
704 | return v4l2_ctrl_query_fill_std(qc); | 709 | return v4l2_ctrl_query_fill_std(qc); |
705 | default: | 710 | default: |
706 | break; | 711 | break; |
707 | } | 712 | } |
708 | if (!state->has_sound_processing) | 713 | if (!state->has_sound_processing) |
709 | return -EINVAL; | 714 | return -EINVAL; |
710 | switch (qc->id) { | 715 | switch (qc->id) { |
711 | case V4L2_CID_AUDIO_LOUDNESS: | 716 | case V4L2_CID_AUDIO_LOUDNESS: |
712 | case V4L2_CID_AUDIO_BALANCE: | 717 | case V4L2_CID_AUDIO_BALANCE: |
713 | case V4L2_CID_AUDIO_BASS: | 718 | case V4L2_CID_AUDIO_BASS: |
714 | case V4L2_CID_AUDIO_TREBLE: | 719 | case V4L2_CID_AUDIO_TREBLE: |
715 | return v4l2_ctrl_query_fill_std(qc); | 720 | return v4l2_ctrl_query_fill_std(qc); |
716 | default: | 721 | default: |
717 | return -EINVAL; | 722 | return -EINVAL; |
718 | } | 723 | } |
719 | } | 724 | } |
720 | 725 | ||
@@ -736,13 +741,14 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
736 | state->volume, state->muted ? " (muted)" : ""); | 741 | state->volume, state->muted ? " (muted)" : ""); |
737 | if (state->has_sound_processing) { | 742 | if (state->has_sound_processing) { |
738 | v4l_info(client, "Audio: balance %d bass %d treble %d loudness %s\n", | 743 | v4l_info(client, "Audio: balance %d bass %d treble %d loudness %s\n", |
739 | state->balance, state->bass, state->treble, | 744 | state->balance, state->bass, |
745 | state->treble, | ||
740 | state->loudness ? "on" : "off"); | 746 | state->loudness ? "on" : "off"); |
741 | } | 747 | } |
742 | switch (state->mode) { | 748 | switch (state->mode) { |
743 | case MSP_MODE_AM_DETECT: p = "AM (for carrier detect)"; break; | 749 | case MSP_MODE_AM_DETECT: p = "AM (for carrier detect)"; break; |
744 | case MSP_MODE_FM_RADIO: p = "FM Radio"; break; | 750 | case MSP_MODE_FM_RADIO: p = "FM Radio"; break; |
745 | case MSP_MODE_FM_TERRA: p = "Terrestial FM-mono + FM-stereo"; break; | 751 | case MSP_MODE_FM_TERRA: p = "Terrestial FM-mono/stereo"; break; |
746 | case MSP_MODE_FM_SAT: p = "Satellite FM-mono"; break; | 752 | case MSP_MODE_FM_SAT: p = "Satellite FM-mono"; break; |
747 | case MSP_MODE_FM_NICAM1: p = "NICAM/FM (B/G, D/K)"; break; | 753 | case MSP_MODE_FM_NICAM1: p = "NICAM/FM (B/G, D/K)"; break; |
748 | case MSP_MODE_FM_NICAM2: p = "NICAM/FM (I)"; break; | 754 | case MSP_MODE_FM_NICAM2: p = "NICAM/FM (I)"; break; |
@@ -773,7 +779,8 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
773 | } | 779 | } |
774 | 780 | ||
775 | case VIDIOC_G_CHIP_IDENT: | 781 | case VIDIOC_G_CHIP_IDENT: |
776 | return v4l2_chip_ident_i2c_client(client, arg, state->ident, (state->rev1 << 16) | state->rev2); | 782 | return v4l2_chip_ident_i2c_client(client, arg, state->ident, |
783 | (state->rev1 << 16) | state->rev2); | ||
777 | 784 | ||
778 | default: | 785 | default: |
779 | /* unknown */ | 786 | /* unknown */ |
@@ -816,9 +823,8 @@ static int msp_probe(struct i2c_client *client) | |||
816 | } | 823 | } |
817 | 824 | ||
818 | state = kzalloc(sizeof(*state), GFP_KERNEL); | 825 | state = kzalloc(sizeof(*state), GFP_KERNEL); |
819 | if (!state) { | 826 | if (!state) |
820 | return -ENOMEM; | 827 | return -ENOMEM; |
821 | } | ||
822 | 828 | ||
823 | i2c_set_clientdata(client, state); | 829 | i2c_set_clientdata(client, state); |
824 | 830 | ||
@@ -840,9 +846,11 @@ static int msp_probe(struct i2c_client *client) | |||
840 | state->rev1 = msp_read_dsp(client, 0x1e); | 846 | state->rev1 = msp_read_dsp(client, 0x1e); |
841 | if (state->rev1 != -1) | 847 | if (state->rev1 != -1) |
842 | state->rev2 = msp_read_dsp(client, 0x1f); | 848 | state->rev2 = msp_read_dsp(client, 0x1f); |
843 | v4l_dbg(1, msp_debug, client, "rev1=0x%04x, rev2=0x%04x\n", state->rev1, state->rev2); | 849 | v4l_dbg(1, msp_debug, client, "rev1=0x%04x, rev2=0x%04x\n", |
850 | state->rev1, state->rev2); | ||
844 | if (state->rev1 == -1 || (state->rev1 == 0 && state->rev2 == 0)) { | 851 | if (state->rev1 == -1 || (state->rev1 == 0 && state->rev2 == 0)) { |
845 | v4l_dbg(1, msp_debug, client, "not an msp3400 (cannot read chip version)\n"); | 852 | v4l_dbg(1, msp_debug, client, |
853 | "not an msp3400 (cannot read chip version)\n"); | ||
846 | kfree(state); | 854 | kfree(state); |
847 | return -ENODEV; | 855 | return -ENODEV; |
848 | } | 856 | } |
@@ -860,37 +868,55 @@ static int msp_probe(struct i2c_client *client) | |||
860 | msp_family, msp_product, | 868 | msp_family, msp_product, |
861 | msp_revision, msp_hard, msp_rom); | 869 | msp_revision, msp_hard, msp_rom); |
862 | /* Rev B=2, C=3, D=4, G=7 */ | 870 | /* Rev B=2, C=3, D=4, G=7 */ |
863 | state->ident = msp_family * 10000 + 4000 + msp_product * 10 + msp_revision - '@'; | 871 | state->ident = msp_family * 10000 + 4000 + msp_product * 10 + |
872 | msp_revision - '@'; | ||
864 | 873 | ||
865 | /* Has NICAM support: all mspx41x and mspx45x products have NICAM */ | 874 | /* Has NICAM support: all mspx41x and mspx45x products have NICAM */ |
866 | state->has_nicam = msp_prod_hi == 1 || msp_prod_hi == 5; | 875 | state->has_nicam = |
876 | msp_prod_hi == 1 || msp_prod_hi == 5; | ||
867 | /* Has radio support: was added with revision G */ | 877 | /* Has radio support: was added with revision G */ |
868 | state->has_radio = msp_revision >= 'G'; | 878 | state->has_radio = |
879 | msp_revision >= 'G'; | ||
869 | /* Has headphones output: not for stripped down products */ | 880 | /* Has headphones output: not for stripped down products */ |
870 | state->has_headphones = msp_prod_lo < 5; | 881 | state->has_headphones = |
882 | msp_prod_lo < 5; | ||
871 | /* Has scart2 input: not in stripped down products of the '3' family */ | 883 | /* Has scart2 input: not in stripped down products of the '3' family */ |
872 | state->has_scart2 = msp_family >= 4 || msp_prod_lo < 7; | 884 | state->has_scart2 = |
885 | msp_family >= 4 || msp_prod_lo < 7; | ||
873 | /* Has scart3 input: not in stripped down products of the '3' family */ | 886 | /* Has scart3 input: not in stripped down products of the '3' family */ |
874 | state->has_scart3 = msp_family >= 4 || msp_prod_lo < 5; | 887 | state->has_scart3 = |
888 | msp_family >= 4 || msp_prod_lo < 5; | ||
875 | /* Has scart4 input: not in pre D revisions, not in stripped D revs */ | 889 | /* Has scart4 input: not in pre D revisions, not in stripped D revs */ |
876 | state->has_scart4 = msp_family >= 4 || (msp_revision >= 'D' && msp_prod_lo < 5); | 890 | state->has_scart4 = |
877 | /* Has scart2 output: not in stripped down products of the '3' family */ | 891 | msp_family >= 4 || (msp_revision >= 'D' && msp_prod_lo < 5); |
878 | state->has_scart2_out = msp_family >= 4 || msp_prod_lo < 5; | 892 | /* Has scart2 output: not in stripped down products of |
893 | * the '3' family */ | ||
894 | state->has_scart2_out = | ||
895 | msp_family >= 4 || msp_prod_lo < 5; | ||
879 | /* Has scart2 a volume control? Not in pre-D revisions. */ | 896 | /* Has scart2 a volume control? Not in pre-D revisions. */ |
880 | state->has_scart2_out_volume = msp_revision > 'C' && state->has_scart2_out; | 897 | state->has_scart2_out_volume = |
898 | msp_revision > 'C' && state->has_scart2_out; | ||
881 | /* Has a configurable i2s out? */ | 899 | /* Has a configurable i2s out? */ |
882 | state->has_i2s_conf = msp_revision >= 'G' && msp_prod_lo < 7; | 900 | state->has_i2s_conf = |
883 | /* Has subwoofer output: not in pre-D revs and not in stripped down products */ | 901 | msp_revision >= 'G' && msp_prod_lo < 7; |
884 | state->has_subwoofer = msp_revision >= 'D' && msp_prod_lo < 5; | 902 | /* Has subwoofer output: not in pre-D revs and not in stripped down |
885 | /* Has soundprocessing (bass/treble/balance/loudness/equalizer): not in | 903 | * products */ |
886 | stripped down products */ | 904 | state->has_subwoofer = |
887 | state->has_sound_processing = msp_prod_lo < 7; | 905 | msp_revision >= 'D' && msp_prod_lo < 5; |
906 | /* Has soundprocessing (bass/treble/balance/loudness/equalizer): | ||
907 | * not in stripped down products */ | ||
908 | state->has_sound_processing = | ||
909 | msp_prod_lo < 7; | ||
888 | /* Has Virtual Dolby Surround: only in msp34x1 */ | 910 | /* Has Virtual Dolby Surround: only in msp34x1 */ |
889 | state->has_virtual_dolby_surround = msp_revision == 'G' && msp_prod_lo == 1; | 911 | state->has_virtual_dolby_surround = |
912 | msp_revision == 'G' && msp_prod_lo == 1; | ||
890 | /* Has Virtual Dolby Surround & Dolby Pro Logic: only in msp34x2 */ | 913 | /* Has Virtual Dolby Surround & Dolby Pro Logic: only in msp34x2 */ |
891 | state->has_dolby_pro_logic = msp_revision == 'G' && msp_prod_lo == 2; | 914 | state->has_dolby_pro_logic = |
892 | /* The msp343xG supports BTSC only and cannot do Automatic Standard Detection. */ | 915 | msp_revision == 'G' && msp_prod_lo == 2; |
893 | state->force_btsc = msp_family == 3 && msp_revision == 'G' && msp_prod_hi == 3; | 916 | /* The msp343xG supports BTSC only and cannot do Automatic Standard |
917 | * Detection. */ | ||
918 | state->force_btsc = | ||
919 | msp_family == 3 && msp_revision == 'G' && msp_prod_hi == 3; | ||
894 | 920 | ||
895 | state->opmode = opmode; | 921 | state->opmode = opmode; |
896 | if (state->opmode == OPMODE_AUTO) { | 922 | if (state->opmode == OPMODE_AUTO) { |
@@ -905,32 +931,33 @@ static int msp_probe(struct i2c_client *client) | |||
905 | } | 931 | } |
906 | 932 | ||
907 | /* hello world :-) */ | 933 | /* hello world :-) */ |
908 | v4l_info(client, "%s found @ 0x%x (%s)\n", client->name, client->addr << 1, client->adapter->name); | 934 | v4l_info(client, "%s found @ 0x%x (%s)\n", client->name, |
935 | client->addr << 1, client->adapter->name); | ||
909 | v4l_info(client, "%s ", client->name); | 936 | v4l_info(client, "%s ", client->name); |
910 | if (state->has_nicam && state->has_radio) | 937 | if (state->has_nicam && state->has_radio) |
911 | printk("supports nicam and radio, "); | 938 | printk(KERN_CONT "supports nicam and radio, "); |
912 | else if (state->has_nicam) | 939 | else if (state->has_nicam) |
913 | printk("supports nicam, "); | 940 | printk(KERN_CONT "supports nicam, "); |
914 | else if (state->has_radio) | 941 | else if (state->has_radio) |
915 | printk("supports radio, "); | 942 | printk(KERN_CONT "supports radio, "); |
916 | printk("mode is "); | 943 | printk(KERN_CONT "mode is "); |
917 | 944 | ||
918 | /* version-specific initialization */ | 945 | /* version-specific initialization */ |
919 | switch (state->opmode) { | 946 | switch (state->opmode) { |
920 | case OPMODE_MANUAL: | 947 | case OPMODE_MANUAL: |
921 | printk("manual"); | 948 | printk(KERN_CONT "manual"); |
922 | thread_func = msp3400c_thread; | 949 | thread_func = msp3400c_thread; |
923 | break; | 950 | break; |
924 | case OPMODE_AUTODETECT: | 951 | case OPMODE_AUTODETECT: |
925 | printk("autodetect"); | 952 | printk(KERN_CONT "autodetect"); |
926 | thread_func = msp3410d_thread; | 953 | thread_func = msp3410d_thread; |
927 | break; | 954 | break; |
928 | case OPMODE_AUTOSELECT: | 955 | case OPMODE_AUTOSELECT: |
929 | printk("autodetect and autoselect"); | 956 | printk(KERN_CONT "autodetect and autoselect"); |
930 | thread_func = msp34xxg_thread; | 957 | thread_func = msp34xxg_thread; |
931 | break; | 958 | break; |
932 | } | 959 | } |
933 | printk("\n"); | 960 | printk(KERN_CONT "\n"); |
934 | 961 | ||
935 | /* startup control thread if needed */ | 962 | /* startup control thread if needed */ |
936 | if (thread_func) { | 963 | if (thread_func) { |