5 * Copyright (C) 2005 Mike Isely <isely@pobox.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <linux/errno.h>
23 #include <linux/string.h>
24 #include <linux/slab.h>
25 #include <linux/firmware.h>
26 #include <linux/videodev2.h>
27 #include <media/v4l2-common.h>
28 #include <asm/semaphore.h>
30 #include "pvrusb2-std.h"
31 #include "pvrusb2-util.h"
32 #include "pvrusb2-hdw.h"
33 #include "pvrusb2-i2c-core.h"
34 #include "pvrusb2-tuner.h"
35 #include "pvrusb2-eeprom.h"
36 #include "pvrusb2-hdw-internal.h"
37 #include "pvrusb2-encoder.h"
38 #include "pvrusb2-debug.h"
39 #include "pvrusb2-fx2-cmd.h"
41 #define TV_MIN_FREQ 55250000L
42 #define TV_MAX_FREQ 850000000L
44 struct usb_device_id pvr2_device_table[] = {
45 [PVR2_HDW_TYPE_29XXX] = { USB_DEVICE(0x2040, 0x2900) },
46 [PVR2_HDW_TYPE_24XXX] = { USB_DEVICE(0x2040, 0x2400) },
50 MODULE_DEVICE_TABLE(usb, pvr2_device_table);
52 static const char *pvr2_device_names[] = {
53 [PVR2_HDW_TYPE_29XXX] = "WinTV PVR USB2 Model Category 29xxxx",
54 [PVR2_HDW_TYPE_24XXX] = "WinTV PVR USB2 Model Category 24xxxx",
57 struct pvr2_string_table {
62 // Names of other client modules to request for 24xxx model hardware
63 static const char *pvr2_client_24xxx[] = {
69 // Names of other client modules to request for 29xxx model hardware
70 static const char *pvr2_client_29xxx[] = {
76 static struct pvr2_string_table pvr2_client_lists[] = {
77 [PVR2_HDW_TYPE_29XXX] = {
78 pvr2_client_29xxx, ARRAY_SIZE(pvr2_client_29xxx)
80 [PVR2_HDW_TYPE_24XXX] = {
81 pvr2_client_24xxx, ARRAY_SIZE(pvr2_client_24xxx)
85 static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = NULL};
86 static DECLARE_MUTEX(pvr2_unit_sem);
88 static int ctlchg = 0;
89 static int initusbreset = 1;
90 static int procreload = 0;
91 static int tuner[PVR_NUM] = { [0 ... PVR_NUM-1] = -1 };
92 static int tolerance[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
93 static int video_std[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
94 static int init_pause_msec = 0;
96 module_param(ctlchg, int, S_IRUGO|S_IWUSR);
97 MODULE_PARM_DESC(ctlchg, "0=optimize ctl change 1=always accept new ctl value");
98 module_param(init_pause_msec, int, S_IRUGO|S_IWUSR);
99 MODULE_PARM_DESC(init_pause_msec, "hardware initialization settling delay");
100 module_param(initusbreset, int, S_IRUGO|S_IWUSR);
101 MODULE_PARM_DESC(initusbreset, "Do USB reset device on probe");
102 module_param(procreload, int, S_IRUGO|S_IWUSR);
103 MODULE_PARM_DESC(procreload,
104 "Attempt init failure recovery with firmware reload");
105 module_param_array(tuner, int, NULL, 0444);
106 MODULE_PARM_DESC(tuner,"specify installed tuner type");
107 module_param_array(video_std, int, NULL, 0444);
108 MODULE_PARM_DESC(video_std,"specify initial video standard");
109 module_param_array(tolerance, int, NULL, 0444);
110 MODULE_PARM_DESC(tolerance,"specify stream error tolerance");
112 #define PVR2_CTL_WRITE_ENDPOINT 0x01
113 #define PVR2_CTL_READ_ENDPOINT 0x81
115 #define PVR2_GPIO_IN 0x9008
116 #define PVR2_GPIO_OUT 0x900c
117 #define PVR2_GPIO_DIR 0x9020
119 #define trace_firmware(...) pvr2_trace(PVR2_TRACE_FIRMWARE,__VA_ARGS__)
121 #define PVR2_FIRMWARE_ENDPOINT 0x02
123 /* size of a firmware chunk */
124 #define FIRMWARE_CHUNK_SIZE 0x2000
126 /* Define the list of additional controls we'll dynamically construct based
127 on query of the cx2341x module. */
128 struct pvr2_mpeg_ids {
132 static const struct pvr2_mpeg_ids mpeg_ids[] = {
134 .strid = "audio_layer",
135 .id = V4L2_CID_MPEG_AUDIO_ENCODING,
137 .strid = "audio_bitrate",
138 .id = V4L2_CID_MPEG_AUDIO_L2_BITRATE,
140 /* Already using audio_mode elsewhere :-( */
141 .strid = "mpeg_audio_mode",
142 .id = V4L2_CID_MPEG_AUDIO_MODE,
144 .strid = "mpeg_audio_mode_extension",
145 .id = V4L2_CID_MPEG_AUDIO_MODE_EXTENSION,
147 .strid = "audio_emphasis",
148 .id = V4L2_CID_MPEG_AUDIO_EMPHASIS,
150 .strid = "audio_crc",
151 .id = V4L2_CID_MPEG_AUDIO_CRC,
153 .strid = "video_aspect",
154 .id = V4L2_CID_MPEG_VIDEO_ASPECT,
156 .strid = "video_b_frames",
157 .id = V4L2_CID_MPEG_VIDEO_B_FRAMES,
159 .strid = "video_gop_size",
160 .id = V4L2_CID_MPEG_VIDEO_GOP_SIZE,
162 .strid = "video_gop_closure",
163 .id = V4L2_CID_MPEG_VIDEO_GOP_CLOSURE,
165 .strid = "video_bitrate_mode",
166 .id = V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
168 .strid = "video_bitrate",
169 .id = V4L2_CID_MPEG_VIDEO_BITRATE,
171 .strid = "video_bitrate_peak",
172 .id = V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
174 .strid = "video_temporal_decimation",
175 .id = V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION,
177 .strid = "stream_type",
178 .id = V4L2_CID_MPEG_STREAM_TYPE,
180 .strid = "video_spatial_filter_mode",
181 .id = V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE,
183 .strid = "video_spatial_filter",
184 .id = V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER,
186 .strid = "video_luma_spatial_filter_type",
187 .id = V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE,
189 .strid = "video_chroma_spatial_filter_type",
190 .id = V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE,
192 .strid = "video_temporal_filter_mode",
193 .id = V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE,
195 .strid = "video_temporal_filter",
196 .id = V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER,
198 .strid = "video_median_filter_type",
199 .id = V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE,
201 .strid = "video_luma_median_filter_top",
202 .id = V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP,
204 .strid = "video_luma_median_filter_bottom",
205 .id = V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM,
207 .strid = "video_chroma_median_filter_top",
208 .id = V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP,
210 .strid = "video_chroma_median_filter_bottom",
211 .id = V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM,
214 #define MPEGDEF_COUNT ARRAY_SIZE(mpeg_ids)
217 static const char *control_values_srate[] = {
218 [V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100] = "44.1 kHz",
219 [V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000] = "48 kHz",
220 [V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000] = "32 kHz",
225 static const char *control_values_input[] = {
226 [PVR2_CVAL_INPUT_TV] = "television", /*xawtv needs this name*/
227 [PVR2_CVAL_INPUT_RADIO] = "radio",
228 [PVR2_CVAL_INPUT_SVIDEO] = "s-video",
229 [PVR2_CVAL_INPUT_COMPOSITE] = "composite",
233 static const char *control_values_audiomode[] = {
234 [V4L2_TUNER_MODE_MONO] = "Mono",
235 [V4L2_TUNER_MODE_STEREO] = "Stereo",
236 [V4L2_TUNER_MODE_LANG1] = "Lang1",
237 [V4L2_TUNER_MODE_LANG2] = "Lang2",
238 [V4L2_TUNER_MODE_LANG1_LANG2] = "Lang1+Lang2",
242 static const char *control_values_hsm[] = {
243 [PVR2_CVAL_HSM_FAIL] = "Fail",
244 [PVR2_CVAL_HSM_HIGH] = "High",
245 [PVR2_CVAL_HSM_FULL] = "Full",
249 static const char *control_values_subsystem[] = {
250 [PVR2_SUBSYS_B_ENC_FIRMWARE] = "enc_firmware",
251 [PVR2_SUBSYS_B_ENC_CFG] = "enc_config",
252 [PVR2_SUBSYS_B_DIGITIZER_RUN] = "digitizer_run",
253 [PVR2_SUBSYS_B_USBSTREAM_RUN] = "usbstream_run",
254 [PVR2_SUBSYS_B_ENC_RUN] = "enc_run",
257 static void pvr2_hdw_set_cur_freq(struct pvr2_hdw *,unsigned long);
258 static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl);
259 static int pvr2_hdw_commit_ctl_internal(struct pvr2_hdw *hdw);
260 static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw);
261 static void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw);
262 static void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw);
263 static void pvr2_hdw_render_useless_unlocked(struct pvr2_hdw *hdw);
264 static void pvr2_hdw_subsys_bit_chg_no_lock(struct pvr2_hdw *hdw,
267 static void pvr2_hdw_subsys_stream_bit_chg_no_lock(struct pvr2_hdw *hdw,
270 static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
271 unsigned int timeout,int probe_fl,
272 void *write_data,unsigned int write_len,
273 void *read_data,unsigned int read_len);
275 static int ctrl_channelfreq_get(struct pvr2_ctrl *cptr,int *vp)
277 struct pvr2_hdw *hdw = cptr->hdw;
278 if ((hdw->freqProgSlot > 0) && (hdw->freqProgSlot <= FREQTABLE_SIZE)) {
279 *vp = hdw->freqTable[hdw->freqProgSlot-1];
286 static int ctrl_channelfreq_set(struct pvr2_ctrl *cptr,int m,int v)
288 struct pvr2_hdw *hdw = cptr->hdw;
289 unsigned int slotId = hdw->freqProgSlot;
290 if ((slotId > 0) && (slotId <= FREQTABLE_SIZE)) {
291 hdw->freqTable[slotId-1] = v;
292 /* Handle side effects correctly - if we're tuned to this
293 slot, then forgot the slot id relation since the stored
294 frequency has been changed. */
295 if (hdw->freqSelector) {
296 if (hdw->freqSlotRadio == slotId) {
297 hdw->freqSlotRadio = 0;
300 if (hdw->freqSlotTelevision == slotId) {
301 hdw->freqSlotTelevision = 0;
308 static int ctrl_channelprog_get(struct pvr2_ctrl *cptr,int *vp)
310 *vp = cptr->hdw->freqProgSlot;
314 static int ctrl_channelprog_set(struct pvr2_ctrl *cptr,int m,int v)
316 struct pvr2_hdw *hdw = cptr->hdw;
317 if ((v >= 0) && (v <= FREQTABLE_SIZE)) {
318 hdw->freqProgSlot = v;
323 static int ctrl_channel_get(struct pvr2_ctrl *cptr,int *vp)
325 struct pvr2_hdw *hdw = cptr->hdw;
326 *vp = hdw->freqSelector ? hdw->freqSlotRadio : hdw->freqSlotTelevision;
330 static int ctrl_channel_set(struct pvr2_ctrl *cptr,int m,int slotId)
333 struct pvr2_hdw *hdw = cptr->hdw;
334 if ((slotId < 0) || (slotId > FREQTABLE_SIZE)) return 0;
336 freq = hdw->freqTable[slotId-1];
338 pvr2_hdw_set_cur_freq(hdw,freq);
340 if (hdw->freqSelector) {
341 hdw->freqSlotRadio = slotId;
343 hdw->freqSlotTelevision = slotId;
348 static int ctrl_freq_get(struct pvr2_ctrl *cptr,int *vp)
350 *vp = pvr2_hdw_get_cur_freq(cptr->hdw);
354 static int ctrl_freq_is_dirty(struct pvr2_ctrl *cptr)
356 return cptr->hdw->freqDirty != 0;
359 static void ctrl_freq_clear_dirty(struct pvr2_ctrl *cptr)
361 cptr->hdw->freqDirty = 0;
364 static int ctrl_freq_set(struct pvr2_ctrl *cptr,int m,int v)
366 pvr2_hdw_set_cur_freq(cptr->hdw,v);
370 static int ctrl_vres_max_get(struct pvr2_ctrl *cptr,int *vp)
372 /* Actual maximum depends on the video standard in effect. */
373 if (cptr->hdw->std_mask_cur & V4L2_STD_525_60) {
381 static int ctrl_vres_min_get(struct pvr2_ctrl *cptr,int *vp)
383 /* Actual minimum depends on device type. */
384 if (cptr->hdw->hdw_type == PVR2_HDW_TYPE_24XXX) {
392 static int ctrl_get_input(struct pvr2_ctrl *cptr,int *vp)
394 *vp = cptr->hdw->input_val;
398 static int ctrl_set_input(struct pvr2_ctrl *cptr,int m,int v)
400 struct pvr2_hdw *hdw = cptr->hdw;
402 if (hdw->input_val != v) {
404 hdw->input_dirty = !0;
407 /* Handle side effects - if we switch to a mode that needs the RF
408 tuner, then select the right frequency choice as well and mark
410 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
411 hdw->freqSelector = 0;
413 } else if (hdw->input_val == PVR2_CVAL_INPUT_TV) {
414 hdw->freqSelector = 1;
420 static int ctrl_isdirty_input(struct pvr2_ctrl *cptr)
422 return cptr->hdw->input_dirty != 0;
425 static void ctrl_cleardirty_input(struct pvr2_ctrl *cptr)
427 cptr->hdw->input_dirty = 0;
431 static int ctrl_freq_max_get(struct pvr2_ctrl *cptr, int *vp)
434 struct pvr2_hdw *hdw = cptr->hdw;
435 if (hdw->tuner_signal_stale) {
436 pvr2_i2c_core_status_poll(hdw);
438 fv = hdw->tuner_signal_info.rangehigh;
440 /* Safety fallback */
444 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
453 static int ctrl_freq_min_get(struct pvr2_ctrl *cptr, int *vp)
456 struct pvr2_hdw *hdw = cptr->hdw;
457 if (hdw->tuner_signal_stale) {
458 pvr2_i2c_core_status_poll(hdw);
460 fv = hdw->tuner_signal_info.rangelow;
462 /* Safety fallback */
466 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
475 static int ctrl_cx2341x_is_dirty(struct pvr2_ctrl *cptr)
477 return cptr->hdw->enc_stale != 0;
480 static void ctrl_cx2341x_clear_dirty(struct pvr2_ctrl *cptr)
482 cptr->hdw->enc_stale = 0;
485 static int ctrl_cx2341x_get(struct pvr2_ctrl *cptr,int *vp)
488 struct v4l2_ext_controls cs;
489 struct v4l2_ext_control c1;
490 memset(&cs,0,sizeof(cs));
491 memset(&c1,0,sizeof(c1));
494 c1.id = cptr->info->v4l_id;
495 ret = cx2341x_ext_ctrls(&cptr->hdw->enc_ctl_state,&cs,
502 static int ctrl_cx2341x_set(struct pvr2_ctrl *cptr,int m,int v)
505 struct v4l2_ext_controls cs;
506 struct v4l2_ext_control c1;
507 memset(&cs,0,sizeof(cs));
508 memset(&c1,0,sizeof(c1));
511 c1.id = cptr->info->v4l_id;
513 ret = cx2341x_ext_ctrls(&cptr->hdw->enc_ctl_state,&cs,
516 cptr->hdw->enc_stale = !0;
520 static unsigned int ctrl_cx2341x_getv4lflags(struct pvr2_ctrl *cptr)
522 struct v4l2_queryctrl qctrl;
523 struct pvr2_ctl_info *info;
524 qctrl.id = cptr->info->v4l_id;
525 cx2341x_ctrl_query(&cptr->hdw->enc_ctl_state,&qctrl);
526 /* Strip out the const so we can adjust a function pointer. It's
527 OK to do this here because we know this is a dynamically created
528 control, so the underlying storage for the info pointer is (a)
529 private to us, and (b) not in read-only storage. Either we do
530 this or we significantly complicate the underlying control
532 info = (struct pvr2_ctl_info *)(cptr->info);
533 if (qctrl.flags & V4L2_CTRL_FLAG_READ_ONLY) {
534 if (info->set_value) {
535 info->set_value = NULL;
538 if (!(info->set_value)) {
539 info->set_value = ctrl_cx2341x_set;
545 static int ctrl_streamingenabled_get(struct pvr2_ctrl *cptr,int *vp)
547 *vp = cptr->hdw->flag_streaming_enabled;
551 static int ctrl_hsm_get(struct pvr2_ctrl *cptr,int *vp)
553 int result = pvr2_hdw_is_hsm(cptr->hdw);
554 *vp = PVR2_CVAL_HSM_FULL;
555 if (result < 0) *vp = PVR2_CVAL_HSM_FAIL;
556 if (result) *vp = PVR2_CVAL_HSM_HIGH;
560 static int ctrl_stdavail_get(struct pvr2_ctrl *cptr,int *vp)
562 *vp = cptr->hdw->std_mask_avail;
566 static int ctrl_stdavail_set(struct pvr2_ctrl *cptr,int m,int v)
568 struct pvr2_hdw *hdw = cptr->hdw;
570 ns = hdw->std_mask_avail;
571 ns = (ns & ~m) | (v & m);
572 if (ns == hdw->std_mask_avail) return 0;
573 hdw->std_mask_avail = ns;
574 pvr2_hdw_internal_set_std_avail(hdw);
575 pvr2_hdw_internal_find_stdenum(hdw);
579 static int ctrl_std_val_to_sym(struct pvr2_ctrl *cptr,int msk,int val,
580 char *bufPtr,unsigned int bufSize,
583 *len = pvr2_std_id_to_str(bufPtr,bufSize,msk & val);
587 static int ctrl_std_sym_to_val(struct pvr2_ctrl *cptr,
588 const char *bufPtr,unsigned int bufSize,
593 ret = pvr2_std_str_to_id(&id,bufPtr,bufSize);
594 if (ret < 0) return ret;
595 if (mskp) *mskp = id;
596 if (valp) *valp = id;
600 static int ctrl_stdcur_get(struct pvr2_ctrl *cptr,int *vp)
602 *vp = cptr->hdw->std_mask_cur;
606 static int ctrl_stdcur_set(struct pvr2_ctrl *cptr,int m,int v)
608 struct pvr2_hdw *hdw = cptr->hdw;
610 ns = hdw->std_mask_cur;
611 ns = (ns & ~m) | (v & m);
612 if (ns == hdw->std_mask_cur) return 0;
613 hdw->std_mask_cur = ns;
615 pvr2_hdw_internal_find_stdenum(hdw);
619 static int ctrl_stdcur_is_dirty(struct pvr2_ctrl *cptr)
621 return cptr->hdw->std_dirty != 0;
624 static void ctrl_stdcur_clear_dirty(struct pvr2_ctrl *cptr)
626 cptr->hdw->std_dirty = 0;
629 static int ctrl_signal_get(struct pvr2_ctrl *cptr,int *vp)
631 struct pvr2_hdw *hdw = cptr->hdw;
632 pvr2_i2c_core_status_poll(hdw);
633 *vp = hdw->tuner_signal_info.signal;
637 static int ctrl_audio_modes_present_get(struct pvr2_ctrl *cptr,int *vp)
640 unsigned int subchan;
641 struct pvr2_hdw *hdw = cptr->hdw;
642 pvr2_i2c_core_status_poll(hdw);
643 subchan = hdw->tuner_signal_info.rxsubchans;
644 if (subchan & V4L2_TUNER_SUB_MONO) {
645 val |= (1 << V4L2_TUNER_MODE_MONO);
647 if (subchan & V4L2_TUNER_SUB_STEREO) {
648 val |= (1 << V4L2_TUNER_MODE_STEREO);
650 if (subchan & V4L2_TUNER_SUB_LANG1) {
651 val |= (1 << V4L2_TUNER_MODE_LANG1);
653 if (subchan & V4L2_TUNER_SUB_LANG2) {
654 val |= (1 << V4L2_TUNER_MODE_LANG2);
660 static int ctrl_subsys_get(struct pvr2_ctrl *cptr,int *vp)
662 *vp = cptr->hdw->subsys_enabled_mask;
666 static int ctrl_subsys_set(struct pvr2_ctrl *cptr,int m,int v)
668 pvr2_hdw_subsys_bit_chg_no_lock(cptr->hdw,m,v);
672 static int ctrl_subsys_stream_get(struct pvr2_ctrl *cptr,int *vp)
674 *vp = cptr->hdw->subsys_stream_mask;
678 static int ctrl_subsys_stream_set(struct pvr2_ctrl *cptr,int m,int v)
680 pvr2_hdw_subsys_stream_bit_chg_no_lock(cptr->hdw,m,v);
684 static int ctrl_stdenumcur_set(struct pvr2_ctrl *cptr,int m,int v)
686 struct pvr2_hdw *hdw = cptr->hdw;
687 if (v < 0) return -EINVAL;
688 if (v > hdw->std_enum_cnt) return -EINVAL;
689 hdw->std_enum_cur = v;
692 if (hdw->std_mask_cur == hdw->std_defs[v].id) return 0;
693 hdw->std_mask_cur = hdw->std_defs[v].id;
699 static int ctrl_stdenumcur_get(struct pvr2_ctrl *cptr,int *vp)
701 *vp = cptr->hdw->std_enum_cur;
706 static int ctrl_stdenumcur_is_dirty(struct pvr2_ctrl *cptr)
708 return cptr->hdw->std_dirty != 0;
712 static void ctrl_stdenumcur_clear_dirty(struct pvr2_ctrl *cptr)
714 cptr->hdw->std_dirty = 0;
718 #define DEFINT(vmin,vmax) \
719 .type = pvr2_ctl_int, \
720 .def.type_int.min_value = vmin, \
721 .def.type_int.max_value = vmax
723 #define DEFENUM(tab) \
724 .type = pvr2_ctl_enum, \
725 .def.type_enum.count = ARRAY_SIZE(tab), \
726 .def.type_enum.value_names = tab
729 .type = pvr2_ctl_bool
731 #define DEFMASK(msk,tab) \
732 .type = pvr2_ctl_bitmask, \
733 .def.type_bitmask.valid_bits = msk, \
734 .def.type_bitmask.bit_names = tab
736 #define DEFREF(vname) \
737 .set_value = ctrl_set_##vname, \
738 .get_value = ctrl_get_##vname, \
739 .is_dirty = ctrl_isdirty_##vname, \
740 .clear_dirty = ctrl_cleardirty_##vname
743 #define VCREATE_FUNCS(vname) \
744 static int ctrl_get_##vname(struct pvr2_ctrl *cptr,int *vp) \
745 {*vp = cptr->hdw->vname##_val; return 0;} \
746 static int ctrl_set_##vname(struct pvr2_ctrl *cptr,int m,int v) \
747 {cptr->hdw->vname##_val = v; cptr->hdw->vname##_dirty = !0; return 0;} \
748 static int ctrl_isdirty_##vname(struct pvr2_ctrl *cptr) \
749 {return cptr->hdw->vname##_dirty != 0;} \
750 static void ctrl_cleardirty_##vname(struct pvr2_ctrl *cptr) \
751 {cptr->hdw->vname##_dirty = 0;}
753 VCREATE_FUNCS(brightness)
754 VCREATE_FUNCS(contrast)
755 VCREATE_FUNCS(saturation)
757 VCREATE_FUNCS(volume)
758 VCREATE_FUNCS(balance)
760 VCREATE_FUNCS(treble)
762 VCREATE_FUNCS(audiomode)
763 VCREATE_FUNCS(res_hor)
764 VCREATE_FUNCS(res_ver)
767 /* Table definition of all controls which can be manipulated */
768 static const struct pvr2_ctl_info control_defs[] = {
770 .v4l_id = V4L2_CID_BRIGHTNESS,
771 .desc = "Brightness",
772 .name = "brightness",
773 .default_value = 128,
777 .v4l_id = V4L2_CID_CONTRAST,
784 .v4l_id = V4L2_CID_SATURATION,
785 .desc = "Saturation",
786 .name = "saturation",
791 .v4l_id = V4L2_CID_HUE,
798 .v4l_id = V4L2_CID_AUDIO_VOLUME,
801 .default_value = 62000,
805 .v4l_id = V4L2_CID_AUDIO_BALANCE,
810 DEFINT(-32768,32767),
812 .v4l_id = V4L2_CID_AUDIO_BASS,
817 DEFINT(-32768,32767),
819 .v4l_id = V4L2_CID_AUDIO_TREBLE,
824 DEFINT(-32768,32767),
826 .v4l_id = V4L2_CID_AUDIO_MUTE,
833 .desc = "Video Source",
835 .internal_id = PVR2_CID_INPUT,
836 .default_value = PVR2_CVAL_INPUT_TV,
838 DEFENUM(control_values_input),
840 .desc = "Audio Mode",
841 .name = "audio_mode",
842 .internal_id = PVR2_CID_AUDIOMODE,
843 .default_value = V4L2_TUNER_MODE_STEREO,
845 DEFENUM(control_values_audiomode),
847 .desc = "Horizontal capture resolution",
848 .name = "resolution_hor",
849 .internal_id = PVR2_CID_HRES,
850 .default_value = 720,
854 .desc = "Vertical capture resolution",
855 .name = "resolution_ver",
856 .internal_id = PVR2_CID_VRES,
857 .default_value = 480,
860 /* Hook in check for video standard and adjust maximum
861 depending on the standard. */
862 .get_max_value = ctrl_vres_max_get,
863 .get_min_value = ctrl_vres_min_get,
865 .v4l_id = V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
866 .default_value = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000,
867 .desc = "Audio Sampling Frequency",
870 DEFENUM(control_values_srate),
872 .desc = "Tuner Frequency (Hz)",
874 .internal_id = PVR2_CID_FREQUENCY,
876 .set_value = ctrl_freq_set,
877 .get_value = ctrl_freq_get,
878 .is_dirty = ctrl_freq_is_dirty,
879 .clear_dirty = ctrl_freq_clear_dirty,
881 /* Hook in check for input value (tv/radio) and adjust
882 max/min values accordingly */
883 .get_max_value = ctrl_freq_max_get,
884 .get_min_value = ctrl_freq_min_get,
888 .set_value = ctrl_channel_set,
889 .get_value = ctrl_channel_get,
890 DEFINT(0,FREQTABLE_SIZE),
892 .desc = "Channel Program Frequency",
893 .name = "freq_table_value",
894 .set_value = ctrl_channelfreq_set,
895 .get_value = ctrl_channelfreq_get,
897 /* Hook in check for input value (tv/radio) and adjust
898 max/min values accordingly */
899 .get_max_value = ctrl_freq_max_get,
900 .get_min_value = ctrl_freq_min_get,
902 .desc = "Channel Program ID",
903 .name = "freq_table_channel",
904 .set_value = ctrl_channelprog_set,
905 .get_value = ctrl_channelprog_get,
906 DEFINT(0,FREQTABLE_SIZE),
908 .desc = "Streaming Enabled",
909 .name = "streaming_enabled",
910 .get_value = ctrl_streamingenabled_get,
915 .get_value = ctrl_hsm_get,
916 DEFENUM(control_values_hsm),
918 .desc = "Signal Present",
919 .name = "signal_present",
920 .get_value = ctrl_signal_get,
923 .desc = "Audio Modes Present",
924 .name = "audio_modes_present",
925 .get_value = ctrl_audio_modes_present_get,
926 /* For this type we "borrow" the V4L2_TUNER_MODE enum from
927 v4l. Nothing outside of this module cares about this,
928 but I reuse it in order to also reuse the
929 control_values_audiomode string table. */
930 DEFMASK(((1 << V4L2_TUNER_MODE_MONO)|
931 (1 << V4L2_TUNER_MODE_STEREO)|
932 (1 << V4L2_TUNER_MODE_LANG1)|
933 (1 << V4L2_TUNER_MODE_LANG2)),
934 control_values_audiomode),
936 .desc = "Video Standards Available Mask",
937 .name = "video_standard_mask_available",
938 .internal_id = PVR2_CID_STDAVAIL,
940 .get_value = ctrl_stdavail_get,
941 .set_value = ctrl_stdavail_set,
942 .val_to_sym = ctrl_std_val_to_sym,
943 .sym_to_val = ctrl_std_sym_to_val,
944 .type = pvr2_ctl_bitmask,
946 .desc = "Video Standards In Use Mask",
947 .name = "video_standard_mask_active",
948 .internal_id = PVR2_CID_STDCUR,
950 .get_value = ctrl_stdcur_get,
951 .set_value = ctrl_stdcur_set,
952 .is_dirty = ctrl_stdcur_is_dirty,
953 .clear_dirty = ctrl_stdcur_clear_dirty,
954 .val_to_sym = ctrl_std_val_to_sym,
955 .sym_to_val = ctrl_std_sym_to_val,
956 .type = pvr2_ctl_bitmask,
958 .desc = "Subsystem enabled mask",
959 .name = "debug_subsys_mask",
961 .get_value = ctrl_subsys_get,
962 .set_value = ctrl_subsys_set,
963 DEFMASK(PVR2_SUBSYS_ALL,control_values_subsystem),
965 .desc = "Subsystem stream mask",
966 .name = "debug_subsys_stream_mask",
968 .get_value = ctrl_subsys_stream_get,
969 .set_value = ctrl_subsys_stream_set,
970 DEFMASK(PVR2_SUBSYS_ALL,control_values_subsystem),
972 .desc = "Video Standard Name",
973 .name = "video_standard",
974 .internal_id = PVR2_CID_STDENUM,
976 .get_value = ctrl_stdenumcur_get,
977 .set_value = ctrl_stdenumcur_set,
978 .is_dirty = ctrl_stdenumcur_is_dirty,
979 .clear_dirty = ctrl_stdenumcur_clear_dirty,
980 .type = pvr2_ctl_enum,
984 #define CTRLDEF_COUNT ARRAY_SIZE(control_defs)
987 const char *pvr2_config_get_name(enum pvr2_config cfg)
990 case pvr2_config_empty: return "empty";
991 case pvr2_config_mpeg: return "mpeg";
992 case pvr2_config_vbi: return "vbi";
993 case pvr2_config_pcm: return "pcm";
994 case pvr2_config_rawvideo: return "raw video";
1000 struct usb_device *pvr2_hdw_get_dev(struct pvr2_hdw *hdw)
1002 return hdw->usb_dev;
1006 unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw)
1008 return hdw->serial_number;
1011 unsigned long pvr2_hdw_get_cur_freq(struct pvr2_hdw *hdw)
1013 return hdw->freqSelector ? hdw->freqValTelevision : hdw->freqValRadio;
1016 /* Set the currently tuned frequency and account for all possible
1017 driver-core side effects of this action. */
1018 void pvr2_hdw_set_cur_freq(struct pvr2_hdw *hdw,unsigned long val)
1020 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
1021 if (hdw->freqSelector) {
1022 /* Swing over to radio frequency selection */
1023 hdw->freqSelector = 0;
1024 hdw->freqDirty = !0;
1026 if (hdw->freqValRadio != val) {
1027 hdw->freqValRadio = val;
1028 hdw->freqSlotRadio = 0;
1029 hdw->freqDirty = !0;
1032 if (!(hdw->freqSelector)) {
1033 /* Swing over to television frequency selection */
1034 hdw->freqSelector = 1;
1035 hdw->freqDirty = !0;
1037 if (hdw->freqValTelevision != val) {
1038 hdw->freqValTelevision = val;
1039 hdw->freqSlotTelevision = 0;
1040 hdw->freqDirty = !0;
1045 int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw)
1047 return hdw->unit_number;
1051 /* Attempt to locate one of the given set of files. Messages are logged
1052 appropriate to what has been found. The return value will be 0 or
1053 greater on success (it will be the index of the file name found) and
1054 fw_entry will be filled in. Otherwise a negative error is returned on
1055 failure. If the return value is -ENOENT then no viable firmware file
1056 could be located. */
1057 static int pvr2_locate_firmware(struct pvr2_hdw *hdw,
1058 const struct firmware **fw_entry,
1059 const char *fwtypename,
1060 unsigned int fwcount,
1061 const char *fwnames[])
1065 for (idx = 0; idx < fwcount; idx++) {
1066 ret = request_firmware(fw_entry,
1068 &hdw->usb_dev->dev);
1070 trace_firmware("Located %s firmware: %s;"
1076 if (ret == -ENOENT) continue;
1077 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1078 "request_firmware fatal error with code=%d",ret);
1081 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1083 " Device %s firmware"
1084 " seems to be missing.",
1086 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1087 "Did you install the pvrusb2 firmware files"
1088 " in their proper location?");
1090 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1091 "request_firmware unable to locate %s file %s",
1092 fwtypename,fwnames[0]);
1094 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1095 "request_firmware unable to locate"
1096 " one of the following %s files:",
1098 for (idx = 0; idx < fwcount; idx++) {
1099 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1100 "request_firmware: Failed to find %s",
1109 * pvr2_upload_firmware1().
1111 * Send the 8051 firmware to the device. After the upload, arrange for
1112 * device to re-enumerate.
1114 * NOTE : the pointer to the firmware data given by request_firmware()
1115 * is not suitable for an usb transaction.
1118 static int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
1120 const struct firmware *fw_entry = NULL;
1125 static const char *fw_files_29xxx[] = {
1126 "v4l-pvrusb2-29xxx-01.fw",
1128 static const char *fw_files_24xxx[] = {
1129 "v4l-pvrusb2-24xxx-01.fw",
1131 static const struct pvr2_string_table fw_file_defs[] = {
1132 [PVR2_HDW_TYPE_29XXX] = {
1133 fw_files_29xxx, ARRAY_SIZE(fw_files_29xxx)
1135 [PVR2_HDW_TYPE_24XXX] = {
1136 fw_files_24xxx, ARRAY_SIZE(fw_files_24xxx)
1139 hdw->fw1_state = FW1_STATE_FAILED; // default result
1141 trace_firmware("pvr2_upload_firmware1");
1143 ret = pvr2_locate_firmware(hdw,&fw_entry,"fx2 controller",
1144 fw_file_defs[hdw->hdw_type].cnt,
1145 fw_file_defs[hdw->hdw_type].lst);
1147 if (ret == -ENOENT) hdw->fw1_state = FW1_STATE_MISSING;
1151 usb_settoggle(hdw->usb_dev, 0 & 0xf, !(0 & USB_DIR_IN), 0);
1152 usb_clear_halt(hdw->usb_dev, usb_sndbulkpipe(hdw->usb_dev, 0 & 0x7f));
1154 pipe = usb_sndctrlpipe(hdw->usb_dev, 0);
1156 if (fw_entry->size != 0x2000){
1157 pvr2_trace(PVR2_TRACE_ERROR_LEGS,"wrong fx2 firmware size");
1158 release_firmware(fw_entry);
1162 fw_ptr = kmalloc(0x800, GFP_KERNEL);
1163 if (fw_ptr == NULL){
1164 release_firmware(fw_entry);
1168 /* We have to hold the CPU during firmware upload. */
1169 pvr2_hdw_cpureset_assert(hdw,1);
1171 /* upload the firmware to address 0000-1fff in 2048 (=0x800) bytes
1175 for(address = 0; address < fw_entry->size; address += 0x800) {
1176 memcpy(fw_ptr, fw_entry->data + address, 0x800);
1177 ret += usb_control_msg(hdw->usb_dev, pipe, 0xa0, 0x40, address,
1178 0, fw_ptr, 0x800, HZ);
1181 trace_firmware("Upload done, releasing device's CPU");
1183 /* Now release the CPU. It will disconnect and reconnect later. */
1184 pvr2_hdw_cpureset_assert(hdw,0);
1187 release_firmware(fw_entry);
1189 trace_firmware("Upload done (%d bytes sent)",ret);
1191 /* We should have written 8192 bytes */
1193 hdw->fw1_state = FW1_STATE_RELOAD;
1202 * pvr2_upload_firmware2()
1204 * This uploads encoder firmware on endpoint 2.
1208 int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
1210 const struct firmware *fw_entry = NULL;
1212 unsigned int pipe, fw_len, fw_done, bcnt, icnt;
1216 static const char *fw_files[] = {
1217 CX2341X_FIRM_ENC_FILENAME,
1220 trace_firmware("pvr2_upload_firmware2");
1222 ret = pvr2_locate_firmware(hdw,&fw_entry,"encoder",
1223 ARRAY_SIZE(fw_files), fw_files);
1224 if (ret < 0) return ret;
1227 /* Since we're about to completely reinitialize the encoder,
1228 invalidate our cached copy of its configuration state. Next
1229 time we configure the encoder, then we'll fully configure it. */
1230 hdw->enc_cur_valid = 0;
1232 /* First prepare firmware loading */
1233 ret |= pvr2_write_register(hdw, 0x0048, 0xffffffff); /*interrupt mask*/
1234 ret |= pvr2_hdw_gpio_chg_dir(hdw,0xffffffff,0x00000088); /*gpio dir*/
1235 ret |= pvr2_hdw_gpio_chg_out(hdw,0xffffffff,0x00000008); /*gpio output state*/
1236 ret |= pvr2_hdw_cmd_deep_reset(hdw);
1237 ret |= pvr2_write_register(hdw, 0xa064, 0x00000000); /*APU command*/
1238 ret |= pvr2_hdw_gpio_chg_dir(hdw,0xffffffff,0x00000408); /*gpio dir*/
1239 ret |= pvr2_hdw_gpio_chg_out(hdw,0xffffffff,0x00000008); /*gpio output state*/
1240 ret |= pvr2_write_register(hdw, 0x9058, 0xffffffed); /*VPU ctrl*/
1241 ret |= pvr2_write_register(hdw, 0x9054, 0xfffffffd); /*reset hw blocks*/
1242 ret |= pvr2_write_register(hdw, 0x07f8, 0x80000800); /*encoder SDRAM refresh*/
1243 ret |= pvr2_write_register(hdw, 0x07fc, 0x0000001a); /*encoder SDRAM pre-charge*/
1244 ret |= pvr2_write_register(hdw, 0x0700, 0x00000000); /*I2C clock*/
1245 ret |= pvr2_write_register(hdw, 0xaa00, 0x00000000); /*unknown*/
1246 ret |= pvr2_write_register(hdw, 0xaa04, 0x00057810); /*unknown*/
1247 ret |= pvr2_write_register(hdw, 0xaa10, 0x00148500); /*unknown*/
1248 ret |= pvr2_write_register(hdw, 0xaa18, 0x00840000); /*unknown*/
1249 LOCK_TAKE(hdw->ctl_lock); do {
1250 hdw->cmd_buffer[0] = FX2CMD_FWPOST1;
1251 ret |= pvr2_send_request(hdw,hdw->cmd_buffer,1,NULL,0);
1252 hdw->cmd_buffer[0] = FX2CMD_MEMSEL;
1253 hdw->cmd_buffer[1] = 0;
1254 ret |= pvr2_send_request(hdw,hdw->cmd_buffer,2,NULL,0);
1255 } while (0); LOCK_GIVE(hdw->ctl_lock);
1258 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1259 "firmware2 upload prep failed, ret=%d",ret);
1260 release_firmware(fw_entry);
1264 /* Now send firmware */
1266 fw_len = fw_entry->size;
1268 if (fw_len % sizeof(u32)) {
1269 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1270 "size of %s firmware"
1271 " must be a multiple of %zu bytes",
1272 fw_files[fwidx],sizeof(u32));
1273 release_firmware(fw_entry);
1277 fw_ptr = kmalloc(FIRMWARE_CHUNK_SIZE, GFP_KERNEL);
1278 if (fw_ptr == NULL){
1279 release_firmware(fw_entry);
1280 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1281 "failed to allocate memory for firmware2 upload");
1285 pipe = usb_sndbulkpipe(hdw->usb_dev, PVR2_FIRMWARE_ENDPOINT);
1288 for (fw_done = 0; fw_done < fw_len;) {
1289 bcnt = fw_len - fw_done;
1290 if (bcnt > FIRMWARE_CHUNK_SIZE) bcnt = FIRMWARE_CHUNK_SIZE;
1291 memcpy(fw_ptr, fw_entry->data + fw_done, bcnt);
1292 /* Usbsnoop log shows that we must swap bytes... */
1293 for (icnt = 0; icnt < bcnt/4 ; icnt++)
1294 ((u32 *)fw_ptr)[icnt] =
1295 ___swab32(((u32 *)fw_ptr)[icnt]);
1297 ret |= usb_bulk_msg(hdw->usb_dev, pipe, fw_ptr,bcnt,
1298 &actual_length, HZ);
1299 ret |= (actual_length != bcnt);
1304 trace_firmware("upload of %s : %i / %i ",
1305 fw_files[fwidx],fw_done,fw_len);
1308 release_firmware(fw_entry);
1311 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1312 "firmware2 upload transfer failure");
1318 ret |= pvr2_write_register(hdw, 0x9054, 0xffffffff); /*reset hw blocks*/
1319 ret |= pvr2_write_register(hdw, 0x9058, 0xffffffe8); /*VPU ctrl*/
1320 LOCK_TAKE(hdw->ctl_lock); do {
1321 hdw->cmd_buffer[0] = FX2CMD_MEMSEL;
1322 hdw->cmd_buffer[1] = 0;
1323 ret |= pvr2_send_request(hdw,hdw->cmd_buffer,2,NULL,0);
1324 } while (0); LOCK_GIVE(hdw->ctl_lock);
1327 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1328 "firmware2 upload post-proc failure");
1330 hdw->subsys_enabled_mask |= (1<<PVR2_SUBSYS_B_ENC_FIRMWARE);
1336 #define FIRMWARE_RECOVERY_BITS \
1337 ((1<<PVR2_SUBSYS_B_ENC_CFG) | \
1338 (1<<PVR2_SUBSYS_B_ENC_RUN) | \
1339 (1<<PVR2_SUBSYS_B_ENC_FIRMWARE) | \
1340 (1<<PVR2_SUBSYS_B_USBSTREAM_RUN))
1344 This single function is key to pretty much everything. The pvrusb2
1345 device can logically be viewed as a series of subsystems which can be
1346 stopped / started or unconfigured / configured. To get things streaming,
1347 one must configure everything and start everything, but there may be
1348 various reasons over time to deconfigure something or stop something.
1349 This function handles all of this activity. Everything EVERYWHERE that
1350 must affect a subsystem eventually comes here to do the work.
1352 The current state of all subsystems is represented by a single bit mask,
1353 known as subsys_enabled_mask. The bit positions are defined by the
1354 PVR2_SUBSYS_xxxx macros, with one subsystem per bit position. At any
1355 time the set of configured or active subsystems can be queried just by
1356 looking at that mask. To change bits in that mask, this function here
1357 must be called. The "msk" argument indicates which bit positions to
1358 change, and the "val" argument defines the new values for the positions
1361 There is a priority ordering of starting / stopping things, and for
1362 multiple requested changes, this function implements that ordering.
1363 (Thus we will act on a request to load encoder firmware before we
1364 configure the encoder.) In addition to priority ordering, there is a
1365 recovery strategy implemented here. If a particular step fails and we
1366 detect that failure, this function will clear the affected subsystem bits
1367 and restart. Thus we have a means for recovering from a dead encoder:
1368 Clear all bits that correspond to subsystems that we need to restart /
1369 reconfigure and start over.
1372 static void pvr2_hdw_subsys_bit_chg_no_lock(struct pvr2_hdw *hdw,
1379 unsigned int tryCount = 0;
1381 if (!hdw->flag_ok) return;
1383 msk &= PVR2_SUBSYS_ALL;
1384 nmsk = (hdw->subsys_enabled_mask & ~msk) | (val & msk);
1385 nmsk &= PVR2_SUBSYS_ALL;
1389 if (!((nmsk ^ hdw->subsys_enabled_mask) &
1390 PVR2_SUBSYS_ALL)) break;
1392 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1393 "Too many retries when configuring device;"
1395 pvr2_hdw_render_useless(hdw);
1399 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1400 "Retrying device reconfiguration");
1402 pvr2_trace(PVR2_TRACE_INIT,
1403 "subsys mask changing 0x%lx:0x%lx"
1404 " from 0x%lx to 0x%lx",
1405 msk,val,hdw->subsys_enabled_mask,nmsk);
1407 vmsk = (nmsk ^ hdw->subsys_enabled_mask) &
1408 hdw->subsys_enabled_mask;
1410 if (vmsk & (1<<PVR2_SUBSYS_B_ENC_RUN)) {
1411 pvr2_trace(PVR2_TRACE_CTL,
1412 "/*---TRACE_CTL----*/"
1413 " pvr2_encoder_stop");
1414 ret = pvr2_encoder_stop(hdw);
1416 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1417 "Error recovery initiated");
1418 hdw->subsys_enabled_mask &=
1419 ~FIRMWARE_RECOVERY_BITS;
1423 if (vmsk & (1<<PVR2_SUBSYS_B_USBSTREAM_RUN)) {
1424 pvr2_trace(PVR2_TRACE_CTL,
1425 "/*---TRACE_CTL----*/"
1426 " pvr2_hdw_cmd_usbstream(0)");
1427 pvr2_hdw_cmd_usbstream(hdw,0);
1429 if (vmsk & (1<<PVR2_SUBSYS_B_DIGITIZER_RUN)) {
1430 pvr2_trace(PVR2_TRACE_CTL,
1431 "/*---TRACE_CTL----*/"
1432 " decoder disable");
1433 if (hdw->decoder_ctrl) {
1434 hdw->decoder_ctrl->enable(
1435 hdw->decoder_ctrl->ctxt,0);
1437 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1439 " No decoder present");
1441 hdw->subsys_enabled_mask &=
1442 ~(1<<PVR2_SUBSYS_B_DIGITIZER_RUN);
1444 if (vmsk & PVR2_SUBSYS_CFG_ALL) {
1445 hdw->subsys_enabled_mask &=
1446 ~(vmsk & PVR2_SUBSYS_CFG_ALL);
1449 vmsk = (nmsk ^ hdw->subsys_enabled_mask) & nmsk;
1451 if (vmsk & (1<<PVR2_SUBSYS_B_ENC_FIRMWARE)) {
1452 pvr2_trace(PVR2_TRACE_CTL,
1453 "/*---TRACE_CTL----*/"
1454 " pvr2_upload_firmware2");
1455 ret = pvr2_upload_firmware2(hdw);
1457 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1458 "Failure uploading encoder"
1460 pvr2_hdw_render_useless(hdw);
1464 if (vmsk & (1<<PVR2_SUBSYS_B_ENC_CFG)) {
1465 pvr2_trace(PVR2_TRACE_CTL,
1466 "/*---TRACE_CTL----*/"
1467 " pvr2_encoder_configure");
1468 ret = pvr2_encoder_configure(hdw);
1470 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1471 "Error recovery initiated");
1472 hdw->subsys_enabled_mask &=
1473 ~FIRMWARE_RECOVERY_BITS;
1477 if (vmsk & (1<<PVR2_SUBSYS_B_DIGITIZER_RUN)) {
1478 pvr2_trace(PVR2_TRACE_CTL,
1479 "/*---TRACE_CTL----*/"
1481 if (hdw->decoder_ctrl) {
1482 hdw->decoder_ctrl->enable(
1483 hdw->decoder_ctrl->ctxt,!0);
1485 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1487 " No decoder present");
1489 hdw->subsys_enabled_mask |=
1490 (1<<PVR2_SUBSYS_B_DIGITIZER_RUN);
1492 if (vmsk & (1<<PVR2_SUBSYS_B_USBSTREAM_RUN)) {
1493 pvr2_trace(PVR2_TRACE_CTL,
1494 "/*---TRACE_CTL----*/"
1495 " pvr2_hdw_cmd_usbstream(1)");
1496 pvr2_hdw_cmd_usbstream(hdw,!0);
1498 if (vmsk & (1<<PVR2_SUBSYS_B_ENC_RUN)) {
1499 pvr2_trace(PVR2_TRACE_CTL,
1500 "/*---TRACE_CTL----*/"
1501 " pvr2_encoder_start");
1502 ret = pvr2_encoder_start(hdw);
1504 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1505 "Error recovery initiated");
1506 hdw->subsys_enabled_mask &=
1507 ~FIRMWARE_RECOVERY_BITS;
1516 void pvr2_hdw_subsys_bit_chg(struct pvr2_hdw *hdw,
1517 unsigned long msk,unsigned long val)
1519 LOCK_TAKE(hdw->big_lock); do {
1520 pvr2_hdw_subsys_bit_chg_no_lock(hdw,msk,val);
1521 } while (0); LOCK_GIVE(hdw->big_lock);
1525 unsigned long pvr2_hdw_subsys_get(struct pvr2_hdw *hdw)
1527 return hdw->subsys_enabled_mask;
1531 unsigned long pvr2_hdw_subsys_stream_get(struct pvr2_hdw *hdw)
1533 return hdw->subsys_stream_mask;
1537 static void pvr2_hdw_subsys_stream_bit_chg_no_lock(struct pvr2_hdw *hdw,
1542 msk &= PVR2_SUBSYS_ALL;
1543 val2 = ((hdw->subsys_stream_mask & ~msk) | (val & msk));
1544 pvr2_trace(PVR2_TRACE_INIT,
1545 "stream mask changing 0x%lx:0x%lx from 0x%lx to 0x%lx",
1546 msk,val,hdw->subsys_stream_mask,val2);
1547 hdw->subsys_stream_mask = val2;
1551 void pvr2_hdw_subsys_stream_bit_chg(struct pvr2_hdw *hdw,
1555 LOCK_TAKE(hdw->big_lock); do {
1556 pvr2_hdw_subsys_stream_bit_chg_no_lock(hdw,msk,val);
1557 } while (0); LOCK_GIVE(hdw->big_lock);
1561 static int pvr2_hdw_set_streaming_no_lock(struct pvr2_hdw *hdw,int enableFl)
1563 if ((!enableFl) == !(hdw->flag_streaming_enabled)) return 0;
1565 pvr2_trace(PVR2_TRACE_START_STOP,
1566 "/*--TRACE_STREAM--*/ enable");
1567 pvr2_hdw_subsys_bit_chg_no_lock(hdw,~0,~0);
1569 pvr2_trace(PVR2_TRACE_START_STOP,
1570 "/*--TRACE_STREAM--*/ disable");
1571 pvr2_hdw_subsys_bit_chg_no_lock(hdw,hdw->subsys_stream_mask,0);
1573 if (!hdw->flag_ok) return -EIO;
1574 hdw->flag_streaming_enabled = enableFl != 0;
1579 int pvr2_hdw_get_streaming(struct pvr2_hdw *hdw)
1581 return hdw->flag_streaming_enabled != 0;
1585 int pvr2_hdw_set_streaming(struct pvr2_hdw *hdw,int enable_flag)
1588 LOCK_TAKE(hdw->big_lock); do {
1589 ret = pvr2_hdw_set_streaming_no_lock(hdw,enable_flag);
1590 } while (0); LOCK_GIVE(hdw->big_lock);
1595 static int pvr2_hdw_set_stream_type_no_lock(struct pvr2_hdw *hdw,
1596 enum pvr2_config config)
1598 unsigned long sm = hdw->subsys_enabled_mask;
1599 if (!hdw->flag_ok) return -EIO;
1600 pvr2_hdw_subsys_bit_chg_no_lock(hdw,hdw->subsys_stream_mask,0);
1601 hdw->config = config;
1602 pvr2_hdw_subsys_bit_chg_no_lock(hdw,~0,sm);
1607 int pvr2_hdw_set_stream_type(struct pvr2_hdw *hdw,enum pvr2_config config)
1610 if (!hdw->flag_ok) return -EIO;
1611 LOCK_TAKE(hdw->big_lock);
1612 ret = pvr2_hdw_set_stream_type_no_lock(hdw,config);
1613 LOCK_GIVE(hdw->big_lock);
1618 static int get_default_tuner_type(struct pvr2_hdw *hdw)
1620 int unit_number = hdw->unit_number;
1622 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1623 tp = tuner[unit_number];
1625 if (tp < 0) return -EINVAL;
1626 hdw->tuner_type = tp;
1631 static v4l2_std_id get_default_standard(struct pvr2_hdw *hdw)
1633 int unit_number = hdw->unit_number;
1635 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1636 tp = video_std[unit_number];
1642 static unsigned int get_default_error_tolerance(struct pvr2_hdw *hdw)
1644 int unit_number = hdw->unit_number;
1646 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1647 tp = tolerance[unit_number];
1653 static int pvr2_hdw_check_firmware(struct pvr2_hdw *hdw)
1655 /* Try a harmless request to fetch the eeprom's address over
1656 endpoint 1. See what happens. Only the full FX2 image can
1657 respond to this. If this probe fails then likely the FX2
1658 firmware needs be loaded. */
1660 LOCK_TAKE(hdw->ctl_lock); do {
1661 hdw->cmd_buffer[0] = FX2CMD_GET_EEPROM_ADDR;
1662 result = pvr2_send_request_ex(hdw,HZ*1,!0,
1665 if (result < 0) break;
1666 } while(0); LOCK_GIVE(hdw->ctl_lock);
1668 pvr2_trace(PVR2_TRACE_INIT,
1669 "Probe of device endpoint 1 result status %d",
1672 pvr2_trace(PVR2_TRACE_INIT,
1673 "Probe of device endpoint 1 succeeded");
1678 static void pvr2_hdw_setup_std(struct pvr2_hdw *hdw)
1682 v4l2_std_id std1,std2;
1684 std1 = get_default_standard(hdw);
1686 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),hdw->std_mask_eeprom);
1687 pvr2_trace(PVR2_TRACE_INIT,
1688 "Supported video standard(s) reported by eeprom: %.*s",
1691 hdw->std_mask_avail = hdw->std_mask_eeprom;
1693 std2 = std1 & ~hdw->std_mask_avail;
1695 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std2);
1696 pvr2_trace(PVR2_TRACE_INIT,
1697 "Expanding supported video standards"
1698 " to include: %.*s",
1700 hdw->std_mask_avail |= std2;
1703 pvr2_hdw_internal_set_std_avail(hdw);
1706 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std1);
1707 pvr2_trace(PVR2_TRACE_INIT,
1708 "Initial video standard forced to %.*s",
1710 hdw->std_mask_cur = std1;
1711 hdw->std_dirty = !0;
1712 pvr2_hdw_internal_find_stdenum(hdw);
1716 if (hdw->std_enum_cnt > 1) {
1717 // Autoselect the first listed standard
1718 hdw->std_enum_cur = 1;
1719 hdw->std_mask_cur = hdw->std_defs[hdw->std_enum_cur-1].id;
1720 hdw->std_dirty = !0;
1721 pvr2_trace(PVR2_TRACE_INIT,
1722 "Initial video standard auto-selected to %s",
1723 hdw->std_defs[hdw->std_enum_cur-1].name);
1727 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1728 "Unable to select a viable initial video standard");
1732 static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
1736 struct pvr2_ctrl *cptr;
1739 reloadFl = (hdw->usb_intf->cur_altsetting->desc.bNumEndpoints
1742 pvr2_trace(PVR2_TRACE_INIT,
1743 "USB endpoint config looks strange"
1744 "; possibly firmware needs to be loaded");
1748 reloadFl = !pvr2_hdw_check_firmware(hdw);
1750 pvr2_trace(PVR2_TRACE_INIT,
1751 "Check for FX2 firmware failed"
1752 "; possibly firmware needs to be loaded");
1756 if (pvr2_upload_firmware1(hdw) != 0) {
1757 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1758 "Failure uploading firmware1");
1762 hdw->fw1_state = FW1_STATE_OK;
1765 pvr2_hdw_device_reset(hdw);
1767 if (!pvr2_hdw_dev_ok(hdw)) return;
1769 for (idx = 0; idx < pvr2_client_lists[hdw->hdw_type].cnt; idx++) {
1770 request_module(pvr2_client_lists[hdw->hdw_type].lst[idx]);
1773 pvr2_hdw_cmd_powerup(hdw);
1774 if (!pvr2_hdw_dev_ok(hdw)) return;
1776 if (pvr2_upload_firmware2(hdw)){
1777 pvr2_trace(PVR2_TRACE_ERROR_LEGS,"device unstable!!");
1778 pvr2_hdw_render_useless(hdw);
1782 // This step MUST happen after the earlier powerup step.
1783 pvr2_i2c_core_init(hdw);
1784 if (!pvr2_hdw_dev_ok(hdw)) return;
1786 for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
1787 cptr = hdw->controls + idx;
1788 if (cptr->info->skip_init) continue;
1789 if (!cptr->info->set_value) continue;
1790 cptr->info->set_value(cptr,~0,cptr->info->default_value);
1793 /* Set up special default values for the television and radio
1794 frequencies here. It's not really important what these defaults
1795 are, but I set them to something usable in the Chicago area just
1796 to make driver testing a little easier. */
1798 /* US Broadcast channel 7 (175.25 MHz) */
1799 hdw->freqValTelevision = 175250000L;
1800 /* 104.3 MHz, a usable FM station for my area */
1801 hdw->freqValRadio = 104300000L;
1803 // Do not use pvr2_reset_ctl_endpoints() here. It is not
1804 // thread-safe against the normal pvr2_send_request() mechanism.
1805 // (We should make it thread safe).
1807 ret = pvr2_hdw_get_eeprom_addr(hdw);
1808 if (!pvr2_hdw_dev_ok(hdw)) return;
1810 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1811 "Unable to determine location of eeprom, skipping");
1813 hdw->eeprom_addr = ret;
1814 pvr2_eeprom_analyze(hdw);
1815 if (!pvr2_hdw_dev_ok(hdw)) return;
1818 pvr2_hdw_setup_std(hdw);
1820 if (!get_default_tuner_type(hdw)) {
1821 pvr2_trace(PVR2_TRACE_INIT,
1822 "pvr2_hdw_setup: Tuner type overridden to %d",
1826 hdw->tuner_updated = !0;
1827 pvr2_i2c_core_check_stale(hdw);
1828 hdw->tuner_updated = 0;
1830 if (!pvr2_hdw_dev_ok(hdw)) return;
1832 pvr2_hdw_commit_ctl_internal(hdw);
1833 if (!pvr2_hdw_dev_ok(hdw)) return;
1835 hdw->vid_stream = pvr2_stream_create();
1836 if (!pvr2_hdw_dev_ok(hdw)) return;
1837 pvr2_trace(PVR2_TRACE_INIT,
1838 "pvr2_hdw_setup: video stream is %p",hdw->vid_stream);
1839 if (hdw->vid_stream) {
1840 idx = get_default_error_tolerance(hdw);
1842 pvr2_trace(PVR2_TRACE_INIT,
1843 "pvr2_hdw_setup: video stream %p"
1844 " setting tolerance %u",
1845 hdw->vid_stream,idx);
1847 pvr2_stream_setup(hdw->vid_stream,hdw->usb_dev,
1848 PVR2_VID_ENDPOINT,idx);
1851 if (!pvr2_hdw_dev_ok(hdw)) return;
1853 /* Make sure everything is up to date */
1854 pvr2_i2c_core_sync(hdw);
1856 if (!pvr2_hdw_dev_ok(hdw)) return;
1858 hdw->flag_init_ok = !0;
1862 int pvr2_hdw_setup(struct pvr2_hdw *hdw)
1864 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_setup(hdw=%p) begin",hdw);
1865 LOCK_TAKE(hdw->big_lock); do {
1866 pvr2_hdw_setup_low(hdw);
1867 pvr2_trace(PVR2_TRACE_INIT,
1868 "pvr2_hdw_setup(hdw=%p) done, ok=%d init_ok=%d",
1869 hdw,hdw->flag_ok,hdw->flag_init_ok);
1870 if (pvr2_hdw_dev_ok(hdw)) {
1871 if (pvr2_hdw_init_ok(hdw)) {
1874 "Device initialization"
1875 " completed successfully.");
1878 if (hdw->fw1_state == FW1_STATE_RELOAD) {
1881 "Device microcontroller firmware"
1882 " (re)loaded; it should now reset"
1887 PVR2_TRACE_ERROR_LEGS,
1888 "Device initialization was not successful.");
1889 if (hdw->fw1_state == FW1_STATE_MISSING) {
1891 PVR2_TRACE_ERROR_LEGS,
1892 "Giving up since device"
1893 " microcontroller firmware"
1894 " appears to be missing.");
1900 PVR2_TRACE_ERROR_LEGS,
1901 "Attempting pvrusb2 recovery by reloading"
1902 " primary firmware.");
1904 PVR2_TRACE_ERROR_LEGS,
1905 "If this works, device should disconnect"
1906 " and reconnect in a sane state.");
1907 hdw->fw1_state = FW1_STATE_UNKNOWN;
1908 pvr2_upload_firmware1(hdw);
1911 PVR2_TRACE_ERROR_LEGS,
1912 "***WARNING*** pvrusb2 device hardware"
1913 " appears to be jammed"
1914 " and I can't clear it.");
1916 PVR2_TRACE_ERROR_LEGS,
1917 "You might need to power cycle"
1918 " the pvrusb2 device"
1919 " in order to recover.");
1921 } while (0); LOCK_GIVE(hdw->big_lock);
1922 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_setup(hdw=%p) end",hdw);
1923 return hdw->flag_init_ok;
1927 /* Create and return a structure for interacting with the underlying
1929 struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
1930 const struct usb_device_id *devid)
1932 unsigned int idx,cnt1,cnt2;
1933 struct pvr2_hdw *hdw;
1934 unsigned int hdw_type;
1936 struct pvr2_ctrl *cptr;
1938 struct v4l2_queryctrl qctrl;
1939 struct pvr2_ctl_info *ciptr;
1941 hdw_type = devid - pvr2_device_table;
1942 if (hdw_type >= ARRAY_SIZE(pvr2_device_names)) {
1943 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1944 "Bogus device type of %u reported",hdw_type);
1948 hdw = kzalloc(sizeof(*hdw),GFP_KERNEL);
1949 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_create: hdw=%p, type \"%s\"",
1950 hdw,pvr2_device_names[hdw_type]);
1951 if (!hdw) goto fail;
1952 hdw->tuner_signal_stale = !0;
1953 cx2341x_fill_defaults(&hdw->enc_ctl_state);
1955 hdw->control_cnt = CTRLDEF_COUNT;
1956 hdw->control_cnt += MPEGDEF_COUNT;
1957 hdw->controls = kzalloc(sizeof(struct pvr2_ctrl) * hdw->control_cnt,
1959 if (!hdw->controls) goto fail;
1960 hdw->hdw_type = hdw_type;
1961 for (idx = 0; idx < hdw->control_cnt; idx++) {
1962 cptr = hdw->controls + idx;
1965 for (idx = 0; idx < 32; idx++) {
1966 hdw->std_mask_ptrs[idx] = hdw->std_mask_names[idx];
1968 for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
1969 cptr = hdw->controls + idx;
1970 cptr->info = control_defs+idx;
1972 /* Define and configure additional controls from cx2341x module. */
1973 hdw->mpeg_ctrl_info = kzalloc(
1974 sizeof(*(hdw->mpeg_ctrl_info)) * MPEGDEF_COUNT, GFP_KERNEL);
1975 if (!hdw->mpeg_ctrl_info) goto fail;
1976 for (idx = 0; idx < MPEGDEF_COUNT; idx++) {
1977 cptr = hdw->controls + idx + CTRLDEF_COUNT;
1978 ciptr = &(hdw->mpeg_ctrl_info[idx].info);
1979 ciptr->desc = hdw->mpeg_ctrl_info[idx].desc;
1980 ciptr->name = mpeg_ids[idx].strid;
1981 ciptr->v4l_id = mpeg_ids[idx].id;
1982 ciptr->skip_init = !0;
1983 ciptr->get_value = ctrl_cx2341x_get;
1984 ciptr->get_v4lflags = ctrl_cx2341x_getv4lflags;
1985 ciptr->is_dirty = ctrl_cx2341x_is_dirty;
1986 if (!idx) ciptr->clear_dirty = ctrl_cx2341x_clear_dirty;
1987 qctrl.id = ciptr->v4l_id;
1988 cx2341x_ctrl_query(&hdw->enc_ctl_state,&qctrl);
1989 if (!(qctrl.flags & V4L2_CTRL_FLAG_READ_ONLY)) {
1990 ciptr->set_value = ctrl_cx2341x_set;
1992 strncpy(hdw->mpeg_ctrl_info[idx].desc,qctrl.name,
1993 PVR2_CTLD_INFO_DESC_SIZE);
1994 hdw->mpeg_ctrl_info[idx].desc[PVR2_CTLD_INFO_DESC_SIZE-1] = 0;
1995 ciptr->default_value = qctrl.default_value;
1996 switch (qctrl.type) {
1998 case V4L2_CTRL_TYPE_INTEGER:
1999 ciptr->type = pvr2_ctl_int;
2000 ciptr->def.type_int.min_value = qctrl.minimum;
2001 ciptr->def.type_int.max_value = qctrl.maximum;
2003 case V4L2_CTRL_TYPE_BOOLEAN:
2004 ciptr->type = pvr2_ctl_bool;
2006 case V4L2_CTRL_TYPE_MENU:
2007 ciptr->type = pvr2_ctl_enum;
2008 ciptr->def.type_enum.value_names =
2009 cx2341x_ctrl_get_menu(ciptr->v4l_id);
2011 ciptr->def.type_enum.value_names[cnt1] != NULL;
2013 ciptr->def.type_enum.count = cnt1;
2019 // Initialize video standard enum dynamic control
2020 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDENUM);
2022 memcpy(&hdw->std_info_enum,cptr->info,
2023 sizeof(hdw->std_info_enum));
2024 cptr->info = &hdw->std_info_enum;
2027 // Initialize control data regarding video standard masks
2028 valid_std_mask = pvr2_std_get_usable();
2029 for (idx = 0; idx < 32; idx++) {
2030 if (!(valid_std_mask & (1 << idx))) continue;
2031 cnt1 = pvr2_std_id_to_str(
2032 hdw->std_mask_names[idx],
2033 sizeof(hdw->std_mask_names[idx])-1,
2035 hdw->std_mask_names[idx][cnt1] = 0;
2037 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDAVAIL);
2039 memcpy(&hdw->std_info_avail,cptr->info,
2040 sizeof(hdw->std_info_avail));
2041 cptr->info = &hdw->std_info_avail;
2042 hdw->std_info_avail.def.type_bitmask.bit_names =
2044 hdw->std_info_avail.def.type_bitmask.valid_bits =
2047 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDCUR);
2049 memcpy(&hdw->std_info_cur,cptr->info,
2050 sizeof(hdw->std_info_cur));
2051 cptr->info = &hdw->std_info_cur;
2052 hdw->std_info_cur.def.type_bitmask.bit_names =
2054 hdw->std_info_avail.def.type_bitmask.valid_bits =
2058 hdw->eeprom_addr = -1;
2059 hdw->unit_number = -1;
2060 hdw->v4l_minor_number_video = -1;
2061 hdw->v4l_minor_number_vbi = -1;
2062 hdw->v4l_minor_number_radio = -1;
2063 hdw->ctl_write_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL);
2064 if (!hdw->ctl_write_buffer) goto fail;
2065 hdw->ctl_read_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL);
2066 if (!hdw->ctl_read_buffer) goto fail;
2067 hdw->ctl_write_urb = usb_alloc_urb(0,GFP_KERNEL);
2068 if (!hdw->ctl_write_urb) goto fail;
2069 hdw->ctl_read_urb = usb_alloc_urb(0,GFP_KERNEL);
2070 if (!hdw->ctl_read_urb) goto fail;
2072 down(&pvr2_unit_sem); do {
2073 for (idx = 0; idx < PVR_NUM; idx++) {
2074 if (unit_pointers[idx]) continue;
2075 hdw->unit_number = idx;
2076 unit_pointers[idx] = hdw;
2079 } while (0); up(&pvr2_unit_sem);
2082 cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"pvrusb2");
2084 if (hdw->unit_number >= 0) {
2085 cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"_%c",
2086 ('a' + hdw->unit_number));
2089 if (cnt1 >= sizeof(hdw->name)) cnt1 = sizeof(hdw->name)-1;
2090 hdw->name[cnt1] = 0;
2092 pvr2_trace(PVR2_TRACE_INIT,"Driver unit number is %d, name is %s",
2093 hdw->unit_number,hdw->name);
2095 hdw->tuner_type = -1;
2097 /* Initialize the mask of subsystems that we will shut down when we
2099 hdw->subsys_stream_mask = PVR2_SUBSYS_RUN_ALL;
2100 hdw->subsys_stream_mask |= (1<<PVR2_SUBSYS_B_ENC_CFG);
2102 pvr2_trace(PVR2_TRACE_INIT,"subsys_stream_mask: 0x%lx",
2103 hdw->subsys_stream_mask);
2105 hdw->usb_intf = intf;
2106 hdw->usb_dev = interface_to_usbdev(intf);
2108 ifnum = hdw->usb_intf->cur_altsetting->desc.bInterfaceNumber;
2109 usb_set_interface(hdw->usb_dev,ifnum,0);
2111 mutex_init(&hdw->ctl_lock_mutex);
2112 mutex_init(&hdw->big_lock_mutex);
2117 usb_free_urb(hdw->ctl_read_urb);
2118 usb_free_urb(hdw->ctl_write_urb);
2119 kfree(hdw->ctl_read_buffer);
2120 kfree(hdw->ctl_write_buffer);
2121 kfree(hdw->controls);
2122 kfree(hdw->mpeg_ctrl_info);
2129 /* Remove _all_ associations between this driver and the underlying USB
2131 static void pvr2_hdw_remove_usb_stuff(struct pvr2_hdw *hdw)
2133 if (hdw->flag_disconnected) return;
2134 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_remove_usb_stuff: hdw=%p",hdw);
2135 if (hdw->ctl_read_urb) {
2136 usb_kill_urb(hdw->ctl_read_urb);
2137 usb_free_urb(hdw->ctl_read_urb);
2138 hdw->ctl_read_urb = NULL;
2140 if (hdw->ctl_write_urb) {
2141 usb_kill_urb(hdw->ctl_write_urb);
2142 usb_free_urb(hdw->ctl_write_urb);
2143 hdw->ctl_write_urb = NULL;
2145 if (hdw->ctl_read_buffer) {
2146 kfree(hdw->ctl_read_buffer);
2147 hdw->ctl_read_buffer = NULL;
2149 if (hdw->ctl_write_buffer) {
2150 kfree(hdw->ctl_write_buffer);
2151 hdw->ctl_write_buffer = NULL;
2153 pvr2_hdw_render_useless_unlocked(hdw);
2154 hdw->flag_disconnected = !0;
2155 hdw->usb_dev = NULL;
2156 hdw->usb_intf = NULL;
2160 /* Destroy hardware interaction structure */
2161 void pvr2_hdw_destroy(struct pvr2_hdw *hdw)
2163 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_destroy: hdw=%p",hdw);
2164 if (hdw->fw_buffer) {
2165 kfree(hdw->fw_buffer);
2166 hdw->fw_buffer = NULL;
2168 if (hdw->vid_stream) {
2169 pvr2_stream_destroy(hdw->vid_stream);
2170 hdw->vid_stream = NULL;
2172 if (hdw->decoder_ctrl) {
2173 hdw->decoder_ctrl->detach(hdw->decoder_ctrl->ctxt);
2175 pvr2_i2c_core_done(hdw);
2176 pvr2_hdw_remove_usb_stuff(hdw);
2177 down(&pvr2_unit_sem); do {
2178 if ((hdw->unit_number >= 0) &&
2179 (hdw->unit_number < PVR_NUM) &&
2180 (unit_pointers[hdw->unit_number] == hdw)) {
2181 unit_pointers[hdw->unit_number] = NULL;
2183 } while (0); up(&pvr2_unit_sem);
2184 kfree(hdw->controls);
2185 kfree(hdw->mpeg_ctrl_info);
2186 kfree(hdw->std_defs);
2187 kfree(hdw->std_enum_names);
2192 int pvr2_hdw_init_ok(struct pvr2_hdw *hdw)
2194 return hdw->flag_init_ok;
2198 int pvr2_hdw_dev_ok(struct pvr2_hdw *hdw)
2200 return (hdw && hdw->flag_ok);
2204 /* Called when hardware has been unplugged */
2205 void pvr2_hdw_disconnect(struct pvr2_hdw *hdw)
2207 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_disconnect(hdw=%p)",hdw);
2208 LOCK_TAKE(hdw->big_lock);
2209 LOCK_TAKE(hdw->ctl_lock);
2210 pvr2_hdw_remove_usb_stuff(hdw);
2211 LOCK_GIVE(hdw->ctl_lock);
2212 LOCK_GIVE(hdw->big_lock);
2216 // Attempt to autoselect an appropriate value for std_enum_cur given
2217 // whatever is currently in std_mask_cur
2218 static void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw)
2221 for (idx = 1; idx < hdw->std_enum_cnt; idx++) {
2222 if (hdw->std_defs[idx-1].id == hdw->std_mask_cur) {
2223 hdw->std_enum_cur = idx;
2227 hdw->std_enum_cur = 0;
2231 // Calculate correct set of enumerated standards based on currently known
2232 // set of available standards bits.
2233 static void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw)
2235 struct v4l2_standard *newstd;
2236 unsigned int std_cnt;
2239 newstd = pvr2_std_create_enum(&std_cnt,hdw->std_mask_avail);
2241 if (hdw->std_defs) {
2242 kfree(hdw->std_defs);
2243 hdw->std_defs = NULL;
2245 hdw->std_enum_cnt = 0;
2246 if (hdw->std_enum_names) {
2247 kfree(hdw->std_enum_names);
2248 hdw->std_enum_names = NULL;
2253 PVR2_TRACE_ERROR_LEGS,
2254 "WARNING: Failed to identify any viable standards");
2256 hdw->std_enum_names = kmalloc(sizeof(char *)*(std_cnt+1),GFP_KERNEL);
2257 hdw->std_enum_names[0] = "none";
2258 for (idx = 0; idx < std_cnt; idx++) {
2259 hdw->std_enum_names[idx+1] =
2262 // Set up the dynamic control for this standard
2263 hdw->std_info_enum.def.type_enum.value_names = hdw->std_enum_names;
2264 hdw->std_info_enum.def.type_enum.count = std_cnt+1;
2265 hdw->std_defs = newstd;
2266 hdw->std_enum_cnt = std_cnt+1;
2267 hdw->std_enum_cur = 0;
2268 hdw->std_info_cur.def.type_bitmask.valid_bits = hdw->std_mask_avail;
2272 int pvr2_hdw_get_stdenum_value(struct pvr2_hdw *hdw,
2273 struct v4l2_standard *std,
2277 if (!idx) return ret;
2278 LOCK_TAKE(hdw->big_lock); do {
2279 if (idx >= hdw->std_enum_cnt) break;
2281 memcpy(std,hdw->std_defs+idx,sizeof(*std));
2283 } while (0); LOCK_GIVE(hdw->big_lock);
2288 /* Get the number of defined controls */
2289 unsigned int pvr2_hdw_get_ctrl_count(struct pvr2_hdw *hdw)
2291 return hdw->control_cnt;
2295 /* Retrieve a control handle given its index (0..count-1) */
2296 struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_index(struct pvr2_hdw *hdw,
2299 if (idx >= hdw->control_cnt) return NULL;
2300 return hdw->controls + idx;
2304 /* Retrieve a control handle given its index (0..count-1) */
2305 struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_id(struct pvr2_hdw *hdw,
2306 unsigned int ctl_id)
2308 struct pvr2_ctrl *cptr;
2312 /* This could be made a lot more efficient, but for now... */
2313 for (idx = 0; idx < hdw->control_cnt; idx++) {
2314 cptr = hdw->controls + idx;
2315 i = cptr->info->internal_id;
2316 if (i && (i == ctl_id)) return cptr;
2322 /* Given a V4L ID, retrieve the control structure associated with it. */
2323 struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *hdw,unsigned int ctl_id)
2325 struct pvr2_ctrl *cptr;
2329 /* This could be made a lot more efficient, but for now... */
2330 for (idx = 0; idx < hdw->control_cnt; idx++) {
2331 cptr = hdw->controls + idx;
2332 i = cptr->info->v4l_id;
2333 if (i && (i == ctl_id)) return cptr;
2339 /* Given a V4L ID for its immediate predecessor, retrieve the control
2340 structure associated with it. */
2341 struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *hdw,
2342 unsigned int ctl_id)
2344 struct pvr2_ctrl *cptr,*cp2;
2348 /* This could be made a lot more efficient, but for now... */
2350 for (idx = 0; idx < hdw->control_cnt; idx++) {
2351 cptr = hdw->controls + idx;
2352 i = cptr->info->v4l_id;
2354 if (i <= ctl_id) continue;
2355 if (cp2 && (cp2->info->v4l_id < i)) continue;
2363 static const char *get_ctrl_typename(enum pvr2_ctl_type tp)
2366 case pvr2_ctl_int: return "integer";
2367 case pvr2_ctl_enum: return "enum";
2368 case pvr2_ctl_bool: return "boolean";
2369 case pvr2_ctl_bitmask: return "bitmask";
2375 /* Commit all control changes made up to this point. Subsystems can be
2376 indirectly affected by these changes. For a given set of things being
2377 committed, we'll clear the affected subsystem bits and then once we're
2378 done committing everything we'll make a request to restore the subsystem
2379 state(s) back to their previous value before this function was called.
2380 Thus we can automatically reconfigure affected pieces of the driver as
2381 controls are changed. */
2382 static int pvr2_hdw_commit_ctl_internal(struct pvr2_hdw *hdw)
2384 unsigned long saved_subsys_mask = hdw->subsys_enabled_mask;
2385 unsigned long stale_subsys_mask = 0;
2387 struct pvr2_ctrl *cptr;
2389 int commit_flag = 0;
2391 unsigned int bcnt,ccnt;
2393 for (idx = 0; idx < hdw->control_cnt; idx++) {
2394 cptr = hdw->controls + idx;
2395 if (cptr->info->is_dirty == 0) continue;
2396 if (!cptr->info->is_dirty(cptr)) continue;
2399 if (!(pvrusb2_debug & PVR2_TRACE_CTL)) continue;
2400 bcnt = scnprintf(buf,sizeof(buf),"\"%s\" <-- ",
2403 cptr->info->get_value(cptr,&value);
2404 pvr2_ctrl_value_to_sym_internal(cptr,~0,value,
2406 sizeof(buf)-bcnt,&ccnt);
2408 bcnt += scnprintf(buf+bcnt,sizeof(buf)-bcnt," <%s>",
2409 get_ctrl_typename(cptr->info->type));
2410 pvr2_trace(PVR2_TRACE_CTL,
2411 "/*--TRACE_COMMIT--*/ %.*s",
2416 /* Nothing has changed */
2420 /* When video standard changes, reset the hres and vres values -
2421 but if the user has pending changes there, then let the changes
2423 if (hdw->std_dirty) {
2424 /* Rewrite the vertical resolution to be appropriate to the
2425 video standard that has been selected. */
2427 if (hdw->std_mask_cur & V4L2_STD_525_60) {
2432 if (nvres != hdw->res_ver_val) {
2433 hdw->res_ver_val = nvres;
2434 hdw->res_ver_dirty = !0;
2438 if (hdw->std_dirty ||
2441 hdw->res_ver_dirty ||
2442 hdw->res_hor_dirty ||
2444 /* If any of this changes, then the encoder needs to be
2445 reconfigured, and we need to reset the stream. */
2446 stale_subsys_mask |= (1<<PVR2_SUBSYS_B_ENC_CFG);
2449 if (hdw->input_dirty) {
2450 /* pk: If input changes to or from radio, then the encoder
2451 needs to be restarted (for ENC_MUTE_VIDEO to work) */
2452 stale_subsys_mask |= (1<<PVR2_SUBSYS_B_ENC_RUN);
2456 if (hdw->srate_dirty) {
2457 /* Write new sample rate into control structure since
2458 * the master copy is stale. We must track srate
2459 * separate from the mpeg control structure because
2460 * other logic also uses this value. */
2461 struct v4l2_ext_controls cs;
2462 struct v4l2_ext_control c1;
2463 memset(&cs,0,sizeof(cs));
2464 memset(&c1,0,sizeof(c1));
2467 c1.id = V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ;
2468 c1.value = hdw->srate_val;
2469 cx2341x_ext_ctrls(&hdw->enc_ctl_state,&cs,VIDIOC_S_EXT_CTRLS);
2472 /* Scan i2c core at this point - before we clear all the dirty
2473 bits. Various parts of the i2c core will notice dirty bits as
2474 appropriate and arrange to broadcast or directly send updates to
2475 the client drivers in order to keep everything in sync */
2476 pvr2_i2c_core_check_stale(hdw);
2478 for (idx = 0; idx < hdw->control_cnt; idx++) {
2479 cptr = hdw->controls + idx;
2480 if (!cptr->info->clear_dirty) continue;
2481 cptr->info->clear_dirty(cptr);
2484 /* Now execute i2c core update */
2485 pvr2_i2c_core_sync(hdw);
2487 pvr2_hdw_subsys_bit_chg_no_lock(hdw,stale_subsys_mask,0);
2488 pvr2_hdw_subsys_bit_chg_no_lock(hdw,~0,saved_subsys_mask);
2494 int pvr2_hdw_commit_ctl(struct pvr2_hdw *hdw)
2496 LOCK_TAKE(hdw->big_lock); do {
2497 pvr2_hdw_commit_ctl_internal(hdw);
2498 } while (0); LOCK_GIVE(hdw->big_lock);
2503 void pvr2_hdw_poll(struct pvr2_hdw *hdw)
2505 LOCK_TAKE(hdw->big_lock); do {
2506 pvr2_i2c_core_sync(hdw);
2507 } while (0); LOCK_GIVE(hdw->big_lock);
2511 void pvr2_hdw_setup_poll_trigger(struct pvr2_hdw *hdw,
2512 void (*func)(void *),
2515 LOCK_TAKE(hdw->big_lock); do {
2516 hdw->poll_trigger_func = func;
2517 hdw->poll_trigger_data = data;
2518 } while (0); LOCK_GIVE(hdw->big_lock);
2522 void pvr2_hdw_poll_trigger_unlocked(struct pvr2_hdw *hdw)
2524 if (hdw->poll_trigger_func) {
2525 hdw->poll_trigger_func(hdw->poll_trigger_data);
2529 /* Return name for this driver instance */
2530 const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw)
2536 int pvr2_hdw_is_hsm(struct pvr2_hdw *hdw)
2539 LOCK_TAKE(hdw->ctl_lock); do {
2540 hdw->cmd_buffer[0] = FX2CMD_GET_USB_SPEED;
2541 result = pvr2_send_request(hdw,
2544 if (result < 0) break;
2545 result = (hdw->cmd_buffer[0] != 0);
2546 } while(0); LOCK_GIVE(hdw->ctl_lock);
2551 /* Execute poll of tuner status */
2552 void pvr2_hdw_execute_tuner_poll(struct pvr2_hdw *hdw)
2554 LOCK_TAKE(hdw->big_lock); do {
2555 pvr2_i2c_core_status_poll(hdw);
2556 } while (0); LOCK_GIVE(hdw->big_lock);
2560 /* Return information about the tuner */
2561 int pvr2_hdw_get_tuner_status(struct pvr2_hdw *hdw,struct v4l2_tuner *vtp)
2563 LOCK_TAKE(hdw->big_lock); do {
2564 if (hdw->tuner_signal_stale) {
2565 pvr2_i2c_core_status_poll(hdw);
2567 memcpy(vtp,&hdw->tuner_signal_info,sizeof(struct v4l2_tuner));
2568 } while (0); LOCK_GIVE(hdw->big_lock);
2573 /* Get handle to video output stream */
2574 struct pvr2_stream *pvr2_hdw_get_video_stream(struct pvr2_hdw *hp)
2576 return hp->vid_stream;
2580 void pvr2_hdw_trigger_module_log(struct pvr2_hdw *hdw)
2582 int nr = pvr2_hdw_get_unit_number(hdw);
2583 LOCK_TAKE(hdw->big_lock); do {
2584 hdw->log_requested = !0;
2585 printk(KERN_INFO "pvrusb2: ================= START STATUS CARD #%d =================\n", nr);
2586 pvr2_i2c_core_check_stale(hdw);
2587 hdw->log_requested = 0;
2588 pvr2_i2c_core_sync(hdw);
2589 pvr2_trace(PVR2_TRACE_INFO,"cx2341x config:");
2590 cx2341x_log_status(&hdw->enc_ctl_state, "pvrusb2");
2591 printk(KERN_INFO "pvrusb2: ================== END STATUS CARD #%d ==================\n", nr);
2592 } while (0); LOCK_GIVE(hdw->big_lock);
2595 void pvr2_hdw_cpufw_set_enabled(struct pvr2_hdw *hdw, int enable_flag)
2600 LOCK_TAKE(hdw->big_lock); do {
2601 if ((hdw->fw_buffer == 0) == !enable_flag) break;
2604 pvr2_trace(PVR2_TRACE_FIRMWARE,
2605 "Cleaning up after CPU firmware fetch");
2606 kfree(hdw->fw_buffer);
2607 hdw->fw_buffer = NULL;
2609 /* Now release the CPU. It will disconnect and
2611 pvr2_hdw_cpureset_assert(hdw,0);
2615 pvr2_trace(PVR2_TRACE_FIRMWARE,
2616 "Preparing to suck out CPU firmware");
2617 hdw->fw_size = 0x2000;
2618 hdw->fw_buffer = kzalloc(hdw->fw_size,GFP_KERNEL);
2619 if (!hdw->fw_buffer) {
2624 /* We have to hold the CPU during firmware upload. */
2625 pvr2_hdw_cpureset_assert(hdw,1);
2627 /* download the firmware from address 0000-1fff in 2048
2628 (=0x800) bytes chunk. */
2630 pvr2_trace(PVR2_TRACE_FIRMWARE,"Grabbing CPU firmware");
2631 pipe = usb_rcvctrlpipe(hdw->usb_dev, 0);
2632 for(address = 0; address < hdw->fw_size; address += 0x800) {
2633 ret = usb_control_msg(hdw->usb_dev,pipe,0xa0,0xc0,
2635 hdw->fw_buffer+address,0x800,HZ);
2639 pvr2_trace(PVR2_TRACE_FIRMWARE,"Done grabbing CPU firmware");
2641 } while (0); LOCK_GIVE(hdw->big_lock);
2645 /* Return true if we're in a mode for retrieval CPU firmware */
2646 int pvr2_hdw_cpufw_get_enabled(struct pvr2_hdw *hdw)
2648 return hdw->fw_buffer != 0;
2652 int pvr2_hdw_cpufw_get(struct pvr2_hdw *hdw,unsigned int offs,
2653 char *buf,unsigned int cnt)
2656 LOCK_TAKE(hdw->big_lock); do {
2660 if (!hdw->fw_buffer) {
2665 if (offs >= hdw->fw_size) {
2666 pvr2_trace(PVR2_TRACE_FIRMWARE,
2667 "Read firmware data offs=%d EOF",
2673 if (offs + cnt > hdw->fw_size) cnt = hdw->fw_size - offs;
2675 memcpy(buf,hdw->fw_buffer+offs,cnt);
2677 pvr2_trace(PVR2_TRACE_FIRMWARE,
2678 "Read firmware data offs=%d cnt=%d",
2681 } while (0); LOCK_GIVE(hdw->big_lock);
2687 int pvr2_hdw_v4l_get_minor_number(struct pvr2_hdw *hdw,
2688 enum pvr2_v4l_type index)
2691 case pvr2_v4l_type_video: return hdw->v4l_minor_number_video;
2692 case pvr2_v4l_type_vbi: return hdw->v4l_minor_number_vbi;
2693 case pvr2_v4l_type_radio: return hdw->v4l_minor_number_radio;
2699 /* Store a v4l minor device number */
2700 void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *hdw,
2701 enum pvr2_v4l_type index,int v)
2704 case pvr2_v4l_type_video: hdw->v4l_minor_number_video = v;
2705 case pvr2_v4l_type_vbi: hdw->v4l_minor_number_vbi = v;
2706 case pvr2_v4l_type_radio: hdw->v4l_minor_number_radio = v;
2712 static void pvr2_ctl_write_complete(struct urb *urb)
2714 struct pvr2_hdw *hdw = urb->context;
2715 hdw->ctl_write_pend_flag = 0;
2716 if (hdw->ctl_read_pend_flag) return;
2717 complete(&hdw->ctl_done);
2721 static void pvr2_ctl_read_complete(struct urb *urb)
2723 struct pvr2_hdw *hdw = urb->context;
2724 hdw->ctl_read_pend_flag = 0;
2725 if (hdw->ctl_write_pend_flag) return;
2726 complete(&hdw->ctl_done);
2730 static void pvr2_ctl_timeout(unsigned long data)
2732 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
2733 if (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
2734 hdw->ctl_timeout_flag = !0;
2735 if (hdw->ctl_write_pend_flag)
2736 usb_unlink_urb(hdw->ctl_write_urb);
2737 if (hdw->ctl_read_pend_flag)
2738 usb_unlink_urb(hdw->ctl_read_urb);
2743 /* Issue a command and get a response from the device. This extended
2744 version includes a probe flag (which if set means that device errors
2745 should not be logged or treated as fatal) and a timeout in jiffies.
2746 This can be used to non-lethally probe the health of endpoint 1. */
2747 static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
2748 unsigned int timeout,int probe_fl,
2749 void *write_data,unsigned int write_len,
2750 void *read_data,unsigned int read_len)
2754 struct timer_list timer;
2755 if (!hdw->ctl_lock_held) {
2756 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2757 "Attempted to execute control transfer"
2761 if ((!hdw->flag_ok) && !probe_fl) {
2762 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2763 "Attempted to execute control transfer"
2764 " when device not ok");
2767 if (!(hdw->ctl_read_urb && hdw->ctl_write_urb)) {
2769 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2770 "Attempted to execute control transfer"
2771 " when USB is disconnected");
2776 /* Ensure that we have sane parameters */
2777 if (!write_data) write_len = 0;
2778 if (!read_data) read_len = 0;
2779 if (write_len > PVR2_CTL_BUFFSIZE) {
2781 PVR2_TRACE_ERROR_LEGS,
2782 "Attempted to execute %d byte"
2783 " control-write transfer (limit=%d)",
2784 write_len,PVR2_CTL_BUFFSIZE);
2787 if (read_len > PVR2_CTL_BUFFSIZE) {
2789 PVR2_TRACE_ERROR_LEGS,
2790 "Attempted to execute %d byte"
2791 " control-read transfer (limit=%d)",
2792 write_len,PVR2_CTL_BUFFSIZE);
2795 if ((!write_len) && (!read_len)) {
2797 PVR2_TRACE_ERROR_LEGS,
2798 "Attempted to execute null control transfer?");
2803 hdw->cmd_debug_state = 1;
2805 hdw->cmd_debug_code = ((unsigned char *)write_data)[0];
2807 hdw->cmd_debug_code = 0;
2809 hdw->cmd_debug_write_len = write_len;
2810 hdw->cmd_debug_read_len = read_len;
2812 /* Initialize common stuff */
2813 init_completion(&hdw->ctl_done);
2814 hdw->ctl_timeout_flag = 0;
2815 hdw->ctl_write_pend_flag = 0;
2816 hdw->ctl_read_pend_flag = 0;
2818 timer.expires = jiffies + timeout;
2819 timer.data = (unsigned long)hdw;
2820 timer.function = pvr2_ctl_timeout;
2823 hdw->cmd_debug_state = 2;
2824 /* Transfer write data to internal buffer */
2825 for (idx = 0; idx < write_len; idx++) {
2826 hdw->ctl_write_buffer[idx] =
2827 ((unsigned char *)write_data)[idx];
2829 /* Initiate a write request */
2830 usb_fill_bulk_urb(hdw->ctl_write_urb,
2832 usb_sndbulkpipe(hdw->usb_dev,
2833 PVR2_CTL_WRITE_ENDPOINT),
2834 hdw->ctl_write_buffer,
2836 pvr2_ctl_write_complete,
2838 hdw->ctl_write_urb->actual_length = 0;
2839 hdw->ctl_write_pend_flag = !0;
2840 status = usb_submit_urb(hdw->ctl_write_urb,GFP_KERNEL);
2842 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2843 "Failed to submit write-control"
2844 " URB status=%d",status);
2845 hdw->ctl_write_pend_flag = 0;
2851 hdw->cmd_debug_state = 3;
2852 memset(hdw->ctl_read_buffer,0x43,read_len);
2853 /* Initiate a read request */
2854 usb_fill_bulk_urb(hdw->ctl_read_urb,
2856 usb_rcvbulkpipe(hdw->usb_dev,
2857 PVR2_CTL_READ_ENDPOINT),
2858 hdw->ctl_read_buffer,
2860 pvr2_ctl_read_complete,
2862 hdw->ctl_read_urb->actual_length = 0;
2863 hdw->ctl_read_pend_flag = !0;
2864 status = usb_submit_urb(hdw->ctl_read_urb,GFP_KERNEL);
2866 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2867 "Failed to submit read-control"
2868 " URB status=%d",status);
2869 hdw->ctl_read_pend_flag = 0;
2877 /* Now wait for all I/O to complete */
2878 hdw->cmd_debug_state = 4;
2879 while (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
2880 wait_for_completion(&hdw->ctl_done);
2882 hdw->cmd_debug_state = 5;
2885 del_timer_sync(&timer);
2887 hdw->cmd_debug_state = 6;
2890 if (hdw->ctl_timeout_flag) {
2891 status = -ETIMEDOUT;
2893 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2894 "Timed out control-write");
2900 /* Validate results of write request */
2901 if ((hdw->ctl_write_urb->status != 0) &&
2902 (hdw->ctl_write_urb->status != -ENOENT) &&
2903 (hdw->ctl_write_urb->status != -ESHUTDOWN) &&
2904 (hdw->ctl_write_urb->status != -ECONNRESET)) {
2905 /* USB subsystem is reporting some kind of failure
2907 status = hdw->ctl_write_urb->status;
2909 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2910 "control-write URB failure,"
2916 if (hdw->ctl_write_urb->actual_length < write_len) {
2917 /* Failed to write enough data */
2920 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2921 "control-write URB short,"
2922 " expected=%d got=%d",
2924 hdw->ctl_write_urb->actual_length);
2930 /* Validate results of read request */
2931 if ((hdw->ctl_read_urb->status != 0) &&
2932 (hdw->ctl_read_urb->status != -ENOENT) &&
2933 (hdw->ctl_read_urb->status != -ESHUTDOWN) &&
2934 (hdw->ctl_read_urb->status != -ECONNRESET)) {
2935 /* USB subsystem is reporting some kind of failure
2937 status = hdw->ctl_read_urb->status;
2939 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2940 "control-read URB failure,"
2946 if (hdw->ctl_read_urb->actual_length < read_len) {
2947 /* Failed to read enough data */
2950 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2951 "control-read URB short,"
2952 " expected=%d got=%d",
2954 hdw->ctl_read_urb->actual_length);
2958 /* Transfer retrieved data out from internal buffer */
2959 for (idx = 0; idx < read_len; idx++) {
2960 ((unsigned char *)read_data)[idx] =
2961 hdw->ctl_read_buffer[idx];
2967 hdw->cmd_debug_state = 0;
2968 if ((status < 0) && (!probe_fl)) {
2969 pvr2_hdw_render_useless_unlocked(hdw);
2975 int pvr2_send_request(struct pvr2_hdw *hdw,
2976 void *write_data,unsigned int write_len,
2977 void *read_data,unsigned int read_len)
2979 return pvr2_send_request_ex(hdw,HZ*4,0,
2980 write_data,write_len,
2981 read_data,read_len);
2984 int pvr2_write_register(struct pvr2_hdw *hdw, u16 reg, u32 data)
2988 LOCK_TAKE(hdw->ctl_lock);
2990 hdw->cmd_buffer[0] = FX2CMD_REG_WRITE; /* write register prefix */
2991 PVR2_DECOMPOSE_LE(hdw->cmd_buffer,1,data);
2992 hdw->cmd_buffer[5] = 0;
2993 hdw->cmd_buffer[6] = (reg >> 8) & 0xff;
2994 hdw->cmd_buffer[7] = reg & 0xff;
2997 ret = pvr2_send_request(hdw, hdw->cmd_buffer, 8, hdw->cmd_buffer, 0);
2999 LOCK_GIVE(hdw->ctl_lock);
3005 static int pvr2_read_register(struct pvr2_hdw *hdw, u16 reg, u32 *data)
3009 LOCK_TAKE(hdw->ctl_lock);
3011 hdw->cmd_buffer[0] = FX2CMD_REG_READ; /* read register prefix */
3012 hdw->cmd_buffer[1] = 0;
3013 hdw->cmd_buffer[2] = 0;
3014 hdw->cmd_buffer[3] = 0;
3015 hdw->cmd_buffer[4] = 0;
3016 hdw->cmd_buffer[5] = 0;
3017 hdw->cmd_buffer[6] = (reg >> 8) & 0xff;
3018 hdw->cmd_buffer[7] = reg & 0xff;
3020 ret |= pvr2_send_request(hdw, hdw->cmd_buffer, 8, hdw->cmd_buffer, 4);
3021 *data = PVR2_COMPOSE_LE(hdw->cmd_buffer,0);
3023 LOCK_GIVE(hdw->ctl_lock);
3029 static void pvr2_hdw_render_useless_unlocked(struct pvr2_hdw *hdw)
3031 if (!hdw->flag_ok) return;
3032 pvr2_trace(PVR2_TRACE_INIT,"render_useless");
3034 if (hdw->vid_stream) {
3035 pvr2_stream_setup(hdw->vid_stream,NULL,0,0);
3037 hdw->flag_streaming_enabled = 0;
3038 hdw->subsys_enabled_mask = 0;
3042 void pvr2_hdw_render_useless(struct pvr2_hdw *hdw)
3044 LOCK_TAKE(hdw->ctl_lock);
3045 pvr2_hdw_render_useless_unlocked(hdw);
3046 LOCK_GIVE(hdw->ctl_lock);
3050 void pvr2_hdw_device_reset(struct pvr2_hdw *hdw)
3053 pvr2_trace(PVR2_TRACE_INIT,"Performing a device reset...");
3054 ret = usb_lock_device_for_reset(hdw->usb_dev,NULL);
3056 ret = usb_reset_device(hdw->usb_dev);
3057 usb_unlock_device(hdw->usb_dev);
3059 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3060 "Failed to lock USB device ret=%d",ret);
3062 if (init_pause_msec) {
3063 pvr2_trace(PVR2_TRACE_INFO,
3064 "Waiting %u msec for hardware to settle",
3066 msleep(init_pause_msec);
3072 void pvr2_hdw_cpureset_assert(struct pvr2_hdw *hdw,int val)
3078 if (!hdw->usb_dev) return;
3080 pvr2_trace(PVR2_TRACE_INIT,"cpureset_assert(%d)",val);
3082 da[0] = val ? 0x01 : 0x00;
3084 /* Write the CPUCS register on the 8051. The lsb of the register
3085 is the reset bit; a 1 asserts reset while a 0 clears it. */
3086 pipe = usb_sndctrlpipe(hdw->usb_dev, 0);
3087 ret = usb_control_msg(hdw->usb_dev,pipe,0xa0,0x40,0xe600,0,da,1,HZ);
3089 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3090 "cpureset_assert(%d) error=%d",val,ret);
3091 pvr2_hdw_render_useless(hdw);
3096 int pvr2_hdw_cmd_deep_reset(struct pvr2_hdw *hdw)
3099 LOCK_TAKE(hdw->ctl_lock); do {
3100 pvr2_trace(PVR2_TRACE_INIT,"Requesting uproc hard reset");
3102 hdw->cmd_buffer[0] = FX2CMD_DEEP_RESET;
3103 status = pvr2_send_request(hdw,hdw->cmd_buffer,1,NULL,0);
3104 } while (0); LOCK_GIVE(hdw->ctl_lock);
3109 int pvr2_hdw_cmd_powerup(struct pvr2_hdw *hdw)
3112 LOCK_TAKE(hdw->ctl_lock); do {
3113 pvr2_trace(PVR2_TRACE_INIT,"Requesting powerup");
3114 hdw->cmd_buffer[0] = FX2CMD_POWER_ON;
3115 status = pvr2_send_request(hdw,hdw->cmd_buffer,1,NULL,0);
3116 } while (0); LOCK_GIVE(hdw->ctl_lock);
3121 int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw)
3123 if (!hdw->decoder_ctrl) {
3124 pvr2_trace(PVR2_TRACE_INIT,
3125 "Unable to reset decoder: nothing attached");
3129 if (!hdw->decoder_ctrl->force_reset) {
3130 pvr2_trace(PVR2_TRACE_INIT,
3131 "Unable to reset decoder: not implemented");
3135 pvr2_trace(PVR2_TRACE_INIT,
3136 "Requesting decoder reset");
3137 hdw->decoder_ctrl->force_reset(hdw->decoder_ctrl->ctxt);
3142 /* Stop / start video stream transport */
3143 static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl)
3146 LOCK_TAKE(hdw->ctl_lock); do {
3147 hdw->cmd_buffer[0] =
3148 (runFl ? FX2CMD_STREAMING_ON : FX2CMD_STREAMING_OFF);
3149 status = pvr2_send_request(hdw,hdw->cmd_buffer,1,NULL,0);
3150 } while (0); LOCK_GIVE(hdw->ctl_lock);
3152 hdw->subsys_enabled_mask =
3153 ((hdw->subsys_enabled_mask &
3154 ~(1<<PVR2_SUBSYS_B_USBSTREAM_RUN)) |
3155 (runFl ? (1<<PVR2_SUBSYS_B_USBSTREAM_RUN) : 0));
3161 void pvr2_hdw_get_debug_info(const struct pvr2_hdw *hdw,
3162 struct pvr2_hdw_debug_info *ptr)
3164 ptr->big_lock_held = hdw->big_lock_held;
3165 ptr->ctl_lock_held = hdw->ctl_lock_held;
3166 ptr->flag_ok = hdw->flag_ok;
3167 ptr->flag_disconnected = hdw->flag_disconnected;
3168 ptr->flag_init_ok = hdw->flag_init_ok;
3169 ptr->flag_streaming_enabled = hdw->flag_streaming_enabled;
3170 ptr->subsys_flags = hdw->subsys_enabled_mask;
3171 ptr->cmd_debug_state = hdw->cmd_debug_state;
3172 ptr->cmd_code = hdw->cmd_debug_code;
3173 ptr->cmd_debug_write_len = hdw->cmd_debug_write_len;
3174 ptr->cmd_debug_read_len = hdw->cmd_debug_read_len;
3175 ptr->cmd_debug_timeout = hdw->ctl_timeout_flag;
3176 ptr->cmd_debug_write_pend = hdw->ctl_write_pend_flag;
3177 ptr->cmd_debug_read_pend = hdw->ctl_read_pend_flag;
3178 ptr->cmd_debug_rstatus = hdw->ctl_read_urb->status;
3179 ptr->cmd_debug_wstatus = hdw->ctl_read_urb->status;
3183 int pvr2_hdw_gpio_get_dir(struct pvr2_hdw *hdw,u32 *dp)
3185 return pvr2_read_register(hdw,PVR2_GPIO_DIR,dp);
3189 int pvr2_hdw_gpio_get_out(struct pvr2_hdw *hdw,u32 *dp)
3191 return pvr2_read_register(hdw,PVR2_GPIO_OUT,dp);
3195 int pvr2_hdw_gpio_get_in(struct pvr2_hdw *hdw,u32 *dp)
3197 return pvr2_read_register(hdw,PVR2_GPIO_IN,dp);
3201 int pvr2_hdw_gpio_chg_dir(struct pvr2_hdw *hdw,u32 msk,u32 val)
3206 ret = pvr2_read_register(hdw,PVR2_GPIO_DIR,&cval);
3207 if (ret) return ret;
3208 nval = (cval & ~msk) | (val & msk);
3209 pvr2_trace(PVR2_TRACE_GPIO,
3210 "GPIO direction changing 0x%x:0x%x"
3211 " from 0x%x to 0x%x",
3215 pvr2_trace(PVR2_TRACE_GPIO,
3216 "GPIO direction changing to 0x%x",nval);
3218 return pvr2_write_register(hdw,PVR2_GPIO_DIR,nval);
3222 int pvr2_hdw_gpio_chg_out(struct pvr2_hdw *hdw,u32 msk,u32 val)
3227 ret = pvr2_read_register(hdw,PVR2_GPIO_OUT,&cval);
3228 if (ret) return ret;
3229 nval = (cval & ~msk) | (val & msk);
3230 pvr2_trace(PVR2_TRACE_GPIO,
3231 "GPIO output changing 0x%x:0x%x from 0x%x to 0x%x",
3235 pvr2_trace(PVR2_TRACE_GPIO,
3236 "GPIO output changing to 0x%x",nval);
3238 return pvr2_write_register(hdw,PVR2_GPIO_OUT,nval);
3242 /* Find I2C address of eeprom */
3243 static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw)
3246 LOCK_TAKE(hdw->ctl_lock); do {
3247 hdw->cmd_buffer[0] = FX2CMD_GET_EEPROM_ADDR;
3248 result = pvr2_send_request(hdw,
3251 if (result < 0) break;
3252 result = hdw->cmd_buffer[0];
3253 } while(0); LOCK_GIVE(hdw->ctl_lock);
3258 int pvr2_hdw_register_access(struct pvr2_hdw *hdw,
3259 u32 match_type, u32 match_chip, u64 reg_id,
3260 int setFl,u64 *val_ptr)
3262 #ifdef CONFIG_VIDEO_ADV_DEBUG
3263 struct list_head *item;
3264 struct pvr2_i2c_client *cp;
3265 struct v4l2_register req;
3269 if (!capable(CAP_SYS_ADMIN)) return -EPERM;
3271 req.match_type = match_type;
3272 req.match_chip = match_chip;
3274 if (setFl) req.val = *val_ptr;
3275 mutex_lock(&hdw->i2c_list_lock); do {
3276 list_for_each(item,&hdw->i2c_clients) {
3277 cp = list_entry(item,struct pvr2_i2c_client,list);
3278 if (!v4l2_chip_match_i2c_client(cp->client, req.match_type, req.match_chip)) {
3281 stat = pvr2_i2c_client_cmd(
3282 cp,(setFl ? VIDIOC_DBG_S_REGISTER :
3283 VIDIOC_DBG_G_REGISTER),&req);
3284 if (!setFl) *val_ptr = req.val;
3288 } while (0); mutex_unlock(&hdw->i2c_list_lock);
3300 Stuff for Emacs to see, in order to encourage consistent editing style:
3301 *** Local Variables: ***
3303 *** fill-column: 75 ***
3304 *** tab-width: 8 ***
3305 *** c-basic-offset: 8 ***