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 <asm/semaphore.h>
29 #include "pvrusb2-std.h"
30 #include "pvrusb2-util.h"
31 #include "pvrusb2-hdw.h"
32 #include "pvrusb2-i2c-core.h"
33 #include "pvrusb2-tuner.h"
34 #include "pvrusb2-eeprom.h"
35 #include "pvrusb2-hdw-internal.h"
36 #include "pvrusb2-encoder.h"
37 #include "pvrusb2-debug.h"
39 struct usb_device_id pvr2_device_table[] = {
40 [PVR2_HDW_TYPE_29XXX] = { USB_DEVICE(0x2040, 0x2900) },
41 #ifdef CONFIG_VIDEO_PVRUSB2_24XXX
42 [PVR2_HDW_TYPE_24XXX] = { USB_DEVICE(0x2040, 0x2400) },
47 MODULE_DEVICE_TABLE(usb, pvr2_device_table);
49 static const char *pvr2_device_names[] = {
50 [PVR2_HDW_TYPE_29XXX] = "WinTV PVR USB2 Model Category 29xxxx",
51 #ifdef CONFIG_VIDEO_PVRUSB2_24XXX
52 [PVR2_HDW_TYPE_24XXX] = "WinTV PVR USB2 Model Category 24xxxx",
56 struct pvr2_string_table {
61 #ifdef CONFIG_VIDEO_PVRUSB2_24XXX
62 // Names of other client modules to request for 24xxx model hardware
63 static const char *pvr2_client_24xxx[] = {
71 // Names of other client modules to request for 29xxx model hardware
72 static const char *pvr2_client_29xxx[] = {
79 static struct pvr2_string_table pvr2_client_lists[] = {
80 [PVR2_HDW_TYPE_29XXX] = {
82 sizeof(pvr2_client_29xxx)/sizeof(pvr2_client_29xxx[0]),
84 #ifdef CONFIG_VIDEO_PVRUSB2_24XXX
85 [PVR2_HDW_TYPE_24XXX] = {
87 sizeof(pvr2_client_24xxx)/sizeof(pvr2_client_24xxx[0]),
92 static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = 0};
93 DECLARE_MUTEX(pvr2_unit_sem);
95 static int ctlchg = 0;
96 static int initusbreset = 1;
97 static int procreload = 0;
98 static int tuner[PVR_NUM] = { [0 ... PVR_NUM-1] = -1 };
99 static int tolerance[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
100 static int video_std[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
101 static int init_pause_msec = 0;
103 module_param(ctlchg, int, S_IRUGO|S_IWUSR);
104 MODULE_PARM_DESC(ctlchg, "0=optimize ctl change 1=always accept new ctl value");
105 module_param(init_pause_msec, int, S_IRUGO|S_IWUSR);
106 MODULE_PARM_DESC(init_pause_msec, "hardware initialization settling delay");
107 module_param(initusbreset, int, S_IRUGO|S_IWUSR);
108 MODULE_PARM_DESC(initusbreset, "Do USB reset device on probe");
109 module_param(procreload, int, S_IRUGO|S_IWUSR);
110 MODULE_PARM_DESC(procreload,
111 "Attempt init failure recovery with firmware reload");
112 module_param_array(tuner, int, NULL, 0444);
113 MODULE_PARM_DESC(tuner,"specify installed tuner type");
114 module_param_array(video_std, int, NULL, 0444);
115 MODULE_PARM_DESC(video_std,"specify initial video standard");
116 module_param_array(tolerance, int, NULL, 0444);
117 MODULE_PARM_DESC(tolerance,"specify stream error tolerance");
119 #define PVR2_CTL_WRITE_ENDPOINT 0x01
120 #define PVR2_CTL_READ_ENDPOINT 0x81
122 #define PVR2_GPIO_IN 0x9008
123 #define PVR2_GPIO_OUT 0x900c
124 #define PVR2_GPIO_DIR 0x9020
126 #define trace_firmware(...) pvr2_trace(PVR2_TRACE_FIRMWARE,__VA_ARGS__)
128 #define PVR2_FIRMWARE_ENDPOINT 0x02
130 /* size of a firmware chunk */
131 #define FIRMWARE_CHUNK_SIZE 0x2000
134 static const char *control_values_srate[] = {
135 [PVR2_CVAL_SRATE_48] = "48KHz",
136 [PVR2_CVAL_SRATE_44_1] = "44.1KHz",
140 static const char *control_values_audiobitrate[] = {
141 [PVR2_CVAL_AUDIOBITRATE_384] = "384kb/s",
142 [PVR2_CVAL_AUDIOBITRATE_320] = "320kb/s",
143 [PVR2_CVAL_AUDIOBITRATE_256] = "256kb/s",
144 [PVR2_CVAL_AUDIOBITRATE_224] = "224kb/s",
145 [PVR2_CVAL_AUDIOBITRATE_192] = "192kb/s",
146 [PVR2_CVAL_AUDIOBITRATE_160] = "160kb/s",
147 [PVR2_CVAL_AUDIOBITRATE_128] = "128kb/s",
148 [PVR2_CVAL_AUDIOBITRATE_112] = "112kb/s",
149 [PVR2_CVAL_AUDIOBITRATE_96] = "96kb/s",
150 [PVR2_CVAL_AUDIOBITRATE_80] = "80kb/s",
151 [PVR2_CVAL_AUDIOBITRATE_64] = "64kb/s",
152 [PVR2_CVAL_AUDIOBITRATE_56] = "56kb/s",
153 [PVR2_CVAL_AUDIOBITRATE_48] = "48kb/s",
154 [PVR2_CVAL_AUDIOBITRATE_32] = "32kb/s",
155 [PVR2_CVAL_AUDIOBITRATE_VBR] = "VBR",
159 static const char *control_values_audioemphasis[] = {
160 [PVR2_CVAL_AUDIOEMPHASIS_NONE] = "None",
161 [PVR2_CVAL_AUDIOEMPHASIS_50_15] = "50/15us",
162 [PVR2_CVAL_AUDIOEMPHASIS_CCITT] = "CCITT J.17",
166 static const char *control_values_input[] = {
167 [PVR2_CVAL_INPUT_TV] = "television", /*xawtv needs this name*/
168 [PVR2_CVAL_INPUT_RADIO] = "radio",
169 [PVR2_CVAL_INPUT_SVIDEO] = "s-video",
170 [PVR2_CVAL_INPUT_COMPOSITE] = "composite",
174 static const char *control_values_audiomode[] = {
175 [V4L2_TUNER_MODE_MONO] = "Mono",
176 [V4L2_TUNER_MODE_STEREO] = "Stereo",
177 [V4L2_TUNER_MODE_LANG1] = "Lang1",
178 [V4L2_TUNER_MODE_LANG2] = "Lang2",
179 [V4L2_TUNER_MODE_LANG1_LANG2] = "Lang1+Lang2",
183 static const char *control_values_hsm[] = {
184 [PVR2_CVAL_HSM_FAIL] = "Fail",
185 [PVR2_CVAL_HSM_HIGH] = "High",
186 [PVR2_CVAL_HSM_FULL] = "Full",
190 static const char *control_values_subsystem[] = {
191 [PVR2_SUBSYS_B_ENC_FIRMWARE] = "enc_firmware",
192 [PVR2_SUBSYS_B_ENC_CFG] = "enc_config",
193 [PVR2_SUBSYS_B_DIGITIZER_RUN] = "digitizer_run",
194 [PVR2_SUBSYS_B_USBSTREAM_RUN] = "usbstream_run",
195 [PVR2_SUBSYS_B_ENC_RUN] = "enc_run",
199 static int ctrl_channelfreq_get(struct pvr2_ctrl *cptr,int *vp)
201 struct pvr2_hdw *hdw = cptr->hdw;
202 if ((hdw->freqProgSlot > 0) && (hdw->freqProgSlot <= FREQTABLE_SIZE)) {
203 *vp = hdw->freqTable[hdw->freqProgSlot-1];
210 static int ctrl_channelfreq_set(struct pvr2_ctrl *cptr,int m,int v)
212 struct pvr2_hdw *hdw = cptr->hdw;
213 if ((hdw->freqProgSlot > 0) && (hdw->freqProgSlot <= FREQTABLE_SIZE)) {
214 hdw->freqTable[hdw->freqProgSlot-1] = v;
219 static int ctrl_channelprog_get(struct pvr2_ctrl *cptr,int *vp)
221 *vp = cptr->hdw->freqProgSlot;
225 static int ctrl_channelprog_set(struct pvr2_ctrl *cptr,int m,int v)
227 struct pvr2_hdw *hdw = cptr->hdw;
228 if ((v >= 0) && (v <= FREQTABLE_SIZE)) {
229 hdw->freqProgSlot = v;
234 static int ctrl_channel_get(struct pvr2_ctrl *cptr,int *vp)
236 *vp = cptr->hdw->freqSlot;
240 static int ctrl_channel_set(struct pvr2_ctrl *cptr,int m,int v)
243 struct pvr2_hdw *hdw = cptr->hdw;
245 if ((hdw->freqSlot > 0) && (hdw->freqSlot <= FREQTABLE_SIZE)) {
246 freq = hdw->freqTable[hdw->freqSlot-1];
248 if (freq && (freq != hdw->freqVal)) {
255 static int ctrl_freq_get(struct pvr2_ctrl *cptr,int *vp)
257 *vp = cptr->hdw->freqVal;
261 static int ctrl_freq_is_dirty(struct pvr2_ctrl *cptr)
263 return cptr->hdw->freqDirty != 0;
266 static void ctrl_freq_clear_dirty(struct pvr2_ctrl *cptr)
268 cptr->hdw->freqDirty = 0;
271 static int ctrl_freq_set(struct pvr2_ctrl *cptr,int m,int v)
273 struct pvr2_hdw *hdw = cptr->hdw;
280 static int ctrl_streamingenabled_get(struct pvr2_ctrl *cptr,int *vp)
282 *vp = cptr->hdw->flag_streaming_enabled;
286 static int ctrl_hsm_get(struct pvr2_ctrl *cptr,int *vp)
288 int result = pvr2_hdw_is_hsm(cptr->hdw);
289 *vp = PVR2_CVAL_HSM_FULL;
290 if (result < 0) *vp = PVR2_CVAL_HSM_FAIL;
291 if (result) *vp = PVR2_CVAL_HSM_HIGH;
295 static int ctrl_stdavail_get(struct pvr2_ctrl *cptr,int *vp)
297 *vp = cptr->hdw->std_mask_avail;
301 static int ctrl_stdavail_set(struct pvr2_ctrl *cptr,int m,int v)
303 struct pvr2_hdw *hdw = cptr->hdw;
305 ns = hdw->std_mask_avail;
306 ns = (ns & ~m) | (v & m);
307 if (ns == hdw->std_mask_avail) return 0;
308 hdw->std_mask_avail = ns;
309 pvr2_hdw_internal_set_std_avail(hdw);
310 pvr2_hdw_internal_find_stdenum(hdw);
314 static int ctrl_std_val_to_sym(struct pvr2_ctrl *cptr,int msk,int val,
315 char *bufPtr,unsigned int bufSize,
318 *len = pvr2_std_id_to_str(bufPtr,bufSize,msk & val);
322 static int ctrl_std_sym_to_val(struct pvr2_ctrl *cptr,
323 const char *bufPtr,unsigned int bufSize,
328 ret = pvr2_std_str_to_id(&id,bufPtr,bufSize);
329 if (ret < 0) return ret;
330 if (mskp) *mskp = id;
331 if (valp) *valp = id;
335 static int ctrl_stdcur_get(struct pvr2_ctrl *cptr,int *vp)
337 *vp = cptr->hdw->std_mask_cur;
341 static int ctrl_stdcur_set(struct pvr2_ctrl *cptr,int m,int v)
343 struct pvr2_hdw *hdw = cptr->hdw;
345 ns = hdw->std_mask_cur;
346 ns = (ns & ~m) | (v & m);
347 if (ns == hdw->std_mask_cur) return 0;
348 hdw->std_mask_cur = ns;
350 pvr2_hdw_internal_find_stdenum(hdw);
354 static int ctrl_stdcur_is_dirty(struct pvr2_ctrl *cptr)
356 return cptr->hdw->std_dirty != 0;
359 static void ctrl_stdcur_clear_dirty(struct pvr2_ctrl *cptr)
361 cptr->hdw->std_dirty = 0;
364 static int ctrl_signal_get(struct pvr2_ctrl *cptr,int *vp)
366 *vp = ((pvr2_hdw_get_signal_status_internal(cptr->hdw) &
367 PVR2_SIGNAL_OK) ? 1 : 0);
371 static int ctrl_subsys_get(struct pvr2_ctrl *cptr,int *vp)
373 *vp = cptr->hdw->subsys_enabled_mask;
377 static int ctrl_subsys_set(struct pvr2_ctrl *cptr,int m,int v)
379 pvr2_hdw_subsys_bit_chg_no_lock(cptr->hdw,m,v);
383 static int ctrl_subsys_stream_get(struct pvr2_ctrl *cptr,int *vp)
385 *vp = cptr->hdw->subsys_stream_mask;
389 static int ctrl_subsys_stream_set(struct pvr2_ctrl *cptr,int m,int v)
391 pvr2_hdw_subsys_stream_bit_chg_no_lock(cptr->hdw,m,v);
395 static int ctrl_stdenumcur_set(struct pvr2_ctrl *cptr,int m,int v)
397 struct pvr2_hdw *hdw = cptr->hdw;
398 if (v < 0) return -EINVAL;
399 if (v > hdw->std_enum_cnt) return -EINVAL;
400 hdw->std_enum_cur = v;
403 if (hdw->std_mask_cur == hdw->std_defs[v].id) return 0;
404 hdw->std_mask_cur = hdw->std_defs[v].id;
410 static int ctrl_stdenumcur_get(struct pvr2_ctrl *cptr,int *vp)
412 *vp = cptr->hdw->std_enum_cur;
417 static int ctrl_stdenumcur_is_dirty(struct pvr2_ctrl *cptr)
419 return cptr->hdw->std_dirty != 0;
423 static void ctrl_stdenumcur_clear_dirty(struct pvr2_ctrl *cptr)
425 cptr->hdw->std_dirty = 0;
429 #define DEFINT(vmin,vmax) \
430 .type = pvr2_ctl_int, \
431 .def.type_int.min_value = vmin, \
432 .def.type_int.max_value = vmax
434 #define DEFENUM(tab) \
435 .type = pvr2_ctl_enum, \
436 .def.type_enum.count = (sizeof(tab)/sizeof((tab)[0])), \
437 .def.type_enum.value_names = tab
440 .type = pvr2_ctl_bool
442 #define DEFMASK(msk,tab) \
443 .type = pvr2_ctl_bitmask, \
444 .def.type_bitmask.valid_bits = msk, \
445 .def.type_bitmask.bit_names = tab
447 #define DEFREF(vname) \
448 .set_value = ctrl_set_##vname, \
449 .get_value = ctrl_get_##vname, \
450 .is_dirty = ctrl_isdirty_##vname, \
451 .clear_dirty = ctrl_cleardirty_##vname
454 #define VCREATE_FUNCS(vname) \
455 static int ctrl_get_##vname(struct pvr2_ctrl *cptr,int *vp) \
456 {*vp = cptr->hdw->vname##_val; return 0;} \
457 static int ctrl_set_##vname(struct pvr2_ctrl *cptr,int m,int v) \
458 {cptr->hdw->vname##_val = v; cptr->hdw->vname##_dirty = !0; return 0;} \
459 static int ctrl_isdirty_##vname(struct pvr2_ctrl *cptr) \
460 {return cptr->hdw->vname##_dirty != 0;} \
461 static void ctrl_cleardirty_##vname(struct pvr2_ctrl *cptr) \
462 {cptr->hdw->vname##_dirty = 0;}
464 VCREATE_FUNCS(brightness)
465 VCREATE_FUNCS(contrast)
466 VCREATE_FUNCS(saturation)
468 VCREATE_FUNCS(volume)
469 VCREATE_FUNCS(balance)
471 VCREATE_FUNCS(treble)
474 VCREATE_FUNCS(audiomode)
475 VCREATE_FUNCS(res_hor)
476 VCREATE_FUNCS(res_ver)
478 VCREATE_FUNCS(audiobitrate)
479 VCREATE_FUNCS(audiocrc)
480 VCREATE_FUNCS(audioemphasis)
482 VCREATE_FUNCS(videobitrate)
483 VCREATE_FUNCS(videopeak)
484 VCREATE_FUNCS(interlace)
485 VCREATE_FUNCS(audiolayer)
487 #define MIN_FREQ 55250000L
488 #define MAX_FREQ 850000000L
490 /* Table definition of all controls which can be manipulated */
491 static const struct pvr2_ctl_info control_defs[] = {
493 .v4l_id = V4L2_CID_BRIGHTNESS,
494 .desc = "Brightness",
495 .name = "brightness",
496 .default_value = 128,
500 .v4l_id = V4L2_CID_CONTRAST,
507 .v4l_id = V4L2_CID_SATURATION,
508 .desc = "Saturation",
509 .name = "saturation",
514 .v4l_id = V4L2_CID_HUE,
521 .v4l_id = V4L2_CID_AUDIO_VOLUME,
524 .default_value = 65535,
528 .v4l_id = V4L2_CID_AUDIO_BALANCE,
533 DEFINT(-32768,32767),
535 .v4l_id = V4L2_CID_AUDIO_BASS,
540 DEFINT(-32768,32767),
542 .v4l_id = V4L2_CID_AUDIO_TREBLE,
547 DEFINT(-32768,32767),
549 .v4l_id = V4L2_CID_AUDIO_MUTE,
556 .desc = "Video Source",
558 .internal_id = PVR2_CID_INPUT,
559 .default_value = PVR2_CVAL_INPUT_TV,
561 DEFENUM(control_values_input),
563 .desc = "Audio Mode",
564 .name = "audio_mode",
565 .internal_id = PVR2_CID_AUDIOMODE,
566 .default_value = V4L2_TUNER_MODE_STEREO,
568 DEFENUM(control_values_audiomode),
570 .desc = "Horizontal capture resolution",
571 .name = "resolution_hor",
572 .internal_id = PVR2_CID_HRES,
573 .default_value = 720,
577 .desc = "Vertical capture resolution",
578 .name = "resolution_ver",
579 .internal_id = PVR2_CID_VRES,
580 .default_value = 480,
584 .v4l_id = V4L2_CID_PVR_SRATE,
585 .desc = "Sample rate",
587 .default_value = PVR2_CVAL_SRATE_48,
589 DEFENUM(control_values_srate),
591 .v4l_id = V4L2_CID_PVR_AUDIOBITRATE,
592 .desc = "Audio Bitrate",
593 .name = "audio_bitrate",
594 .default_value = PVR2_CVAL_AUDIOBITRATE_224,
595 DEFREF(audiobitrate),
596 DEFENUM(control_values_audiobitrate),
598 .v4l_id = V4L2_CID_PVR_AUDIOCRC,
605 .v4l_id = V4L2_CID_PVR_AUDIOEMPHASIS,
606 .desc = "Audio Emphasis",
607 .name = "audio_emphasis",
608 .default_value = PVR2_CVAL_AUDIOEMPHASIS_NONE,
609 DEFREF(audioemphasis),
610 DEFENUM(control_values_audioemphasis),
612 .v4l_id = V4L2_CID_PVR_VBR,
613 .desc = "Variable video bitrate",
619 .v4l_id = V4L2_CID_PVR_VIDEOBITRATE,
620 .desc = "Average video bitrate",
621 .name = "video_average_bitrate",
622 .default_value = 6000000,
623 DEFREF(videobitrate),
624 DEFINT(500000,20000000),
626 .v4l_id = V4L2_CID_PVR_VIDEOPEAK,
627 .desc = "Peak video bitrate",
628 .name = "video_peak_bitrate",
629 .default_value = 6000000,
631 DEFINT(500000,20000000),
633 .desc = "Interlace mode",
635 .internal_id = PVR2_CID_INTERLACE,
640 .desc = "Audio Layer",
641 .name = "audio_layer",
646 .desc = "Tuner Frequency (Hz)",
648 .internal_id = PVR2_CID_FREQUENCY,
649 .default_value = 175250000L,
650 .set_value = ctrl_freq_set,
651 .get_value = ctrl_freq_get,
652 .is_dirty = ctrl_freq_is_dirty,
653 .clear_dirty = ctrl_freq_clear_dirty,
654 DEFINT(MIN_FREQ,MAX_FREQ),
658 .set_value = ctrl_channel_set,
659 .get_value = ctrl_channel_get,
660 DEFINT(0,FREQTABLE_SIZE),
662 .desc = "Channel Program Frequency",
663 .name = "freq_table_value",
664 .set_value = ctrl_channelfreq_set,
665 .get_value = ctrl_channelfreq_get,
666 DEFINT(MIN_FREQ,MAX_FREQ),
668 .desc = "Channel Program ID",
669 .name = "freq_table_channel",
670 .set_value = ctrl_channelprog_set,
671 .get_value = ctrl_channelprog_get,
672 DEFINT(0,FREQTABLE_SIZE),
674 .desc = "Streaming Enabled",
675 .name = "streaming_enabled",
676 .get_value = ctrl_streamingenabled_get,
681 .get_value = ctrl_hsm_get,
682 DEFENUM(control_values_hsm),
684 .desc = "Signal Present",
685 .name = "signal_present",
686 .get_value = ctrl_signal_get,
689 .desc = "Video Standards Available Mask",
690 .name = "video_standard_mask_available",
691 .internal_id = PVR2_CID_STDAVAIL,
693 .get_value = ctrl_stdavail_get,
694 .set_value = ctrl_stdavail_set,
695 .val_to_sym = ctrl_std_val_to_sym,
696 .sym_to_val = ctrl_std_sym_to_val,
697 .type = pvr2_ctl_bitmask,
699 .desc = "Video Standards In Use Mask",
700 .name = "video_standard_mask_active",
701 .internal_id = PVR2_CID_STDCUR,
703 .get_value = ctrl_stdcur_get,
704 .set_value = ctrl_stdcur_set,
705 .is_dirty = ctrl_stdcur_is_dirty,
706 .clear_dirty = ctrl_stdcur_clear_dirty,
707 .val_to_sym = ctrl_std_val_to_sym,
708 .sym_to_val = ctrl_std_sym_to_val,
709 .type = pvr2_ctl_bitmask,
711 .desc = "Subsystem enabled mask",
712 .name = "debug_subsys_mask",
714 .get_value = ctrl_subsys_get,
715 .set_value = ctrl_subsys_set,
716 DEFMASK(PVR2_SUBSYS_ALL,control_values_subsystem),
718 .desc = "Subsystem stream mask",
719 .name = "debug_subsys_stream_mask",
721 .get_value = ctrl_subsys_stream_get,
722 .set_value = ctrl_subsys_stream_set,
723 DEFMASK(PVR2_SUBSYS_ALL,control_values_subsystem),
725 .desc = "Video Standard Name",
726 .name = "video_standard",
727 .internal_id = PVR2_CID_STDENUM,
729 .get_value = ctrl_stdenumcur_get,
730 .set_value = ctrl_stdenumcur_set,
731 .is_dirty = ctrl_stdenumcur_is_dirty,
732 .clear_dirty = ctrl_stdenumcur_clear_dirty,
733 .type = pvr2_ctl_enum,
737 #define CTRLDEF_COUNT (sizeof(control_defs)/sizeof(control_defs[0]))
740 const char *pvr2_config_get_name(enum pvr2_config cfg)
743 case pvr2_config_empty: return "empty";
744 case pvr2_config_mpeg: return "mpeg";
745 case pvr2_config_vbi: return "vbi";
746 case pvr2_config_radio: return "radio";
752 struct usb_device *pvr2_hdw_get_dev(struct pvr2_hdw *hdw)
758 unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw)
760 return hdw->serial_number;
764 struct pvr2_hdw *pvr2_hdw_find(int unit_number)
766 if (unit_number < 0) return 0;
767 if (unit_number >= PVR_NUM) return 0;
768 return unit_pointers[unit_number];
772 int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw)
774 return hdw->unit_number;
778 /* Attempt to locate one of the given set of files. Messages are logged
779 appropriate to what has been found. The return value will be 0 or
780 greater on success (it will be the index of the file name found) and
781 fw_entry will be filled in. Otherwise a negative error is returned on
782 failure. If the return value is -ENOENT then no viable firmware file
784 static int pvr2_locate_firmware(struct pvr2_hdw *hdw,
785 const struct firmware **fw_entry,
786 const char *fwtypename,
787 unsigned int fwcount,
788 const char *fwnames[])
792 for (idx = 0; idx < fwcount; idx++) {
793 ret = request_firmware(fw_entry,
797 trace_firmware("Located %s firmware: %s;"
803 if (ret == -ENOENT) continue;
804 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
805 "request_firmware fatal error with code=%d",ret);
808 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
810 " Device %s firmware"
811 " seems to be missing.",
813 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
814 "Did you install the pvrusb2 firmware files"
815 " in their proper location?");
817 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
818 "request_firmware unable to locate %s file %s",
819 fwtypename,fwnames[0]);
821 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
822 "request_firmware unable to locate"
823 " one of the following %s files:",
825 for (idx = 0; idx < fwcount; idx++) {
826 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
827 "request_firmware: Failed to find %s",
836 * pvr2_upload_firmware1().
838 * Send the 8051 firmware to the device. After the upload, arrange for
839 * device to re-enumerate.
841 * NOTE : the pointer to the firmware data given by request_firmware()
842 * is not suitable for an usb transaction.
845 int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
847 const struct firmware *fw_entry = 0;
852 static const char *fw_files_29xxx[] = {
853 "v4l-pvrusb2-29xxx-01.fw",
855 #ifdef CONFIG_VIDEO_PVRUSB2_24XXX
856 static const char *fw_files_24xxx[] = {
857 "v4l-pvrusb2-24xxx-01.fw",
860 static const struct pvr2_string_table fw_file_defs[] = {
861 [PVR2_HDW_TYPE_29XXX] = {
863 sizeof(fw_files_29xxx)/sizeof(fw_files_29xxx[0]),
865 #ifdef CONFIG_VIDEO_PVRUSB2_24XXX
866 [PVR2_HDW_TYPE_24XXX] = {
868 sizeof(fw_files_24xxx)/sizeof(fw_files_24xxx[0]),
872 hdw->fw1_state = FW1_STATE_FAILED; // default result
874 trace_firmware("pvr2_upload_firmware1");
876 ret = pvr2_locate_firmware(hdw,&fw_entry,"fx2 controller",
877 fw_file_defs[hdw->hdw_type].cnt,
878 fw_file_defs[hdw->hdw_type].lst);
880 if (ret == -ENOENT) hdw->fw1_state = FW1_STATE_MISSING;
884 usb_settoggle(hdw->usb_dev, 0 & 0xf, !(0 & USB_DIR_IN), 0);
885 usb_clear_halt(hdw->usb_dev, usb_sndbulkpipe(hdw->usb_dev, 0 & 0x7f));
887 pipe = usb_sndctrlpipe(hdw->usb_dev, 0);
889 if (fw_entry->size != 0x2000){
890 pvr2_trace(PVR2_TRACE_ERROR_LEGS,"wrong fx2 firmware size");
891 release_firmware(fw_entry);
895 fw_ptr = kmalloc(0x800, GFP_KERNEL);
897 release_firmware(fw_entry);
901 /* We have to hold the CPU during firmware upload. */
902 pvr2_hdw_cpureset_assert(hdw,1);
904 /* upload the firmware to address 0000-1fff in 2048 (=0x800) bytes
908 for(address = 0; address < fw_entry->size; address += 0x800) {
909 memcpy(fw_ptr, fw_entry->data + address, 0x800);
910 ret += usb_control_msg(hdw->usb_dev, pipe, 0xa0, 0x40, address,
911 0, fw_ptr, 0x800, HZ);
914 trace_firmware("Upload done, releasing device's CPU");
916 /* Now release the CPU. It will disconnect and reconnect later. */
917 pvr2_hdw_cpureset_assert(hdw,0);
920 release_firmware(fw_entry);
922 trace_firmware("Upload done (%d bytes sent)",ret);
924 /* We should have written 8192 bytes */
926 hdw->fw1_state = FW1_STATE_RELOAD;
935 * pvr2_upload_firmware2()
937 * This uploads encoder firmware on endpoint 2.
941 int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
943 const struct firmware *fw_entry = 0;
945 unsigned int pipe, fw_len, fw_done;
949 static const char *fw_files[] = {
950 CX2341X_FIRM_ENC_FILENAME,
953 trace_firmware("pvr2_upload_firmware2");
955 ret = pvr2_locate_firmware(hdw,&fw_entry,"encoder",
956 sizeof(fw_files)/sizeof(fw_files[0]),
958 if (ret < 0) return ret;
962 /* First prepare firmware loading */
963 ret |= pvr2_write_register(hdw, 0x0048, 0xffffffff); /*interrupt mask*/
964 ret |= pvr2_hdw_gpio_chg_dir(hdw,0xffffffff,0x00000088); /*gpio dir*/
965 ret |= pvr2_hdw_gpio_chg_out(hdw,0xffffffff,0x00000008); /*gpio output state*/
966 ret |= pvr2_hdw_cmd_deep_reset(hdw);
967 ret |= pvr2_write_register(hdw, 0xa064, 0x00000000); /*APU command*/
968 ret |= pvr2_hdw_gpio_chg_dir(hdw,0xffffffff,0x00000408); /*gpio dir*/
969 ret |= pvr2_hdw_gpio_chg_out(hdw,0xffffffff,0x00000008); /*gpio output state*/
970 ret |= pvr2_write_register(hdw, 0x9058, 0xffffffed); /*VPU ctrl*/
971 ret |= pvr2_write_register(hdw, 0x9054, 0xfffffffd); /*reset hw blocks*/
972 ret |= pvr2_write_register(hdw, 0x07f8, 0x80000800); /*encoder SDRAM refresh*/
973 ret |= pvr2_write_register(hdw, 0x07fc, 0x0000001a); /*encoder SDRAM pre-charge*/
974 ret |= pvr2_write_register(hdw, 0x0700, 0x00000000); /*I2C clock*/
975 ret |= pvr2_write_register(hdw, 0xaa00, 0x00000000); /*unknown*/
976 ret |= pvr2_write_register(hdw, 0xaa04, 0x00057810); /*unknown*/
977 ret |= pvr2_write_register(hdw, 0xaa10, 0x00148500); /*unknown*/
978 ret |= pvr2_write_register(hdw, 0xaa18, 0x00840000); /*unknown*/
979 ret |= pvr2_write_u8(hdw, 0x52, 0);
980 ret |= pvr2_write_u16(hdw, 0x0600, 0);
983 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
984 "firmware2 upload prep failed, ret=%d",ret);
985 release_firmware(fw_entry);
989 /* Now send firmware */
991 fw_len = fw_entry->size;
993 if (fw_len % FIRMWARE_CHUNK_SIZE) {
994 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
995 "size of %s firmware"
996 " must be a multiple of 8192B",
998 release_firmware(fw_entry);
1002 fw_ptr = kmalloc(FIRMWARE_CHUNK_SIZE, GFP_KERNEL);
1003 if (fw_ptr == NULL){
1004 release_firmware(fw_entry);
1005 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1006 "failed to allocate memory for firmware2 upload");
1010 pipe = usb_sndbulkpipe(hdw->usb_dev, PVR2_FIRMWARE_ENDPOINT);
1012 for (fw_done = 0 ; (fw_done < fw_len) && !ret ;
1013 fw_done += FIRMWARE_CHUNK_SIZE ) {
1015 memcpy(fw_ptr, fw_entry->data + fw_done, FIRMWARE_CHUNK_SIZE);
1016 /* Usbsnoop log shows that we must swap bytes... */
1017 for (i = 0; i < FIRMWARE_CHUNK_SIZE/4 ; i++)
1018 ((u32 *)fw_ptr)[i] = ___swab32(((u32 *)fw_ptr)[i]);
1020 ret |= usb_bulk_msg(hdw->usb_dev, pipe, fw_ptr,
1021 FIRMWARE_CHUNK_SIZE,
1022 &actual_length, HZ);
1023 ret |= (actual_length != FIRMWARE_CHUNK_SIZE);
1026 trace_firmware("upload of %s : %i / %i ",
1027 fw_files[fwidx],fw_done,fw_len);
1030 release_firmware(fw_entry);
1033 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1034 "firmware2 upload transfer failure");
1040 ret |= pvr2_write_register(hdw, 0x9054, 0xffffffff); /*reset hw blocks*/
1041 ret |= pvr2_write_register(hdw, 0x9058, 0xffffffe8); /*VPU ctrl*/
1042 ret |= pvr2_write_u16(hdw, 0x0600, 0);
1045 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1046 "firmware2 upload post-proc failure");
1048 hdw->subsys_enabled_mask |= (1<<PVR2_SUBSYS_B_ENC_FIRMWARE);
1054 #define FIRMWARE_RECOVERY_BITS \
1055 ((1<<PVR2_SUBSYS_B_ENC_CFG) | \
1056 (1<<PVR2_SUBSYS_B_ENC_RUN) | \
1057 (1<<PVR2_SUBSYS_B_ENC_FIRMWARE) | \
1058 (1<<PVR2_SUBSYS_B_USBSTREAM_RUN))
1062 This single function is key to pretty much everything. The pvrusb2
1063 device can logically be viewed as a series of subsystems which can be
1064 stopped / started or unconfigured / configured. To get things streaming,
1065 one must configure everything and start everything, but there may be
1066 various reasons over time to deconfigure something or stop something.
1067 This function handles all of this activity. Everything EVERYWHERE that
1068 must affect a subsystem eventually comes here to do the work.
1070 The current state of all subsystems is represented by a single bit mask,
1071 known as subsys_enabled_mask. The bit positions are defined by the
1072 PVR2_SUBSYS_xxxx macros, with one subsystem per bit position. At any
1073 time the set of configured or active subsystems can be queried just by
1074 looking at that mask. To change bits in that mask, this function here
1075 must be called. The "msk" argument indicates which bit positions to
1076 change, and the "val" argument defines the new values for the positions
1079 There is a priority ordering of starting / stopping things, and for
1080 multiple requested changes, this function implements that ordering.
1081 (Thus we will act on a request to load encoder firmware before we
1082 configure the encoder.) In addition to priority ordering, there is a
1083 recovery strategy implemented here. If a particular step fails and we
1084 detect that failure, this function will clear the affected subsystem bits
1085 and restart. Thus we have a means for recovering from a dead encoder:
1086 Clear all bits that correspond to subsystems that we need to restart /
1087 reconfigure and start over.
1090 void pvr2_hdw_subsys_bit_chg_no_lock(struct pvr2_hdw *hdw,
1091 unsigned long msk,unsigned long val)
1096 unsigned int tryCount = 0;
1098 if (!hdw->flag_ok) return;
1100 msk &= PVR2_SUBSYS_ALL;
1104 vmsk = hdw->subsys_enabled_mask & PVR2_SUBSYS_ALL;
1105 nmsk = (vmsk & ~msk) | (val & msk);
1106 if (!(nmsk ^ vmsk)) break;
1108 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1109 "Too many retries when configuring device;"
1111 pvr2_hdw_render_useless(hdw);
1115 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1116 "Retrying device reconfiguration");
1118 pvr2_trace(PVR2_TRACE_INIT,
1119 "subsys mask changing 0x%lx:0x%lx"
1120 " from 0x%lx to 0x%lx",
1121 msk,val,hdw->subsys_enabled_mask,nmsk);
1123 vmsk = (nmsk ^ hdw->subsys_enabled_mask) &
1124 hdw->subsys_enabled_mask;
1126 if (vmsk & (1<<PVR2_SUBSYS_B_ENC_RUN)) {
1127 pvr2_trace(PVR2_TRACE_CTL,
1128 "/*---TRACE_CTL----*/"
1129 " pvr2_encoder_stop");
1130 ret = pvr2_encoder_stop(hdw);
1132 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1133 "Error recovery initiated");
1134 hdw->subsys_enabled_mask &=
1135 ~FIRMWARE_RECOVERY_BITS;
1139 if (vmsk & (1<<PVR2_SUBSYS_B_USBSTREAM_RUN)) {
1140 pvr2_trace(PVR2_TRACE_CTL,
1141 "/*---TRACE_CTL----*/"
1142 " pvr2_hdw_cmd_usbstream(0)");
1143 pvr2_hdw_cmd_usbstream(hdw,0);
1145 if (vmsk & (1<<PVR2_SUBSYS_B_DIGITIZER_RUN)) {
1146 pvr2_trace(PVR2_TRACE_CTL,
1147 "/*---TRACE_CTL----*/"
1148 " decoder disable");
1149 if (hdw->decoder_ctrl) {
1150 hdw->decoder_ctrl->enable(
1151 hdw->decoder_ctrl->ctxt,0);
1153 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1155 " No decoder present");
1157 hdw->subsys_enabled_mask &=
1158 ~(1<<PVR2_SUBSYS_B_DIGITIZER_RUN);
1160 if (vmsk & PVR2_SUBSYS_CFG_ALL) {
1161 hdw->subsys_enabled_mask &=
1162 ~(vmsk & PVR2_SUBSYS_CFG_ALL);
1165 vmsk = (nmsk ^ hdw->subsys_enabled_mask) & nmsk;
1167 if (vmsk & (1<<PVR2_SUBSYS_B_ENC_FIRMWARE)) {
1168 pvr2_trace(PVR2_TRACE_CTL,
1169 "/*---TRACE_CTL----*/"
1170 " pvr2_upload_firmware2");
1171 ret = pvr2_upload_firmware2(hdw);
1173 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1174 "Failure uploading encoder"
1176 pvr2_hdw_render_useless(hdw);
1180 if (vmsk & (1<<PVR2_SUBSYS_B_ENC_CFG)) {
1181 pvr2_trace(PVR2_TRACE_CTL,
1182 "/*---TRACE_CTL----*/"
1183 " pvr2_encoder_configure");
1184 ret = pvr2_encoder_configure(hdw);
1186 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1187 "Error recovery initiated");
1188 hdw->subsys_enabled_mask &=
1189 ~FIRMWARE_RECOVERY_BITS;
1193 if (vmsk & (1<<PVR2_SUBSYS_B_DIGITIZER_RUN)) {
1194 pvr2_trace(PVR2_TRACE_CTL,
1195 "/*---TRACE_CTL----*/"
1197 if (hdw->decoder_ctrl) {
1198 hdw->decoder_ctrl->enable(
1199 hdw->decoder_ctrl->ctxt,!0);
1201 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1203 " No decoder present");
1205 hdw->subsys_enabled_mask |=
1206 (1<<PVR2_SUBSYS_B_DIGITIZER_RUN);
1208 if (vmsk & (1<<PVR2_SUBSYS_B_USBSTREAM_RUN)) {
1209 pvr2_trace(PVR2_TRACE_CTL,
1210 "/*---TRACE_CTL----*/"
1211 " pvr2_hdw_cmd_usbstream(1)");
1212 pvr2_hdw_cmd_usbstream(hdw,!0);
1214 if (vmsk & (1<<PVR2_SUBSYS_B_ENC_RUN)) {
1215 pvr2_trace(PVR2_TRACE_CTL,
1216 "/*---TRACE_CTL----*/"
1217 " pvr2_encoder_start");
1218 ret = pvr2_encoder_start(hdw);
1220 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1221 "Error recovery initiated");
1222 hdw->subsys_enabled_mask &=
1223 ~FIRMWARE_RECOVERY_BITS;
1232 void pvr2_hdw_subsys_bit_chg(struct pvr2_hdw *hdw,
1233 unsigned long msk,unsigned long val)
1235 LOCK_TAKE(hdw->big_lock); do {
1236 pvr2_hdw_subsys_bit_chg_no_lock(hdw,msk,val);
1237 } while (0); LOCK_GIVE(hdw->big_lock);
1241 void pvr2_hdw_subsys_bit_set(struct pvr2_hdw *hdw,unsigned long msk)
1243 pvr2_hdw_subsys_bit_chg(hdw,msk,msk);
1247 void pvr2_hdw_subsys_bit_clr(struct pvr2_hdw *hdw,unsigned long msk)
1249 pvr2_hdw_subsys_bit_chg(hdw,msk,0);
1253 unsigned long pvr2_hdw_subsys_get(struct pvr2_hdw *hdw)
1255 return hdw->subsys_enabled_mask;
1259 unsigned long pvr2_hdw_subsys_stream_get(struct pvr2_hdw *hdw)
1261 return hdw->subsys_stream_mask;
1265 void pvr2_hdw_subsys_stream_bit_chg_no_lock(struct pvr2_hdw *hdw,
1270 msk &= PVR2_SUBSYS_ALL;
1271 val2 = ((hdw->subsys_stream_mask & ~msk) | (val & msk));
1272 pvr2_trace(PVR2_TRACE_INIT,
1273 "stream mask changing 0x%lx:0x%lx from 0x%lx to 0x%lx",
1274 msk,val,hdw->subsys_stream_mask,val2);
1275 hdw->subsys_stream_mask = val2;
1279 void pvr2_hdw_subsys_stream_bit_chg(struct pvr2_hdw *hdw,
1283 LOCK_TAKE(hdw->big_lock); do {
1284 pvr2_hdw_subsys_stream_bit_chg_no_lock(hdw,msk,val);
1285 } while (0); LOCK_GIVE(hdw->big_lock);
1289 int pvr2_hdw_set_streaming_no_lock(struct pvr2_hdw *hdw,int enableFl)
1291 if ((!enableFl) == !(hdw->flag_streaming_enabled)) return 0;
1293 pvr2_trace(PVR2_TRACE_START_STOP,
1294 "/*--TRACE_STREAM--*/ enable");
1295 pvr2_hdw_subsys_bit_chg_no_lock(hdw,~0,~0);
1297 pvr2_trace(PVR2_TRACE_START_STOP,
1298 "/*--TRACE_STREAM--*/ disable");
1299 pvr2_hdw_subsys_bit_chg_no_lock(hdw,hdw->subsys_stream_mask,0);
1301 if (!hdw->flag_ok) return -EIO;
1302 hdw->flag_streaming_enabled = enableFl != 0;
1307 int pvr2_hdw_get_streaming(struct pvr2_hdw *hdw)
1309 return hdw->flag_streaming_enabled != 0;
1313 int pvr2_hdw_set_streaming(struct pvr2_hdw *hdw,int enable_flag)
1316 LOCK_TAKE(hdw->big_lock); do {
1317 ret = pvr2_hdw_set_streaming_no_lock(hdw,enable_flag);
1318 } while (0); LOCK_GIVE(hdw->big_lock);
1323 int pvr2_hdw_set_stream_type_no_lock(struct pvr2_hdw *hdw,
1324 enum pvr2_config config)
1326 unsigned long sm = hdw->subsys_enabled_mask;
1327 if (!hdw->flag_ok) return -EIO;
1328 pvr2_hdw_subsys_bit_chg_no_lock(hdw,hdw->subsys_stream_mask,0);
1329 hdw->config = config;
1330 pvr2_hdw_subsys_bit_chg_no_lock(hdw,~0,sm);
1335 int pvr2_hdw_set_stream_type(struct pvr2_hdw *hdw,enum pvr2_config config)
1338 if (!hdw->flag_ok) return -EIO;
1339 LOCK_TAKE(hdw->big_lock);
1340 ret = pvr2_hdw_set_stream_type_no_lock(hdw,config);
1341 LOCK_GIVE(hdw->big_lock);
1346 static int get_default_tuner_type(struct pvr2_hdw *hdw)
1348 int unit_number = hdw->unit_number;
1350 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1351 tp = tuner[unit_number];
1353 if (tp < 0) return -EINVAL;
1354 hdw->tuner_type = tp;
1359 static v4l2_std_id get_default_standard(struct pvr2_hdw *hdw)
1361 int unit_number = hdw->unit_number;
1363 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1364 tp = video_std[unit_number];
1370 static unsigned int get_default_error_tolerance(struct pvr2_hdw *hdw)
1372 int unit_number = hdw->unit_number;
1374 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1375 tp = tolerance[unit_number];
1381 static int pvr2_hdw_check_firmware(struct pvr2_hdw *hdw)
1383 /* Try a harmless request to fetch the eeprom's address over
1384 endpoint 1. See what happens. Only the full FX2 image can
1385 respond to this. If this probe fails then likely the FX2
1386 firmware needs be loaded. */
1388 LOCK_TAKE(hdw->ctl_lock); do {
1389 hdw->cmd_buffer[0] = 0xeb;
1390 result = pvr2_send_request_ex(hdw,HZ*1,!0,
1393 if (result < 0) break;
1394 } while(0); LOCK_GIVE(hdw->ctl_lock);
1396 pvr2_trace(PVR2_TRACE_INIT,
1397 "Probe of device endpoint 1 result status %d",
1400 pvr2_trace(PVR2_TRACE_INIT,
1401 "Probe of device endpoint 1 succeeded");
1406 static void pvr2_hdw_setup_std(struct pvr2_hdw *hdw)
1410 v4l2_std_id std1,std2;
1412 std1 = get_default_standard(hdw);
1414 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),hdw->std_mask_eeprom);
1415 pvr2_trace(PVR2_TRACE_INIT,
1416 "Supported video standard(s) reported by eeprom: %.*s",
1419 hdw->std_mask_avail = hdw->std_mask_eeprom;
1421 std2 = std1 & ~hdw->std_mask_avail;
1423 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std2);
1424 pvr2_trace(PVR2_TRACE_INIT,
1425 "Expanding supported video standards"
1426 " to include: %.*s",
1428 hdw->std_mask_avail |= std2;
1431 pvr2_hdw_internal_set_std_avail(hdw);
1434 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std1);
1435 pvr2_trace(PVR2_TRACE_INIT,
1436 "Initial video standard forced to %.*s",
1438 hdw->std_mask_cur = std1;
1439 hdw->std_dirty = !0;
1440 pvr2_hdw_internal_find_stdenum(hdw);
1444 if (hdw->std_enum_cnt > 1) {
1445 // Autoselect the first listed standard
1446 hdw->std_enum_cur = 1;
1447 hdw->std_mask_cur = hdw->std_defs[hdw->std_enum_cur-1].id;
1448 hdw->std_dirty = !0;
1449 pvr2_trace(PVR2_TRACE_INIT,
1450 "Initial video standard auto-selected to %s",
1451 hdw->std_defs[hdw->std_enum_cur-1].name);
1455 pvr2_trace(PVR2_TRACE_EEPROM,
1456 "Unable to select a viable initial video standard");
1460 static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
1464 struct pvr2_ctrl *cptr;
1467 reloadFl = (hdw->usb_intf->cur_altsetting->desc.bNumEndpoints
1470 pvr2_trace(PVR2_TRACE_INIT,
1471 "USB endpoint config looks strange"
1472 "; possibly firmware needs to be loaded");
1476 reloadFl = !pvr2_hdw_check_firmware(hdw);
1478 pvr2_trace(PVR2_TRACE_INIT,
1479 "Check for FX2 firmware failed"
1480 "; possibly firmware needs to be loaded");
1484 if (pvr2_upload_firmware1(hdw) != 0) {
1485 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1486 "Failure uploading firmware1");
1490 hdw->fw1_state = FW1_STATE_OK;
1493 pvr2_hdw_device_reset(hdw);
1495 if (!pvr2_hdw_dev_ok(hdw)) return;
1497 for (idx = 0; idx < pvr2_client_lists[hdw->hdw_type].cnt; idx++) {
1498 request_module(pvr2_client_lists[hdw->hdw_type].lst[idx]);
1501 pvr2_hdw_cmd_powerup(hdw);
1502 if (!pvr2_hdw_dev_ok(hdw)) return;
1504 if (pvr2_upload_firmware2(hdw)){
1505 pvr2_trace(PVR2_TRACE_ERROR_LEGS,"device unstable!!");
1506 pvr2_hdw_render_useless(hdw);
1510 // This step MUST happen after the earlier powerup step.
1511 pvr2_i2c_core_init(hdw);
1512 if (!pvr2_hdw_dev_ok(hdw)) return;
1514 for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
1515 cptr = hdw->controls + idx;
1516 if (cptr->info->skip_init) continue;
1517 if (!cptr->info->set_value) continue;
1518 cptr->info->set_value(cptr,~0,cptr->info->default_value);
1521 // Do not use pvr2_reset_ctl_endpoints() here. It is not
1522 // thread-safe against the normal pvr2_send_request() mechanism.
1523 // (We should make it thread safe).
1525 ret = pvr2_hdw_get_eeprom_addr(hdw);
1526 if (!pvr2_hdw_dev_ok(hdw)) return;
1528 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1529 "Unable to determine location of eeprom, skipping");
1531 hdw->eeprom_addr = ret;
1532 pvr2_eeprom_analyze(hdw);
1533 if (!pvr2_hdw_dev_ok(hdw)) return;
1536 pvr2_hdw_setup_std(hdw);
1538 if (!get_default_tuner_type(hdw)) {
1539 pvr2_trace(PVR2_TRACE_INIT,
1540 "pvr2_hdw_setup: Tuner type overridden to %d",
1544 hdw->tuner_updated = !0;
1545 pvr2_i2c_core_check_stale(hdw);
1546 hdw->tuner_updated = 0;
1548 if (!pvr2_hdw_dev_ok(hdw)) return;
1550 pvr2_hdw_commit_ctl_internal(hdw);
1551 if (!pvr2_hdw_dev_ok(hdw)) return;
1553 hdw->vid_stream = pvr2_stream_create();
1554 if (!pvr2_hdw_dev_ok(hdw)) return;
1555 pvr2_trace(PVR2_TRACE_INIT,
1556 "pvr2_hdw_setup: video stream is %p",hdw->vid_stream);
1557 if (hdw->vid_stream) {
1558 idx = get_default_error_tolerance(hdw);
1560 pvr2_trace(PVR2_TRACE_INIT,
1561 "pvr2_hdw_setup: video stream %p"
1562 " setting tolerance %u",
1563 hdw->vid_stream,idx);
1565 pvr2_stream_setup(hdw->vid_stream,hdw->usb_dev,
1566 PVR2_VID_ENDPOINT,idx);
1569 if (!pvr2_hdw_dev_ok(hdw)) return;
1571 /* Make sure everything is up to date */
1572 pvr2_i2c_core_sync(hdw);
1574 if (!pvr2_hdw_dev_ok(hdw)) return;
1576 hdw->flag_init_ok = !0;
1580 int pvr2_hdw_setup(struct pvr2_hdw *hdw)
1582 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_setup(hdw=%p) begin",hdw);
1583 LOCK_TAKE(hdw->big_lock); do {
1584 pvr2_hdw_setup_low(hdw);
1585 pvr2_trace(PVR2_TRACE_INIT,
1586 "pvr2_hdw_setup(hdw=%p) done, ok=%d init_ok=%d",
1587 hdw,hdw->flag_ok,hdw->flag_init_ok);
1588 if (pvr2_hdw_dev_ok(hdw)) {
1589 if (pvr2_hdw_init_ok(hdw)) {
1592 "Device initialization"
1593 " completed successfully.");
1596 if (hdw->fw1_state == FW1_STATE_RELOAD) {
1599 "Device microcontroller firmware"
1600 " (re)loaded; it should now reset"
1605 PVR2_TRACE_ERROR_LEGS,
1606 "Device initialization was not successful.");
1607 if (hdw->fw1_state == FW1_STATE_MISSING) {
1609 PVR2_TRACE_ERROR_LEGS,
1610 "Giving up since device"
1611 " microcontroller firmware"
1612 " appears to be missing.");
1618 PVR2_TRACE_ERROR_LEGS,
1619 "Attempting pvrusb2 recovery by reloading"
1620 " primary firmware.");
1622 PVR2_TRACE_ERROR_LEGS,
1623 "If this works, device should disconnect"
1624 " and reconnect in a sane state.");
1625 hdw->fw1_state = FW1_STATE_UNKNOWN;
1626 pvr2_upload_firmware1(hdw);
1629 PVR2_TRACE_ERROR_LEGS,
1630 "***WARNING*** pvrusb2 device hardware"
1631 " appears to be jammed"
1632 " and I can't clear it.");
1634 PVR2_TRACE_ERROR_LEGS,
1635 "You might need to power cycle"
1636 " the pvrusb2 device"
1637 " in order to recover.");
1639 } while (0); LOCK_GIVE(hdw->big_lock);
1640 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_setup(hdw=%p) end",hdw);
1641 return hdw->flag_init_ok;
1645 /* Create and return a structure for interacting with the underlying
1647 struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
1648 const struct usb_device_id *devid)
1650 unsigned int idx,cnt1,cnt2;
1651 struct pvr2_hdw *hdw;
1652 unsigned int hdw_type;
1654 struct pvr2_ctrl *cptr;
1657 hdw_type = devid - pvr2_device_table;
1659 sizeof(pvr2_device_names)/sizeof(pvr2_device_names[0])) {
1660 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1661 "Bogus device type of %u reported",hdw_type);
1665 hdw = kmalloc(sizeof(*hdw),GFP_KERNEL);
1666 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_create: hdw=%p, type \"%s\"",
1667 hdw,pvr2_device_names[hdw_type]);
1668 if (!hdw) goto fail;
1669 memset(hdw,0,sizeof(*hdw));
1671 hdw->control_cnt = CTRLDEF_COUNT;
1672 hdw->controls = kmalloc(sizeof(struct pvr2_ctrl) * hdw->control_cnt,
1674 if (!hdw->controls) goto fail;
1675 memset(hdw->controls,0,sizeof(struct pvr2_ctrl) * hdw->control_cnt);
1676 hdw->hdw_type = hdw_type;
1677 for (idx = 0; idx < hdw->control_cnt; idx++) {
1678 cptr = hdw->controls + idx;
1681 for (idx = 0; idx < 32; idx++) {
1682 hdw->std_mask_ptrs[idx] = hdw->std_mask_names[idx];
1684 for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
1685 cptr = hdw->controls + idx;
1686 cptr->info = control_defs+idx;
1689 // Initialize video standard enum dynamic control
1690 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDENUM);
1692 memcpy(&hdw->std_info_enum,cptr->info,
1693 sizeof(hdw->std_info_enum));
1694 cptr->info = &hdw->std_info_enum;
1697 // Initialize control data regarding video standard masks
1698 valid_std_mask = pvr2_std_get_usable();
1699 for (idx = 0; idx < 32; idx++) {
1700 if (!(valid_std_mask & (1 << idx))) continue;
1701 cnt1 = pvr2_std_id_to_str(
1702 hdw->std_mask_names[idx],
1703 sizeof(hdw->std_mask_names[idx])-1,
1705 hdw->std_mask_names[idx][cnt1] = 0;
1707 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDAVAIL);
1709 memcpy(&hdw->std_info_avail,cptr->info,
1710 sizeof(hdw->std_info_avail));
1711 cptr->info = &hdw->std_info_avail;
1712 hdw->std_info_avail.def.type_bitmask.bit_names =
1714 hdw->std_info_avail.def.type_bitmask.valid_bits =
1717 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDCUR);
1719 memcpy(&hdw->std_info_cur,cptr->info,
1720 sizeof(hdw->std_info_cur));
1721 cptr->info = &hdw->std_info_cur;
1722 hdw->std_info_cur.def.type_bitmask.bit_names =
1724 hdw->std_info_avail.def.type_bitmask.valid_bits =
1728 hdw->eeprom_addr = -1;
1729 hdw->unit_number = -1;
1730 hdw->v4l_minor_number = -1;
1731 hdw->ctl_write_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL);
1732 if (!hdw->ctl_write_buffer) goto fail;
1733 hdw->ctl_read_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL);
1734 if (!hdw->ctl_read_buffer) goto fail;
1735 hdw->ctl_write_urb = usb_alloc_urb(0,GFP_KERNEL);
1736 if (!hdw->ctl_write_urb) goto fail;
1737 hdw->ctl_read_urb = usb_alloc_urb(0,GFP_KERNEL);
1738 if (!hdw->ctl_read_urb) goto fail;
1740 down(&pvr2_unit_sem); do {
1741 for (idx = 0; idx < PVR_NUM; idx++) {
1742 if (unit_pointers[idx]) continue;
1743 hdw->unit_number = idx;
1744 unit_pointers[idx] = hdw;
1747 } while (0); up(&pvr2_unit_sem);
1750 cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"pvrusb2");
1752 if (hdw->unit_number >= 0) {
1753 cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"_%c",
1754 ('a' + hdw->unit_number));
1757 if (cnt1 >= sizeof(hdw->name)) cnt1 = sizeof(hdw->name)-1;
1758 hdw->name[cnt1] = 0;
1760 pvr2_trace(PVR2_TRACE_INIT,"Driver unit number is %d, name is %s",
1761 hdw->unit_number,hdw->name);
1763 hdw->tuner_type = -1;
1765 /* Initialize the mask of subsystems that we will shut down when we
1767 hdw->subsys_stream_mask = PVR2_SUBSYS_RUN_ALL;
1768 hdw->subsys_stream_mask |= (1<<PVR2_SUBSYS_B_ENC_CFG);
1770 pvr2_trace(PVR2_TRACE_INIT,"subsys_stream_mask: 0x%lx",
1771 hdw->subsys_stream_mask);
1773 hdw->usb_intf = intf;
1774 hdw->usb_dev = interface_to_usbdev(intf);
1776 ifnum = hdw->usb_intf->cur_altsetting->desc.bInterfaceNumber;
1777 usb_set_interface(hdw->usb_dev,ifnum,0);
1779 mutex_init(&hdw->ctl_lock_mutex);
1780 mutex_init(&hdw->big_lock_mutex);
1785 if (hdw->ctl_read_urb) usb_free_urb(hdw->ctl_read_urb);
1786 if (hdw->ctl_write_urb) usb_free_urb(hdw->ctl_write_urb);
1787 if (hdw->ctl_read_buffer) kfree(hdw->ctl_read_buffer);
1788 if (hdw->ctl_write_buffer) kfree(hdw->ctl_write_buffer);
1789 if (hdw->controls) kfree(hdw->controls);
1796 /* Remove _all_ associations between this driver and the underlying USB
1798 void pvr2_hdw_remove_usb_stuff(struct pvr2_hdw *hdw)
1800 if (hdw->flag_disconnected) return;
1801 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_remove_usb_stuff: hdw=%p",hdw);
1802 if (hdw->ctl_read_urb) {
1803 usb_kill_urb(hdw->ctl_read_urb);
1804 usb_free_urb(hdw->ctl_read_urb);
1805 hdw->ctl_read_urb = 0;
1807 if (hdw->ctl_write_urb) {
1808 usb_kill_urb(hdw->ctl_write_urb);
1809 usb_free_urb(hdw->ctl_write_urb);
1810 hdw->ctl_write_urb = 0;
1812 if (hdw->ctl_read_buffer) {
1813 kfree(hdw->ctl_read_buffer);
1814 hdw->ctl_read_buffer = 0;
1816 if (hdw->ctl_write_buffer) {
1817 kfree(hdw->ctl_write_buffer);
1818 hdw->ctl_write_buffer = 0;
1820 pvr2_hdw_render_useless_unlocked(hdw);
1821 hdw->flag_disconnected = !0;
1827 /* Destroy hardware interaction structure */
1828 void pvr2_hdw_destroy(struct pvr2_hdw *hdw)
1830 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_destroy: hdw=%p",hdw);
1831 if (hdw->fw_buffer) {
1832 kfree(hdw->fw_buffer);
1835 if (hdw->vid_stream) {
1836 pvr2_stream_destroy(hdw->vid_stream);
1837 hdw->vid_stream = 0;
1839 if (hdw->audio_stat) {
1840 hdw->audio_stat->detach(hdw->audio_stat->ctxt);
1842 if (hdw->decoder_ctrl) {
1843 hdw->decoder_ctrl->detach(hdw->decoder_ctrl->ctxt);
1845 pvr2_i2c_core_done(hdw);
1846 pvr2_hdw_remove_usb_stuff(hdw);
1847 down(&pvr2_unit_sem); do {
1848 if ((hdw->unit_number >= 0) &&
1849 (hdw->unit_number < PVR_NUM) &&
1850 (unit_pointers[hdw->unit_number] == hdw)) {
1851 unit_pointers[hdw->unit_number] = 0;
1853 } while (0); up(&pvr2_unit_sem);
1854 if (hdw->controls) kfree(hdw->controls);
1855 if (hdw->std_defs) kfree(hdw->std_defs);
1856 if (hdw->std_enum_names) kfree(hdw->std_enum_names);
1861 int pvr2_hdw_init_ok(struct pvr2_hdw *hdw)
1863 return hdw->flag_init_ok;
1867 int pvr2_hdw_dev_ok(struct pvr2_hdw *hdw)
1869 return (hdw && hdw->flag_ok);
1873 /* Called when hardware has been unplugged */
1874 void pvr2_hdw_disconnect(struct pvr2_hdw *hdw)
1876 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_disconnect(hdw=%p)",hdw);
1877 LOCK_TAKE(hdw->big_lock);
1878 LOCK_TAKE(hdw->ctl_lock);
1879 pvr2_hdw_remove_usb_stuff(hdw);
1880 LOCK_GIVE(hdw->ctl_lock);
1881 LOCK_GIVE(hdw->big_lock);
1885 // Attempt to autoselect an appropriate value for std_enum_cur given
1886 // whatever is currently in std_mask_cur
1887 void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw)
1890 for (idx = 1; idx < hdw->std_enum_cnt; idx++) {
1891 if (hdw->std_defs[idx-1].id == hdw->std_mask_cur) {
1892 hdw->std_enum_cur = idx;
1896 hdw->std_enum_cur = 0;
1900 // Calculate correct set of enumerated standards based on currently known
1901 // set of available standards bits.
1902 void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw)
1904 struct v4l2_standard *newstd;
1905 unsigned int std_cnt;
1908 newstd = pvr2_std_create_enum(&std_cnt,hdw->std_mask_avail);
1910 if (hdw->std_defs) {
1911 kfree(hdw->std_defs);
1914 hdw->std_enum_cnt = 0;
1915 if (hdw->std_enum_names) {
1916 kfree(hdw->std_enum_names);
1917 hdw->std_enum_names = 0;
1922 PVR2_TRACE_ERROR_LEGS,
1923 "WARNING: Failed to identify any viable standards");
1925 hdw->std_enum_names = kmalloc(sizeof(char *)*(std_cnt+1),GFP_KERNEL);
1926 hdw->std_enum_names[0] = "none";
1927 for (idx = 0; idx < std_cnt; idx++) {
1928 hdw->std_enum_names[idx+1] =
1931 // Set up the dynamic control for this standard
1932 hdw->std_info_enum.def.type_enum.value_names = hdw->std_enum_names;
1933 hdw->std_info_enum.def.type_enum.count = std_cnt+1;
1934 hdw->std_defs = newstd;
1935 hdw->std_enum_cnt = std_cnt+1;
1936 hdw->std_enum_cur = 0;
1937 hdw->std_info_cur.def.type_bitmask.valid_bits = hdw->std_mask_avail;
1941 int pvr2_hdw_get_stdenum_value(struct pvr2_hdw *hdw,
1942 struct v4l2_standard *std,
1946 if (!idx) return ret;
1947 LOCK_TAKE(hdw->big_lock); do {
1948 if (idx >= hdw->std_enum_cnt) break;
1950 memcpy(std,hdw->std_defs+idx,sizeof(*std));
1952 } while (0); LOCK_GIVE(hdw->big_lock);
1957 /* Get the number of defined controls */
1958 unsigned int pvr2_hdw_get_ctrl_count(struct pvr2_hdw *hdw)
1960 return hdw->control_cnt;
1964 /* Retrieve a control handle given its index (0..count-1) */
1965 struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_index(struct pvr2_hdw *hdw,
1968 if (idx >= hdw->control_cnt) return 0;
1969 return hdw->controls + idx;
1973 /* Retrieve a control handle given its index (0..count-1) */
1974 struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_id(struct pvr2_hdw *hdw,
1975 unsigned int ctl_id)
1977 struct pvr2_ctrl *cptr;
1981 /* This could be made a lot more efficient, but for now... */
1982 for (idx = 0; idx < hdw->control_cnt; idx++) {
1983 cptr = hdw->controls + idx;
1984 i = cptr->info->internal_id;
1985 if (i && (i == ctl_id)) return cptr;
1991 /* Given an ID, retrieve the control structure associated with it. */
1992 struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *hdw,unsigned int ctl_id)
1994 struct pvr2_ctrl *cptr;
1998 /* This could be made a lot more efficient, but for now... */
1999 for (idx = 0; idx < hdw->control_cnt; idx++) {
2000 cptr = hdw->controls + idx;
2001 i = cptr->info->v4l_id;
2002 if (i && (i == ctl_id)) return cptr;
2008 static const char *get_ctrl_typename(enum pvr2_ctl_type tp)
2011 case pvr2_ctl_int: return "integer";
2012 case pvr2_ctl_enum: return "enum";
2013 case pvr2_ctl_bool: return "boolean";
2014 case pvr2_ctl_bitmask: return "bitmask";
2020 /* Commit all control changes made up to this point. Subsystems can be
2021 indirectly affected by these changes. For a given set of things being
2022 committed, we'll clear the affected subsystem bits and then once we're
2023 done committing everything we'll make a request to restore the subsystem
2024 state(s) back to their previous value before this function was called.
2025 Thus we can automatically reconfigure affected pieces of the driver as
2026 controls are changed. */
2027 int pvr2_hdw_commit_ctl_internal(struct pvr2_hdw *hdw)
2029 unsigned long saved_subsys_mask = hdw->subsys_enabled_mask;
2030 unsigned long stale_subsys_mask = 0;
2032 struct pvr2_ctrl *cptr;
2034 int commit_flag = 0;
2036 unsigned int bcnt,ccnt;
2038 for (idx = 0; idx < hdw->control_cnt; idx++) {
2039 cptr = hdw->controls + idx;
2040 if (cptr->info->is_dirty == 0) continue;
2041 if (!cptr->info->is_dirty(cptr)) continue;
2046 bcnt = scnprintf(buf,sizeof(buf),"\"%s\" <-- ",
2049 cptr->info->get_value(cptr,&value);
2050 pvr2_ctrl_value_to_sym_internal(cptr,~0,value,
2052 sizeof(buf)-bcnt,&ccnt);
2054 bcnt += scnprintf(buf+bcnt,sizeof(buf)-bcnt," <%s>",
2055 get_ctrl_typename(cptr->info->type));
2056 pvr2_trace(PVR2_TRACE_CTL,
2057 "/*--TRACE_COMMIT--*/ %.*s",
2062 /* Nothing has changed */
2066 /* When video standard changes, reset the hres and vres values -
2067 but if the user has pending changes there, then let the changes
2069 if (hdw->std_dirty) {
2070 /* Rewrite the vertical resolution to be appropriate to the
2071 video standard that has been selected. */
2073 if (hdw->std_mask_cur & V4L2_STD_525_60) {
2078 if (nvres != hdw->res_ver_val) {
2079 hdw->res_ver_val = nvres;
2080 hdw->res_ver_dirty = !0;
2082 if (!hdw->interlace_val) {
2083 hdw->interlace_val = 0;
2084 hdw->interlace_dirty = !0;
2088 if (hdw->std_dirty ||
2089 hdw->interlace_dirty ||
2091 hdw->videobitrate_dirty ||
2092 hdw->videopeak_dirty ||
2093 hdw->audiobitrate_dirty ||
2094 hdw->audiolayer_dirty ||
2095 hdw->audiocrc_dirty ||
2096 hdw->audioemphasis_dirty ||
2098 hdw->res_ver_dirty ||
2099 hdw->res_hor_dirty) {
2100 /* If any of this changes, then the encoder needs to be
2101 reconfigured, and we need to reset the stream. */
2102 stale_subsys_mask |= (1<<PVR2_SUBSYS_B_ENC_CFG);
2103 stale_subsys_mask |= hdw->subsys_stream_mask;
2107 /* Scan i2c core at this point - before we clear all the dirty
2108 bits. Various parts of the i2c core will notice dirty bits as
2109 appropriate and arrange to broadcast or directly send updates to
2110 the client drivers in order to keep everything in sync */
2111 pvr2_i2c_core_check_stale(hdw);
2113 for (idx = 0; idx < hdw->control_cnt; idx++) {
2114 cptr = hdw->controls + idx;
2115 if (!cptr->info->clear_dirty) continue;
2116 cptr->info->clear_dirty(cptr);
2119 /* Now execute i2c core update */
2120 pvr2_i2c_core_sync(hdw);
2122 pvr2_hdw_subsys_bit_chg_no_lock(hdw,stale_subsys_mask,0);
2123 pvr2_hdw_subsys_bit_chg_no_lock(hdw,~0,saved_subsys_mask);
2129 int pvr2_hdw_commit_ctl(struct pvr2_hdw *hdw)
2131 LOCK_TAKE(hdw->big_lock); do {
2132 pvr2_hdw_commit_ctl_internal(hdw);
2133 } while (0); LOCK_GIVE(hdw->big_lock);
2138 void pvr2_hdw_poll(struct pvr2_hdw *hdw)
2140 LOCK_TAKE(hdw->big_lock); do {
2141 pvr2_i2c_core_sync(hdw);
2142 } while (0); LOCK_GIVE(hdw->big_lock);
2146 void pvr2_hdw_setup_poll_trigger(struct pvr2_hdw *hdw,
2147 void (*func)(void *),
2150 LOCK_TAKE(hdw->big_lock); do {
2151 hdw->poll_trigger_func = func;
2152 hdw->poll_trigger_data = data;
2153 } while (0); LOCK_GIVE(hdw->big_lock);
2157 void pvr2_hdw_poll_trigger_unlocked(struct pvr2_hdw *hdw)
2159 if (hdw->poll_trigger_func) {
2160 hdw->poll_trigger_func(hdw->poll_trigger_data);
2165 void pvr2_hdw_poll_trigger(struct pvr2_hdw *hdw)
2167 LOCK_TAKE(hdw->big_lock); do {
2168 pvr2_hdw_poll_trigger_unlocked(hdw);
2169 } while (0); LOCK_GIVE(hdw->big_lock);
2173 /* Return name for this driver instance */
2174 const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw)
2180 /* Return bit mask indicating signal status */
2181 unsigned int pvr2_hdw_get_signal_status_internal(struct pvr2_hdw *hdw)
2183 unsigned int msk = 0;
2184 switch (hdw->input_val) {
2185 case PVR2_CVAL_INPUT_TV:
2186 case PVR2_CVAL_INPUT_RADIO:
2187 if (hdw->decoder_ctrl &&
2188 hdw->decoder_ctrl->tuned(hdw->decoder_ctrl->ctxt)) {
2189 msk |= PVR2_SIGNAL_OK;
2190 if (hdw->audio_stat &&
2191 hdw->audio_stat->status(hdw->audio_stat->ctxt)) {
2192 if (hdw->flag_stereo) {
2193 msk |= PVR2_SIGNAL_STEREO;
2195 if (hdw->flag_bilingual) {
2196 msk |= PVR2_SIGNAL_SAP;
2202 msk |= PVR2_SIGNAL_OK | PVR2_SIGNAL_STEREO;
2208 int pvr2_hdw_is_hsm(struct pvr2_hdw *hdw)
2211 LOCK_TAKE(hdw->ctl_lock); do {
2212 hdw->cmd_buffer[0] = 0x0b;
2213 result = pvr2_send_request(hdw,
2216 if (result < 0) break;
2217 result = (hdw->cmd_buffer[0] != 0);
2218 } while(0); LOCK_GIVE(hdw->ctl_lock);
2223 /* Return bit mask indicating signal status */
2224 unsigned int pvr2_hdw_get_signal_status(struct pvr2_hdw *hdw)
2226 unsigned int msk = 0;
2227 LOCK_TAKE(hdw->big_lock); do {
2228 msk = pvr2_hdw_get_signal_status_internal(hdw);
2229 } while (0); LOCK_GIVE(hdw->big_lock);
2234 /* Get handle to video output stream */
2235 struct pvr2_stream *pvr2_hdw_get_video_stream(struct pvr2_hdw *hp)
2237 return hp->vid_stream;
2241 void pvr2_hdw_trigger_module_log(struct pvr2_hdw *hdw)
2243 int nr = pvr2_hdw_get_unit_number(hdw);
2244 LOCK_TAKE(hdw->big_lock); do {
2245 hdw->log_requested = !0;
2246 printk(KERN_INFO "pvrusb2: ================= START STATUS CARD #%d =================\n", nr);
2247 pvr2_i2c_core_check_stale(hdw);
2248 hdw->log_requested = 0;
2249 pvr2_i2c_core_sync(hdw);
2250 printk(KERN_INFO "pvrusb2: ================== END STATUS CARD #%d ==================\n", nr);
2251 } while (0); LOCK_GIVE(hdw->big_lock);
2254 void pvr2_hdw_cpufw_set_enabled(struct pvr2_hdw *hdw, int enable_flag)
2259 LOCK_TAKE(hdw->big_lock); do {
2260 if ((hdw->fw_buffer == 0) == !enable_flag) break;
2263 pvr2_trace(PVR2_TRACE_FIRMWARE,
2264 "Cleaning up after CPU firmware fetch");
2265 kfree(hdw->fw_buffer);
2268 /* Now release the CPU. It will disconnect and
2270 pvr2_hdw_cpureset_assert(hdw,0);
2274 pvr2_trace(PVR2_TRACE_FIRMWARE,
2275 "Preparing to suck out CPU firmware");
2276 hdw->fw_size = 0x2000;
2277 hdw->fw_buffer = kmalloc(hdw->fw_size,GFP_KERNEL);
2278 if (!hdw->fw_buffer) {
2283 memset(hdw->fw_buffer,0,hdw->fw_size);
2285 /* We have to hold the CPU during firmware upload. */
2286 pvr2_hdw_cpureset_assert(hdw,1);
2288 /* download the firmware from address 0000-1fff in 2048
2289 (=0x800) bytes chunk. */
2291 pvr2_trace(PVR2_TRACE_FIRMWARE,"Grabbing CPU firmware");
2292 pipe = usb_rcvctrlpipe(hdw->usb_dev, 0);
2293 for(address = 0; address < hdw->fw_size; address += 0x800) {
2294 ret = usb_control_msg(hdw->usb_dev,pipe,0xa0,0xc0,
2296 hdw->fw_buffer+address,0x800,HZ);
2300 pvr2_trace(PVR2_TRACE_FIRMWARE,"Done grabbing CPU firmware");
2302 } while (0); LOCK_GIVE(hdw->big_lock);
2306 /* Return true if we're in a mode for retrieval CPU firmware */
2307 int pvr2_hdw_cpufw_get_enabled(struct pvr2_hdw *hdw)
2309 return hdw->fw_buffer != 0;
2313 int pvr2_hdw_cpufw_get(struct pvr2_hdw *hdw,unsigned int offs,
2314 char *buf,unsigned int cnt)
2317 LOCK_TAKE(hdw->big_lock); do {
2321 if (!hdw->fw_buffer) {
2326 if (offs >= hdw->fw_size) {
2327 pvr2_trace(PVR2_TRACE_FIRMWARE,
2328 "Read firmware data offs=%d EOF",
2334 if (offs + cnt > hdw->fw_size) cnt = hdw->fw_size - offs;
2336 memcpy(buf,hdw->fw_buffer+offs,cnt);
2338 pvr2_trace(PVR2_TRACE_FIRMWARE,
2339 "Read firmware data offs=%d cnt=%d",
2342 } while (0); LOCK_GIVE(hdw->big_lock);
2348 int pvr2_hdw_v4l_get_minor_number(struct pvr2_hdw *hdw)
2350 return hdw->v4l_minor_number;
2354 /* Store the v4l minor device number */
2355 void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *hdw,int v)
2357 hdw->v4l_minor_number = v;
2361 void pvr2_reset_ctl_endpoints(struct pvr2_hdw *hdw)
2363 if (!hdw->usb_dev) return;
2364 usb_settoggle(hdw->usb_dev, PVR2_CTL_WRITE_ENDPOINT & 0xf,
2365 !(PVR2_CTL_WRITE_ENDPOINT & USB_DIR_IN), 0);
2366 usb_settoggle(hdw->usb_dev, PVR2_CTL_READ_ENDPOINT & 0xf,
2367 !(PVR2_CTL_READ_ENDPOINT & USB_DIR_IN), 0);
2368 usb_clear_halt(hdw->usb_dev,
2369 usb_rcvbulkpipe(hdw->usb_dev,
2370 PVR2_CTL_READ_ENDPOINT & 0x7f));
2371 usb_clear_halt(hdw->usb_dev,
2372 usb_sndbulkpipe(hdw->usb_dev,
2373 PVR2_CTL_WRITE_ENDPOINT & 0x7f));
2377 static void pvr2_ctl_write_complete(struct urb *urb, struct pt_regs *regs)
2379 struct pvr2_hdw *hdw = urb->context;
2380 hdw->ctl_write_pend_flag = 0;
2381 if (hdw->ctl_read_pend_flag) return;
2382 complete(&hdw->ctl_done);
2386 static void pvr2_ctl_read_complete(struct urb *urb, struct pt_regs *regs)
2388 struct pvr2_hdw *hdw = urb->context;
2389 hdw->ctl_read_pend_flag = 0;
2390 if (hdw->ctl_write_pend_flag) return;
2391 complete(&hdw->ctl_done);
2395 static void pvr2_ctl_timeout(unsigned long data)
2397 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
2398 if (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
2399 hdw->ctl_timeout_flag = !0;
2400 if (hdw->ctl_write_pend_flag && hdw->ctl_write_urb) {
2401 usb_unlink_urb(hdw->ctl_write_urb);
2403 if (hdw->ctl_read_pend_flag && hdw->ctl_read_urb) {
2404 usb_unlink_urb(hdw->ctl_read_urb);
2410 int pvr2_send_request_ex(struct pvr2_hdw *hdw,
2411 unsigned int timeout,int probe_fl,
2412 void *write_data,unsigned int write_len,
2413 void *read_data,unsigned int read_len)
2417 struct timer_list timer;
2418 if (!hdw->ctl_lock_held) {
2419 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2420 "Attempted to execute control transfer"
2424 if ((!hdw->flag_ok) && !probe_fl) {
2425 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2426 "Attempted to execute control transfer"
2427 " when device not ok");
2430 if (!(hdw->ctl_read_urb && hdw->ctl_write_urb)) {
2432 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2433 "Attempted to execute control transfer"
2434 " when USB is disconnected");
2439 /* Ensure that we have sane parameters */
2440 if (!write_data) write_len = 0;
2441 if (!read_data) read_len = 0;
2442 if (write_len > PVR2_CTL_BUFFSIZE) {
2444 PVR2_TRACE_ERROR_LEGS,
2445 "Attempted to execute %d byte"
2446 " control-write transfer (limit=%d)",
2447 write_len,PVR2_CTL_BUFFSIZE);
2450 if (read_len > PVR2_CTL_BUFFSIZE) {
2452 PVR2_TRACE_ERROR_LEGS,
2453 "Attempted to execute %d byte"
2454 " control-read transfer (limit=%d)",
2455 write_len,PVR2_CTL_BUFFSIZE);
2458 if ((!write_len) && (!read_len)) {
2460 PVR2_TRACE_ERROR_LEGS,
2461 "Attempted to execute null control transfer?");
2466 hdw->cmd_debug_state = 1;
2468 hdw->cmd_debug_code = ((unsigned char *)write_data)[0];
2470 hdw->cmd_debug_code = 0;
2472 hdw->cmd_debug_write_len = write_len;
2473 hdw->cmd_debug_read_len = read_len;
2475 /* Initialize common stuff */
2476 init_completion(&hdw->ctl_done);
2477 hdw->ctl_timeout_flag = 0;
2478 hdw->ctl_write_pend_flag = 0;
2479 hdw->ctl_read_pend_flag = 0;
2481 timer.expires = jiffies + timeout;
2482 timer.data = (unsigned long)hdw;
2483 timer.function = pvr2_ctl_timeout;
2486 hdw->cmd_debug_state = 2;
2487 /* Transfer write data to internal buffer */
2488 for (idx = 0; idx < write_len; idx++) {
2489 hdw->ctl_write_buffer[idx] =
2490 ((unsigned char *)write_data)[idx];
2492 /* Initiate a write request */
2493 usb_fill_bulk_urb(hdw->ctl_write_urb,
2495 usb_sndbulkpipe(hdw->usb_dev,
2496 PVR2_CTL_WRITE_ENDPOINT),
2497 hdw->ctl_write_buffer,
2499 pvr2_ctl_write_complete,
2501 hdw->ctl_write_urb->actual_length = 0;
2502 hdw->ctl_write_pend_flag = !0;
2503 status = usb_submit_urb(hdw->ctl_write_urb,GFP_KERNEL);
2505 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2506 "Failed to submit write-control"
2507 " URB status=%d",status);
2508 hdw->ctl_write_pend_flag = 0;
2514 hdw->cmd_debug_state = 3;
2515 memset(hdw->ctl_read_buffer,0x43,read_len);
2516 /* Initiate a read request */
2517 usb_fill_bulk_urb(hdw->ctl_read_urb,
2519 usb_rcvbulkpipe(hdw->usb_dev,
2520 PVR2_CTL_READ_ENDPOINT),
2521 hdw->ctl_read_buffer,
2523 pvr2_ctl_read_complete,
2525 hdw->ctl_read_urb->actual_length = 0;
2526 hdw->ctl_read_pend_flag = !0;
2527 status = usb_submit_urb(hdw->ctl_read_urb,GFP_KERNEL);
2529 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2530 "Failed to submit read-control"
2531 " URB status=%d",status);
2532 hdw->ctl_read_pend_flag = 0;
2540 /* Now wait for all I/O to complete */
2541 hdw->cmd_debug_state = 4;
2542 while (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
2543 wait_for_completion(&hdw->ctl_done);
2545 hdw->cmd_debug_state = 5;
2548 del_timer_sync(&timer);
2550 hdw->cmd_debug_state = 6;
2553 if (hdw->ctl_timeout_flag) {
2554 status = -ETIMEDOUT;
2556 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2557 "Timed out control-write");
2563 /* Validate results of write request */
2564 if ((hdw->ctl_write_urb->status != 0) &&
2565 (hdw->ctl_write_urb->status != -ENOENT) &&
2566 (hdw->ctl_write_urb->status != -ESHUTDOWN) &&
2567 (hdw->ctl_write_urb->status != -ECONNRESET)) {
2568 /* USB subsystem is reporting some kind of failure
2570 status = hdw->ctl_write_urb->status;
2572 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2573 "control-write URB failure,"
2579 if (hdw->ctl_write_urb->actual_length < write_len) {
2580 /* Failed to write enough data */
2583 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2584 "control-write URB short,"
2585 " expected=%d got=%d",
2587 hdw->ctl_write_urb->actual_length);
2593 /* Validate results of read request */
2594 if ((hdw->ctl_read_urb->status != 0) &&
2595 (hdw->ctl_read_urb->status != -ENOENT) &&
2596 (hdw->ctl_read_urb->status != -ESHUTDOWN) &&
2597 (hdw->ctl_read_urb->status != -ECONNRESET)) {
2598 /* USB subsystem is reporting some kind of failure
2600 status = hdw->ctl_read_urb->status;
2602 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2603 "control-read URB failure,"
2609 if (hdw->ctl_read_urb->actual_length < read_len) {
2610 /* Failed to read enough data */
2613 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2614 "control-read URB short,"
2615 " expected=%d got=%d",
2617 hdw->ctl_read_urb->actual_length);
2621 /* Transfer retrieved data out from internal buffer */
2622 for (idx = 0; idx < read_len; idx++) {
2623 ((unsigned char *)read_data)[idx] =
2624 hdw->ctl_read_buffer[idx];
2630 hdw->cmd_debug_state = 0;
2631 if ((status < 0) && (!probe_fl)) {
2632 pvr2_hdw_render_useless_unlocked(hdw);
2638 int pvr2_send_request(struct pvr2_hdw *hdw,
2639 void *write_data,unsigned int write_len,
2640 void *read_data,unsigned int read_len)
2642 return pvr2_send_request_ex(hdw,HZ*4,0,
2643 write_data,write_len,
2644 read_data,read_len);
2647 int pvr2_write_register(struct pvr2_hdw *hdw, u16 reg, u32 data)
2651 LOCK_TAKE(hdw->ctl_lock);
2653 hdw->cmd_buffer[0] = 0x04; /* write register prefix */
2654 PVR2_DECOMPOSE_LE(hdw->cmd_buffer,1,data);
2655 hdw->cmd_buffer[5] = 0;
2656 hdw->cmd_buffer[6] = (reg >> 8) & 0xff;
2657 hdw->cmd_buffer[7] = reg & 0xff;
2660 ret = pvr2_send_request(hdw, hdw->cmd_buffer, 8, hdw->cmd_buffer, 0);
2662 LOCK_GIVE(hdw->ctl_lock);
2668 int pvr2_read_register(struct pvr2_hdw *hdw, u16 reg, u32 *data)
2672 LOCK_TAKE(hdw->ctl_lock);
2674 hdw->cmd_buffer[0] = 0x05; /* read register prefix */
2675 hdw->cmd_buffer[1] = 0;
2676 hdw->cmd_buffer[2] = 0;
2677 hdw->cmd_buffer[3] = 0;
2678 hdw->cmd_buffer[4] = 0;
2679 hdw->cmd_buffer[5] = 0;
2680 hdw->cmd_buffer[6] = (reg >> 8) & 0xff;
2681 hdw->cmd_buffer[7] = reg & 0xff;
2683 ret |= pvr2_send_request(hdw, hdw->cmd_buffer, 8, hdw->cmd_buffer, 4);
2684 *data = PVR2_COMPOSE_LE(hdw->cmd_buffer,0);
2686 LOCK_GIVE(hdw->ctl_lock);
2692 int pvr2_write_u16(struct pvr2_hdw *hdw, u16 data, int res)
2696 LOCK_TAKE(hdw->ctl_lock);
2698 hdw->cmd_buffer[0] = (data >> 8) & 0xff;
2699 hdw->cmd_buffer[1] = data & 0xff;
2701 ret = pvr2_send_request(hdw, hdw->cmd_buffer, 2, hdw->cmd_buffer, res);
2703 LOCK_GIVE(hdw->ctl_lock);
2709 int pvr2_write_u8(struct pvr2_hdw *hdw, u8 data, int res)
2713 LOCK_TAKE(hdw->ctl_lock);
2715 hdw->cmd_buffer[0] = data;
2717 ret = pvr2_send_request(hdw, hdw->cmd_buffer, 1, hdw->cmd_buffer, res);
2719 LOCK_GIVE(hdw->ctl_lock);
2725 void pvr2_hdw_render_useless_unlocked(struct pvr2_hdw *hdw)
2727 if (!hdw->flag_ok) return;
2728 pvr2_trace(PVR2_TRACE_INIT,"render_useless");
2730 if (hdw->vid_stream) {
2731 pvr2_stream_setup(hdw->vid_stream,0,0,0);
2733 hdw->flag_streaming_enabled = 0;
2734 hdw->subsys_enabled_mask = 0;
2738 void pvr2_hdw_render_useless(struct pvr2_hdw *hdw)
2740 LOCK_TAKE(hdw->ctl_lock);
2741 pvr2_hdw_render_useless_unlocked(hdw);
2742 LOCK_GIVE(hdw->ctl_lock);
2746 void pvr2_hdw_device_reset(struct pvr2_hdw *hdw)
2749 pvr2_trace(PVR2_TRACE_INIT,"Performing a device reset...");
2750 ret = usb_lock_device_for_reset(hdw->usb_dev,0);
2752 ret = usb_reset_device(hdw->usb_dev);
2753 usb_unlock_device(hdw->usb_dev);
2755 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2756 "Failed to lock USB device ret=%d",ret);
2758 if (init_pause_msec) {
2759 pvr2_trace(PVR2_TRACE_INFO,
2760 "Waiting %u msec for hardware to settle",
2762 msleep(init_pause_msec);
2768 void pvr2_hdw_cpureset_assert(struct pvr2_hdw *hdw,int val)
2774 if (!hdw->usb_dev) return;
2776 pvr2_trace(PVR2_TRACE_INIT,"cpureset_assert(%d)",val);
2778 da[0] = val ? 0x01 : 0x00;
2780 /* Write the CPUCS register on the 8051. The lsb of the register
2781 is the reset bit; a 1 asserts reset while a 0 clears it. */
2782 pipe = usb_sndctrlpipe(hdw->usb_dev, 0);
2783 ret = usb_control_msg(hdw->usb_dev,pipe,0xa0,0x40,0xe600,0,da,1,HZ);
2785 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2786 "cpureset_assert(%d) error=%d",val,ret);
2787 pvr2_hdw_render_useless(hdw);
2792 int pvr2_hdw_cmd_deep_reset(struct pvr2_hdw *hdw)
2795 LOCK_TAKE(hdw->ctl_lock); do {
2796 pvr2_trace(PVR2_TRACE_INIT,"Requesting uproc hard reset");
2798 hdw->cmd_buffer[0] = 0xdd;
2799 status = pvr2_send_request(hdw,hdw->cmd_buffer,1,0,0);
2800 } while (0); LOCK_GIVE(hdw->ctl_lock);
2805 int pvr2_hdw_cmd_powerup(struct pvr2_hdw *hdw)
2808 LOCK_TAKE(hdw->ctl_lock); do {
2809 pvr2_trace(PVR2_TRACE_INIT,"Requesting powerup");
2810 hdw->cmd_buffer[0] = 0xde;
2811 status = pvr2_send_request(hdw,hdw->cmd_buffer,1,0,0);
2812 } while (0); LOCK_GIVE(hdw->ctl_lock);
2817 int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw)
2819 if (!hdw->decoder_ctrl) {
2820 pvr2_trace(PVR2_TRACE_INIT,
2821 "Unable to reset decoder: nothing attached");
2825 if (!hdw->decoder_ctrl->force_reset) {
2826 pvr2_trace(PVR2_TRACE_INIT,
2827 "Unable to reset decoder: not implemented");
2831 pvr2_trace(PVR2_TRACE_INIT,
2832 "Requesting decoder reset");
2833 hdw->decoder_ctrl->force_reset(hdw->decoder_ctrl->ctxt);
2838 int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl)
2841 LOCK_TAKE(hdw->ctl_lock); do {
2842 hdw->cmd_buffer[0] = (runFl ? 0x36 : 0x37);
2843 status = pvr2_send_request(hdw,hdw->cmd_buffer,1,0,0);
2844 } while (0); LOCK_GIVE(hdw->ctl_lock);
2846 hdw->subsys_enabled_mask =
2847 ((hdw->subsys_enabled_mask &
2848 ~(1<<PVR2_SUBSYS_B_USBSTREAM_RUN)) |
2849 (runFl ? (1<<PVR2_SUBSYS_B_USBSTREAM_RUN) : 0));
2855 void pvr2_hdw_get_debug_info(const struct pvr2_hdw *hdw,
2856 struct pvr2_hdw_debug_info *ptr)
2858 ptr->big_lock_held = hdw->big_lock_held;
2859 ptr->ctl_lock_held = hdw->ctl_lock_held;
2860 ptr->flag_ok = hdw->flag_ok;
2861 ptr->flag_disconnected = hdw->flag_disconnected;
2862 ptr->flag_init_ok = hdw->flag_init_ok;
2863 ptr->flag_streaming_enabled = hdw->flag_streaming_enabled;
2864 ptr->subsys_flags = hdw->subsys_enabled_mask;
2865 ptr->cmd_debug_state = hdw->cmd_debug_state;
2866 ptr->cmd_code = hdw->cmd_debug_code;
2867 ptr->cmd_debug_write_len = hdw->cmd_debug_write_len;
2868 ptr->cmd_debug_read_len = hdw->cmd_debug_read_len;
2869 ptr->cmd_debug_timeout = hdw->ctl_timeout_flag;
2870 ptr->cmd_debug_write_pend = hdw->ctl_write_pend_flag;
2871 ptr->cmd_debug_read_pend = hdw->ctl_read_pend_flag;
2872 ptr->cmd_debug_rstatus = hdw->ctl_read_urb->status;
2873 ptr->cmd_debug_wstatus = hdw->ctl_read_urb->status;
2877 int pvr2_hdw_gpio_get_dir(struct pvr2_hdw *hdw,u32 *dp)
2879 return pvr2_read_register(hdw,PVR2_GPIO_DIR,dp);
2883 int pvr2_hdw_gpio_get_out(struct pvr2_hdw *hdw,u32 *dp)
2885 return pvr2_read_register(hdw,PVR2_GPIO_OUT,dp);
2889 int pvr2_hdw_gpio_get_in(struct pvr2_hdw *hdw,u32 *dp)
2891 return pvr2_read_register(hdw,PVR2_GPIO_IN,dp);
2895 int pvr2_hdw_gpio_chg_dir(struct pvr2_hdw *hdw,u32 msk,u32 val)
2900 ret = pvr2_read_register(hdw,PVR2_GPIO_DIR,&cval);
2901 if (ret) return ret;
2902 nval = (cval & ~msk) | (val & msk);
2903 pvr2_trace(PVR2_TRACE_GPIO,
2904 "GPIO direction changing 0x%x:0x%x"
2905 " from 0x%x to 0x%x",
2909 pvr2_trace(PVR2_TRACE_GPIO,
2910 "GPIO direction changing to 0x%x",nval);
2912 return pvr2_write_register(hdw,PVR2_GPIO_DIR,nval);
2916 int pvr2_hdw_gpio_chg_out(struct pvr2_hdw *hdw,u32 msk,u32 val)
2921 ret = pvr2_read_register(hdw,PVR2_GPIO_OUT,&cval);
2922 if (ret) return ret;
2923 nval = (cval & ~msk) | (val & msk);
2924 pvr2_trace(PVR2_TRACE_GPIO,
2925 "GPIO output changing 0x%x:0x%x from 0x%x to 0x%x",
2929 pvr2_trace(PVR2_TRACE_GPIO,
2930 "GPIO output changing to 0x%x",nval);
2932 return pvr2_write_register(hdw,PVR2_GPIO_OUT,nval);
2936 int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw)
2939 LOCK_TAKE(hdw->ctl_lock); do {
2940 hdw->cmd_buffer[0] = 0xeb;
2941 result = pvr2_send_request(hdw,
2944 if (result < 0) break;
2945 result = hdw->cmd_buffer[0];
2946 } while(0); LOCK_GIVE(hdw->ctl_lock);
2952 Stuff for Emacs to see, in order to encourage consistent editing style:
2953 *** Local Variables: ***
2955 *** fill-column: 75 ***
2956 *** tab-width: 8 ***
2957 *** c-basic-offset: 8 ***