blob: f461830c64c957cbb58e297d8be8ec483ca35bb3 [file] [log] [blame]
Mike Iselyd8554972006-06-26 20:58:46 -03001/*
2 *
3 * $Id$
4 *
5 * Copyright (C) 2005 Mike Isely <isely@pobox.com>
6 *
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
10 *
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.
15 *
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
19 *
20 */
21
22#include <linux/errno.h>
23#include <linux/string.h>
24#include <linux/slab.h>
25#include <linux/firmware.h>
Mike Iselyd8554972006-06-26 20:58:46 -030026#include <linux/videodev2.h>
Mike Iselyb2bbaa92006-06-25 20:03:59 -030027#include <asm/semaphore.h>
Mike Iselyd8554972006-06-26 20:58:46 -030028#include "pvrusb2.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"
38
39struct 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) },
43#endif
44 { }
45};
46
47MODULE_DEVICE_TABLE(usb, pvr2_device_table);
48
49static 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",
53#endif
54};
55
56struct pvr2_string_table {
57 const char **lst;
58 unsigned int cnt;
59};
60
61#ifdef CONFIG_VIDEO_PVRUSB2_24XXX
62// Names of other client modules to request for 24xxx model hardware
63static const char *pvr2_client_24xxx[] = {
64 "cx25840",
65 "tuner",
66 "tda9887",
67 "wm8775",
68};
69#endif
70
71// Names of other client modules to request for 29xxx model hardware
72static const char *pvr2_client_29xxx[] = {
73 "msp3400",
74 "saa7115",
75 "tuner",
76 "tda9887",
77};
78
79static struct pvr2_string_table pvr2_client_lists[] = {
80 [PVR2_HDW_TYPE_29XXX] = {
81 pvr2_client_29xxx,
82 sizeof(pvr2_client_29xxx)/sizeof(pvr2_client_29xxx[0]),
83 },
84#ifdef CONFIG_VIDEO_PVRUSB2_24XXX
85 [PVR2_HDW_TYPE_24XXX] = {
86 pvr2_client_24xxx,
87 sizeof(pvr2_client_24xxx)/sizeof(pvr2_client_24xxx[0]),
88 },
89#endif
90};
91
92static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = 0};
93DECLARE_MUTEX(pvr2_unit_sem);
94
95static int ctlchg = 0;
96static int initusbreset = 1;
97static int procreload = 0;
98static int tuner[PVR_NUM] = { [0 ... PVR_NUM-1] = -1 };
99static int tolerance[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
100static int video_std[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
101static int init_pause_msec = 0;
102
103module_param(ctlchg, int, S_IRUGO|S_IWUSR);
104MODULE_PARM_DESC(ctlchg, "0=optimize ctl change 1=always accept new ctl value");
105module_param(init_pause_msec, int, S_IRUGO|S_IWUSR);
106MODULE_PARM_DESC(init_pause_msec, "hardware initialization settling delay");
107module_param(initusbreset, int, S_IRUGO|S_IWUSR);
108MODULE_PARM_DESC(initusbreset, "Do USB reset device on probe");
109module_param(procreload, int, S_IRUGO|S_IWUSR);
110MODULE_PARM_DESC(procreload,
111 "Attempt init failure recovery with firmware reload");
112module_param_array(tuner, int, NULL, 0444);
113MODULE_PARM_DESC(tuner,"specify installed tuner type");
114module_param_array(video_std, int, NULL, 0444);
115MODULE_PARM_DESC(video_std,"specify initial video standard");
116module_param_array(tolerance, int, NULL, 0444);
117MODULE_PARM_DESC(tolerance,"specify stream error tolerance");
118
119#define PVR2_CTL_WRITE_ENDPOINT 0x01
120#define PVR2_CTL_READ_ENDPOINT 0x81
121
122#define PVR2_GPIO_IN 0x9008
123#define PVR2_GPIO_OUT 0x900c
124#define PVR2_GPIO_DIR 0x9020
125
126#define trace_firmware(...) pvr2_trace(PVR2_TRACE_FIRMWARE,__VA_ARGS__)
127
128#define PVR2_FIRMWARE_ENDPOINT 0x02
129
130/* size of a firmware chunk */
131#define FIRMWARE_CHUNK_SIZE 0x2000
132
Mike Iselyc05c0462006-06-25 20:04:25 -0300133
Mike Iselyd8554972006-06-26 20:58:46 -0300134static const char *control_values_srate[] = {
135 [PVR2_CVAL_SRATE_48] = "48KHz",
136 [PVR2_CVAL_SRATE_44_1] = "44.1KHz",
137};
138
139
140static 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",
156};
157
158
159static 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",
163};
164
165
166static 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",
171};
172
173
174static 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",
180};
181
182
183static const char *control_values_hsm[] = {
184 [PVR2_CVAL_HSM_FAIL] = "Fail",
185 [PVR2_CVAL_HSM_HIGH] = "High",
186 [PVR2_CVAL_HSM_FULL] = "Full",
187};
188
189
190static 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",
196};
197
198
199static int ctrl_channelfreq_get(struct pvr2_ctrl *cptr,int *vp)
200{
201 struct pvr2_hdw *hdw = cptr->hdw;
202 if ((hdw->freqProgSlot > 0) && (hdw->freqProgSlot <= FREQTABLE_SIZE)) {
203 *vp = hdw->freqTable[hdw->freqProgSlot-1];
204 } else {
205 *vp = 0;
206 }
207 return 0;
208}
209
210static int ctrl_channelfreq_set(struct pvr2_ctrl *cptr,int m,int v)
211{
212 struct pvr2_hdw *hdw = cptr->hdw;
213 if ((hdw->freqProgSlot > 0) && (hdw->freqProgSlot <= FREQTABLE_SIZE)) {
214 hdw->freqTable[hdw->freqProgSlot-1] = v;
215 }
216 return 0;
217}
218
219static int ctrl_channelprog_get(struct pvr2_ctrl *cptr,int *vp)
220{
221 *vp = cptr->hdw->freqProgSlot;
222 return 0;
223}
224
225static int ctrl_channelprog_set(struct pvr2_ctrl *cptr,int m,int v)
226{
227 struct pvr2_hdw *hdw = cptr->hdw;
228 if ((v >= 0) && (v <= FREQTABLE_SIZE)) {
229 hdw->freqProgSlot = v;
230 }
231 return 0;
232}
233
234static int ctrl_channel_get(struct pvr2_ctrl *cptr,int *vp)
235{
236 *vp = cptr->hdw->freqSlot;
237 return 0;
238}
239
240static int ctrl_channel_set(struct pvr2_ctrl *cptr,int m,int v)
241{
242 unsigned freq = 0;
243 struct pvr2_hdw *hdw = cptr->hdw;
244 hdw->freqSlot = v;
245 if ((hdw->freqSlot > 0) && (hdw->freqSlot <= FREQTABLE_SIZE)) {
246 freq = hdw->freqTable[hdw->freqSlot-1];
247 }
248 if (freq && (freq != hdw->freqVal)) {
249 hdw->freqVal = freq;
250 hdw->freqDirty = !0;
251 }
252 return 0;
253}
254
255static int ctrl_freq_get(struct pvr2_ctrl *cptr,int *vp)
256{
257 *vp = cptr->hdw->freqVal;
258 return 0;
259}
260
261static int ctrl_freq_is_dirty(struct pvr2_ctrl *cptr)
262{
263 return cptr->hdw->freqDirty != 0;
264}
265
266static void ctrl_freq_clear_dirty(struct pvr2_ctrl *cptr)
267{
268 cptr->hdw->freqDirty = 0;
269}
270
271static int ctrl_freq_set(struct pvr2_ctrl *cptr,int m,int v)
272{
273 struct pvr2_hdw *hdw = cptr->hdw;
274 hdw->freqVal = v;
275 hdw->freqDirty = !0;
276 hdw->freqSlot = 0;
277 return 0;
278}
279
280static int ctrl_streamingenabled_get(struct pvr2_ctrl *cptr,int *vp)
281{
282 *vp = cptr->hdw->flag_streaming_enabled;
283 return 0;
284}
285
286static int ctrl_hsm_get(struct pvr2_ctrl *cptr,int *vp)
287{
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;
292 return 0;
293}
294
295static int ctrl_stdavail_get(struct pvr2_ctrl *cptr,int *vp)
296{
297 *vp = cptr->hdw->std_mask_avail;
298 return 0;
299}
300
301static int ctrl_stdavail_set(struct pvr2_ctrl *cptr,int m,int v)
302{
303 struct pvr2_hdw *hdw = cptr->hdw;
304 v4l2_std_id ns;
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);
311 return 0;
312}
313
314static int ctrl_std_val_to_sym(struct pvr2_ctrl *cptr,int msk,int val,
315 char *bufPtr,unsigned int bufSize,
316 unsigned int *len)
317{
318 *len = pvr2_std_id_to_str(bufPtr,bufSize,msk & val);
319 return 0;
320}
321
322static int ctrl_std_sym_to_val(struct pvr2_ctrl *cptr,
323 const char *bufPtr,unsigned int bufSize,
324 int *mskp,int *valp)
325{
326 int ret;
327 v4l2_std_id id;
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;
332 return 0;
333}
334
335static int ctrl_stdcur_get(struct pvr2_ctrl *cptr,int *vp)
336{
337 *vp = cptr->hdw->std_mask_cur;
338 return 0;
339}
340
341static int ctrl_stdcur_set(struct pvr2_ctrl *cptr,int m,int v)
342{
343 struct pvr2_hdw *hdw = cptr->hdw;
344 v4l2_std_id ns;
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;
349 hdw->std_dirty = !0;
350 pvr2_hdw_internal_find_stdenum(hdw);
351 return 0;
352}
353
354static int ctrl_stdcur_is_dirty(struct pvr2_ctrl *cptr)
355{
356 return cptr->hdw->std_dirty != 0;
357}
358
359static void ctrl_stdcur_clear_dirty(struct pvr2_ctrl *cptr)
360{
361 cptr->hdw->std_dirty = 0;
362}
363
364static int ctrl_signal_get(struct pvr2_ctrl *cptr,int *vp)
365{
366 *vp = ((pvr2_hdw_get_signal_status_internal(cptr->hdw) &
367 PVR2_SIGNAL_OK) ? 1 : 0);
368 return 0;
369}
370
371static int ctrl_subsys_get(struct pvr2_ctrl *cptr,int *vp)
372{
373 *vp = cptr->hdw->subsys_enabled_mask;
374 return 0;
375}
376
377static int ctrl_subsys_set(struct pvr2_ctrl *cptr,int m,int v)
378{
379 pvr2_hdw_subsys_bit_chg_no_lock(cptr->hdw,m,v);
380 return 0;
381}
382
383static int ctrl_subsys_stream_get(struct pvr2_ctrl *cptr,int *vp)
384{
385 *vp = cptr->hdw->subsys_stream_mask;
386 return 0;
387}
388
389static int ctrl_subsys_stream_set(struct pvr2_ctrl *cptr,int m,int v)
390{
391 pvr2_hdw_subsys_stream_bit_chg_no_lock(cptr->hdw,m,v);
392 return 0;
393}
394
395static int ctrl_stdenumcur_set(struct pvr2_ctrl *cptr,int m,int v)
396{
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;
401 if (!v) return 0;
402 v--;
403 if (hdw->std_mask_cur == hdw->std_defs[v].id) return 0;
404 hdw->std_mask_cur = hdw->std_defs[v].id;
405 hdw->std_dirty = !0;
406 return 0;
407}
408
409
410static int ctrl_stdenumcur_get(struct pvr2_ctrl *cptr,int *vp)
411{
412 *vp = cptr->hdw->std_enum_cur;
413 return 0;
414}
415
416
417static int ctrl_stdenumcur_is_dirty(struct pvr2_ctrl *cptr)
418{
419 return cptr->hdw->std_dirty != 0;
420}
421
422
423static void ctrl_stdenumcur_clear_dirty(struct pvr2_ctrl *cptr)
424{
425 cptr->hdw->std_dirty = 0;
426}
427
428
429#define DEFINT(vmin,vmax) \
430 .type = pvr2_ctl_int, \
431 .def.type_int.min_value = vmin, \
432 .def.type_int.max_value = vmax
433
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
438
Mike Isely33213962006-06-25 20:04:40 -0300439#define DEFBOOL \
440 .type = pvr2_ctl_bool
441
Mike Iselyd8554972006-06-26 20:58:46 -0300442#define DEFMASK(msk,tab) \
443 .type = pvr2_ctl_bitmask, \
444 .def.type_bitmask.valid_bits = msk, \
445 .def.type_bitmask.bit_names = tab
446
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
452
453
454#define VCREATE_FUNCS(vname) \
455static int ctrl_get_##vname(struct pvr2_ctrl *cptr,int *vp) \
456{*vp = cptr->hdw->vname##_val; return 0;} \
457static 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;} \
459static int ctrl_isdirty_##vname(struct pvr2_ctrl *cptr) \
460{return cptr->hdw->vname##_dirty != 0;} \
461static void ctrl_cleardirty_##vname(struct pvr2_ctrl *cptr) \
462{cptr->hdw->vname##_dirty = 0;}
463
464VCREATE_FUNCS(brightness)
465VCREATE_FUNCS(contrast)
466VCREATE_FUNCS(saturation)
467VCREATE_FUNCS(hue)
468VCREATE_FUNCS(volume)
469VCREATE_FUNCS(balance)
470VCREATE_FUNCS(bass)
471VCREATE_FUNCS(treble)
472VCREATE_FUNCS(mute)
Mike Iselyc05c0462006-06-25 20:04:25 -0300473VCREATE_FUNCS(input)
474VCREATE_FUNCS(audiomode)
475VCREATE_FUNCS(res_hor)
476VCREATE_FUNCS(res_ver)
Mike Iselyd8554972006-06-26 20:58:46 -0300477VCREATE_FUNCS(srate)
478VCREATE_FUNCS(audiobitrate)
479VCREATE_FUNCS(audiocrc)
480VCREATE_FUNCS(audioemphasis)
481VCREATE_FUNCS(vbr)
482VCREATE_FUNCS(videobitrate)
483VCREATE_FUNCS(videopeak)
Mike Iselyd8554972006-06-26 20:58:46 -0300484VCREATE_FUNCS(interlace)
485VCREATE_FUNCS(audiolayer)
486
487#define MIN_FREQ 55250000L
488#define MAX_FREQ 850000000L
489
490/* Table definition of all controls which can be manipulated */
491static const struct pvr2_ctl_info control_defs[] = {
492 {
493 .v4l_id = V4L2_CID_BRIGHTNESS,
494 .desc = "Brightness",
495 .name = "brightness",
496 .default_value = 128,
497 DEFREF(brightness),
498 DEFINT(0,255),
499 },{
500 .v4l_id = V4L2_CID_CONTRAST,
501 .desc = "Contrast",
502 .name = "contrast",
503 .default_value = 68,
504 DEFREF(contrast),
505 DEFINT(0,127),
506 },{
507 .v4l_id = V4L2_CID_SATURATION,
508 .desc = "Saturation",
509 .name = "saturation",
510 .default_value = 64,
511 DEFREF(saturation),
512 DEFINT(0,127),
513 },{
514 .v4l_id = V4L2_CID_HUE,
515 .desc = "Hue",
516 .name = "hue",
517 .default_value = 0,
518 DEFREF(hue),
519 DEFINT(-128,127),
520 },{
521 .v4l_id = V4L2_CID_AUDIO_VOLUME,
522 .desc = "Volume",
523 .name = "volume",
524 .default_value = 65535,
525 DEFREF(volume),
526 DEFINT(0,65535),
527 },{
528 .v4l_id = V4L2_CID_AUDIO_BALANCE,
529 .desc = "Balance",
530 .name = "balance",
531 .default_value = 0,
532 DEFREF(balance),
533 DEFINT(-32768,32767),
534 },{
535 .v4l_id = V4L2_CID_AUDIO_BASS,
536 .desc = "Bass",
537 .name = "bass",
538 .default_value = 0,
539 DEFREF(bass),
540 DEFINT(-32768,32767),
541 },{
542 .v4l_id = V4L2_CID_AUDIO_TREBLE,
543 .desc = "Treble",
544 .name = "treble",
545 .default_value = 0,
546 DEFREF(treble),
547 DEFINT(-32768,32767),
548 },{
549 .v4l_id = V4L2_CID_AUDIO_MUTE,
550 .desc = "Mute",
551 .name = "mute",
552 .default_value = 0,
553 DEFREF(mute),
Mike Isely33213962006-06-25 20:04:40 -0300554 DEFBOOL,
Mike Iselyd8554972006-06-26 20:58:46 -0300555 },{
Mike Iselyc05c0462006-06-25 20:04:25 -0300556 .desc = "Video Source",
557 .name = "input",
558 .internal_id = PVR2_CID_INPUT,
559 .default_value = PVR2_CVAL_INPUT_TV,
560 DEFREF(input),
561 DEFENUM(control_values_input),
562 },{
563 .desc = "Audio Mode",
564 .name = "audio_mode",
565 .internal_id = PVR2_CID_AUDIOMODE,
566 .default_value = V4L2_TUNER_MODE_STEREO,
567 DEFREF(audiomode),
568 DEFENUM(control_values_audiomode),
569 },{
570 .desc = "Horizontal capture resolution",
571 .name = "resolution_hor",
572 .internal_id = PVR2_CID_HRES,
573 .default_value = 720,
574 DEFREF(res_hor),
575 DEFINT(320,720),
576 },{
577 .desc = "Vertical capture resolution",
578 .name = "resolution_ver",
579 .internal_id = PVR2_CID_VRES,
580 .default_value = 480,
581 DEFREF(res_ver),
582 DEFINT(200,625),
583 },{
Mike Iselyd8554972006-06-26 20:58:46 -0300584 .v4l_id = V4L2_CID_PVR_SRATE,
585 .desc = "Sample rate",
586 .name = "srate",
587 .default_value = PVR2_CVAL_SRATE_48,
588 DEFREF(srate),
589 DEFENUM(control_values_srate),
590 },{
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),
597 },{
598 .v4l_id = V4L2_CID_PVR_AUDIOCRC,
599 .desc = "Audio CRC",
600 .name = "audio_crc",
601 .default_value = 1,
602 DEFREF(audiocrc),
Mike Isely33213962006-06-25 20:04:40 -0300603 DEFBOOL,
Mike Iselyd8554972006-06-26 20:58:46 -0300604 },{
Mike Iselyd8554972006-06-26 20:58:46 -0300605 .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),
611 },{
Mike Iselyd8554972006-06-26 20:58:46 -0300612 .v4l_id = V4L2_CID_PVR_VBR,
613 .desc = "Variable video bitrate",
614 .name = "vbr",
615 .default_value = 0,
616 DEFREF(vbr),
Mike Isely33213962006-06-25 20:04:40 -0300617 DEFBOOL,
Mike Iselyd8554972006-06-26 20:58:46 -0300618 },{
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),
625 },{
626 .v4l_id = V4L2_CID_PVR_VIDEOPEAK,
627 .desc = "Peak video bitrate",
628 .name = "video_peak_bitrate",
629 .default_value = 6000000,
630 DEFREF(videopeak),
631 DEFINT(500000,20000000),
632 },{
Mike Iselyc05c0462006-06-25 20:04:25 -0300633 .desc = "Interlace mode",
634 .name = "interlace",
635 .internal_id = PVR2_CID_INTERLACE,
636 .default_value = 0,
637 DEFREF(interlace),
Mike Isely33213962006-06-25 20:04:40 -0300638 DEFBOOL,
Mike Iselyd8554972006-06-26 20:58:46 -0300639 },{
Mike Iselyc05c0462006-06-25 20:04:25 -0300640 .desc = "Audio Layer",
641 .name = "audio_layer",
642 .default_value = 2,
643 DEFREF(audiolayer),
644 DEFINT(0,3),
Mike Iselyd8554972006-06-26 20:58:46 -0300645 },{
646 .desc = "Tuner Frequency (Hz)",
647 .name = "frequency",
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),
655 },{
656 .desc = "Channel",
657 .name = "channel",
658 .set_value = ctrl_channel_set,
659 .get_value = ctrl_channel_get,
660 DEFINT(0,FREQTABLE_SIZE),
661 },{
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),
667 },{
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),
673 },{
Mike Iselyd8554972006-06-26 20:58:46 -0300674 .desc = "Streaming Enabled",
675 .name = "streaming_enabled",
676 .get_value = ctrl_streamingenabled_get,
Mike Isely33213962006-06-25 20:04:40 -0300677 DEFBOOL,
Mike Iselyd8554972006-06-26 20:58:46 -0300678 },{
679 .desc = "USB Speed",
680 .name = "usb_speed",
681 .get_value = ctrl_hsm_get,
682 DEFENUM(control_values_hsm),
683 },{
684 .desc = "Signal Present",
685 .name = "signal_present",
686 .get_value = ctrl_signal_get,
Mike Isely33213962006-06-25 20:04:40 -0300687 DEFBOOL,
Mike Iselyd8554972006-06-26 20:58:46 -0300688 },{
689 .desc = "Video Standards Available Mask",
690 .name = "video_standard_mask_available",
691 .internal_id = PVR2_CID_STDAVAIL,
692 .skip_init = !0,
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,
698 },{
699 .desc = "Video Standards In Use Mask",
700 .name = "video_standard_mask_active",
701 .internal_id = PVR2_CID_STDCUR,
702 .skip_init = !0,
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,
710 },{
711 .desc = "Subsystem enabled mask",
712 .name = "debug_subsys_mask",
713 .skip_init = !0,
714 .get_value = ctrl_subsys_get,
715 .set_value = ctrl_subsys_set,
716 DEFMASK(PVR2_SUBSYS_ALL,control_values_subsystem),
717 },{
718 .desc = "Subsystem stream mask",
719 .name = "debug_subsys_stream_mask",
720 .skip_init = !0,
721 .get_value = ctrl_subsys_stream_get,
722 .set_value = ctrl_subsys_stream_set,
723 DEFMASK(PVR2_SUBSYS_ALL,control_values_subsystem),
724 },{
725 .desc = "Video Standard Name",
726 .name = "video_standard",
727 .internal_id = PVR2_CID_STDENUM,
728 .skip_init = !0,
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,
734 }
735};
736
Mike Iselyc05c0462006-06-25 20:04:25 -0300737#define CTRLDEF_COUNT (sizeof(control_defs)/sizeof(control_defs[0]))
Mike Iselyd8554972006-06-26 20:58:46 -0300738
739
740const char *pvr2_config_get_name(enum pvr2_config cfg)
741{
742 switch (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";
747 }
748 return "<unknown>";
749}
750
751
752struct usb_device *pvr2_hdw_get_dev(struct pvr2_hdw *hdw)
753{
754 return hdw->usb_dev;
755}
756
757
758unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw)
759{
760 return hdw->serial_number;
761}
762
763
764struct pvr2_hdw *pvr2_hdw_find(int unit_number)
765{
766 if (unit_number < 0) return 0;
767 if (unit_number >= PVR_NUM) return 0;
768 return unit_pointers[unit_number];
769}
770
771
772int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw)
773{
774 return hdw->unit_number;
775}
776
777
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
783 could be located. */
784static 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[])
789{
790 unsigned int idx;
791 int ret = -EINVAL;
792 for (idx = 0; idx < fwcount; idx++) {
793 ret = request_firmware(fw_entry,
794 fwnames[idx],
795 &hdw->usb_dev->dev);
796 if (!ret) {
797 trace_firmware("Located %s firmware: %s;"
798 " uploading...",
799 fwtypename,
800 fwnames[idx]);
801 return idx;
802 }
803 if (ret == -ENOENT) continue;
804 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
805 "request_firmware fatal error with code=%d",ret);
806 return ret;
807 }
808 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
809 "***WARNING***"
810 " Device %s firmware"
811 " seems to be missing.",
812 fwtypename);
813 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
814 "Did you install the pvrusb2 firmware files"
815 " in their proper location?");
816 if (fwcount == 1) {
817 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
818 "request_firmware unable to locate %s file %s",
819 fwtypename,fwnames[0]);
820 } else {
821 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
822 "request_firmware unable to locate"
823 " one of the following %s files:",
824 fwtypename);
825 for (idx = 0; idx < fwcount; idx++) {
826 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
827 "request_firmware: Failed to find %s",
828 fwnames[idx]);
829 }
830 }
831 return ret;
832}
833
834
835/*
836 * pvr2_upload_firmware1().
837 *
838 * Send the 8051 firmware to the device. After the upload, arrange for
839 * device to re-enumerate.
840 *
841 * NOTE : the pointer to the firmware data given by request_firmware()
842 * is not suitable for an usb transaction.
843 *
844 */
845int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
846{
847 const struct firmware *fw_entry = 0;
848 void *fw_ptr;
849 unsigned int pipe;
850 int ret;
851 u16 address;
852 static const char *fw_files_29xxx[] = {
853 "v4l-pvrusb2-29xxx-01.fw",
854 };
855#ifdef CONFIG_VIDEO_PVRUSB2_24XXX
856 static const char *fw_files_24xxx[] = {
857 "v4l-pvrusb2-24xxx-01.fw",
858 };
859#endif
860 static const struct pvr2_string_table fw_file_defs[] = {
861 [PVR2_HDW_TYPE_29XXX] = {
862 fw_files_29xxx,
863 sizeof(fw_files_29xxx)/sizeof(fw_files_29xxx[0]),
864 },
865#ifdef CONFIG_VIDEO_PVRUSB2_24XXX
866 [PVR2_HDW_TYPE_24XXX] = {
867 fw_files_24xxx,
868 sizeof(fw_files_24xxx)/sizeof(fw_files_24xxx[0]),
869 },
870#endif
871 };
872 hdw->fw1_state = FW1_STATE_FAILED; // default result
873
874 trace_firmware("pvr2_upload_firmware1");
875
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);
879 if (ret < 0) {
880 if (ret == -ENOENT) hdw->fw1_state = FW1_STATE_MISSING;
881 return ret;
882 }
883
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));
886
887 pipe = usb_sndctrlpipe(hdw->usb_dev, 0);
888
889 if (fw_entry->size != 0x2000){
890 pvr2_trace(PVR2_TRACE_ERROR_LEGS,"wrong fx2 firmware size");
891 release_firmware(fw_entry);
892 return -ENOMEM;
893 }
894
895 fw_ptr = kmalloc(0x800, GFP_KERNEL);
896 if (fw_ptr == NULL){
897 release_firmware(fw_entry);
898 return -ENOMEM;
899 }
900
901 /* We have to hold the CPU during firmware upload. */
902 pvr2_hdw_cpureset_assert(hdw,1);
903
904 /* upload the firmware to address 0000-1fff in 2048 (=0x800) bytes
905 chunk. */
906
907 ret = 0;
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);
912 }
913
914 trace_firmware("Upload done, releasing device's CPU");
915
916 /* Now release the CPU. It will disconnect and reconnect later. */
917 pvr2_hdw_cpureset_assert(hdw,0);
918
919 kfree(fw_ptr);
920 release_firmware(fw_entry);
921
922 trace_firmware("Upload done (%d bytes sent)",ret);
923
924 /* We should have written 8192 bytes */
925 if (ret == 8192) {
926 hdw->fw1_state = FW1_STATE_RELOAD;
927 return 0;
928 }
929
930 return -EIO;
931}
932
933
934/*
935 * pvr2_upload_firmware2()
936 *
937 * This uploads encoder firmware on endpoint 2.
938 *
939 */
940
941int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
942{
943 const struct firmware *fw_entry = 0;
944 void *fw_ptr;
945 unsigned int pipe, fw_len, fw_done;
946 int actual_length;
947 int ret = 0;
948 int fwidx;
949 static const char *fw_files[] = {
950 CX2341X_FIRM_ENC_FILENAME,
951 };
952
953 trace_firmware("pvr2_upload_firmware2");
954
955 ret = pvr2_locate_firmware(hdw,&fw_entry,"encoder",
956 sizeof(fw_files)/sizeof(fw_files[0]),
957 fw_files);
958 if (ret < 0) return ret;
959 fwidx = ret;
960 ret = 0;
961
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);
981
982 if (ret) {
983 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
984 "firmware2 upload prep failed, ret=%d",ret);
985 release_firmware(fw_entry);
986 return ret;
987 }
988
989 /* Now send firmware */
990
991 fw_len = fw_entry->size;
992
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",
997 fw_files[fwidx]);
998 release_firmware(fw_entry);
999 return -1;
1000 }
1001
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");
1007 return -ENOMEM;
1008 }
1009
1010 pipe = usb_sndbulkpipe(hdw->usb_dev, PVR2_FIRMWARE_ENDPOINT);
1011
1012 for (fw_done = 0 ; (fw_done < fw_len) && !ret ;
1013 fw_done += FIRMWARE_CHUNK_SIZE ) {
1014 int i;
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]);
1019
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);
1024 }
1025
1026 trace_firmware("upload of %s : %i / %i ",
1027 fw_files[fwidx],fw_done,fw_len);
1028
1029 kfree(fw_ptr);
1030 release_firmware(fw_entry);
1031
1032 if (ret) {
1033 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1034 "firmware2 upload transfer failure");
1035 return ret;
1036 }
1037
1038 /* Finish upload */
1039
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);
1043
1044 if (ret) {
1045 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1046 "firmware2 upload post-proc failure");
1047 } else {
1048 hdw->subsys_enabled_mask |= (1<<PVR2_SUBSYS_B_ENC_FIRMWARE);
1049 }
1050 return ret;
1051}
1052
1053
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))
1059
1060/*
1061
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.
1069
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
1077 defined by "msk".
1078
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.
1088
1089*/
1090void pvr2_hdw_subsys_bit_chg_no_lock(struct pvr2_hdw *hdw,
1091 unsigned long msk,unsigned long val)
1092{
1093 unsigned long nmsk;
1094 unsigned long vmsk;
1095 int ret;
1096 unsigned int tryCount = 0;
1097
1098 if (!hdw->flag_ok) return;
1099
1100 msk &= PVR2_SUBSYS_ALL;
1101
1102 for (;;) {
1103 tryCount++;
1104 vmsk = hdw->subsys_enabled_mask & PVR2_SUBSYS_ALL;
1105 nmsk = (vmsk & ~msk) | (val & msk);
1106 if (!(nmsk ^ vmsk)) break;
1107 if (tryCount > 4) {
1108 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1109 "Too many retries when configuring device;"
1110 " giving up");
1111 pvr2_hdw_render_useless(hdw);
1112 break;
1113 }
1114 if (tryCount > 1) {
1115 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1116 "Retrying device reconfiguration");
1117 }
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);
1122
1123 vmsk = (nmsk ^ hdw->subsys_enabled_mask) &
1124 hdw->subsys_enabled_mask;
1125 if (vmsk) {
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);
1131 if (ret) {
1132 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1133 "Error recovery initiated");
1134 hdw->subsys_enabled_mask &=
1135 ~FIRMWARE_RECOVERY_BITS;
1136 continue;
1137 }
1138 }
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);
1144 }
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);
1152 } else {
1153 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1154 "WARNING:"
1155 " No decoder present");
1156 }
1157 hdw->subsys_enabled_mask &=
1158 ~(1<<PVR2_SUBSYS_B_DIGITIZER_RUN);
1159 }
1160 if (vmsk & PVR2_SUBSYS_CFG_ALL) {
1161 hdw->subsys_enabled_mask &=
1162 ~(vmsk & PVR2_SUBSYS_CFG_ALL);
1163 }
1164 }
1165 vmsk = (nmsk ^ hdw->subsys_enabled_mask) & nmsk;
1166 if (vmsk) {
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);
1172 if (ret) {
1173 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1174 "Failure uploading encoder"
1175 " firmware");
1176 pvr2_hdw_render_useless(hdw);
1177 break;
1178 }
1179 }
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);
1185 if (ret) {
1186 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1187 "Error recovery initiated");
1188 hdw->subsys_enabled_mask &=
1189 ~FIRMWARE_RECOVERY_BITS;
1190 continue;
1191 }
1192 }
1193 if (vmsk & (1<<PVR2_SUBSYS_B_DIGITIZER_RUN)) {
1194 pvr2_trace(PVR2_TRACE_CTL,
1195 "/*---TRACE_CTL----*/"
1196 " decoder enable");
1197 if (hdw->decoder_ctrl) {
1198 hdw->decoder_ctrl->enable(
1199 hdw->decoder_ctrl->ctxt,!0);
1200 } else {
1201 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1202 "WARNING:"
1203 " No decoder present");
1204 }
1205 hdw->subsys_enabled_mask |=
1206 (1<<PVR2_SUBSYS_B_DIGITIZER_RUN);
1207 }
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);
1213 }
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);
1219 if (ret) {
1220 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1221 "Error recovery initiated");
1222 hdw->subsys_enabled_mask &=
1223 ~FIRMWARE_RECOVERY_BITS;
1224 continue;
1225 }
1226 }
1227 }
1228 }
1229}
1230
1231
1232void pvr2_hdw_subsys_bit_chg(struct pvr2_hdw *hdw,
1233 unsigned long msk,unsigned long val)
1234{
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);
1238}
1239
1240
1241void pvr2_hdw_subsys_bit_set(struct pvr2_hdw *hdw,unsigned long msk)
1242{
1243 pvr2_hdw_subsys_bit_chg(hdw,msk,msk);
1244}
1245
1246
1247void pvr2_hdw_subsys_bit_clr(struct pvr2_hdw *hdw,unsigned long msk)
1248{
1249 pvr2_hdw_subsys_bit_chg(hdw,msk,0);
1250}
1251
1252
1253unsigned long pvr2_hdw_subsys_get(struct pvr2_hdw *hdw)
1254{
1255 return hdw->subsys_enabled_mask;
1256}
1257
1258
1259unsigned long pvr2_hdw_subsys_stream_get(struct pvr2_hdw *hdw)
1260{
1261 return hdw->subsys_stream_mask;
1262}
1263
1264
1265void pvr2_hdw_subsys_stream_bit_chg_no_lock(struct pvr2_hdw *hdw,
1266 unsigned long msk,
1267 unsigned long val)
1268{
1269 unsigned long val2;
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;
1276}
1277
1278
1279void pvr2_hdw_subsys_stream_bit_chg(struct pvr2_hdw *hdw,
1280 unsigned long msk,
1281 unsigned long val)
1282{
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);
1286}
1287
1288
1289int pvr2_hdw_set_streaming_no_lock(struct pvr2_hdw *hdw,int enableFl)
1290{
1291 if ((!enableFl) == !(hdw->flag_streaming_enabled)) return 0;
1292 if (enableFl) {
1293 pvr2_trace(PVR2_TRACE_START_STOP,
1294 "/*--TRACE_STREAM--*/ enable");
1295 pvr2_hdw_subsys_bit_chg_no_lock(hdw,~0,~0);
1296 } else {
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);
1300 }
1301 if (!hdw->flag_ok) return -EIO;
1302 hdw->flag_streaming_enabled = enableFl != 0;
1303 return 0;
1304}
1305
1306
1307int pvr2_hdw_get_streaming(struct pvr2_hdw *hdw)
1308{
1309 return hdw->flag_streaming_enabled != 0;
1310}
1311
1312
1313int pvr2_hdw_set_streaming(struct pvr2_hdw *hdw,int enable_flag)
1314{
1315 int ret;
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);
1319 return ret;
1320}
1321
1322
1323int pvr2_hdw_set_stream_type_no_lock(struct pvr2_hdw *hdw,
1324 enum pvr2_config config)
1325{
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);
1331 return 0;
1332}
1333
1334
1335int pvr2_hdw_set_stream_type(struct pvr2_hdw *hdw,enum pvr2_config config)
1336{
1337 int ret;
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);
1342 return ret;
1343}
1344
1345
1346static int get_default_tuner_type(struct pvr2_hdw *hdw)
1347{
1348 int unit_number = hdw->unit_number;
1349 int tp = -1;
1350 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1351 tp = tuner[unit_number];
1352 }
1353 if (tp < 0) return -EINVAL;
1354 hdw->tuner_type = tp;
1355 return 0;
1356}
1357
1358
1359static v4l2_std_id get_default_standard(struct pvr2_hdw *hdw)
1360{
1361 int unit_number = hdw->unit_number;
1362 int tp = 0;
1363 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1364 tp = video_std[unit_number];
1365 }
1366 return tp;
1367}
1368
1369
1370static unsigned int get_default_error_tolerance(struct pvr2_hdw *hdw)
1371{
1372 int unit_number = hdw->unit_number;
1373 int tp = 0;
1374 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1375 tp = tolerance[unit_number];
1376 }
1377 return tp;
1378}
1379
1380
1381static int pvr2_hdw_check_firmware(struct pvr2_hdw *hdw)
1382{
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. */
1387 int result;
1388 LOCK_TAKE(hdw->ctl_lock); do {
1389 hdw->cmd_buffer[0] = 0xeb;
1390 result = pvr2_send_request_ex(hdw,HZ*1,!0,
1391 hdw->cmd_buffer,1,
1392 hdw->cmd_buffer,1);
1393 if (result < 0) break;
1394 } while(0); LOCK_GIVE(hdw->ctl_lock);
1395 if (result) {
1396 pvr2_trace(PVR2_TRACE_INIT,
1397 "Probe of device endpoint 1 result status %d",
1398 result);
1399 } else {
1400 pvr2_trace(PVR2_TRACE_INIT,
1401 "Probe of device endpoint 1 succeeded");
1402 }
1403 return result == 0;
1404}
1405
1406static void pvr2_hdw_setup_std(struct pvr2_hdw *hdw)
1407{
1408 char buf[40];
1409 unsigned int bcnt;
1410 v4l2_std_id std1,std2;
1411
1412 std1 = get_default_standard(hdw);
1413
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",
1417 bcnt,buf);
1418
1419 hdw->std_mask_avail = hdw->std_mask_eeprom;
1420
1421 std2 = std1 & ~hdw->std_mask_avail;
1422 if (std2) {
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",
1427 bcnt,buf);
1428 hdw->std_mask_avail |= std2;
1429 }
1430
1431 pvr2_hdw_internal_set_std_avail(hdw);
1432
1433 if (std1) {
1434 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std1);
1435 pvr2_trace(PVR2_TRACE_INIT,
1436 "Initial video standard forced to %.*s",
1437 bcnt,buf);
1438 hdw->std_mask_cur = std1;
1439 hdw->std_dirty = !0;
1440 pvr2_hdw_internal_find_stdenum(hdw);
1441 return;
1442 }
1443
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);
1452 return;
1453 }
1454
1455 pvr2_trace(PVR2_TRACE_EEPROM,
1456 "Unable to select a viable initial video standard");
1457}
1458
1459
1460static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
1461{
1462 int ret;
1463 unsigned int idx;
1464 struct pvr2_ctrl *cptr;
1465 int reloadFl = 0;
1466 if (!reloadFl) {
1467 reloadFl = (hdw->usb_intf->cur_altsetting->desc.bNumEndpoints
1468 == 0);
1469 if (reloadFl) {
1470 pvr2_trace(PVR2_TRACE_INIT,
1471 "USB endpoint config looks strange"
1472 "; possibly firmware needs to be loaded");
1473 }
1474 }
1475 if (!reloadFl) {
1476 reloadFl = !pvr2_hdw_check_firmware(hdw);
1477 if (reloadFl) {
1478 pvr2_trace(PVR2_TRACE_INIT,
1479 "Check for FX2 firmware failed"
1480 "; possibly firmware needs to be loaded");
1481 }
1482 }
1483 if (reloadFl) {
1484 if (pvr2_upload_firmware1(hdw) != 0) {
1485 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1486 "Failure uploading firmware1");
1487 }
1488 return;
1489 }
1490 hdw->fw1_state = FW1_STATE_OK;
1491
1492 if (initusbreset) {
1493 pvr2_hdw_device_reset(hdw);
1494 }
1495 if (!pvr2_hdw_dev_ok(hdw)) return;
1496
1497 for (idx = 0; idx < pvr2_client_lists[hdw->hdw_type].cnt; idx++) {
1498 request_module(pvr2_client_lists[hdw->hdw_type].lst[idx]);
1499 }
1500
1501 pvr2_hdw_cmd_powerup(hdw);
1502 if (!pvr2_hdw_dev_ok(hdw)) return;
1503
1504 if (pvr2_upload_firmware2(hdw)){
1505 pvr2_trace(PVR2_TRACE_ERROR_LEGS,"device unstable!!");
1506 pvr2_hdw_render_useless(hdw);
1507 return;
1508 }
1509
1510 // This step MUST happen after the earlier powerup step.
1511 pvr2_i2c_core_init(hdw);
1512 if (!pvr2_hdw_dev_ok(hdw)) return;
1513
Mike Iselyc05c0462006-06-25 20:04:25 -03001514 for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03001515 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);
1519 }
1520
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).
1524
1525 ret = pvr2_hdw_get_eeprom_addr(hdw);
1526 if (!pvr2_hdw_dev_ok(hdw)) return;
1527 if (ret < 0) {
1528 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1529 "Unable to determine location of eeprom, skipping");
1530 } else {
1531 hdw->eeprom_addr = ret;
1532 pvr2_eeprom_analyze(hdw);
1533 if (!pvr2_hdw_dev_ok(hdw)) return;
1534 }
1535
1536 pvr2_hdw_setup_std(hdw);
1537
1538 if (!get_default_tuner_type(hdw)) {
1539 pvr2_trace(PVR2_TRACE_INIT,
1540 "pvr2_hdw_setup: Tuner type overridden to %d",
1541 hdw->tuner_type);
1542 }
1543
1544 hdw->tuner_updated = !0;
1545 pvr2_i2c_core_check_stale(hdw);
1546 hdw->tuner_updated = 0;
1547
1548 if (!pvr2_hdw_dev_ok(hdw)) return;
1549
1550 pvr2_hdw_commit_ctl_internal(hdw);
1551 if (!pvr2_hdw_dev_ok(hdw)) return;
1552
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);
1559 if (idx) {
1560 pvr2_trace(PVR2_TRACE_INIT,
1561 "pvr2_hdw_setup: video stream %p"
1562 " setting tolerance %u",
1563 hdw->vid_stream,idx);
1564 }
1565 pvr2_stream_setup(hdw->vid_stream,hdw->usb_dev,
1566 PVR2_VID_ENDPOINT,idx);
1567 }
1568
1569 if (!pvr2_hdw_dev_ok(hdw)) return;
1570
1571 /* Make sure everything is up to date */
1572 pvr2_i2c_core_sync(hdw);
1573
1574 if (!pvr2_hdw_dev_ok(hdw)) return;
1575
1576 hdw->flag_init_ok = !0;
1577}
1578
1579
1580int pvr2_hdw_setup(struct pvr2_hdw *hdw)
1581{
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)) {
1590 pvr2_trace(
1591 PVR2_TRACE_INFO,
1592 "Device initialization"
1593 " completed successfully.");
1594 break;
1595 }
1596 if (hdw->fw1_state == FW1_STATE_RELOAD) {
1597 pvr2_trace(
1598 PVR2_TRACE_INFO,
1599 "Device microcontroller firmware"
1600 " (re)loaded; it should now reset"
1601 " and reconnect.");
1602 break;
1603 }
1604 pvr2_trace(
1605 PVR2_TRACE_ERROR_LEGS,
1606 "Device initialization was not successful.");
1607 if (hdw->fw1_state == FW1_STATE_MISSING) {
1608 pvr2_trace(
1609 PVR2_TRACE_ERROR_LEGS,
1610 "Giving up since device"
1611 " microcontroller firmware"
1612 " appears to be missing.");
1613 break;
1614 }
1615 }
1616 if (procreload) {
1617 pvr2_trace(
1618 PVR2_TRACE_ERROR_LEGS,
1619 "Attempting pvrusb2 recovery by reloading"
1620 " primary firmware.");
1621 pvr2_trace(
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);
1627 } else {
1628 pvr2_trace(
1629 PVR2_TRACE_ERROR_LEGS,
1630 "***WARNING*** pvrusb2 device hardware"
1631 " appears to be jammed"
1632 " and I can't clear it.");
1633 pvr2_trace(
1634 PVR2_TRACE_ERROR_LEGS,
1635 "You might need to power cycle"
1636 " the pvrusb2 device"
1637 " in order to recover.");
1638 }
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;
1642}
1643
1644
1645/* Create and return a structure for interacting with the underlying
1646 hardware */
1647struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
1648 const struct usb_device_id *devid)
1649{
1650 unsigned int idx,cnt1,cnt2;
1651 struct pvr2_hdw *hdw;
1652 unsigned int hdw_type;
1653 int valid_std_mask;
1654 struct pvr2_ctrl *cptr;
1655 __u8 ifnum;
1656
1657 hdw_type = devid - pvr2_device_table;
1658 if (hdw_type >=
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);
1662 return 0;
1663 }
1664
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));
1670
Mike Iselyc05c0462006-06-25 20:04:25 -03001671 hdw->control_cnt = CTRLDEF_COUNT;
1672 hdw->controls = kmalloc(sizeof(struct pvr2_ctrl) * hdw->control_cnt,
Mike Iselyd8554972006-06-26 20:58:46 -03001673 GFP_KERNEL);
1674 if (!hdw->controls) goto fail;
Mike Iselyc05c0462006-06-25 20:04:25 -03001675 memset(hdw->controls,0,sizeof(struct pvr2_ctrl) * hdw->control_cnt);
Mike Iselyd8554972006-06-26 20:58:46 -03001676 hdw->hdw_type = hdw_type;
Mike Iselyc05c0462006-06-25 20:04:25 -03001677 for (idx = 0; idx < hdw->control_cnt; idx++) {
1678 cptr = hdw->controls + idx;
1679 cptr->hdw = hdw;
1680 }
Mike Iselyd8554972006-06-26 20:58:46 -03001681 for (idx = 0; idx < 32; idx++) {
1682 hdw->std_mask_ptrs[idx] = hdw->std_mask_names[idx];
1683 }
Mike Iselyc05c0462006-06-25 20:04:25 -03001684 for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03001685 cptr = hdw->controls + idx;
Mike Iselyd8554972006-06-26 20:58:46 -03001686 cptr->info = control_defs+idx;
1687 }
1688
1689 // Initialize video standard enum dynamic control
1690 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDENUM);
1691 if (cptr) {
1692 memcpy(&hdw->std_info_enum,cptr->info,
1693 sizeof(hdw->std_info_enum));
1694 cptr->info = &hdw->std_info_enum;
1695
1696 }
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,
1704 1 << idx);
1705 hdw->std_mask_names[idx][cnt1] = 0;
1706 }
1707 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDAVAIL);
1708 if (cptr) {
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 =
1713 hdw->std_mask_ptrs;
1714 hdw->std_info_avail.def.type_bitmask.valid_bits =
1715 valid_std_mask;
1716 }
1717 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDCUR);
1718 if (cptr) {
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 =
1723 hdw->std_mask_ptrs;
1724 hdw->std_info_avail.def.type_bitmask.valid_bits =
1725 valid_std_mask;
1726 }
1727
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;
1739
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;
1745 break;
1746 }
1747 } while (0); up(&pvr2_unit_sem);
1748
1749 cnt1 = 0;
1750 cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"pvrusb2");
1751 cnt1 += cnt2;
1752 if (hdw->unit_number >= 0) {
1753 cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"_%c",
1754 ('a' + hdw->unit_number));
1755 cnt1 += cnt2;
1756 }
1757 if (cnt1 >= sizeof(hdw->name)) cnt1 = sizeof(hdw->name)-1;
1758 hdw->name[cnt1] = 0;
1759
1760 pvr2_trace(PVR2_TRACE_INIT,"Driver unit number is %d, name is %s",
1761 hdw->unit_number,hdw->name);
1762
1763 hdw->tuner_type = -1;
1764 hdw->flag_ok = !0;
1765 /* Initialize the mask of subsystems that we will shut down when we
1766 stop streaming. */
1767 hdw->subsys_stream_mask = PVR2_SUBSYS_RUN_ALL;
1768 hdw->subsys_stream_mask |= (1<<PVR2_SUBSYS_B_ENC_CFG);
1769
1770 pvr2_trace(PVR2_TRACE_INIT,"subsys_stream_mask: 0x%lx",
1771 hdw->subsys_stream_mask);
1772
1773 hdw->usb_intf = intf;
1774 hdw->usb_dev = interface_to_usbdev(intf);
1775
1776 ifnum = hdw->usb_intf->cur_altsetting->desc.bInterfaceNumber;
1777 usb_set_interface(hdw->usb_dev,ifnum,0);
1778
1779 mutex_init(&hdw->ctl_lock_mutex);
1780 mutex_init(&hdw->big_lock_mutex);
1781
1782 return hdw;
1783 fail:
1784 if (hdw) {
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);
1790 kfree(hdw);
1791 }
1792 return 0;
1793}
1794
1795
1796/* Remove _all_ associations between this driver and the underlying USB
1797 layer. */
1798void pvr2_hdw_remove_usb_stuff(struct pvr2_hdw *hdw)
1799{
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;
1806 }
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;
1811 }
1812 if (hdw->ctl_read_buffer) {
1813 kfree(hdw->ctl_read_buffer);
1814 hdw->ctl_read_buffer = 0;
1815 }
1816 if (hdw->ctl_write_buffer) {
1817 kfree(hdw->ctl_write_buffer);
1818 hdw->ctl_write_buffer = 0;
1819 }
1820 pvr2_hdw_render_useless_unlocked(hdw);
1821 hdw->flag_disconnected = !0;
1822 hdw->usb_dev = 0;
1823 hdw->usb_intf = 0;
1824}
1825
1826
1827/* Destroy hardware interaction structure */
1828void pvr2_hdw_destroy(struct pvr2_hdw *hdw)
1829{
1830 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_destroy: hdw=%p",hdw);
1831 if (hdw->fw_buffer) {
1832 kfree(hdw->fw_buffer);
1833 hdw->fw_buffer = 0;
1834 }
1835 if (hdw->vid_stream) {
1836 pvr2_stream_destroy(hdw->vid_stream);
1837 hdw->vid_stream = 0;
1838 }
1839 if (hdw->audio_stat) {
1840 hdw->audio_stat->detach(hdw->audio_stat->ctxt);
1841 }
1842 if (hdw->decoder_ctrl) {
1843 hdw->decoder_ctrl->detach(hdw->decoder_ctrl->ctxt);
1844 }
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;
1852 }
1853 } while (0); up(&pvr2_unit_sem);
Mike Iselyc05c0462006-06-25 20:04:25 -03001854 if (hdw->controls) kfree(hdw->controls);
Mike Iselyd8554972006-06-26 20:58:46 -03001855 if (hdw->std_defs) kfree(hdw->std_defs);
1856 if (hdw->std_enum_names) kfree(hdw->std_enum_names);
1857 kfree(hdw);
1858}
1859
1860
1861int pvr2_hdw_init_ok(struct pvr2_hdw *hdw)
1862{
1863 return hdw->flag_init_ok;
1864}
1865
1866
1867int pvr2_hdw_dev_ok(struct pvr2_hdw *hdw)
1868{
1869 return (hdw && hdw->flag_ok);
1870}
1871
1872
1873/* Called when hardware has been unplugged */
1874void pvr2_hdw_disconnect(struct pvr2_hdw *hdw)
1875{
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);
1882}
1883
1884
1885// Attempt to autoselect an appropriate value for std_enum_cur given
1886// whatever is currently in std_mask_cur
1887void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw)
1888{
1889 unsigned int idx;
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;
1893 return;
1894 }
1895 }
1896 hdw->std_enum_cur = 0;
1897}
1898
1899
1900// Calculate correct set of enumerated standards based on currently known
1901// set of available standards bits.
1902void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw)
1903{
1904 struct v4l2_standard *newstd;
1905 unsigned int std_cnt;
1906 unsigned int idx;
1907
1908 newstd = pvr2_std_create_enum(&std_cnt,hdw->std_mask_avail);
1909
1910 if (hdw->std_defs) {
1911 kfree(hdw->std_defs);
1912 hdw->std_defs = 0;
1913 }
1914 hdw->std_enum_cnt = 0;
1915 if (hdw->std_enum_names) {
1916 kfree(hdw->std_enum_names);
1917 hdw->std_enum_names = 0;
1918 }
1919
1920 if (!std_cnt) {
1921 pvr2_trace(
1922 PVR2_TRACE_ERROR_LEGS,
1923 "WARNING: Failed to identify any viable standards");
1924 }
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] =
1929 newstd[idx].name;
1930 }
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;
1938}
1939
1940
1941int pvr2_hdw_get_stdenum_value(struct pvr2_hdw *hdw,
1942 struct v4l2_standard *std,
1943 unsigned int idx)
1944{
1945 int ret = -EINVAL;
1946 if (!idx) return ret;
1947 LOCK_TAKE(hdw->big_lock); do {
1948 if (idx >= hdw->std_enum_cnt) break;
1949 idx--;
1950 memcpy(std,hdw->std_defs+idx,sizeof(*std));
1951 ret = 0;
1952 } while (0); LOCK_GIVE(hdw->big_lock);
1953 return ret;
1954}
1955
1956
1957/* Get the number of defined controls */
1958unsigned int pvr2_hdw_get_ctrl_count(struct pvr2_hdw *hdw)
1959{
Mike Iselyc05c0462006-06-25 20:04:25 -03001960 return hdw->control_cnt;
Mike Iselyd8554972006-06-26 20:58:46 -03001961}
1962
1963
1964/* Retrieve a control handle given its index (0..count-1) */
1965struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_index(struct pvr2_hdw *hdw,
1966 unsigned int idx)
1967{
Mike Iselyc05c0462006-06-25 20:04:25 -03001968 if (idx >= hdw->control_cnt) return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001969 return hdw->controls + idx;
1970}
1971
1972
1973/* Retrieve a control handle given its index (0..count-1) */
1974struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_id(struct pvr2_hdw *hdw,
1975 unsigned int ctl_id)
1976{
1977 struct pvr2_ctrl *cptr;
1978 unsigned int idx;
1979 int i;
1980
1981 /* This could be made a lot more efficient, but for now... */
Mike Iselyc05c0462006-06-25 20:04:25 -03001982 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03001983 cptr = hdw->controls + idx;
1984 i = cptr->info->internal_id;
1985 if (i && (i == ctl_id)) return cptr;
1986 }
1987 return 0;
1988}
1989
1990
Mike Iselya761f432006-06-25 20:04:44 -03001991/* Given a V4L ID, retrieve the control structure associated with it. */
Mike Iselyd8554972006-06-26 20:58:46 -03001992struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *hdw,unsigned int ctl_id)
1993{
1994 struct pvr2_ctrl *cptr;
1995 unsigned int idx;
1996 int i;
1997
1998 /* This could be made a lot more efficient, but for now... */
Mike Iselyc05c0462006-06-25 20:04:25 -03001999 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002000 cptr = hdw->controls + idx;
2001 i = cptr->info->v4l_id;
2002 if (i && (i == ctl_id)) return cptr;
2003 }
2004 return 0;
2005}
2006
2007
Mike Iselya761f432006-06-25 20:04:44 -03002008/* Given a V4L ID for its immediate predecessor, retrieve the control
2009 structure associated with it. */
2010struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *hdw,
2011 unsigned int ctl_id)
2012{
2013 struct pvr2_ctrl *cptr,*cp2;
2014 unsigned int idx;
2015 int i;
2016
2017 /* This could be made a lot more efficient, but for now... */
2018 cp2 = 0;
2019 for (idx = 0; idx < hdw->control_cnt; idx++) {
2020 cptr = hdw->controls + idx;
2021 i = cptr->info->v4l_id;
2022 if (!i) continue;
2023 if (i <= ctl_id) continue;
2024 if (cp2 && (cp2->info->v4l_id < i)) continue;
2025 cp2 = cptr;
2026 }
2027 return cp2;
2028 return 0;
2029}
2030
2031
Mike Iselyd8554972006-06-26 20:58:46 -03002032static const char *get_ctrl_typename(enum pvr2_ctl_type tp)
2033{
2034 switch (tp) {
2035 case pvr2_ctl_int: return "integer";
2036 case pvr2_ctl_enum: return "enum";
Mike Isely33213962006-06-25 20:04:40 -03002037 case pvr2_ctl_bool: return "boolean";
Mike Iselyd8554972006-06-26 20:58:46 -03002038 case pvr2_ctl_bitmask: return "bitmask";
2039 }
2040 return "";
2041}
2042
2043
2044/* Commit all control changes made up to this point. Subsystems can be
2045 indirectly affected by these changes. For a given set of things being
2046 committed, we'll clear the affected subsystem bits and then once we're
2047 done committing everything we'll make a request to restore the subsystem
2048 state(s) back to their previous value before this function was called.
2049 Thus we can automatically reconfigure affected pieces of the driver as
2050 controls are changed. */
2051int pvr2_hdw_commit_ctl_internal(struct pvr2_hdw *hdw)
2052{
2053 unsigned long saved_subsys_mask = hdw->subsys_enabled_mask;
2054 unsigned long stale_subsys_mask = 0;
2055 unsigned int idx;
2056 struct pvr2_ctrl *cptr;
2057 int value;
2058 int commit_flag = 0;
2059 char buf[100];
2060 unsigned int bcnt,ccnt;
2061
Mike Iselyc05c0462006-06-25 20:04:25 -03002062 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002063 cptr = hdw->controls + idx;
2064 if (cptr->info->is_dirty == 0) continue;
2065 if (!cptr->info->is_dirty(cptr)) continue;
2066 if (!commit_flag) {
2067 commit_flag = !0;
2068 }
2069
2070 bcnt = scnprintf(buf,sizeof(buf),"\"%s\" <-- ",
2071 cptr->info->name);
2072 value = 0;
2073 cptr->info->get_value(cptr,&value);
2074 pvr2_ctrl_value_to_sym_internal(cptr,~0,value,
2075 buf+bcnt,
2076 sizeof(buf)-bcnt,&ccnt);
2077 bcnt += ccnt;
2078 bcnt += scnprintf(buf+bcnt,sizeof(buf)-bcnt," <%s>",
2079 get_ctrl_typename(cptr->info->type));
2080 pvr2_trace(PVR2_TRACE_CTL,
2081 "/*--TRACE_COMMIT--*/ %.*s",
2082 bcnt,buf);
2083 }
2084
2085 if (!commit_flag) {
2086 /* Nothing has changed */
2087 return 0;
2088 }
2089
2090 /* When video standard changes, reset the hres and vres values -
2091 but if the user has pending changes there, then let the changes
2092 take priority. */
2093 if (hdw->std_dirty) {
2094 /* Rewrite the vertical resolution to be appropriate to the
2095 video standard that has been selected. */
2096 int nvres;
2097 if (hdw->std_mask_cur & V4L2_STD_525_60) {
2098 nvres = 480;
2099 } else {
2100 nvres = 576;
2101 }
2102 if (nvres != hdw->res_ver_val) {
2103 hdw->res_ver_val = nvres;
2104 hdw->res_ver_dirty = !0;
2105 }
2106 if (!hdw->interlace_val) {
2107 hdw->interlace_val = 0;
2108 hdw->interlace_dirty = !0;
2109 }
2110 }
2111
2112 if (hdw->std_dirty ||
Mike Iselyd8554972006-06-26 20:58:46 -03002113 hdw->interlace_dirty ||
2114 hdw->vbr_dirty ||
2115 hdw->videobitrate_dirty ||
2116 hdw->videopeak_dirty ||
2117 hdw->audiobitrate_dirty ||
Mike Iselyd8554972006-06-26 20:58:46 -03002118 hdw->audiolayer_dirty ||
2119 hdw->audiocrc_dirty ||
Mike Iselyc05c0462006-06-25 20:04:25 -03002120 hdw->audioemphasis_dirty ||
2121 hdw->srate_dirty ||
2122 hdw->res_ver_dirty ||
2123 hdw->res_hor_dirty) {
Mike Iselyd8554972006-06-26 20:58:46 -03002124 /* If any of this changes, then the encoder needs to be
2125 reconfigured, and we need to reset the stream. */
2126 stale_subsys_mask |= (1<<PVR2_SUBSYS_B_ENC_CFG);
2127 stale_subsys_mask |= hdw->subsys_stream_mask;
2128 }
2129
Mike Iselyc05c0462006-06-25 20:04:25 -03002130
Mike Iselyd8554972006-06-26 20:58:46 -03002131 /* Scan i2c core at this point - before we clear all the dirty
2132 bits. Various parts of the i2c core will notice dirty bits as
2133 appropriate and arrange to broadcast or directly send updates to
2134 the client drivers in order to keep everything in sync */
2135 pvr2_i2c_core_check_stale(hdw);
2136
Mike Iselyc05c0462006-06-25 20:04:25 -03002137 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002138 cptr = hdw->controls + idx;
2139 if (!cptr->info->clear_dirty) continue;
2140 cptr->info->clear_dirty(cptr);
2141 }
2142
2143 /* Now execute i2c core update */
2144 pvr2_i2c_core_sync(hdw);
2145
2146 pvr2_hdw_subsys_bit_chg_no_lock(hdw,stale_subsys_mask,0);
2147 pvr2_hdw_subsys_bit_chg_no_lock(hdw,~0,saved_subsys_mask);
2148
2149 return 0;
2150}
2151
2152
2153int pvr2_hdw_commit_ctl(struct pvr2_hdw *hdw)
2154{
2155 LOCK_TAKE(hdw->big_lock); do {
2156 pvr2_hdw_commit_ctl_internal(hdw);
2157 } while (0); LOCK_GIVE(hdw->big_lock);
2158 return 0;
2159}
2160
2161
2162void pvr2_hdw_poll(struct pvr2_hdw *hdw)
2163{
2164 LOCK_TAKE(hdw->big_lock); do {
2165 pvr2_i2c_core_sync(hdw);
2166 } while (0); LOCK_GIVE(hdw->big_lock);
2167}
2168
2169
2170void pvr2_hdw_setup_poll_trigger(struct pvr2_hdw *hdw,
2171 void (*func)(void *),
2172 void *data)
2173{
2174 LOCK_TAKE(hdw->big_lock); do {
2175 hdw->poll_trigger_func = func;
2176 hdw->poll_trigger_data = data;
2177 } while (0); LOCK_GIVE(hdw->big_lock);
2178}
2179
2180
2181void pvr2_hdw_poll_trigger_unlocked(struct pvr2_hdw *hdw)
2182{
2183 if (hdw->poll_trigger_func) {
2184 hdw->poll_trigger_func(hdw->poll_trigger_data);
2185 }
2186}
2187
2188
2189void pvr2_hdw_poll_trigger(struct pvr2_hdw *hdw)
2190{
2191 LOCK_TAKE(hdw->big_lock); do {
2192 pvr2_hdw_poll_trigger_unlocked(hdw);
2193 } while (0); LOCK_GIVE(hdw->big_lock);
2194}
2195
2196
2197/* Return name for this driver instance */
2198const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw)
2199{
2200 return hdw->name;
2201}
2202
2203
2204/* Return bit mask indicating signal status */
2205unsigned int pvr2_hdw_get_signal_status_internal(struct pvr2_hdw *hdw)
2206{
2207 unsigned int msk = 0;
2208 switch (hdw->input_val) {
2209 case PVR2_CVAL_INPUT_TV:
2210 case PVR2_CVAL_INPUT_RADIO:
2211 if (hdw->decoder_ctrl &&
2212 hdw->decoder_ctrl->tuned(hdw->decoder_ctrl->ctxt)) {
2213 msk |= PVR2_SIGNAL_OK;
2214 if (hdw->audio_stat &&
2215 hdw->audio_stat->status(hdw->audio_stat->ctxt)) {
2216 if (hdw->flag_stereo) {
2217 msk |= PVR2_SIGNAL_STEREO;
2218 }
2219 if (hdw->flag_bilingual) {
2220 msk |= PVR2_SIGNAL_SAP;
2221 }
2222 }
2223 }
2224 break;
2225 default:
2226 msk |= PVR2_SIGNAL_OK | PVR2_SIGNAL_STEREO;
2227 }
2228 return msk;
2229}
2230
2231
2232int pvr2_hdw_is_hsm(struct pvr2_hdw *hdw)
2233{
2234 int result;
2235 LOCK_TAKE(hdw->ctl_lock); do {
2236 hdw->cmd_buffer[0] = 0x0b;
2237 result = pvr2_send_request(hdw,
2238 hdw->cmd_buffer,1,
2239 hdw->cmd_buffer,1);
2240 if (result < 0) break;
2241 result = (hdw->cmd_buffer[0] != 0);
2242 } while(0); LOCK_GIVE(hdw->ctl_lock);
2243 return result;
2244}
2245
2246
2247/* Return bit mask indicating signal status */
2248unsigned int pvr2_hdw_get_signal_status(struct pvr2_hdw *hdw)
2249{
2250 unsigned int msk = 0;
2251 LOCK_TAKE(hdw->big_lock); do {
2252 msk = pvr2_hdw_get_signal_status_internal(hdw);
2253 } while (0); LOCK_GIVE(hdw->big_lock);
2254 return msk;
2255}
2256
2257
2258/* Get handle to video output stream */
2259struct pvr2_stream *pvr2_hdw_get_video_stream(struct pvr2_hdw *hp)
2260{
2261 return hp->vid_stream;
2262}
2263
2264
2265void pvr2_hdw_trigger_module_log(struct pvr2_hdw *hdw)
2266{
Mike Isely4f1a3e52006-06-25 20:04:31 -03002267 int nr = pvr2_hdw_get_unit_number(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002268 LOCK_TAKE(hdw->big_lock); do {
2269 hdw->log_requested = !0;
Mike Isely4f1a3e52006-06-25 20:04:31 -03002270 printk(KERN_INFO "pvrusb2: ================= START STATUS CARD #%d =================\n", nr);
Mike Iselyd8554972006-06-26 20:58:46 -03002271 pvr2_i2c_core_check_stale(hdw);
2272 hdw->log_requested = 0;
2273 pvr2_i2c_core_sync(hdw);
Mike Isely4f1a3e52006-06-25 20:04:31 -03002274 printk(KERN_INFO "pvrusb2: ================== END STATUS CARD #%d ==================\n", nr);
Mike Iselyd8554972006-06-26 20:58:46 -03002275 } while (0); LOCK_GIVE(hdw->big_lock);
2276}
2277
2278void pvr2_hdw_cpufw_set_enabled(struct pvr2_hdw *hdw, int enable_flag)
2279{
2280 int ret;
2281 u16 address;
2282 unsigned int pipe;
2283 LOCK_TAKE(hdw->big_lock); do {
2284 if ((hdw->fw_buffer == 0) == !enable_flag) break;
2285
2286 if (!enable_flag) {
2287 pvr2_trace(PVR2_TRACE_FIRMWARE,
2288 "Cleaning up after CPU firmware fetch");
2289 kfree(hdw->fw_buffer);
2290 hdw->fw_buffer = 0;
2291 hdw->fw_size = 0;
2292 /* Now release the CPU. It will disconnect and
2293 reconnect later. */
2294 pvr2_hdw_cpureset_assert(hdw,0);
2295 break;
2296 }
2297
2298 pvr2_trace(PVR2_TRACE_FIRMWARE,
2299 "Preparing to suck out CPU firmware");
2300 hdw->fw_size = 0x2000;
2301 hdw->fw_buffer = kmalloc(hdw->fw_size,GFP_KERNEL);
2302 if (!hdw->fw_buffer) {
2303 hdw->fw_size = 0;
2304 break;
2305 }
2306
2307 memset(hdw->fw_buffer,0,hdw->fw_size);
2308
2309 /* We have to hold the CPU during firmware upload. */
2310 pvr2_hdw_cpureset_assert(hdw,1);
2311
2312 /* download the firmware from address 0000-1fff in 2048
2313 (=0x800) bytes chunk. */
2314
2315 pvr2_trace(PVR2_TRACE_FIRMWARE,"Grabbing CPU firmware");
2316 pipe = usb_rcvctrlpipe(hdw->usb_dev, 0);
2317 for(address = 0; address < hdw->fw_size; address += 0x800) {
2318 ret = usb_control_msg(hdw->usb_dev,pipe,0xa0,0xc0,
2319 address,0,
2320 hdw->fw_buffer+address,0x800,HZ);
2321 if (ret < 0) break;
2322 }
2323
2324 pvr2_trace(PVR2_TRACE_FIRMWARE,"Done grabbing CPU firmware");
2325
2326 } while (0); LOCK_GIVE(hdw->big_lock);
2327}
2328
2329
2330/* Return true if we're in a mode for retrieval CPU firmware */
2331int pvr2_hdw_cpufw_get_enabled(struct pvr2_hdw *hdw)
2332{
2333 return hdw->fw_buffer != 0;
2334}
2335
2336
2337int pvr2_hdw_cpufw_get(struct pvr2_hdw *hdw,unsigned int offs,
2338 char *buf,unsigned int cnt)
2339{
2340 int ret = -EINVAL;
2341 LOCK_TAKE(hdw->big_lock); do {
2342 if (!buf) break;
2343 if (!cnt) break;
2344
2345 if (!hdw->fw_buffer) {
2346 ret = -EIO;
2347 break;
2348 }
2349
2350 if (offs >= hdw->fw_size) {
2351 pvr2_trace(PVR2_TRACE_FIRMWARE,
2352 "Read firmware data offs=%d EOF",
2353 offs);
2354 ret = 0;
2355 break;
2356 }
2357
2358 if (offs + cnt > hdw->fw_size) cnt = hdw->fw_size - offs;
2359
2360 memcpy(buf,hdw->fw_buffer+offs,cnt);
2361
2362 pvr2_trace(PVR2_TRACE_FIRMWARE,
2363 "Read firmware data offs=%d cnt=%d",
2364 offs,cnt);
2365 ret = cnt;
2366 } while (0); LOCK_GIVE(hdw->big_lock);
2367
2368 return ret;
2369}
2370
2371
2372int pvr2_hdw_v4l_get_minor_number(struct pvr2_hdw *hdw)
2373{
2374 return hdw->v4l_minor_number;
2375}
2376
2377
2378/* Store the v4l minor device number */
2379void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *hdw,int v)
2380{
2381 hdw->v4l_minor_number = v;
2382}
2383
2384
2385void pvr2_reset_ctl_endpoints(struct pvr2_hdw *hdw)
2386{
2387 if (!hdw->usb_dev) return;
2388 usb_settoggle(hdw->usb_dev, PVR2_CTL_WRITE_ENDPOINT & 0xf,
2389 !(PVR2_CTL_WRITE_ENDPOINT & USB_DIR_IN), 0);
2390 usb_settoggle(hdw->usb_dev, PVR2_CTL_READ_ENDPOINT & 0xf,
2391 !(PVR2_CTL_READ_ENDPOINT & USB_DIR_IN), 0);
2392 usb_clear_halt(hdw->usb_dev,
2393 usb_rcvbulkpipe(hdw->usb_dev,
2394 PVR2_CTL_READ_ENDPOINT & 0x7f));
2395 usb_clear_halt(hdw->usb_dev,
2396 usb_sndbulkpipe(hdw->usb_dev,
2397 PVR2_CTL_WRITE_ENDPOINT & 0x7f));
2398}
2399
2400
2401static void pvr2_ctl_write_complete(struct urb *urb, struct pt_regs *regs)
2402{
2403 struct pvr2_hdw *hdw = urb->context;
2404 hdw->ctl_write_pend_flag = 0;
2405 if (hdw->ctl_read_pend_flag) return;
2406 complete(&hdw->ctl_done);
2407}
2408
2409
2410static void pvr2_ctl_read_complete(struct urb *urb, struct pt_regs *regs)
2411{
2412 struct pvr2_hdw *hdw = urb->context;
2413 hdw->ctl_read_pend_flag = 0;
2414 if (hdw->ctl_write_pend_flag) return;
2415 complete(&hdw->ctl_done);
2416}
2417
2418
2419static void pvr2_ctl_timeout(unsigned long data)
2420{
2421 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
2422 if (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
2423 hdw->ctl_timeout_flag = !0;
2424 if (hdw->ctl_write_pend_flag && hdw->ctl_write_urb) {
2425 usb_unlink_urb(hdw->ctl_write_urb);
2426 }
2427 if (hdw->ctl_read_pend_flag && hdw->ctl_read_urb) {
2428 usb_unlink_urb(hdw->ctl_read_urb);
2429 }
2430 }
2431}
2432
2433
2434int pvr2_send_request_ex(struct pvr2_hdw *hdw,
2435 unsigned int timeout,int probe_fl,
2436 void *write_data,unsigned int write_len,
2437 void *read_data,unsigned int read_len)
2438{
2439 unsigned int idx;
2440 int status = 0;
2441 struct timer_list timer;
2442 if (!hdw->ctl_lock_held) {
2443 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2444 "Attempted to execute control transfer"
2445 " without lock!!");
2446 return -EDEADLK;
2447 }
2448 if ((!hdw->flag_ok) && !probe_fl) {
2449 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2450 "Attempted to execute control transfer"
2451 " when device not ok");
2452 return -EIO;
2453 }
2454 if (!(hdw->ctl_read_urb && hdw->ctl_write_urb)) {
2455 if (!probe_fl) {
2456 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2457 "Attempted to execute control transfer"
2458 " when USB is disconnected");
2459 }
2460 return -ENOTTY;
2461 }
2462
2463 /* Ensure that we have sane parameters */
2464 if (!write_data) write_len = 0;
2465 if (!read_data) read_len = 0;
2466 if (write_len > PVR2_CTL_BUFFSIZE) {
2467 pvr2_trace(
2468 PVR2_TRACE_ERROR_LEGS,
2469 "Attempted to execute %d byte"
2470 " control-write transfer (limit=%d)",
2471 write_len,PVR2_CTL_BUFFSIZE);
2472 return -EINVAL;
2473 }
2474 if (read_len > PVR2_CTL_BUFFSIZE) {
2475 pvr2_trace(
2476 PVR2_TRACE_ERROR_LEGS,
2477 "Attempted to execute %d byte"
2478 " control-read transfer (limit=%d)",
2479 write_len,PVR2_CTL_BUFFSIZE);
2480 return -EINVAL;
2481 }
2482 if ((!write_len) && (!read_len)) {
2483 pvr2_trace(
2484 PVR2_TRACE_ERROR_LEGS,
2485 "Attempted to execute null control transfer?");
2486 return -EINVAL;
2487 }
2488
2489
2490 hdw->cmd_debug_state = 1;
2491 if (write_len) {
2492 hdw->cmd_debug_code = ((unsigned char *)write_data)[0];
2493 } else {
2494 hdw->cmd_debug_code = 0;
2495 }
2496 hdw->cmd_debug_write_len = write_len;
2497 hdw->cmd_debug_read_len = read_len;
2498
2499 /* Initialize common stuff */
2500 init_completion(&hdw->ctl_done);
2501 hdw->ctl_timeout_flag = 0;
2502 hdw->ctl_write_pend_flag = 0;
2503 hdw->ctl_read_pend_flag = 0;
2504 init_timer(&timer);
2505 timer.expires = jiffies + timeout;
2506 timer.data = (unsigned long)hdw;
2507 timer.function = pvr2_ctl_timeout;
2508
2509 if (write_len) {
2510 hdw->cmd_debug_state = 2;
2511 /* Transfer write data to internal buffer */
2512 for (idx = 0; idx < write_len; idx++) {
2513 hdw->ctl_write_buffer[idx] =
2514 ((unsigned char *)write_data)[idx];
2515 }
2516 /* Initiate a write request */
2517 usb_fill_bulk_urb(hdw->ctl_write_urb,
2518 hdw->usb_dev,
2519 usb_sndbulkpipe(hdw->usb_dev,
2520 PVR2_CTL_WRITE_ENDPOINT),
2521 hdw->ctl_write_buffer,
2522 write_len,
2523 pvr2_ctl_write_complete,
2524 hdw);
2525 hdw->ctl_write_urb->actual_length = 0;
2526 hdw->ctl_write_pend_flag = !0;
2527 status = usb_submit_urb(hdw->ctl_write_urb,GFP_KERNEL);
2528 if (status < 0) {
2529 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2530 "Failed to submit write-control"
2531 " URB status=%d",status);
2532 hdw->ctl_write_pend_flag = 0;
2533 goto done;
2534 }
2535 }
2536
2537 if (read_len) {
2538 hdw->cmd_debug_state = 3;
2539 memset(hdw->ctl_read_buffer,0x43,read_len);
2540 /* Initiate a read request */
2541 usb_fill_bulk_urb(hdw->ctl_read_urb,
2542 hdw->usb_dev,
2543 usb_rcvbulkpipe(hdw->usb_dev,
2544 PVR2_CTL_READ_ENDPOINT),
2545 hdw->ctl_read_buffer,
2546 read_len,
2547 pvr2_ctl_read_complete,
2548 hdw);
2549 hdw->ctl_read_urb->actual_length = 0;
2550 hdw->ctl_read_pend_flag = !0;
2551 status = usb_submit_urb(hdw->ctl_read_urb,GFP_KERNEL);
2552 if (status < 0) {
2553 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2554 "Failed to submit read-control"
2555 " URB status=%d",status);
2556 hdw->ctl_read_pend_flag = 0;
2557 goto done;
2558 }
2559 }
2560
2561 /* Start timer */
2562 add_timer(&timer);
2563
2564 /* Now wait for all I/O to complete */
2565 hdw->cmd_debug_state = 4;
2566 while (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
2567 wait_for_completion(&hdw->ctl_done);
2568 }
2569 hdw->cmd_debug_state = 5;
2570
2571 /* Stop timer */
2572 del_timer_sync(&timer);
2573
2574 hdw->cmd_debug_state = 6;
2575 status = 0;
2576
2577 if (hdw->ctl_timeout_flag) {
2578 status = -ETIMEDOUT;
2579 if (!probe_fl) {
2580 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2581 "Timed out control-write");
2582 }
2583 goto done;
2584 }
2585
2586 if (write_len) {
2587 /* Validate results of write request */
2588 if ((hdw->ctl_write_urb->status != 0) &&
2589 (hdw->ctl_write_urb->status != -ENOENT) &&
2590 (hdw->ctl_write_urb->status != -ESHUTDOWN) &&
2591 (hdw->ctl_write_urb->status != -ECONNRESET)) {
2592 /* USB subsystem is reporting some kind of failure
2593 on the write */
2594 status = hdw->ctl_write_urb->status;
2595 if (!probe_fl) {
2596 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2597 "control-write URB failure,"
2598 " status=%d",
2599 status);
2600 }
2601 goto done;
2602 }
2603 if (hdw->ctl_write_urb->actual_length < write_len) {
2604 /* Failed to write enough data */
2605 status = -EIO;
2606 if (!probe_fl) {
2607 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2608 "control-write URB short,"
2609 " expected=%d got=%d",
2610 write_len,
2611 hdw->ctl_write_urb->actual_length);
2612 }
2613 goto done;
2614 }
2615 }
2616 if (read_len) {
2617 /* Validate results of read request */
2618 if ((hdw->ctl_read_urb->status != 0) &&
2619 (hdw->ctl_read_urb->status != -ENOENT) &&
2620 (hdw->ctl_read_urb->status != -ESHUTDOWN) &&
2621 (hdw->ctl_read_urb->status != -ECONNRESET)) {
2622 /* USB subsystem is reporting some kind of failure
2623 on the read */
2624 status = hdw->ctl_read_urb->status;
2625 if (!probe_fl) {
2626 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2627 "control-read URB failure,"
2628 " status=%d",
2629 status);
2630 }
2631 goto done;
2632 }
2633 if (hdw->ctl_read_urb->actual_length < read_len) {
2634 /* Failed to read enough data */
2635 status = -EIO;
2636 if (!probe_fl) {
2637 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2638 "control-read URB short,"
2639 " expected=%d got=%d",
2640 read_len,
2641 hdw->ctl_read_urb->actual_length);
2642 }
2643 goto done;
2644 }
2645 /* Transfer retrieved data out from internal buffer */
2646 for (idx = 0; idx < read_len; idx++) {
2647 ((unsigned char *)read_data)[idx] =
2648 hdw->ctl_read_buffer[idx];
2649 }
2650 }
2651
2652 done:
2653
2654 hdw->cmd_debug_state = 0;
2655 if ((status < 0) && (!probe_fl)) {
2656 pvr2_hdw_render_useless_unlocked(hdw);
2657 }
2658 return status;
2659}
2660
2661
2662int pvr2_send_request(struct pvr2_hdw *hdw,
2663 void *write_data,unsigned int write_len,
2664 void *read_data,unsigned int read_len)
2665{
2666 return pvr2_send_request_ex(hdw,HZ*4,0,
2667 write_data,write_len,
2668 read_data,read_len);
2669}
2670
2671int pvr2_write_register(struct pvr2_hdw *hdw, u16 reg, u32 data)
2672{
2673 int ret;
2674
2675 LOCK_TAKE(hdw->ctl_lock);
2676
2677 hdw->cmd_buffer[0] = 0x04; /* write register prefix */
2678 PVR2_DECOMPOSE_LE(hdw->cmd_buffer,1,data);
2679 hdw->cmd_buffer[5] = 0;
2680 hdw->cmd_buffer[6] = (reg >> 8) & 0xff;
2681 hdw->cmd_buffer[7] = reg & 0xff;
2682
2683
2684 ret = pvr2_send_request(hdw, hdw->cmd_buffer, 8, hdw->cmd_buffer, 0);
2685
2686 LOCK_GIVE(hdw->ctl_lock);
2687
2688 return ret;
2689}
2690
2691
2692int pvr2_read_register(struct pvr2_hdw *hdw, u16 reg, u32 *data)
2693{
2694 int ret = 0;
2695
2696 LOCK_TAKE(hdw->ctl_lock);
2697
2698 hdw->cmd_buffer[0] = 0x05; /* read register prefix */
2699 hdw->cmd_buffer[1] = 0;
2700 hdw->cmd_buffer[2] = 0;
2701 hdw->cmd_buffer[3] = 0;
2702 hdw->cmd_buffer[4] = 0;
2703 hdw->cmd_buffer[5] = 0;
2704 hdw->cmd_buffer[6] = (reg >> 8) & 0xff;
2705 hdw->cmd_buffer[7] = reg & 0xff;
2706
2707 ret |= pvr2_send_request(hdw, hdw->cmd_buffer, 8, hdw->cmd_buffer, 4);
2708 *data = PVR2_COMPOSE_LE(hdw->cmd_buffer,0);
2709
2710 LOCK_GIVE(hdw->ctl_lock);
2711
2712 return ret;
2713}
2714
2715
2716int pvr2_write_u16(struct pvr2_hdw *hdw, u16 data, int res)
2717{
2718 int ret;
2719
2720 LOCK_TAKE(hdw->ctl_lock);
2721
2722 hdw->cmd_buffer[0] = (data >> 8) & 0xff;
2723 hdw->cmd_buffer[1] = data & 0xff;
2724
2725 ret = pvr2_send_request(hdw, hdw->cmd_buffer, 2, hdw->cmd_buffer, res);
2726
2727 LOCK_GIVE(hdw->ctl_lock);
2728
2729 return ret;
2730}
2731
2732
2733int pvr2_write_u8(struct pvr2_hdw *hdw, u8 data, int res)
2734{
2735 int ret;
2736
2737 LOCK_TAKE(hdw->ctl_lock);
2738
2739 hdw->cmd_buffer[0] = data;
2740
2741 ret = pvr2_send_request(hdw, hdw->cmd_buffer, 1, hdw->cmd_buffer, res);
2742
2743 LOCK_GIVE(hdw->ctl_lock);
2744
2745 return ret;
2746}
2747
2748
2749void pvr2_hdw_render_useless_unlocked(struct pvr2_hdw *hdw)
2750{
2751 if (!hdw->flag_ok) return;
2752 pvr2_trace(PVR2_TRACE_INIT,"render_useless");
2753 hdw->flag_ok = 0;
2754 if (hdw->vid_stream) {
2755 pvr2_stream_setup(hdw->vid_stream,0,0,0);
2756 }
2757 hdw->flag_streaming_enabled = 0;
2758 hdw->subsys_enabled_mask = 0;
2759}
2760
2761
2762void pvr2_hdw_render_useless(struct pvr2_hdw *hdw)
2763{
2764 LOCK_TAKE(hdw->ctl_lock);
2765 pvr2_hdw_render_useless_unlocked(hdw);
2766 LOCK_GIVE(hdw->ctl_lock);
2767}
2768
2769
2770void pvr2_hdw_device_reset(struct pvr2_hdw *hdw)
2771{
2772 int ret;
2773 pvr2_trace(PVR2_TRACE_INIT,"Performing a device reset...");
2774 ret = usb_lock_device_for_reset(hdw->usb_dev,0);
2775 if (ret == 1) {
2776 ret = usb_reset_device(hdw->usb_dev);
2777 usb_unlock_device(hdw->usb_dev);
2778 } else {
2779 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2780 "Failed to lock USB device ret=%d",ret);
2781 }
2782 if (init_pause_msec) {
2783 pvr2_trace(PVR2_TRACE_INFO,
2784 "Waiting %u msec for hardware to settle",
2785 init_pause_msec);
2786 msleep(init_pause_msec);
2787 }
2788
2789}
2790
2791
2792void pvr2_hdw_cpureset_assert(struct pvr2_hdw *hdw,int val)
2793{
2794 char da[1];
2795 unsigned int pipe;
2796 int ret;
2797
2798 if (!hdw->usb_dev) return;
2799
2800 pvr2_trace(PVR2_TRACE_INIT,"cpureset_assert(%d)",val);
2801
2802 da[0] = val ? 0x01 : 0x00;
2803
2804 /* Write the CPUCS register on the 8051. The lsb of the register
2805 is the reset bit; a 1 asserts reset while a 0 clears it. */
2806 pipe = usb_sndctrlpipe(hdw->usb_dev, 0);
2807 ret = usb_control_msg(hdw->usb_dev,pipe,0xa0,0x40,0xe600,0,da,1,HZ);
2808 if (ret < 0) {
2809 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2810 "cpureset_assert(%d) error=%d",val,ret);
2811 pvr2_hdw_render_useless(hdw);
2812 }
2813}
2814
2815
2816int pvr2_hdw_cmd_deep_reset(struct pvr2_hdw *hdw)
2817{
2818 int status;
2819 LOCK_TAKE(hdw->ctl_lock); do {
2820 pvr2_trace(PVR2_TRACE_INIT,"Requesting uproc hard reset");
2821 hdw->flag_ok = !0;
2822 hdw->cmd_buffer[0] = 0xdd;
2823 status = pvr2_send_request(hdw,hdw->cmd_buffer,1,0,0);
2824 } while (0); LOCK_GIVE(hdw->ctl_lock);
2825 return status;
2826}
2827
2828
2829int pvr2_hdw_cmd_powerup(struct pvr2_hdw *hdw)
2830{
2831 int status;
2832 LOCK_TAKE(hdw->ctl_lock); do {
2833 pvr2_trace(PVR2_TRACE_INIT,"Requesting powerup");
2834 hdw->cmd_buffer[0] = 0xde;
2835 status = pvr2_send_request(hdw,hdw->cmd_buffer,1,0,0);
2836 } while (0); LOCK_GIVE(hdw->ctl_lock);
2837 return status;
2838}
2839
2840
2841int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw)
2842{
2843 if (!hdw->decoder_ctrl) {
2844 pvr2_trace(PVR2_TRACE_INIT,
2845 "Unable to reset decoder: nothing attached");
2846 return -ENOTTY;
2847 }
2848
2849 if (!hdw->decoder_ctrl->force_reset) {
2850 pvr2_trace(PVR2_TRACE_INIT,
2851 "Unable to reset decoder: not implemented");
2852 return -ENOTTY;
2853 }
2854
2855 pvr2_trace(PVR2_TRACE_INIT,
2856 "Requesting decoder reset");
2857 hdw->decoder_ctrl->force_reset(hdw->decoder_ctrl->ctxt);
2858 return 0;
2859}
2860
2861
2862int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl)
2863{
2864 int status;
2865 LOCK_TAKE(hdw->ctl_lock); do {
2866 hdw->cmd_buffer[0] = (runFl ? 0x36 : 0x37);
2867 status = pvr2_send_request(hdw,hdw->cmd_buffer,1,0,0);
2868 } while (0); LOCK_GIVE(hdw->ctl_lock);
2869 if (!status) {
2870 hdw->subsys_enabled_mask =
2871 ((hdw->subsys_enabled_mask &
2872 ~(1<<PVR2_SUBSYS_B_USBSTREAM_RUN)) |
2873 (runFl ? (1<<PVR2_SUBSYS_B_USBSTREAM_RUN) : 0));
2874 }
2875 return status;
2876}
2877
2878
2879void pvr2_hdw_get_debug_info(const struct pvr2_hdw *hdw,
2880 struct pvr2_hdw_debug_info *ptr)
2881{
2882 ptr->big_lock_held = hdw->big_lock_held;
2883 ptr->ctl_lock_held = hdw->ctl_lock_held;
2884 ptr->flag_ok = hdw->flag_ok;
2885 ptr->flag_disconnected = hdw->flag_disconnected;
2886 ptr->flag_init_ok = hdw->flag_init_ok;
2887 ptr->flag_streaming_enabled = hdw->flag_streaming_enabled;
2888 ptr->subsys_flags = hdw->subsys_enabled_mask;
2889 ptr->cmd_debug_state = hdw->cmd_debug_state;
2890 ptr->cmd_code = hdw->cmd_debug_code;
2891 ptr->cmd_debug_write_len = hdw->cmd_debug_write_len;
2892 ptr->cmd_debug_read_len = hdw->cmd_debug_read_len;
2893 ptr->cmd_debug_timeout = hdw->ctl_timeout_flag;
2894 ptr->cmd_debug_write_pend = hdw->ctl_write_pend_flag;
2895 ptr->cmd_debug_read_pend = hdw->ctl_read_pend_flag;
2896 ptr->cmd_debug_rstatus = hdw->ctl_read_urb->status;
2897 ptr->cmd_debug_wstatus = hdw->ctl_read_urb->status;
2898}
2899
2900
2901int pvr2_hdw_gpio_get_dir(struct pvr2_hdw *hdw,u32 *dp)
2902{
2903 return pvr2_read_register(hdw,PVR2_GPIO_DIR,dp);
2904}
2905
2906
2907int pvr2_hdw_gpio_get_out(struct pvr2_hdw *hdw,u32 *dp)
2908{
2909 return pvr2_read_register(hdw,PVR2_GPIO_OUT,dp);
2910}
2911
2912
2913int pvr2_hdw_gpio_get_in(struct pvr2_hdw *hdw,u32 *dp)
2914{
2915 return pvr2_read_register(hdw,PVR2_GPIO_IN,dp);
2916}
2917
2918
2919int pvr2_hdw_gpio_chg_dir(struct pvr2_hdw *hdw,u32 msk,u32 val)
2920{
2921 u32 cval,nval;
2922 int ret;
2923 if (~msk) {
2924 ret = pvr2_read_register(hdw,PVR2_GPIO_DIR,&cval);
2925 if (ret) return ret;
2926 nval = (cval & ~msk) | (val & msk);
2927 pvr2_trace(PVR2_TRACE_GPIO,
2928 "GPIO direction changing 0x%x:0x%x"
2929 " from 0x%x to 0x%x",
2930 msk,val,cval,nval);
2931 } else {
2932 nval = val;
2933 pvr2_trace(PVR2_TRACE_GPIO,
2934 "GPIO direction changing to 0x%x",nval);
2935 }
2936 return pvr2_write_register(hdw,PVR2_GPIO_DIR,nval);
2937}
2938
2939
2940int pvr2_hdw_gpio_chg_out(struct pvr2_hdw *hdw,u32 msk,u32 val)
2941{
2942 u32 cval,nval;
2943 int ret;
2944 if (~msk) {
2945 ret = pvr2_read_register(hdw,PVR2_GPIO_OUT,&cval);
2946 if (ret) return ret;
2947 nval = (cval & ~msk) | (val & msk);
2948 pvr2_trace(PVR2_TRACE_GPIO,
2949 "GPIO output changing 0x%x:0x%x from 0x%x to 0x%x",
2950 msk,val,cval,nval);
2951 } else {
2952 nval = val;
2953 pvr2_trace(PVR2_TRACE_GPIO,
2954 "GPIO output changing to 0x%x",nval);
2955 }
2956 return pvr2_write_register(hdw,PVR2_GPIO_OUT,nval);
2957}
2958
2959
2960int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw)
2961{
2962 int result;
2963 LOCK_TAKE(hdw->ctl_lock); do {
2964 hdw->cmd_buffer[0] = 0xeb;
2965 result = pvr2_send_request(hdw,
2966 hdw->cmd_buffer,1,
2967 hdw->cmd_buffer,1);
2968 if (result < 0) break;
2969 result = hdw->cmd_buffer[0];
2970 } while(0); LOCK_GIVE(hdw->ctl_lock);
2971 return result;
2972}
2973
2974
2975/*
2976 Stuff for Emacs to see, in order to encourage consistent editing style:
2977 *** Local Variables: ***
2978 *** mode: c ***
2979 *** fill-column: 75 ***
2980 *** tab-width: 8 ***
2981 *** c-basic-offset: 8 ***
2982 *** End: ***
2983 */