blob: 74b365f1cfd20aaf1042f7b24540177c6b3f81f0 [file] [log] [blame]
Mike Iselyd8554972006-06-26 20:58:46 -03001/*
2 *
Mike Iselyd8554972006-06-26 20:58:46 -03003 *
4 * Copyright (C) 2005 Mike Isely <isely@pobox.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *
19 */
20
21#include <linux/errno.h>
22#include <linux/string.h>
23#include <linux/slab.h>
24#include <linux/firmware.h>
Mike Iselyd8554972006-06-26 20:58:46 -030025#include <linux/videodev2.h>
Mike Isely32ffa9a2006-09-23 22:26:52 -030026#include <media/v4l2-common.h>
Mike Iselyd8554972006-06-26 20:58:46 -030027#include "pvrusb2.h"
28#include "pvrusb2-std.h"
29#include "pvrusb2-util.h"
30#include "pvrusb2-hdw.h"
31#include "pvrusb2-i2c-core.h"
Mike Isely59af3362009-03-07 03:06:09 -030032#include "pvrusb2-i2c-track.h"
Mike Iselyd8554972006-06-26 20:58:46 -030033#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"
Michael Krufky8d364362007-01-22 02:17:55 -030038#include "pvrusb2-fx2-cmd.h"
Mike Iselyd8554972006-06-26 20:58:46 -030039
Mike Isely1bde0282006-12-27 23:30:13 -030040#define TV_MIN_FREQ 55250000L
41#define TV_MAX_FREQ 850000000L
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -030042
Mike Isely83ce57a2008-05-26 05:51:57 -030043/* This defines a minimum interval that the decoder must remain quiet
44 before we are allowed to start it running. */
45#define TIME_MSEC_DECODER_WAIT 50
46
47/* This defines a minimum interval that the encoder must remain quiet
Mike Iselyfa98e592008-05-26 05:54:24 -030048 before we are allowed to configure it. I had this originally set to
49 50msec, but Martin Dauskardt <martin.dauskardt@gmx.de> reports that
50 things work better when it's set to 100msec. */
51#define TIME_MSEC_ENCODER_WAIT 100
Mike Isely83ce57a2008-05-26 05:51:57 -030052
53/* This defines the minimum interval that the encoder must successfully run
54 before we consider that the encoder has run at least once since its
55 firmware has been loaded. This measurement is in important for cases
56 where we can't do something until we know that the encoder has been run
57 at least once. */
58#define TIME_MSEC_ENCODER_OK 250
59
Mike Iselya0fd1cb2006-06-30 11:35:28 -030060static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = NULL};
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -030061static DEFINE_MUTEX(pvr2_unit_mtx);
Mike Iselyd8554972006-06-26 20:58:46 -030062
Douglas Schilling Landgrafff699e62008-04-22 14:41:48 -030063static int ctlchg;
Douglas Schilling Landgrafff699e62008-04-22 14:41:48 -030064static int procreload;
Mike Iselyd8554972006-06-26 20:58:46 -030065static int tuner[PVR_NUM] = { [0 ... PVR_NUM-1] = -1 };
66static int tolerance[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
67static int video_std[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
Douglas Schilling Landgrafff699e62008-04-22 14:41:48 -030068static int init_pause_msec;
Mike Iselyd8554972006-06-26 20:58:46 -030069
70module_param(ctlchg, int, S_IRUGO|S_IWUSR);
71MODULE_PARM_DESC(ctlchg, "0=optimize ctl change 1=always accept new ctl value");
72module_param(init_pause_msec, int, S_IRUGO|S_IWUSR);
73MODULE_PARM_DESC(init_pause_msec, "hardware initialization settling delay");
Mike Iselyd8554972006-06-26 20:58:46 -030074module_param(procreload, int, S_IRUGO|S_IWUSR);
75MODULE_PARM_DESC(procreload,
76 "Attempt init failure recovery with firmware reload");
77module_param_array(tuner, int, NULL, 0444);
78MODULE_PARM_DESC(tuner,"specify installed tuner type");
79module_param_array(video_std, int, NULL, 0444);
80MODULE_PARM_DESC(video_std,"specify initial video standard");
81module_param_array(tolerance, int, NULL, 0444);
82MODULE_PARM_DESC(tolerance,"specify stream error tolerance");
83
Michael Krufky5a4f5da62008-05-11 16:37:50 -030084/* US Broadcast channel 7 (175.25 MHz) */
85static int default_tv_freq = 175250000L;
86/* 104.3 MHz, a usable FM station for my area */
87static int default_radio_freq = 104300000L;
88
89module_param_named(tv_freq, default_tv_freq, int, 0444);
90MODULE_PARM_DESC(tv_freq, "specify initial television frequency");
91module_param_named(radio_freq, default_radio_freq, int, 0444);
92MODULE_PARM_DESC(radio_freq, "specify initial radio frequency");
93
Mike Iselyd8554972006-06-26 20:58:46 -030094#define PVR2_CTL_WRITE_ENDPOINT 0x01
95#define PVR2_CTL_READ_ENDPOINT 0x81
96
97#define PVR2_GPIO_IN 0x9008
98#define PVR2_GPIO_OUT 0x900c
99#define PVR2_GPIO_DIR 0x9020
100
101#define trace_firmware(...) pvr2_trace(PVR2_TRACE_FIRMWARE,__VA_ARGS__)
102
103#define PVR2_FIRMWARE_ENDPOINT 0x02
104
105/* size of a firmware chunk */
106#define FIRMWARE_CHUNK_SIZE 0x2000
107
Mike Iselye9c64a72009-03-06 23:42:20 -0300108static const char *module_names[] = {
109 [PVR2_CLIENT_ID_MSP3400] = "msp3400",
110 [PVR2_CLIENT_ID_CX25840] = "cx25840",
111 [PVR2_CLIENT_ID_SAA7115] = "saa7115",
112 [PVR2_CLIENT_ID_TUNER] = "tuner",
113 [PVR2_CLIENT_ID_CS53132A] = "cs53132a",
114};
115
116
117static const unsigned char *module_i2c_addresses[] = {
118 [PVR2_CLIENT_ID_TUNER] = "\x60\x61\x62\x63",
119};
120
121
Mike Iselyb30d2442006-06-25 20:05:01 -0300122/* Define the list of additional controls we'll dynamically construct based
123 on query of the cx2341x module. */
124struct pvr2_mpeg_ids {
125 const char *strid;
126 int id;
127};
128static const struct pvr2_mpeg_ids mpeg_ids[] = {
129 {
130 .strid = "audio_layer",
131 .id = V4L2_CID_MPEG_AUDIO_ENCODING,
132 },{
133 .strid = "audio_bitrate",
134 .id = V4L2_CID_MPEG_AUDIO_L2_BITRATE,
135 },{
136 /* Already using audio_mode elsewhere :-( */
137 .strid = "mpeg_audio_mode",
138 .id = V4L2_CID_MPEG_AUDIO_MODE,
139 },{
140 .strid = "mpeg_audio_mode_extension",
141 .id = V4L2_CID_MPEG_AUDIO_MODE_EXTENSION,
142 },{
143 .strid = "audio_emphasis",
144 .id = V4L2_CID_MPEG_AUDIO_EMPHASIS,
145 },{
146 .strid = "audio_crc",
147 .id = V4L2_CID_MPEG_AUDIO_CRC,
148 },{
149 .strid = "video_aspect",
150 .id = V4L2_CID_MPEG_VIDEO_ASPECT,
151 },{
152 .strid = "video_b_frames",
153 .id = V4L2_CID_MPEG_VIDEO_B_FRAMES,
154 },{
155 .strid = "video_gop_size",
156 .id = V4L2_CID_MPEG_VIDEO_GOP_SIZE,
157 },{
158 .strid = "video_gop_closure",
159 .id = V4L2_CID_MPEG_VIDEO_GOP_CLOSURE,
160 },{
Mike Iselyb30d2442006-06-25 20:05:01 -0300161 .strid = "video_bitrate_mode",
162 .id = V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
163 },{
164 .strid = "video_bitrate",
165 .id = V4L2_CID_MPEG_VIDEO_BITRATE,
166 },{
167 .strid = "video_bitrate_peak",
168 .id = V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
169 },{
170 .strid = "video_temporal_decimation",
171 .id = V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION,
172 },{
173 .strid = "stream_type",
174 .id = V4L2_CID_MPEG_STREAM_TYPE,
175 },{
176 .strid = "video_spatial_filter_mode",
177 .id = V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE,
178 },{
179 .strid = "video_spatial_filter",
180 .id = V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER,
181 },{
182 .strid = "video_luma_spatial_filter_type",
183 .id = V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE,
184 },{
185 .strid = "video_chroma_spatial_filter_type",
186 .id = V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE,
187 },{
188 .strid = "video_temporal_filter_mode",
189 .id = V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE,
190 },{
191 .strid = "video_temporal_filter",
192 .id = V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER,
193 },{
194 .strid = "video_median_filter_type",
195 .id = V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE,
196 },{
197 .strid = "video_luma_median_filter_top",
198 .id = V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP,
199 },{
200 .strid = "video_luma_median_filter_bottom",
201 .id = V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM,
202 },{
203 .strid = "video_chroma_median_filter_top",
204 .id = V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP,
205 },{
206 .strid = "video_chroma_median_filter_bottom",
207 .id = V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM,
208 }
209};
Ahmed S. Darwisheca8ebf2007-01-20 00:35:03 -0300210#define MPEGDEF_COUNT ARRAY_SIZE(mpeg_ids)
Mike Iselyc05c0462006-06-25 20:04:25 -0300211
Mike Iselyd8554972006-06-26 20:58:46 -0300212
Mike Isely434449f2006-08-08 09:10:06 -0300213static const char *control_values_srate[] = {
214 [V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100] = "44.1 kHz",
215 [V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000] = "48 kHz",
216 [V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000] = "32 kHz",
217};
Mike Iselyd8554972006-06-26 20:58:46 -0300218
Mike Iselyd8554972006-06-26 20:58:46 -0300219
220
221static const char *control_values_input[] = {
222 [PVR2_CVAL_INPUT_TV] = "television", /*xawtv needs this name*/
Mike Isely29bf5b12008-04-22 14:45:37 -0300223 [PVR2_CVAL_INPUT_DTV] = "dtv",
Mike Iselyd8554972006-06-26 20:58:46 -0300224 [PVR2_CVAL_INPUT_RADIO] = "radio",
225 [PVR2_CVAL_INPUT_SVIDEO] = "s-video",
226 [PVR2_CVAL_INPUT_COMPOSITE] = "composite",
227};
228
229
230static const char *control_values_audiomode[] = {
231 [V4L2_TUNER_MODE_MONO] = "Mono",
232 [V4L2_TUNER_MODE_STEREO] = "Stereo",
233 [V4L2_TUNER_MODE_LANG1] = "Lang1",
234 [V4L2_TUNER_MODE_LANG2] = "Lang2",
235 [V4L2_TUNER_MODE_LANG1_LANG2] = "Lang1+Lang2",
236};
237
238
239static const char *control_values_hsm[] = {
240 [PVR2_CVAL_HSM_FAIL] = "Fail",
241 [PVR2_CVAL_HSM_HIGH] = "High",
242 [PVR2_CVAL_HSM_FULL] = "Full",
243};
244
245
Mike Isely681c7392007-11-26 01:48:52 -0300246static const char *pvr2_state_names[] = {
247 [PVR2_STATE_NONE] = "none",
248 [PVR2_STATE_DEAD] = "dead",
249 [PVR2_STATE_COLD] = "cold",
250 [PVR2_STATE_WARM] = "warm",
251 [PVR2_STATE_ERROR] = "error",
252 [PVR2_STATE_READY] = "ready",
253 [PVR2_STATE_RUN] = "run",
Mike Iselyd8554972006-06-26 20:58:46 -0300254};
255
Mike Isely681c7392007-11-26 01:48:52 -0300256
Mike Isely694dca2b2008-03-28 05:42:10 -0300257struct pvr2_fx2cmd_descdef {
Mike Isely1c9d10d2008-03-28 05:38:54 -0300258 unsigned char id;
259 unsigned char *desc;
260};
261
Mike Isely694dca2b2008-03-28 05:42:10 -0300262static const struct pvr2_fx2cmd_descdef pvr2_fx2cmd_desc[] = {
Mike Isely1c9d10d2008-03-28 05:38:54 -0300263 {FX2CMD_MEM_WRITE_DWORD, "write encoder dword"},
264 {FX2CMD_MEM_READ_DWORD, "read encoder dword"},
Mike Isely31335b12008-07-25 19:35:31 -0300265 {FX2CMD_HCW_ZILOG_RESET, "zilog IR reset control"},
Mike Isely1c9d10d2008-03-28 05:38:54 -0300266 {FX2CMD_MEM_READ_64BYTES, "read encoder 64bytes"},
267 {FX2CMD_REG_WRITE, "write encoder register"},
268 {FX2CMD_REG_READ, "read encoder register"},
269 {FX2CMD_MEMSEL, "encoder memsel"},
270 {FX2CMD_I2C_WRITE, "i2c write"},
271 {FX2CMD_I2C_READ, "i2c read"},
272 {FX2CMD_GET_USB_SPEED, "get USB speed"},
273 {FX2CMD_STREAMING_ON, "stream on"},
274 {FX2CMD_STREAMING_OFF, "stream off"},
275 {FX2CMD_FWPOST1, "fwpost1"},
276 {FX2CMD_POWER_OFF, "power off"},
277 {FX2CMD_POWER_ON, "power on"},
278 {FX2CMD_DEEP_RESET, "deep reset"},
279 {FX2CMD_GET_EEPROM_ADDR, "get rom addr"},
280 {FX2CMD_GET_IR_CODE, "get IR code"},
281 {FX2CMD_HCW_DEMOD_RESETIN, "hcw demod resetin"},
282 {FX2CMD_HCW_DTV_STREAMING_ON, "hcw dtv stream on"},
283 {FX2CMD_HCW_DTV_STREAMING_OFF, "hcw dtv stream off"},
284 {FX2CMD_ONAIR_DTV_STREAMING_ON, "onair dtv stream on"},
285 {FX2CMD_ONAIR_DTV_STREAMING_OFF, "onair dtv stream off"},
286 {FX2CMD_ONAIR_DTV_POWER_ON, "onair dtv power on"},
287 {FX2CMD_ONAIR_DTV_POWER_OFF, "onair dtv power off"},
288};
289
290
Mike Isely1cb03b72008-04-21 03:47:43 -0300291static int pvr2_hdw_set_input(struct pvr2_hdw *hdw,int v);
Mike Isely681c7392007-11-26 01:48:52 -0300292static void pvr2_hdw_state_sched(struct pvr2_hdw *);
293static int pvr2_hdw_state_eval(struct pvr2_hdw *);
Mike Isely1bde0282006-12-27 23:30:13 -0300294static void pvr2_hdw_set_cur_freq(struct pvr2_hdw *,unsigned long);
Mike Isely681c7392007-11-26 01:48:52 -0300295static void pvr2_hdw_worker_i2c(struct work_struct *work);
296static void pvr2_hdw_worker_poll(struct work_struct *work);
Mike Isely681c7392007-11-26 01:48:52 -0300297static int pvr2_hdw_wait(struct pvr2_hdw *,int state);
298static int pvr2_hdw_untrip_unlocked(struct pvr2_hdw *);
299static void pvr2_hdw_state_log_state(struct pvr2_hdw *);
Adrian Bunk07e337e2006-06-30 11:30:20 -0300300static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl);
Mike Isely681c7392007-11-26 01:48:52 -0300301static int pvr2_hdw_commit_setup(struct pvr2_hdw *hdw);
Adrian Bunk07e337e2006-06-30 11:30:20 -0300302static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw);
Adrian Bunk07e337e2006-06-30 11:30:20 -0300303static void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw);
304static void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw);
Mike Isely681c7392007-11-26 01:48:52 -0300305static void pvr2_hdw_quiescent_timeout(unsigned long);
306static void pvr2_hdw_encoder_wait_timeout(unsigned long);
Mike Iselyd913d632008-04-06 04:04:35 -0300307static void pvr2_hdw_encoder_run_timeout(unsigned long);
Mike Isely1c9d10d2008-03-28 05:38:54 -0300308static int pvr2_issue_simple_cmd(struct pvr2_hdw *,u32);
Adrian Bunk07e337e2006-06-30 11:30:20 -0300309static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
310 unsigned int timeout,int probe_fl,
311 void *write_data,unsigned int write_len,
312 void *read_data,unsigned int read_len);
Mike Isely432907f2008-08-31 21:02:20 -0300313static int pvr2_hdw_check_cropcap(struct pvr2_hdw *hdw);
Mike Iselyd8554972006-06-26 20:58:46 -0300314
Mike Isely681c7392007-11-26 01:48:52 -0300315
316static void trace_stbit(const char *name,int val)
317{
318 pvr2_trace(PVR2_TRACE_STBITS,
319 "State bit %s <-- %s",
320 name,(val ? "true" : "false"));
321}
322
Mike Iselyd8554972006-06-26 20:58:46 -0300323static int ctrl_channelfreq_get(struct pvr2_ctrl *cptr,int *vp)
324{
325 struct pvr2_hdw *hdw = cptr->hdw;
326 if ((hdw->freqProgSlot > 0) && (hdw->freqProgSlot <= FREQTABLE_SIZE)) {
327 *vp = hdw->freqTable[hdw->freqProgSlot-1];
328 } else {
329 *vp = 0;
330 }
331 return 0;
332}
333
334static int ctrl_channelfreq_set(struct pvr2_ctrl *cptr,int m,int v)
335{
336 struct pvr2_hdw *hdw = cptr->hdw;
Mike Isely1bde0282006-12-27 23:30:13 -0300337 unsigned int slotId = hdw->freqProgSlot;
338 if ((slotId > 0) && (slotId <= FREQTABLE_SIZE)) {
339 hdw->freqTable[slotId-1] = v;
340 /* Handle side effects correctly - if we're tuned to this
341 slot, then forgot the slot id relation since the stored
342 frequency has been changed. */
343 if (hdw->freqSelector) {
344 if (hdw->freqSlotRadio == slotId) {
345 hdw->freqSlotRadio = 0;
346 }
347 } else {
348 if (hdw->freqSlotTelevision == slotId) {
349 hdw->freqSlotTelevision = 0;
350 }
351 }
Mike Iselyd8554972006-06-26 20:58:46 -0300352 }
353 return 0;
354}
355
356static int ctrl_channelprog_get(struct pvr2_ctrl *cptr,int *vp)
357{
358 *vp = cptr->hdw->freqProgSlot;
359 return 0;
360}
361
362static int ctrl_channelprog_set(struct pvr2_ctrl *cptr,int m,int v)
363{
364 struct pvr2_hdw *hdw = cptr->hdw;
365 if ((v >= 0) && (v <= FREQTABLE_SIZE)) {
366 hdw->freqProgSlot = v;
367 }
368 return 0;
369}
370
371static int ctrl_channel_get(struct pvr2_ctrl *cptr,int *vp)
372{
Mike Isely1bde0282006-12-27 23:30:13 -0300373 struct pvr2_hdw *hdw = cptr->hdw;
374 *vp = hdw->freqSelector ? hdw->freqSlotRadio : hdw->freqSlotTelevision;
Mike Iselyd8554972006-06-26 20:58:46 -0300375 return 0;
376}
377
Mike Isely1bde0282006-12-27 23:30:13 -0300378static int ctrl_channel_set(struct pvr2_ctrl *cptr,int m,int slotId)
Mike Iselyd8554972006-06-26 20:58:46 -0300379{
380 unsigned freq = 0;
381 struct pvr2_hdw *hdw = cptr->hdw;
Mike Isely1bde0282006-12-27 23:30:13 -0300382 if ((slotId < 0) || (slotId > FREQTABLE_SIZE)) return 0;
383 if (slotId > 0) {
384 freq = hdw->freqTable[slotId-1];
385 if (!freq) return 0;
386 pvr2_hdw_set_cur_freq(hdw,freq);
Mike Iselyd8554972006-06-26 20:58:46 -0300387 }
Mike Isely1bde0282006-12-27 23:30:13 -0300388 if (hdw->freqSelector) {
389 hdw->freqSlotRadio = slotId;
390 } else {
391 hdw->freqSlotTelevision = slotId;
Mike Iselyd8554972006-06-26 20:58:46 -0300392 }
393 return 0;
394}
395
396static int ctrl_freq_get(struct pvr2_ctrl *cptr,int *vp)
397{
Mike Isely1bde0282006-12-27 23:30:13 -0300398 *vp = pvr2_hdw_get_cur_freq(cptr->hdw);
Mike Iselyd8554972006-06-26 20:58:46 -0300399 return 0;
400}
401
402static int ctrl_freq_is_dirty(struct pvr2_ctrl *cptr)
403{
404 return cptr->hdw->freqDirty != 0;
405}
406
407static void ctrl_freq_clear_dirty(struct pvr2_ctrl *cptr)
408{
409 cptr->hdw->freqDirty = 0;
410}
411
412static int ctrl_freq_set(struct pvr2_ctrl *cptr,int m,int v)
413{
Mike Isely1bde0282006-12-27 23:30:13 -0300414 pvr2_hdw_set_cur_freq(cptr->hdw,v);
Mike Iselyd8554972006-06-26 20:58:46 -0300415 return 0;
416}
417
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300418static int ctrl_cropl_min_get(struct pvr2_ctrl *cptr, int *left)
419{
Mike Isely432907f2008-08-31 21:02:20 -0300420 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
421 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
422 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300423 return stat;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300424 }
Mike Isely432907f2008-08-31 21:02:20 -0300425 *left = cap->bounds.left;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300426 return 0;
427}
428
429static int ctrl_cropl_max_get(struct pvr2_ctrl *cptr, int *left)
430{
Mike Isely432907f2008-08-31 21:02:20 -0300431 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
432 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
433 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300434 return stat;
435 }
436 *left = cap->bounds.left;
437 if (cap->bounds.width > cptr->hdw->cropw_val) {
Mike Isely432907f2008-08-31 21:02:20 -0300438 *left += cap->bounds.width - cptr->hdw->cropw_val;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300439 }
440 return 0;
441}
442
443static int ctrl_cropt_min_get(struct pvr2_ctrl *cptr, int *top)
444{
Mike Isely432907f2008-08-31 21:02:20 -0300445 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
446 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
447 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300448 return stat;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300449 }
Mike Isely432907f2008-08-31 21:02:20 -0300450 *top = cap->bounds.top;
451 return 0;
452}
453
454static int ctrl_cropt_max_get(struct pvr2_ctrl *cptr, int *top)
455{
456 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
457 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
458 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300459 return stat;
460 }
461 *top = cap->bounds.top;
462 if (cap->bounds.height > cptr->hdw->croph_val) {
Mike Isely432907f2008-08-31 21:02:20 -0300463 *top += cap->bounds.height - cptr->hdw->croph_val;
464 }
465 return 0;
466}
467
468static int ctrl_cropw_max_get(struct pvr2_ctrl *cptr, int *val)
469{
470 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
471 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
472 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300473 return stat;
474 }
475 *val = 0;
476 if (cap->bounds.width > cptr->hdw->cropl_val) {
Mike Isely432907f2008-08-31 21:02:20 -0300477 *val = cap->bounds.width - cptr->hdw->cropl_val;
478 }
479 return 0;
480}
481
482static int ctrl_croph_max_get(struct pvr2_ctrl *cptr, int *val)
483{
484 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
485 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
486 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300487 return stat;
488 }
489 *val = 0;
490 if (cap->bounds.height > cptr->hdw->cropt_val) {
Mike Isely432907f2008-08-31 21:02:20 -0300491 *val = cap->bounds.height - cptr->hdw->cropt_val;
492 }
493 return 0;
494}
495
496static int ctrl_get_cropcapbl(struct pvr2_ctrl *cptr, int *val)
497{
498 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
499 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
500 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300501 return stat;
502 }
503 *val = cap->bounds.left;
504 return 0;
505}
506
507static int ctrl_get_cropcapbt(struct pvr2_ctrl *cptr, int *val)
508{
509 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
510 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
511 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300512 return stat;
513 }
514 *val = cap->bounds.top;
515 return 0;
516}
517
518static int ctrl_get_cropcapbw(struct pvr2_ctrl *cptr, int *val)
519{
520 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
521 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
522 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300523 return stat;
524 }
525 *val = cap->bounds.width;
526 return 0;
527}
528
529static int ctrl_get_cropcapbh(struct pvr2_ctrl *cptr, int *val)
530{
531 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
532 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
533 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300534 return stat;
535 }
536 *val = cap->bounds.height;
537 return 0;
538}
539
540static int ctrl_get_cropcapdl(struct pvr2_ctrl *cptr, int *val)
541{
542 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
543 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
544 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300545 return stat;
546 }
547 *val = cap->defrect.left;
548 return 0;
549}
550
551static int ctrl_get_cropcapdt(struct pvr2_ctrl *cptr, int *val)
552{
553 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
554 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
555 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300556 return stat;
557 }
558 *val = cap->defrect.top;
559 return 0;
560}
561
562static int ctrl_get_cropcapdw(struct pvr2_ctrl *cptr, int *val)
563{
564 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
565 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
566 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300567 return stat;
568 }
569 *val = cap->defrect.width;
570 return 0;
571}
572
573static int ctrl_get_cropcapdh(struct pvr2_ctrl *cptr, int *val)
574{
575 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
576 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
577 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300578 return stat;
579 }
580 *val = cap->defrect.height;
581 return 0;
582}
583
584static int ctrl_get_cropcappan(struct pvr2_ctrl *cptr, int *val)
585{
586 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
587 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
588 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300589 return stat;
590 }
591 *val = cap->pixelaspect.numerator;
592 return 0;
593}
594
595static int ctrl_get_cropcappad(struct pvr2_ctrl *cptr, int *val)
596{
597 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
598 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
599 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300600 return stat;
601 }
602 *val = cap->pixelaspect.denominator;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300603 return 0;
604}
605
Mike Isely3ad9fc32006-09-02 22:37:52 -0300606static int ctrl_vres_max_get(struct pvr2_ctrl *cptr,int *vp)
607{
608 /* Actual maximum depends on the video standard in effect. */
609 if (cptr->hdw->std_mask_cur & V4L2_STD_525_60) {
610 *vp = 480;
611 } else {
612 *vp = 576;
613 }
614 return 0;
615}
616
617static int ctrl_vres_min_get(struct pvr2_ctrl *cptr,int *vp)
618{
Mike Isely989eb152007-11-26 01:53:12 -0300619 /* Actual minimum depends on device digitizer type. */
620 if (cptr->hdw->hdw_desc->flag_has_cx25840) {
Mike Isely3ad9fc32006-09-02 22:37:52 -0300621 *vp = 75;
622 } else {
623 *vp = 17;
624 }
625 return 0;
626}
627
Mike Isely1bde0282006-12-27 23:30:13 -0300628static int ctrl_get_input(struct pvr2_ctrl *cptr,int *vp)
629{
630 *vp = cptr->hdw->input_val;
631 return 0;
632}
633
Mike Isely29bf5b12008-04-22 14:45:37 -0300634static int ctrl_check_input(struct pvr2_ctrl *cptr,int v)
635{
Mike Isely1cb03b72008-04-21 03:47:43 -0300636 return ((1 << v) & cptr->hdw->input_allowed_mask) != 0;
Mike Isely29bf5b12008-04-22 14:45:37 -0300637}
638
Mike Isely1bde0282006-12-27 23:30:13 -0300639static int ctrl_set_input(struct pvr2_ctrl *cptr,int m,int v)
640{
Mike Isely1cb03b72008-04-21 03:47:43 -0300641 return pvr2_hdw_set_input(cptr->hdw,v);
Mike Isely1bde0282006-12-27 23:30:13 -0300642}
643
644static int ctrl_isdirty_input(struct pvr2_ctrl *cptr)
645{
646 return cptr->hdw->input_dirty != 0;
647}
648
649static void ctrl_cleardirty_input(struct pvr2_ctrl *cptr)
650{
651 cptr->hdw->input_dirty = 0;
652}
653
Mike Isely5549f542006-12-27 23:28:54 -0300654
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300655static int ctrl_freq_max_get(struct pvr2_ctrl *cptr, int *vp)
656{
Mike Isely644afdb2007-01-20 00:19:23 -0300657 unsigned long fv;
658 struct pvr2_hdw *hdw = cptr->hdw;
659 if (hdw->tuner_signal_stale) {
Mike Iselya51f5002009-03-06 23:30:37 -0300660 pvr2_hdw_status_poll(hdw);
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300661 }
Mike Isely644afdb2007-01-20 00:19:23 -0300662 fv = hdw->tuner_signal_info.rangehigh;
663 if (!fv) {
664 /* Safety fallback */
665 *vp = TV_MAX_FREQ;
666 return 0;
667 }
668 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
669 fv = (fv * 125) / 2;
670 } else {
671 fv = fv * 62500;
672 }
673 *vp = fv;
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300674 return 0;
675}
676
677static int ctrl_freq_min_get(struct pvr2_ctrl *cptr, int *vp)
678{
Mike Isely644afdb2007-01-20 00:19:23 -0300679 unsigned long fv;
680 struct pvr2_hdw *hdw = cptr->hdw;
681 if (hdw->tuner_signal_stale) {
Mike Iselya51f5002009-03-06 23:30:37 -0300682 pvr2_hdw_status_poll(hdw);
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300683 }
Mike Isely644afdb2007-01-20 00:19:23 -0300684 fv = hdw->tuner_signal_info.rangelow;
685 if (!fv) {
686 /* Safety fallback */
687 *vp = TV_MIN_FREQ;
688 return 0;
689 }
690 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
691 fv = (fv * 125) / 2;
692 } else {
693 fv = fv * 62500;
694 }
695 *vp = fv;
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300696 return 0;
697}
698
Mike Iselyb30d2442006-06-25 20:05:01 -0300699static int ctrl_cx2341x_is_dirty(struct pvr2_ctrl *cptr)
700{
701 return cptr->hdw->enc_stale != 0;
702}
703
704static void ctrl_cx2341x_clear_dirty(struct pvr2_ctrl *cptr)
705{
706 cptr->hdw->enc_stale = 0;
Mike Isely681c7392007-11-26 01:48:52 -0300707 cptr->hdw->enc_unsafe_stale = 0;
Mike Iselyb30d2442006-06-25 20:05:01 -0300708}
709
710static int ctrl_cx2341x_get(struct pvr2_ctrl *cptr,int *vp)
711{
712 int ret;
713 struct v4l2_ext_controls cs;
714 struct v4l2_ext_control c1;
715 memset(&cs,0,sizeof(cs));
716 memset(&c1,0,sizeof(c1));
717 cs.controls = &c1;
718 cs.count = 1;
719 c1.id = cptr->info->v4l_id;
Hans Verkuil01f1e442007-08-21 18:32:42 -0300720 ret = cx2341x_ext_ctrls(&cptr->hdw->enc_ctl_state, 0, &cs,
Mike Iselyb30d2442006-06-25 20:05:01 -0300721 VIDIOC_G_EXT_CTRLS);
722 if (ret) return ret;
723 *vp = c1.value;
724 return 0;
725}
726
727static int ctrl_cx2341x_set(struct pvr2_ctrl *cptr,int m,int v)
728{
729 int ret;
Mike Isely681c7392007-11-26 01:48:52 -0300730 struct pvr2_hdw *hdw = cptr->hdw;
Mike Iselyb30d2442006-06-25 20:05:01 -0300731 struct v4l2_ext_controls cs;
732 struct v4l2_ext_control c1;
733 memset(&cs,0,sizeof(cs));
734 memset(&c1,0,sizeof(c1));
735 cs.controls = &c1;
736 cs.count = 1;
737 c1.id = cptr->info->v4l_id;
738 c1.value = v;
Mike Isely681c7392007-11-26 01:48:52 -0300739 ret = cx2341x_ext_ctrls(&hdw->enc_ctl_state,
740 hdw->state_encoder_run, &cs,
Mike Iselyb30d2442006-06-25 20:05:01 -0300741 VIDIOC_S_EXT_CTRLS);
Mike Isely681c7392007-11-26 01:48:52 -0300742 if (ret == -EBUSY) {
743 /* Oops. cx2341x is telling us it's not safe to change
744 this control while we're capturing. Make a note of this
745 fact so that the pipeline will be stopped the next time
746 controls are committed. Then go on ahead and store this
747 change anyway. */
748 ret = cx2341x_ext_ctrls(&hdw->enc_ctl_state,
749 0, &cs,
750 VIDIOC_S_EXT_CTRLS);
751 if (!ret) hdw->enc_unsafe_stale = !0;
752 }
Mike Iselyb30d2442006-06-25 20:05:01 -0300753 if (ret) return ret;
Mike Isely681c7392007-11-26 01:48:52 -0300754 hdw->enc_stale = !0;
Mike Iselyb30d2442006-06-25 20:05:01 -0300755 return 0;
756}
757
758static unsigned int ctrl_cx2341x_getv4lflags(struct pvr2_ctrl *cptr)
759{
760 struct v4l2_queryctrl qctrl;
761 struct pvr2_ctl_info *info;
762 qctrl.id = cptr->info->v4l_id;
763 cx2341x_ctrl_query(&cptr->hdw->enc_ctl_state,&qctrl);
764 /* Strip out the const so we can adjust a function pointer. It's
765 OK to do this here because we know this is a dynamically created
766 control, so the underlying storage for the info pointer is (a)
767 private to us, and (b) not in read-only storage. Either we do
768 this or we significantly complicate the underlying control
769 implementation. */
770 info = (struct pvr2_ctl_info *)(cptr->info);
771 if (qctrl.flags & V4L2_CTRL_FLAG_READ_ONLY) {
772 if (info->set_value) {
Mike Iselya0fd1cb2006-06-30 11:35:28 -0300773 info->set_value = NULL;
Mike Iselyb30d2442006-06-25 20:05:01 -0300774 }
775 } else {
776 if (!(info->set_value)) {
777 info->set_value = ctrl_cx2341x_set;
778 }
779 }
780 return qctrl.flags;
781}
782
Mike Iselyd8554972006-06-26 20:58:46 -0300783static int ctrl_streamingenabled_get(struct pvr2_ctrl *cptr,int *vp)
784{
Mike Isely681c7392007-11-26 01:48:52 -0300785 *vp = cptr->hdw->state_pipeline_req;
786 return 0;
787}
788
789static int ctrl_masterstate_get(struct pvr2_ctrl *cptr,int *vp)
790{
791 *vp = cptr->hdw->master_state;
Mike Iselyd8554972006-06-26 20:58:46 -0300792 return 0;
793}
794
795static int ctrl_hsm_get(struct pvr2_ctrl *cptr,int *vp)
796{
797 int result = pvr2_hdw_is_hsm(cptr->hdw);
798 *vp = PVR2_CVAL_HSM_FULL;
799 if (result < 0) *vp = PVR2_CVAL_HSM_FAIL;
800 if (result) *vp = PVR2_CVAL_HSM_HIGH;
801 return 0;
802}
803
804static int ctrl_stdavail_get(struct pvr2_ctrl *cptr,int *vp)
805{
806 *vp = cptr->hdw->std_mask_avail;
807 return 0;
808}
809
810static int ctrl_stdavail_set(struct pvr2_ctrl *cptr,int m,int v)
811{
812 struct pvr2_hdw *hdw = cptr->hdw;
813 v4l2_std_id ns;
814 ns = hdw->std_mask_avail;
815 ns = (ns & ~m) | (v & m);
816 if (ns == hdw->std_mask_avail) return 0;
817 hdw->std_mask_avail = ns;
818 pvr2_hdw_internal_set_std_avail(hdw);
819 pvr2_hdw_internal_find_stdenum(hdw);
820 return 0;
821}
822
823static int ctrl_std_val_to_sym(struct pvr2_ctrl *cptr,int msk,int val,
824 char *bufPtr,unsigned int bufSize,
825 unsigned int *len)
826{
827 *len = pvr2_std_id_to_str(bufPtr,bufSize,msk & val);
828 return 0;
829}
830
831static int ctrl_std_sym_to_val(struct pvr2_ctrl *cptr,
832 const char *bufPtr,unsigned int bufSize,
833 int *mskp,int *valp)
834{
835 int ret;
836 v4l2_std_id id;
837 ret = pvr2_std_str_to_id(&id,bufPtr,bufSize);
838 if (ret < 0) return ret;
839 if (mskp) *mskp = id;
840 if (valp) *valp = id;
841 return 0;
842}
843
844static int ctrl_stdcur_get(struct pvr2_ctrl *cptr,int *vp)
845{
846 *vp = cptr->hdw->std_mask_cur;
847 return 0;
848}
849
850static int ctrl_stdcur_set(struct pvr2_ctrl *cptr,int m,int v)
851{
852 struct pvr2_hdw *hdw = cptr->hdw;
853 v4l2_std_id ns;
854 ns = hdw->std_mask_cur;
855 ns = (ns & ~m) | (v & m);
856 if (ns == hdw->std_mask_cur) return 0;
857 hdw->std_mask_cur = ns;
858 hdw->std_dirty = !0;
859 pvr2_hdw_internal_find_stdenum(hdw);
860 return 0;
861}
862
863static int ctrl_stdcur_is_dirty(struct pvr2_ctrl *cptr)
864{
865 return cptr->hdw->std_dirty != 0;
866}
867
868static void ctrl_stdcur_clear_dirty(struct pvr2_ctrl *cptr)
869{
870 cptr->hdw->std_dirty = 0;
871}
872
873static int ctrl_signal_get(struct pvr2_ctrl *cptr,int *vp)
874{
Mike Isely18103c572007-01-20 00:09:47 -0300875 struct pvr2_hdw *hdw = cptr->hdw;
Mike Iselya51f5002009-03-06 23:30:37 -0300876 pvr2_hdw_status_poll(hdw);
Mike Isely18103c572007-01-20 00:09:47 -0300877 *vp = hdw->tuner_signal_info.signal;
878 return 0;
879}
880
881static int ctrl_audio_modes_present_get(struct pvr2_ctrl *cptr,int *vp)
882{
883 int val = 0;
884 unsigned int subchan;
885 struct pvr2_hdw *hdw = cptr->hdw;
Mike Iselya51f5002009-03-06 23:30:37 -0300886 pvr2_hdw_status_poll(hdw);
Mike Isely18103c572007-01-20 00:09:47 -0300887 subchan = hdw->tuner_signal_info.rxsubchans;
888 if (subchan & V4L2_TUNER_SUB_MONO) {
889 val |= (1 << V4L2_TUNER_MODE_MONO);
890 }
891 if (subchan & V4L2_TUNER_SUB_STEREO) {
892 val |= (1 << V4L2_TUNER_MODE_STEREO);
893 }
894 if (subchan & V4L2_TUNER_SUB_LANG1) {
895 val |= (1 << V4L2_TUNER_MODE_LANG1);
896 }
897 if (subchan & V4L2_TUNER_SUB_LANG2) {
898 val |= (1 << V4L2_TUNER_MODE_LANG2);
899 }
900 *vp = val;
Mike Iselyd8554972006-06-26 20:58:46 -0300901 return 0;
902}
903
Mike Iselyd8554972006-06-26 20:58:46 -0300904
905static int ctrl_stdenumcur_set(struct pvr2_ctrl *cptr,int m,int v)
906{
907 struct pvr2_hdw *hdw = cptr->hdw;
908 if (v < 0) return -EINVAL;
909 if (v > hdw->std_enum_cnt) return -EINVAL;
910 hdw->std_enum_cur = v;
911 if (!v) return 0;
912 v--;
913 if (hdw->std_mask_cur == hdw->std_defs[v].id) return 0;
914 hdw->std_mask_cur = hdw->std_defs[v].id;
915 hdw->std_dirty = !0;
916 return 0;
917}
918
919
920static int ctrl_stdenumcur_get(struct pvr2_ctrl *cptr,int *vp)
921{
922 *vp = cptr->hdw->std_enum_cur;
923 return 0;
924}
925
926
927static int ctrl_stdenumcur_is_dirty(struct pvr2_ctrl *cptr)
928{
929 return cptr->hdw->std_dirty != 0;
930}
931
932
933static void ctrl_stdenumcur_clear_dirty(struct pvr2_ctrl *cptr)
934{
935 cptr->hdw->std_dirty = 0;
936}
937
938
939#define DEFINT(vmin,vmax) \
940 .type = pvr2_ctl_int, \
941 .def.type_int.min_value = vmin, \
942 .def.type_int.max_value = vmax
943
944#define DEFENUM(tab) \
945 .type = pvr2_ctl_enum, \
Mike Isely27c7b712007-01-20 00:39:17 -0300946 .def.type_enum.count = ARRAY_SIZE(tab), \
Mike Iselyd8554972006-06-26 20:58:46 -0300947 .def.type_enum.value_names = tab
948
Mike Isely33213962006-06-25 20:04:40 -0300949#define DEFBOOL \
950 .type = pvr2_ctl_bool
951
Mike Iselyd8554972006-06-26 20:58:46 -0300952#define DEFMASK(msk,tab) \
953 .type = pvr2_ctl_bitmask, \
954 .def.type_bitmask.valid_bits = msk, \
955 .def.type_bitmask.bit_names = tab
956
957#define DEFREF(vname) \
958 .set_value = ctrl_set_##vname, \
959 .get_value = ctrl_get_##vname, \
960 .is_dirty = ctrl_isdirty_##vname, \
961 .clear_dirty = ctrl_cleardirty_##vname
962
963
964#define VCREATE_FUNCS(vname) \
965static int ctrl_get_##vname(struct pvr2_ctrl *cptr,int *vp) \
966{*vp = cptr->hdw->vname##_val; return 0;} \
967static int ctrl_set_##vname(struct pvr2_ctrl *cptr,int m,int v) \
968{cptr->hdw->vname##_val = v; cptr->hdw->vname##_dirty = !0; return 0;} \
969static int ctrl_isdirty_##vname(struct pvr2_ctrl *cptr) \
970{return cptr->hdw->vname##_dirty != 0;} \
971static void ctrl_cleardirty_##vname(struct pvr2_ctrl *cptr) \
972{cptr->hdw->vname##_dirty = 0;}
973
974VCREATE_FUNCS(brightness)
975VCREATE_FUNCS(contrast)
976VCREATE_FUNCS(saturation)
977VCREATE_FUNCS(hue)
978VCREATE_FUNCS(volume)
979VCREATE_FUNCS(balance)
980VCREATE_FUNCS(bass)
981VCREATE_FUNCS(treble)
982VCREATE_FUNCS(mute)
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300983VCREATE_FUNCS(cropl)
984VCREATE_FUNCS(cropt)
985VCREATE_FUNCS(cropw)
986VCREATE_FUNCS(croph)
Mike Iselyc05c0462006-06-25 20:04:25 -0300987VCREATE_FUNCS(audiomode)
988VCREATE_FUNCS(res_hor)
989VCREATE_FUNCS(res_ver)
Mike Iselyd8554972006-06-26 20:58:46 -0300990VCREATE_FUNCS(srate)
Mike Iselyd8554972006-06-26 20:58:46 -0300991
Mike Iselyd8554972006-06-26 20:58:46 -0300992/* Table definition of all controls which can be manipulated */
993static const struct pvr2_ctl_info control_defs[] = {
994 {
995 .v4l_id = V4L2_CID_BRIGHTNESS,
996 .desc = "Brightness",
997 .name = "brightness",
998 .default_value = 128,
999 DEFREF(brightness),
1000 DEFINT(0,255),
1001 },{
1002 .v4l_id = V4L2_CID_CONTRAST,
1003 .desc = "Contrast",
1004 .name = "contrast",
1005 .default_value = 68,
1006 DEFREF(contrast),
1007 DEFINT(0,127),
1008 },{
1009 .v4l_id = V4L2_CID_SATURATION,
1010 .desc = "Saturation",
1011 .name = "saturation",
1012 .default_value = 64,
1013 DEFREF(saturation),
1014 DEFINT(0,127),
1015 },{
1016 .v4l_id = V4L2_CID_HUE,
1017 .desc = "Hue",
1018 .name = "hue",
1019 .default_value = 0,
1020 DEFREF(hue),
1021 DEFINT(-128,127),
1022 },{
1023 .v4l_id = V4L2_CID_AUDIO_VOLUME,
1024 .desc = "Volume",
1025 .name = "volume",
Mike Isely139eecf2006-12-27 23:36:33 -03001026 .default_value = 62000,
Mike Iselyd8554972006-06-26 20:58:46 -03001027 DEFREF(volume),
1028 DEFINT(0,65535),
1029 },{
1030 .v4l_id = V4L2_CID_AUDIO_BALANCE,
1031 .desc = "Balance",
1032 .name = "balance",
1033 .default_value = 0,
1034 DEFREF(balance),
1035 DEFINT(-32768,32767),
1036 },{
1037 .v4l_id = V4L2_CID_AUDIO_BASS,
1038 .desc = "Bass",
1039 .name = "bass",
1040 .default_value = 0,
1041 DEFREF(bass),
1042 DEFINT(-32768,32767),
1043 },{
1044 .v4l_id = V4L2_CID_AUDIO_TREBLE,
1045 .desc = "Treble",
1046 .name = "treble",
1047 .default_value = 0,
1048 DEFREF(treble),
1049 DEFINT(-32768,32767),
1050 },{
1051 .v4l_id = V4L2_CID_AUDIO_MUTE,
1052 .desc = "Mute",
1053 .name = "mute",
1054 .default_value = 0,
1055 DEFREF(mute),
Mike Isely33213962006-06-25 20:04:40 -03001056 DEFBOOL,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001057 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001058 .desc = "Capture crop left margin",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001059 .name = "crop_left",
1060 .internal_id = PVR2_CID_CROPL,
1061 .default_value = 0,
1062 DEFREF(cropl),
1063 DEFINT(-129, 340),
1064 .get_min_value = ctrl_cropl_min_get,
1065 .get_max_value = ctrl_cropl_max_get,
Mike Isely432907f2008-08-31 21:02:20 -03001066 .get_def_value = ctrl_get_cropcapdl,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001067 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001068 .desc = "Capture crop top margin",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001069 .name = "crop_top",
1070 .internal_id = PVR2_CID_CROPT,
1071 .default_value = 0,
1072 DEFREF(cropt),
1073 DEFINT(-35, 544),
1074 .get_min_value = ctrl_cropt_min_get,
1075 .get_max_value = ctrl_cropt_max_get,
Mike Isely432907f2008-08-31 21:02:20 -03001076 .get_def_value = ctrl_get_cropcapdt,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001077 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001078 .desc = "Capture crop width",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001079 .name = "crop_width",
1080 .internal_id = PVR2_CID_CROPW,
1081 .default_value = 720,
1082 DEFREF(cropw),
Mike Isely432907f2008-08-31 21:02:20 -03001083 .get_max_value = ctrl_cropw_max_get,
1084 .get_def_value = ctrl_get_cropcapdw,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001085 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001086 .desc = "Capture crop height",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001087 .name = "crop_height",
1088 .internal_id = PVR2_CID_CROPH,
1089 .default_value = 480,
1090 DEFREF(croph),
Mike Isely432907f2008-08-31 21:02:20 -03001091 .get_max_value = ctrl_croph_max_get,
1092 .get_def_value = ctrl_get_cropcapdh,
1093 }, {
1094 .desc = "Capture capability pixel aspect numerator",
1095 .name = "cropcap_pixel_numerator",
1096 .internal_id = PVR2_CID_CROPCAPPAN,
1097 .get_value = ctrl_get_cropcappan,
1098 }, {
1099 .desc = "Capture capability pixel aspect denominator",
1100 .name = "cropcap_pixel_denominator",
1101 .internal_id = PVR2_CID_CROPCAPPAD,
1102 .get_value = ctrl_get_cropcappad,
1103 }, {
1104 .desc = "Capture capability bounds top",
1105 .name = "cropcap_bounds_top",
1106 .internal_id = PVR2_CID_CROPCAPBT,
1107 .get_value = ctrl_get_cropcapbt,
1108 }, {
1109 .desc = "Capture capability bounds left",
1110 .name = "cropcap_bounds_left",
1111 .internal_id = PVR2_CID_CROPCAPBL,
1112 .get_value = ctrl_get_cropcapbl,
1113 }, {
1114 .desc = "Capture capability bounds width",
1115 .name = "cropcap_bounds_width",
1116 .internal_id = PVR2_CID_CROPCAPBW,
1117 .get_value = ctrl_get_cropcapbw,
1118 }, {
1119 .desc = "Capture capability bounds height",
1120 .name = "cropcap_bounds_height",
1121 .internal_id = PVR2_CID_CROPCAPBH,
1122 .get_value = ctrl_get_cropcapbh,
Mike Iselyd8554972006-06-26 20:58:46 -03001123 },{
Mike Iselyc05c0462006-06-25 20:04:25 -03001124 .desc = "Video Source",
1125 .name = "input",
1126 .internal_id = PVR2_CID_INPUT,
1127 .default_value = PVR2_CVAL_INPUT_TV,
Mike Isely29bf5b12008-04-22 14:45:37 -03001128 .check_value = ctrl_check_input,
Mike Iselyc05c0462006-06-25 20:04:25 -03001129 DEFREF(input),
1130 DEFENUM(control_values_input),
1131 },{
1132 .desc = "Audio Mode",
1133 .name = "audio_mode",
1134 .internal_id = PVR2_CID_AUDIOMODE,
1135 .default_value = V4L2_TUNER_MODE_STEREO,
1136 DEFREF(audiomode),
1137 DEFENUM(control_values_audiomode),
1138 },{
1139 .desc = "Horizontal capture resolution",
1140 .name = "resolution_hor",
1141 .internal_id = PVR2_CID_HRES,
1142 .default_value = 720,
1143 DEFREF(res_hor),
Mike Isely3ad9fc32006-09-02 22:37:52 -03001144 DEFINT(19,720),
Mike Iselyc05c0462006-06-25 20:04:25 -03001145 },{
1146 .desc = "Vertical capture resolution",
1147 .name = "resolution_ver",
1148 .internal_id = PVR2_CID_VRES,
1149 .default_value = 480,
1150 DEFREF(res_ver),
Mike Isely3ad9fc32006-09-02 22:37:52 -03001151 DEFINT(17,576),
1152 /* Hook in check for video standard and adjust maximum
1153 depending on the standard. */
1154 .get_max_value = ctrl_vres_max_get,
1155 .get_min_value = ctrl_vres_min_get,
Mike Iselyc05c0462006-06-25 20:04:25 -03001156 },{
Mike Iselyb30d2442006-06-25 20:05:01 -03001157 .v4l_id = V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
Mike Isely434449f2006-08-08 09:10:06 -03001158 .default_value = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000,
1159 .desc = "Audio Sampling Frequency",
Mike Iselyd8554972006-06-26 20:58:46 -03001160 .name = "srate",
Mike Iselyd8554972006-06-26 20:58:46 -03001161 DEFREF(srate),
1162 DEFENUM(control_values_srate),
1163 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001164 .desc = "Tuner Frequency (Hz)",
1165 .name = "frequency",
1166 .internal_id = PVR2_CID_FREQUENCY,
Mike Isely1bde0282006-12-27 23:30:13 -03001167 .default_value = 0,
Mike Iselyd8554972006-06-26 20:58:46 -03001168 .set_value = ctrl_freq_set,
1169 .get_value = ctrl_freq_get,
1170 .is_dirty = ctrl_freq_is_dirty,
1171 .clear_dirty = ctrl_freq_clear_dirty,
Mike Isely644afdb2007-01-20 00:19:23 -03001172 DEFINT(0,0),
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -03001173 /* Hook in check for input value (tv/radio) and adjust
1174 max/min values accordingly */
1175 .get_max_value = ctrl_freq_max_get,
1176 .get_min_value = ctrl_freq_min_get,
Mike Iselyd8554972006-06-26 20:58:46 -03001177 },{
1178 .desc = "Channel",
1179 .name = "channel",
1180 .set_value = ctrl_channel_set,
1181 .get_value = ctrl_channel_get,
1182 DEFINT(0,FREQTABLE_SIZE),
1183 },{
1184 .desc = "Channel Program Frequency",
1185 .name = "freq_table_value",
1186 .set_value = ctrl_channelfreq_set,
1187 .get_value = ctrl_channelfreq_get,
Mike Isely644afdb2007-01-20 00:19:23 -03001188 DEFINT(0,0),
Mike Isely1bde0282006-12-27 23:30:13 -03001189 /* Hook in check for input value (tv/radio) and adjust
1190 max/min values accordingly */
Mike Isely1bde0282006-12-27 23:30:13 -03001191 .get_max_value = ctrl_freq_max_get,
1192 .get_min_value = ctrl_freq_min_get,
Mike Iselyd8554972006-06-26 20:58:46 -03001193 },{
1194 .desc = "Channel Program ID",
1195 .name = "freq_table_channel",
1196 .set_value = ctrl_channelprog_set,
1197 .get_value = ctrl_channelprog_get,
1198 DEFINT(0,FREQTABLE_SIZE),
1199 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001200 .desc = "Streaming Enabled",
1201 .name = "streaming_enabled",
1202 .get_value = ctrl_streamingenabled_get,
Mike Isely33213962006-06-25 20:04:40 -03001203 DEFBOOL,
Mike Iselyd8554972006-06-26 20:58:46 -03001204 },{
1205 .desc = "USB Speed",
1206 .name = "usb_speed",
1207 .get_value = ctrl_hsm_get,
1208 DEFENUM(control_values_hsm),
1209 },{
Mike Isely681c7392007-11-26 01:48:52 -03001210 .desc = "Master State",
1211 .name = "master_state",
1212 .get_value = ctrl_masterstate_get,
1213 DEFENUM(pvr2_state_names),
1214 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001215 .desc = "Signal Present",
1216 .name = "signal_present",
1217 .get_value = ctrl_signal_get,
Mike Isely18103c572007-01-20 00:09:47 -03001218 DEFINT(0,65535),
1219 },{
1220 .desc = "Audio Modes Present",
1221 .name = "audio_modes_present",
1222 .get_value = ctrl_audio_modes_present_get,
1223 /* For this type we "borrow" the V4L2_TUNER_MODE enum from
1224 v4l. Nothing outside of this module cares about this,
1225 but I reuse it in order to also reuse the
1226 control_values_audiomode string table. */
1227 DEFMASK(((1 << V4L2_TUNER_MODE_MONO)|
1228 (1 << V4L2_TUNER_MODE_STEREO)|
1229 (1 << V4L2_TUNER_MODE_LANG1)|
1230 (1 << V4L2_TUNER_MODE_LANG2)),
1231 control_values_audiomode),
Mike Iselyd8554972006-06-26 20:58:46 -03001232 },{
1233 .desc = "Video Standards Available Mask",
1234 .name = "video_standard_mask_available",
1235 .internal_id = PVR2_CID_STDAVAIL,
1236 .skip_init = !0,
1237 .get_value = ctrl_stdavail_get,
1238 .set_value = ctrl_stdavail_set,
1239 .val_to_sym = ctrl_std_val_to_sym,
1240 .sym_to_val = ctrl_std_sym_to_val,
1241 .type = pvr2_ctl_bitmask,
1242 },{
1243 .desc = "Video Standards In Use Mask",
1244 .name = "video_standard_mask_active",
1245 .internal_id = PVR2_CID_STDCUR,
1246 .skip_init = !0,
1247 .get_value = ctrl_stdcur_get,
1248 .set_value = ctrl_stdcur_set,
1249 .is_dirty = ctrl_stdcur_is_dirty,
1250 .clear_dirty = ctrl_stdcur_clear_dirty,
1251 .val_to_sym = ctrl_std_val_to_sym,
1252 .sym_to_val = ctrl_std_sym_to_val,
1253 .type = pvr2_ctl_bitmask,
1254 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001255 .desc = "Video Standard Name",
1256 .name = "video_standard",
1257 .internal_id = PVR2_CID_STDENUM,
1258 .skip_init = !0,
1259 .get_value = ctrl_stdenumcur_get,
1260 .set_value = ctrl_stdenumcur_set,
1261 .is_dirty = ctrl_stdenumcur_is_dirty,
1262 .clear_dirty = ctrl_stdenumcur_clear_dirty,
1263 .type = pvr2_ctl_enum,
1264 }
1265};
1266
Ahmed S. Darwisheca8ebf2007-01-20 00:35:03 -03001267#define CTRLDEF_COUNT ARRAY_SIZE(control_defs)
Mike Iselyd8554972006-06-26 20:58:46 -03001268
1269
1270const char *pvr2_config_get_name(enum pvr2_config cfg)
1271{
1272 switch (cfg) {
1273 case pvr2_config_empty: return "empty";
1274 case pvr2_config_mpeg: return "mpeg";
1275 case pvr2_config_vbi: return "vbi";
Mike Isely16eb40d2006-12-30 18:27:32 -03001276 case pvr2_config_pcm: return "pcm";
1277 case pvr2_config_rawvideo: return "raw video";
Mike Iselyd8554972006-06-26 20:58:46 -03001278 }
1279 return "<unknown>";
1280}
1281
1282
1283struct usb_device *pvr2_hdw_get_dev(struct pvr2_hdw *hdw)
1284{
1285 return hdw->usb_dev;
1286}
1287
1288
1289unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw)
1290{
1291 return hdw->serial_number;
1292}
1293
Mike Isely31a18542007-04-08 01:11:47 -03001294
1295const char *pvr2_hdw_get_bus_info(struct pvr2_hdw *hdw)
1296{
1297 return hdw->bus_info;
1298}
1299
1300
Mike Isely13a88792009-01-14 04:22:56 -03001301const char *pvr2_hdw_get_device_identifier(struct pvr2_hdw *hdw)
1302{
1303 return hdw->identifier;
1304}
1305
1306
Mike Isely1bde0282006-12-27 23:30:13 -03001307unsigned long pvr2_hdw_get_cur_freq(struct pvr2_hdw *hdw)
1308{
1309 return hdw->freqSelector ? hdw->freqValTelevision : hdw->freqValRadio;
1310}
1311
1312/* Set the currently tuned frequency and account for all possible
1313 driver-core side effects of this action. */
Adrian Bunkf55a8712008-04-18 05:38:56 -03001314static void pvr2_hdw_set_cur_freq(struct pvr2_hdw *hdw,unsigned long val)
Mike Isely1bde0282006-12-27 23:30:13 -03001315{
Mike Isely7c74e572007-01-20 00:15:41 -03001316 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
Mike Isely1bde0282006-12-27 23:30:13 -03001317 if (hdw->freqSelector) {
1318 /* Swing over to radio frequency selection */
1319 hdw->freqSelector = 0;
1320 hdw->freqDirty = !0;
1321 }
Mike Isely1bde0282006-12-27 23:30:13 -03001322 if (hdw->freqValRadio != val) {
1323 hdw->freqValRadio = val;
1324 hdw->freqSlotRadio = 0;
Mike Isely7c74e572007-01-20 00:15:41 -03001325 hdw->freqDirty = !0;
Mike Isely1bde0282006-12-27 23:30:13 -03001326 }
Mike Isely7c74e572007-01-20 00:15:41 -03001327 } else {
Mike Isely1bde0282006-12-27 23:30:13 -03001328 if (!(hdw->freqSelector)) {
1329 /* Swing over to television frequency selection */
1330 hdw->freqSelector = 1;
1331 hdw->freqDirty = !0;
1332 }
Mike Isely1bde0282006-12-27 23:30:13 -03001333 if (hdw->freqValTelevision != val) {
1334 hdw->freqValTelevision = val;
1335 hdw->freqSlotTelevision = 0;
Mike Isely7c74e572007-01-20 00:15:41 -03001336 hdw->freqDirty = !0;
Mike Isely1bde0282006-12-27 23:30:13 -03001337 }
Mike Isely1bde0282006-12-27 23:30:13 -03001338 }
1339}
1340
Mike Iselyd8554972006-06-26 20:58:46 -03001341int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw)
1342{
1343 return hdw->unit_number;
1344}
1345
1346
1347/* Attempt to locate one of the given set of files. Messages are logged
1348 appropriate to what has been found. The return value will be 0 or
1349 greater on success (it will be the index of the file name found) and
1350 fw_entry will be filled in. Otherwise a negative error is returned on
1351 failure. If the return value is -ENOENT then no viable firmware file
1352 could be located. */
1353static int pvr2_locate_firmware(struct pvr2_hdw *hdw,
1354 const struct firmware **fw_entry,
1355 const char *fwtypename,
1356 unsigned int fwcount,
1357 const char *fwnames[])
1358{
1359 unsigned int idx;
1360 int ret = -EINVAL;
1361 for (idx = 0; idx < fwcount; idx++) {
1362 ret = request_firmware(fw_entry,
1363 fwnames[idx],
1364 &hdw->usb_dev->dev);
1365 if (!ret) {
1366 trace_firmware("Located %s firmware: %s;"
1367 " uploading...",
1368 fwtypename,
1369 fwnames[idx]);
1370 return idx;
1371 }
1372 if (ret == -ENOENT) continue;
1373 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1374 "request_firmware fatal error with code=%d",ret);
1375 return ret;
1376 }
1377 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1378 "***WARNING***"
1379 " Device %s firmware"
1380 " seems to be missing.",
1381 fwtypename);
1382 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1383 "Did you install the pvrusb2 firmware files"
1384 " in their proper location?");
1385 if (fwcount == 1) {
1386 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1387 "request_firmware unable to locate %s file %s",
1388 fwtypename,fwnames[0]);
1389 } else {
1390 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1391 "request_firmware unable to locate"
1392 " one of the following %s files:",
1393 fwtypename);
1394 for (idx = 0; idx < fwcount; idx++) {
1395 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1396 "request_firmware: Failed to find %s",
1397 fwnames[idx]);
1398 }
1399 }
1400 return ret;
1401}
1402
1403
1404/*
1405 * pvr2_upload_firmware1().
1406 *
1407 * Send the 8051 firmware to the device. After the upload, arrange for
1408 * device to re-enumerate.
1409 *
1410 * NOTE : the pointer to the firmware data given by request_firmware()
1411 * is not suitable for an usb transaction.
1412 *
1413 */
Adrian Bunk07e337e2006-06-30 11:30:20 -03001414static int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03001415{
Mike Iselya0fd1cb2006-06-30 11:35:28 -03001416 const struct firmware *fw_entry = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03001417 void *fw_ptr;
1418 unsigned int pipe;
1419 int ret;
1420 u16 address;
Mike Isely1d643a32007-09-08 22:18:50 -03001421
Mike Isely989eb152007-11-26 01:53:12 -03001422 if (!hdw->hdw_desc->fx2_firmware.cnt) {
Mike Isely1d643a32007-09-08 22:18:50 -03001423 hdw->fw1_state = FW1_STATE_OK;
Mike Isely56dcbfa2007-11-26 02:00:51 -03001424 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1425 "Connected device type defines"
1426 " no firmware to upload; ignoring firmware");
1427 return -ENOTTY;
Mike Isely1d643a32007-09-08 22:18:50 -03001428 }
1429
Mike Iselyd8554972006-06-26 20:58:46 -03001430 hdw->fw1_state = FW1_STATE_FAILED; // default result
1431
1432 trace_firmware("pvr2_upload_firmware1");
1433
1434 ret = pvr2_locate_firmware(hdw,&fw_entry,"fx2 controller",
Mike Isely989eb152007-11-26 01:53:12 -03001435 hdw->hdw_desc->fx2_firmware.cnt,
1436 hdw->hdw_desc->fx2_firmware.lst);
Mike Iselyd8554972006-06-26 20:58:46 -03001437 if (ret < 0) {
1438 if (ret == -ENOENT) hdw->fw1_state = FW1_STATE_MISSING;
1439 return ret;
1440 }
1441
1442 usb_settoggle(hdw->usb_dev, 0 & 0xf, !(0 & USB_DIR_IN), 0);
1443 usb_clear_halt(hdw->usb_dev, usb_sndbulkpipe(hdw->usb_dev, 0 & 0x7f));
1444
1445 pipe = usb_sndctrlpipe(hdw->usb_dev, 0);
1446
1447 if (fw_entry->size != 0x2000){
1448 pvr2_trace(PVR2_TRACE_ERROR_LEGS,"wrong fx2 firmware size");
1449 release_firmware(fw_entry);
1450 return -ENOMEM;
1451 }
1452
1453 fw_ptr = kmalloc(0x800, GFP_KERNEL);
1454 if (fw_ptr == NULL){
1455 release_firmware(fw_entry);
1456 return -ENOMEM;
1457 }
1458
1459 /* We have to hold the CPU during firmware upload. */
1460 pvr2_hdw_cpureset_assert(hdw,1);
1461
1462 /* upload the firmware to address 0000-1fff in 2048 (=0x800) bytes
1463 chunk. */
1464
1465 ret = 0;
1466 for(address = 0; address < fw_entry->size; address += 0x800) {
1467 memcpy(fw_ptr, fw_entry->data + address, 0x800);
1468 ret += usb_control_msg(hdw->usb_dev, pipe, 0xa0, 0x40, address,
1469 0, fw_ptr, 0x800, HZ);
1470 }
1471
1472 trace_firmware("Upload done, releasing device's CPU");
1473
1474 /* Now release the CPU. It will disconnect and reconnect later. */
1475 pvr2_hdw_cpureset_assert(hdw,0);
1476
1477 kfree(fw_ptr);
1478 release_firmware(fw_entry);
1479
1480 trace_firmware("Upload done (%d bytes sent)",ret);
1481
1482 /* We should have written 8192 bytes */
1483 if (ret == 8192) {
1484 hdw->fw1_state = FW1_STATE_RELOAD;
1485 return 0;
1486 }
1487
1488 return -EIO;
1489}
1490
1491
1492/*
1493 * pvr2_upload_firmware2()
1494 *
1495 * This uploads encoder firmware on endpoint 2.
1496 *
1497 */
1498
1499int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
1500{
Mike Iselya0fd1cb2006-06-30 11:35:28 -03001501 const struct firmware *fw_entry = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03001502 void *fw_ptr;
Mike Isely90060d32007-02-08 02:02:53 -03001503 unsigned int pipe, fw_len, fw_done, bcnt, icnt;
Mike Iselyd8554972006-06-26 20:58:46 -03001504 int actual_length;
1505 int ret = 0;
1506 int fwidx;
1507 static const char *fw_files[] = {
1508 CX2341X_FIRM_ENC_FILENAME,
1509 };
1510
Mike Isely989eb152007-11-26 01:53:12 -03001511 if (hdw->hdw_desc->flag_skip_cx23416_firmware) {
Mike Isely1d643a32007-09-08 22:18:50 -03001512 return 0;
1513 }
1514
Mike Iselyd8554972006-06-26 20:58:46 -03001515 trace_firmware("pvr2_upload_firmware2");
1516
1517 ret = pvr2_locate_firmware(hdw,&fw_entry,"encoder",
Ahmed S. Darwisheca8ebf2007-01-20 00:35:03 -03001518 ARRAY_SIZE(fw_files), fw_files);
Mike Iselyd8554972006-06-26 20:58:46 -03001519 if (ret < 0) return ret;
1520 fwidx = ret;
1521 ret = 0;
Mike Iselyb30d2442006-06-25 20:05:01 -03001522 /* Since we're about to completely reinitialize the encoder,
1523 invalidate our cached copy of its configuration state. Next
1524 time we configure the encoder, then we'll fully configure it. */
1525 hdw->enc_cur_valid = 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001526
Mike Iselyd913d632008-04-06 04:04:35 -03001527 /* Encoder is about to be reset so note that as far as we're
1528 concerned now, the encoder has never been run. */
1529 del_timer_sync(&hdw->encoder_run_timer);
1530 if (hdw->state_encoder_runok) {
1531 hdw->state_encoder_runok = 0;
1532 trace_stbit("state_encoder_runok",hdw->state_encoder_runok);
1533 }
1534
Mike Iselyd8554972006-06-26 20:58:46 -03001535 /* First prepare firmware loading */
1536 ret |= pvr2_write_register(hdw, 0x0048, 0xffffffff); /*interrupt mask*/
1537 ret |= pvr2_hdw_gpio_chg_dir(hdw,0xffffffff,0x00000088); /*gpio dir*/
1538 ret |= pvr2_hdw_gpio_chg_out(hdw,0xffffffff,0x00000008); /*gpio output state*/
1539 ret |= pvr2_hdw_cmd_deep_reset(hdw);
1540 ret |= pvr2_write_register(hdw, 0xa064, 0x00000000); /*APU command*/
1541 ret |= pvr2_hdw_gpio_chg_dir(hdw,0xffffffff,0x00000408); /*gpio dir*/
1542 ret |= pvr2_hdw_gpio_chg_out(hdw,0xffffffff,0x00000008); /*gpio output state*/
1543 ret |= pvr2_write_register(hdw, 0x9058, 0xffffffed); /*VPU ctrl*/
1544 ret |= pvr2_write_register(hdw, 0x9054, 0xfffffffd); /*reset hw blocks*/
1545 ret |= pvr2_write_register(hdw, 0x07f8, 0x80000800); /*encoder SDRAM refresh*/
1546 ret |= pvr2_write_register(hdw, 0x07fc, 0x0000001a); /*encoder SDRAM pre-charge*/
1547 ret |= pvr2_write_register(hdw, 0x0700, 0x00000000); /*I2C clock*/
1548 ret |= pvr2_write_register(hdw, 0xaa00, 0x00000000); /*unknown*/
1549 ret |= pvr2_write_register(hdw, 0xaa04, 0x00057810); /*unknown*/
1550 ret |= pvr2_write_register(hdw, 0xaa10, 0x00148500); /*unknown*/
1551 ret |= pvr2_write_register(hdw, 0xaa18, 0x00840000); /*unknown*/
Mike Isely1c9d10d2008-03-28 05:38:54 -03001552 ret |= pvr2_issue_simple_cmd(hdw,FX2CMD_FWPOST1);
1553 ret |= pvr2_issue_simple_cmd(hdw,FX2CMD_MEMSEL | (1 << 8) | (0 << 16));
Mike Iselyd8554972006-06-26 20:58:46 -03001554
1555 if (ret) {
1556 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1557 "firmware2 upload prep failed, ret=%d",ret);
1558 release_firmware(fw_entry);
Mike Isely21684ba2008-04-21 03:49:33 -03001559 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001560 }
1561
1562 /* Now send firmware */
1563
1564 fw_len = fw_entry->size;
1565
Mike Isely90060d32007-02-08 02:02:53 -03001566 if (fw_len % sizeof(u32)) {
Mike Iselyd8554972006-06-26 20:58:46 -03001567 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1568 "size of %s firmware"
Mike Isely48dc30a2007-03-03 10:13:05 -02001569 " must be a multiple of %zu bytes",
Mike Isely90060d32007-02-08 02:02:53 -03001570 fw_files[fwidx],sizeof(u32));
Mike Iselyd8554972006-06-26 20:58:46 -03001571 release_firmware(fw_entry);
Mike Isely21684ba2008-04-21 03:49:33 -03001572 ret = -EINVAL;
1573 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001574 }
1575
1576 fw_ptr = kmalloc(FIRMWARE_CHUNK_SIZE, GFP_KERNEL);
1577 if (fw_ptr == NULL){
1578 release_firmware(fw_entry);
1579 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1580 "failed to allocate memory for firmware2 upload");
Mike Isely21684ba2008-04-21 03:49:33 -03001581 ret = -ENOMEM;
1582 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001583 }
1584
1585 pipe = usb_sndbulkpipe(hdw->usb_dev, PVR2_FIRMWARE_ENDPOINT);
1586
Mike Isely90060d32007-02-08 02:02:53 -03001587 fw_done = 0;
1588 for (fw_done = 0; fw_done < fw_len;) {
1589 bcnt = fw_len - fw_done;
1590 if (bcnt > FIRMWARE_CHUNK_SIZE) bcnt = FIRMWARE_CHUNK_SIZE;
1591 memcpy(fw_ptr, fw_entry->data + fw_done, bcnt);
1592 /* Usbsnoop log shows that we must swap bytes... */
Mike Isely5f33df12008-08-30 15:09:31 -03001593 /* Some background info: The data being swapped here is a
1594 firmware image destined for the mpeg encoder chip that
1595 lives at the other end of a USB endpoint. The encoder
1596 chip always talks in 32 bit chunks and its storage is
1597 organized into 32 bit words. However from the file
1598 system to the encoder chip everything is purely a byte
1599 stream. The firmware file's contents are always 32 bit
1600 swapped from what the encoder expects. Thus the need
1601 always exists to swap the bytes regardless of the endian
1602 type of the host processor and therefore swab32() makes
1603 the most sense. */
Mike Isely90060d32007-02-08 02:02:53 -03001604 for (icnt = 0; icnt < bcnt/4 ; icnt++)
Harvey Harrison513edce2008-08-18 17:38:01 -03001605 ((u32 *)fw_ptr)[icnt] = swab32(((u32 *)fw_ptr)[icnt]);
Mike Iselyd8554972006-06-26 20:58:46 -03001606
Mike Isely90060d32007-02-08 02:02:53 -03001607 ret |= usb_bulk_msg(hdw->usb_dev, pipe, fw_ptr,bcnt,
Mike Iselyd8554972006-06-26 20:58:46 -03001608 &actual_length, HZ);
Mike Isely90060d32007-02-08 02:02:53 -03001609 ret |= (actual_length != bcnt);
1610 if (ret) break;
1611 fw_done += bcnt;
Mike Iselyd8554972006-06-26 20:58:46 -03001612 }
1613
1614 trace_firmware("upload of %s : %i / %i ",
1615 fw_files[fwidx],fw_done,fw_len);
1616
1617 kfree(fw_ptr);
1618 release_firmware(fw_entry);
1619
1620 if (ret) {
1621 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1622 "firmware2 upload transfer failure");
Mike Isely21684ba2008-04-21 03:49:33 -03001623 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001624 }
1625
1626 /* Finish upload */
1627
1628 ret |= pvr2_write_register(hdw, 0x9054, 0xffffffff); /*reset hw blocks*/
1629 ret |= pvr2_write_register(hdw, 0x9058, 0xffffffe8); /*VPU ctrl*/
Mike Isely1c9d10d2008-03-28 05:38:54 -03001630 ret |= pvr2_issue_simple_cmd(hdw,FX2CMD_MEMSEL | (1 << 8) | (0 << 16));
Mike Iselyd8554972006-06-26 20:58:46 -03001631
1632 if (ret) {
1633 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1634 "firmware2 upload post-proc failure");
Mike Iselyd8554972006-06-26 20:58:46 -03001635 }
Mike Isely21684ba2008-04-21 03:49:33 -03001636
1637 done:
Mike Isely1df59f02008-04-21 03:50:39 -03001638 if (hdw->hdw_desc->signal_routing_scheme ==
1639 PVR2_ROUTING_SCHEME_GOTVIEW) {
1640 /* Ensure that GPIO 11 is set to output for GOTVIEW
1641 hardware. */
1642 pvr2_hdw_gpio_chg_dir(hdw,(1 << 11),~0);
1643 }
Mike Iselyd8554972006-06-26 20:58:46 -03001644 return ret;
1645}
1646
1647
Mike Isely681c7392007-11-26 01:48:52 -03001648static const char *pvr2_get_state_name(unsigned int st)
Mike Iselyd8554972006-06-26 20:58:46 -03001649{
Mike Isely681c7392007-11-26 01:48:52 -03001650 if (st < ARRAY_SIZE(pvr2_state_names)) {
1651 return pvr2_state_names[st];
Mike Iselyd8554972006-06-26 20:58:46 -03001652 }
Mike Isely681c7392007-11-26 01:48:52 -03001653 return "???";
Mike Iselyd8554972006-06-26 20:58:46 -03001654}
1655
Mike Isely681c7392007-11-26 01:48:52 -03001656static int pvr2_decoder_enable(struct pvr2_hdw *hdw,int enablefl)
Mike Iselyd8554972006-06-26 20:58:46 -03001657{
Mike Iselyaf78e162009-03-07 00:21:30 -03001658 if (hdw->decoder_ctrl) {
1659 hdw->decoder_ctrl->enable(hdw->decoder_ctrl->ctxt, enablefl);
1660 return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001661 }
Mike Iselyaf78e162009-03-07 00:21:30 -03001662 /* Even though we really only care about the video decoder chip at
1663 this point, we'll broadcast stream on/off to all sub-devices
1664 anyway, just in case somebody else wants to hear the
1665 command... */
1666 v4l2_device_call_all(&hdw->v4l2_dev, 0, video, s_stream, enablefl);
1667 if (hdw->decoder_client_id) {
1668 /* We get here if the encoder has been noticed. Otherwise
1669 we'll issue a warning to the user (which should
1670 normally never happen). */
1671 return 0;
1672 }
1673 if (!hdw->flag_decoder_missed) {
1674 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1675 "WARNING: No decoder present");
1676 hdw->flag_decoder_missed = !0;
1677 trace_stbit("flag_decoder_missed",
1678 hdw->flag_decoder_missed);
1679 }
1680 return -EIO;
Mike Iselyd8554972006-06-26 20:58:46 -03001681}
1682
1683
Mike Isely681c7392007-11-26 01:48:52 -03001684void pvr2_hdw_set_decoder(struct pvr2_hdw *hdw,struct pvr2_decoder_ctrl *ptr)
1685{
1686 if (hdw->decoder_ctrl == ptr) return;
1687 hdw->decoder_ctrl = ptr;
1688 if (hdw->decoder_ctrl && hdw->flag_decoder_missed) {
1689 hdw->flag_decoder_missed = 0;
1690 trace_stbit("flag_decoder_missed",
1691 hdw->flag_decoder_missed);
1692 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1693 "Decoder has appeared");
1694 pvr2_hdw_state_sched(hdw);
1695 }
1696}
1697
1698
1699int pvr2_hdw_get_state(struct pvr2_hdw *hdw)
1700{
1701 return hdw->master_state;
1702}
1703
1704
1705static int pvr2_hdw_untrip_unlocked(struct pvr2_hdw *hdw)
1706{
1707 if (!hdw->flag_tripped) return 0;
1708 hdw->flag_tripped = 0;
1709 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1710 "Clearing driver error statuss");
1711 return !0;
1712}
1713
1714
1715int pvr2_hdw_untrip(struct pvr2_hdw *hdw)
1716{
1717 int fl;
1718 LOCK_TAKE(hdw->big_lock); do {
1719 fl = pvr2_hdw_untrip_unlocked(hdw);
1720 } while (0); LOCK_GIVE(hdw->big_lock);
1721 if (fl) pvr2_hdw_state_sched(hdw);
1722 return 0;
1723}
1724
1725
Mike Isely681c7392007-11-26 01:48:52 -03001726
1727
Mike Iselyd8554972006-06-26 20:58:46 -03001728int pvr2_hdw_get_streaming(struct pvr2_hdw *hdw)
1729{
Mike Isely681c7392007-11-26 01:48:52 -03001730 return hdw->state_pipeline_req != 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001731}
1732
1733
1734int pvr2_hdw_set_streaming(struct pvr2_hdw *hdw,int enable_flag)
1735{
Mike Isely681c7392007-11-26 01:48:52 -03001736 int ret,st;
Mike Iselyd8554972006-06-26 20:58:46 -03001737 LOCK_TAKE(hdw->big_lock); do {
Mike Isely681c7392007-11-26 01:48:52 -03001738 pvr2_hdw_untrip_unlocked(hdw);
1739 if ((!enable_flag) != !(hdw->state_pipeline_req)) {
1740 hdw->state_pipeline_req = enable_flag != 0;
1741 pvr2_trace(PVR2_TRACE_START_STOP,
1742 "/*--TRACE_STREAM--*/ %s",
1743 enable_flag ? "enable" : "disable");
1744 }
1745 pvr2_hdw_state_sched(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03001746 } while (0); LOCK_GIVE(hdw->big_lock);
Mike Isely681c7392007-11-26 01:48:52 -03001747 if ((ret = pvr2_hdw_wait(hdw,0)) < 0) return ret;
1748 if (enable_flag) {
1749 while ((st = hdw->master_state) != PVR2_STATE_RUN) {
1750 if (st != PVR2_STATE_READY) return -EIO;
1751 if ((ret = pvr2_hdw_wait(hdw,st)) < 0) return ret;
1752 }
1753 }
Mike Iselyd8554972006-06-26 20:58:46 -03001754 return 0;
1755}
1756
1757
1758int pvr2_hdw_set_stream_type(struct pvr2_hdw *hdw,enum pvr2_config config)
1759{
Mike Isely681c7392007-11-26 01:48:52 -03001760 int fl;
Mike Iselyd8554972006-06-26 20:58:46 -03001761 LOCK_TAKE(hdw->big_lock);
Mike Isely681c7392007-11-26 01:48:52 -03001762 if ((fl = (hdw->desired_stream_type != config)) != 0) {
1763 hdw->desired_stream_type = config;
1764 hdw->state_pipeline_config = 0;
1765 trace_stbit("state_pipeline_config",
1766 hdw->state_pipeline_config);
1767 pvr2_hdw_state_sched(hdw);
1768 }
Mike Iselyd8554972006-06-26 20:58:46 -03001769 LOCK_GIVE(hdw->big_lock);
Mike Isely681c7392007-11-26 01:48:52 -03001770 if (fl) return 0;
1771 return pvr2_hdw_wait(hdw,0);
Mike Iselyd8554972006-06-26 20:58:46 -03001772}
1773
1774
1775static int get_default_tuner_type(struct pvr2_hdw *hdw)
1776{
1777 int unit_number = hdw->unit_number;
1778 int tp = -1;
1779 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1780 tp = tuner[unit_number];
1781 }
1782 if (tp < 0) return -EINVAL;
1783 hdw->tuner_type = tp;
Mike Iselyaaf78842007-11-26 02:04:11 -03001784 hdw->tuner_updated = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03001785 return 0;
1786}
1787
1788
1789static v4l2_std_id get_default_standard(struct pvr2_hdw *hdw)
1790{
1791 int unit_number = hdw->unit_number;
1792 int tp = 0;
1793 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1794 tp = video_std[unit_number];
Mike Isely6a540252007-12-02 23:51:34 -03001795 if (tp) return tp;
Mike Iselyd8554972006-06-26 20:58:46 -03001796 }
Mike Isely6a540252007-12-02 23:51:34 -03001797 return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001798}
1799
1800
1801static unsigned int get_default_error_tolerance(struct pvr2_hdw *hdw)
1802{
1803 int unit_number = hdw->unit_number;
1804 int tp = 0;
1805 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1806 tp = tolerance[unit_number];
1807 }
1808 return tp;
1809}
1810
1811
1812static int pvr2_hdw_check_firmware(struct pvr2_hdw *hdw)
1813{
1814 /* Try a harmless request to fetch the eeprom's address over
1815 endpoint 1. See what happens. Only the full FX2 image can
1816 respond to this. If this probe fails then likely the FX2
1817 firmware needs be loaded. */
1818 int result;
1819 LOCK_TAKE(hdw->ctl_lock); do {
Michael Krufky8d364362007-01-22 02:17:55 -03001820 hdw->cmd_buffer[0] = FX2CMD_GET_EEPROM_ADDR;
Mike Iselyd8554972006-06-26 20:58:46 -03001821 result = pvr2_send_request_ex(hdw,HZ*1,!0,
1822 hdw->cmd_buffer,1,
1823 hdw->cmd_buffer,1);
1824 if (result < 0) break;
1825 } while(0); LOCK_GIVE(hdw->ctl_lock);
1826 if (result) {
1827 pvr2_trace(PVR2_TRACE_INIT,
1828 "Probe of device endpoint 1 result status %d",
1829 result);
1830 } else {
1831 pvr2_trace(PVR2_TRACE_INIT,
1832 "Probe of device endpoint 1 succeeded");
1833 }
1834 return result == 0;
1835}
1836
Mike Isely9f66d4e2007-09-08 22:28:51 -03001837struct pvr2_std_hack {
1838 v4l2_std_id pat; /* Pattern to match */
1839 v4l2_std_id msk; /* Which bits we care about */
1840 v4l2_std_id std; /* What additional standards or default to set */
1841};
1842
1843/* This data structure labels specific combinations of standards from
1844 tveeprom that we'll try to recognize. If we recognize one, then assume
1845 a specified default standard to use. This is here because tveeprom only
1846 tells us about available standards not the intended default standard (if
1847 any) for the device in question. We guess the default based on what has
1848 been reported as available. Note that this is only for guessing a
1849 default - which can always be overridden explicitly - and if the user
1850 has otherwise named a default then that default will always be used in
1851 place of this table. */
Tobias Klauserebff0332008-04-22 14:45:45 -03001852static const struct pvr2_std_hack std_eeprom_maps[] = {
Mike Isely9f66d4e2007-09-08 22:28:51 -03001853 { /* PAL(B/G) */
1854 .pat = V4L2_STD_B|V4L2_STD_GH,
1855 .std = V4L2_STD_PAL_B|V4L2_STD_PAL_B1|V4L2_STD_PAL_G,
1856 },
1857 { /* NTSC(M) */
1858 .pat = V4L2_STD_MN,
1859 .std = V4L2_STD_NTSC_M,
1860 },
1861 { /* PAL(I) */
1862 .pat = V4L2_STD_PAL_I,
1863 .std = V4L2_STD_PAL_I,
1864 },
1865 { /* SECAM(L/L') */
1866 .pat = V4L2_STD_SECAM_L|V4L2_STD_SECAM_LC,
1867 .std = V4L2_STD_SECAM_L|V4L2_STD_SECAM_LC,
1868 },
1869 { /* PAL(D/D1/K) */
1870 .pat = V4L2_STD_DK,
Roel Kluinea2562d2007-12-02 23:04:57 -03001871 .std = V4L2_STD_PAL_D|V4L2_STD_PAL_D1|V4L2_STD_PAL_K,
Mike Isely9f66d4e2007-09-08 22:28:51 -03001872 },
1873};
1874
Mike Iselyd8554972006-06-26 20:58:46 -03001875static void pvr2_hdw_setup_std(struct pvr2_hdw *hdw)
1876{
1877 char buf[40];
1878 unsigned int bcnt;
Mike Isely3d290bd2007-12-03 01:47:12 -03001879 v4l2_std_id std1,std2,std3;
Mike Iselyd8554972006-06-26 20:58:46 -03001880
1881 std1 = get_default_standard(hdw);
Mike Isely3d290bd2007-12-03 01:47:12 -03001882 std3 = std1 ? 0 : hdw->hdw_desc->default_std_mask;
Mike Iselyd8554972006-06-26 20:58:46 -03001883
1884 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),hdw->std_mask_eeprom);
Mike Isely56585382007-09-08 22:32:12 -03001885 pvr2_trace(PVR2_TRACE_STD,
Mike Isely56dcbfa2007-11-26 02:00:51 -03001886 "Supported video standard(s) reported available"
1887 " in hardware: %.*s",
Mike Iselyd8554972006-06-26 20:58:46 -03001888 bcnt,buf);
1889
1890 hdw->std_mask_avail = hdw->std_mask_eeprom;
1891
Mike Isely3d290bd2007-12-03 01:47:12 -03001892 std2 = (std1|std3) & ~hdw->std_mask_avail;
Mike Iselyd8554972006-06-26 20:58:46 -03001893 if (std2) {
1894 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std2);
Mike Isely56585382007-09-08 22:32:12 -03001895 pvr2_trace(PVR2_TRACE_STD,
Mike Iselyd8554972006-06-26 20:58:46 -03001896 "Expanding supported video standards"
1897 " to include: %.*s",
1898 bcnt,buf);
1899 hdw->std_mask_avail |= std2;
1900 }
1901
1902 pvr2_hdw_internal_set_std_avail(hdw);
1903
1904 if (std1) {
1905 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std1);
Mike Isely56585382007-09-08 22:32:12 -03001906 pvr2_trace(PVR2_TRACE_STD,
Mike Iselyd8554972006-06-26 20:58:46 -03001907 "Initial video standard forced to %.*s",
1908 bcnt,buf);
1909 hdw->std_mask_cur = std1;
1910 hdw->std_dirty = !0;
1911 pvr2_hdw_internal_find_stdenum(hdw);
1912 return;
1913 }
Mike Isely3d290bd2007-12-03 01:47:12 -03001914 if (std3) {
1915 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std3);
1916 pvr2_trace(PVR2_TRACE_STD,
1917 "Initial video standard"
1918 " (determined by device type): %.*s",bcnt,buf);
1919 hdw->std_mask_cur = std3;
1920 hdw->std_dirty = !0;
1921 pvr2_hdw_internal_find_stdenum(hdw);
1922 return;
1923 }
Mike Iselyd8554972006-06-26 20:58:46 -03001924
Mike Isely9f66d4e2007-09-08 22:28:51 -03001925 {
1926 unsigned int idx;
1927 for (idx = 0; idx < ARRAY_SIZE(std_eeprom_maps); idx++) {
1928 if (std_eeprom_maps[idx].msk ?
1929 ((std_eeprom_maps[idx].pat ^
1930 hdw->std_mask_eeprom) &
1931 std_eeprom_maps[idx].msk) :
1932 (std_eeprom_maps[idx].pat !=
1933 hdw->std_mask_eeprom)) continue;
1934 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),
1935 std_eeprom_maps[idx].std);
Mike Isely56585382007-09-08 22:32:12 -03001936 pvr2_trace(PVR2_TRACE_STD,
Mike Isely9f66d4e2007-09-08 22:28:51 -03001937 "Initial video standard guessed as %.*s",
1938 bcnt,buf);
1939 hdw->std_mask_cur = std_eeprom_maps[idx].std;
1940 hdw->std_dirty = !0;
1941 pvr2_hdw_internal_find_stdenum(hdw);
1942 return;
1943 }
1944 }
1945
Mike Iselyd8554972006-06-26 20:58:46 -03001946 if (hdw->std_enum_cnt > 1) {
1947 // Autoselect the first listed standard
1948 hdw->std_enum_cur = 1;
1949 hdw->std_mask_cur = hdw->std_defs[hdw->std_enum_cur-1].id;
1950 hdw->std_dirty = !0;
Mike Isely56585382007-09-08 22:32:12 -03001951 pvr2_trace(PVR2_TRACE_STD,
Mike Iselyd8554972006-06-26 20:58:46 -03001952 "Initial video standard auto-selected to %s",
1953 hdw->std_defs[hdw->std_enum_cur-1].name);
1954 return;
1955 }
1956
Mike Isely0885ba12006-06-25 21:30:47 -03001957 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Iselyd8554972006-06-26 20:58:46 -03001958 "Unable to select a viable initial video standard");
1959}
1960
1961
Mike Iselye9c64a72009-03-06 23:42:20 -03001962static unsigned int pvr2_copy_i2c_addr_list(
1963 unsigned short *dst, const unsigned char *src,
1964 unsigned int dst_max)
1965{
1966 unsigned int cnt;
1967 if (!src) return 0;
1968 while (src[cnt] && (cnt + 1) < dst_max) {
1969 dst[cnt] = src[cnt];
1970 cnt++;
1971 }
1972 dst[cnt] = I2C_CLIENT_END;
1973 return cnt;
1974}
1975
1976
1977static void pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
1978 const struct pvr2_device_client_desc *cd)
1979{
1980 const char *fname;
1981 unsigned char mid;
1982 struct v4l2_subdev *sd;
1983 unsigned int i2ccnt;
1984 const unsigned char *p;
1985 /* Arbitrary count - max # i2c addresses we will probe */
1986 unsigned short i2caddr[25];
1987
1988 mid = cd->module_id;
1989 fname = (mid < ARRAY_SIZE(module_names)) ? module_names[mid] : NULL;
1990 if (!fname) {
1991 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1992 "Module ID %u for device %s is unknown"
1993 " (this is probably a bad thing...)",
1994 mid,
1995 hdw->hdw_desc->description);
1996 return;
1997 }
1998
1999 i2ccnt = pvr2_copy_i2c_addr_list(i2caddr, cd->i2c_address_list,
2000 ARRAY_SIZE(i2caddr));
2001 if (!i2ccnt && ((p = (mid < ARRAY_SIZE(module_i2c_addresses)) ?
2002 module_i2c_addresses[mid] : NULL) != NULL)) {
2003 /* Second chance: Try default i2c address list */
2004 i2ccnt = pvr2_copy_i2c_addr_list(i2caddr, p,
2005 ARRAY_SIZE(i2caddr));
2006 }
2007
2008 if (!i2ccnt) {
2009 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2010 "Module ID %u for device %s:"
2011 " No i2c addresses"
2012 " (this is probably a bad thing...)",
2013 mid, hdw->hdw_desc->description);
2014 return;
2015 }
2016
2017 /* Note how the 2nd and 3rd arguments are the same for both
2018 * v4l2_i2c_new_subdev() and v4l2_i2c_new_probed_subdev(). Why?
2019 * Well the 2nd argument is the module name to load, while the 3rd
2020 * argument is documented in the framework as being the "chipid" -
2021 * and every other place where I can find examples of this, the
2022 * "chipid" appears to just be the module name again. So here we
2023 * just do the same thing. */
2024 if (i2ccnt == 1) {
2025 sd = v4l2_i2c_new_subdev(&hdw->i2c_adap,
2026 fname, fname,
2027 i2caddr[0]);
2028 } else {
2029 sd = v4l2_i2c_new_probed_subdev(&hdw->i2c_adap,
2030 fname, fname,
2031 i2caddr);
2032 }
2033
Mike Isely446dfdc2009-03-06 23:58:15 -03002034 if (!sd) {
2035 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2036 "Module ID %u for device %s failed to load"
2037 " (this is probably a bad thing...)",
2038 mid, hdw->hdw_desc->description);
2039 return;
2040 }
2041
2042 /* Tag this sub-device instance with the module ID we know about.
2043 In other places we'll use that tag to determine if the instance
2044 requires special handling. */
2045 sd->grp_id = mid;
2046
Mike Iselya932f502009-03-06 23:47:10 -03002047 /* If we have both old and new i2c layers enabled, make sure that
2048 old layer isn't also tracking this module. This is a debugging
2049 aid, in normal situations there's no reason for both mechanisms
2050 to be enabled. */
2051 pvr2_i2c_untrack_subdev(hdw, sd);
Mike Isely446dfdc2009-03-06 23:58:15 -03002052 pvr2_trace(PVR2_TRACE_INIT, "Attached sub-driver %s", fname);
Mike Iselya932f502009-03-06 23:47:10 -03002053
Mike Iselye9c64a72009-03-06 23:42:20 -03002054
Mike Isely00e5f732009-03-07 00:17:11 -03002055 /* client-specific setup... */
2056 switch (mid) {
2057 case PVR2_CLIENT_ID_CX25840:
2058 hdw->decoder_client_id = mid;
2059 {
2060 /*
2061 Mike Isely <isely@pobox.com> 19-Nov-2006 - This
2062 bit of nuttiness for cx25840 causes that module
2063 to correctly set up its video scaling. This is
2064 really a problem in the cx25840 module itself,
2065 but we work around it here. The problem has not
2066 been seen in ivtv because there VBI is supported
2067 and set up. We don't do VBI here (at least not
2068 yet) and thus we never attempted to even set it
2069 up.
2070 */
2071 struct v4l2_format fmt;
2072 memset(&fmt, 0, sizeof(fmt));
2073 fmt.type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
2074 v4l2_device_call_all(&hdw->v4l2_dev, mid,
2075 video, s_fmt, &fmt);
2076 }
2077 break;
2078 case PVR2_CLIENT_ID_SAA7115:
2079 hdw->decoder_client_id = mid;
2080 break;
2081 default: break;
2082 }
Mike Iselye9c64a72009-03-06 23:42:20 -03002083}
2084
2085
2086static void pvr2_hdw_load_modules(struct pvr2_hdw *hdw)
2087{
2088 unsigned int idx;
2089 const struct pvr2_string_table *cm;
2090 const struct pvr2_device_client_table *ct;
2091
2092 cm = &hdw->hdw_desc->client_modules;
2093 for (idx = 0; idx < cm->cnt; idx++) {
2094 request_module(cm->lst[idx]);
2095 }
2096
2097 ct = &hdw->hdw_desc->client_table;
2098 for (idx = 0; idx < ct->cnt; idx++) {
2099 pvr2_hdw_load_subdev(hdw,&ct->lst[idx]);
2100 }
2101}
2102
2103
Mike Iselyd8554972006-06-26 20:58:46 -03002104static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
2105{
2106 int ret;
2107 unsigned int idx;
2108 struct pvr2_ctrl *cptr;
2109 int reloadFl = 0;
Mike Isely989eb152007-11-26 01:53:12 -03002110 if (hdw->hdw_desc->fx2_firmware.cnt) {
Mike Isely1d643a32007-09-08 22:18:50 -03002111 if (!reloadFl) {
2112 reloadFl =
2113 (hdw->usb_intf->cur_altsetting->desc.bNumEndpoints
2114 == 0);
2115 if (reloadFl) {
2116 pvr2_trace(PVR2_TRACE_INIT,
2117 "USB endpoint config looks strange"
2118 "; possibly firmware needs to be"
2119 " loaded");
2120 }
2121 }
2122 if (!reloadFl) {
2123 reloadFl = !pvr2_hdw_check_firmware(hdw);
2124 if (reloadFl) {
2125 pvr2_trace(PVR2_TRACE_INIT,
2126 "Check for FX2 firmware failed"
2127 "; possibly firmware needs to be"
2128 " loaded");
2129 }
2130 }
Mike Iselyd8554972006-06-26 20:58:46 -03002131 if (reloadFl) {
Mike Isely1d643a32007-09-08 22:18:50 -03002132 if (pvr2_upload_firmware1(hdw) != 0) {
2133 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2134 "Failure uploading firmware1");
2135 }
2136 return;
Mike Iselyd8554972006-06-26 20:58:46 -03002137 }
2138 }
Mike Iselyd8554972006-06-26 20:58:46 -03002139 hdw->fw1_state = FW1_STATE_OK;
2140
Mike Iselyd8554972006-06-26 20:58:46 -03002141 if (!pvr2_hdw_dev_ok(hdw)) return;
2142
Mike Isely989eb152007-11-26 01:53:12 -03002143 if (!hdw->hdw_desc->flag_no_powerup) {
Mike Isely1d643a32007-09-08 22:18:50 -03002144 pvr2_hdw_cmd_powerup(hdw);
2145 if (!pvr2_hdw_dev_ok(hdw)) return;
Mike Iselyd8554972006-06-26 20:58:46 -03002146 }
2147
Mike Isely31335b12008-07-25 19:35:31 -03002148 /* Take the IR chip out of reset, if appropriate */
2149 if (hdw->hdw_desc->ir_scheme == PVR2_IR_SCHEME_ZILOG) {
2150 pvr2_issue_simple_cmd(hdw,
2151 FX2CMD_HCW_ZILOG_RESET |
2152 (1 << 8) |
2153 ((0) << 16));
2154 }
2155
Mike Iselyd8554972006-06-26 20:58:46 -03002156 // This step MUST happen after the earlier powerup step.
Mike Isely59af3362009-03-07 03:06:09 -03002157 pvr2_i2c_track_init(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002158 pvr2_i2c_core_init(hdw);
2159 if (!pvr2_hdw_dev_ok(hdw)) return;
2160
Mike Iselye9c64a72009-03-06 23:42:20 -03002161 pvr2_hdw_load_modules(hdw);
2162
Mike Iselyc05c0462006-06-25 20:04:25 -03002163 for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002164 cptr = hdw->controls + idx;
2165 if (cptr->info->skip_init) continue;
2166 if (!cptr->info->set_value) continue;
2167 cptr->info->set_value(cptr,~0,cptr->info->default_value);
2168 }
2169
Mike Isely1bde0282006-12-27 23:30:13 -03002170 /* Set up special default values for the television and radio
2171 frequencies here. It's not really important what these defaults
2172 are, but I set them to something usable in the Chicago area just
2173 to make driver testing a little easier. */
2174
Michael Krufky5a4f5da62008-05-11 16:37:50 -03002175 hdw->freqValTelevision = default_tv_freq;
2176 hdw->freqValRadio = default_radio_freq;
Mike Isely1bde0282006-12-27 23:30:13 -03002177
Mike Iselyd8554972006-06-26 20:58:46 -03002178 // Do not use pvr2_reset_ctl_endpoints() here. It is not
2179 // thread-safe against the normal pvr2_send_request() mechanism.
2180 // (We should make it thread safe).
2181
Mike Iselyaaf78842007-11-26 02:04:11 -03002182 if (hdw->hdw_desc->flag_has_hauppauge_rom) {
2183 ret = pvr2_hdw_get_eeprom_addr(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002184 if (!pvr2_hdw_dev_ok(hdw)) return;
Mike Iselyaaf78842007-11-26 02:04:11 -03002185 if (ret < 0) {
2186 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2187 "Unable to determine location of eeprom,"
2188 " skipping");
2189 } else {
2190 hdw->eeprom_addr = ret;
2191 pvr2_eeprom_analyze(hdw);
2192 if (!pvr2_hdw_dev_ok(hdw)) return;
2193 }
2194 } else {
2195 hdw->tuner_type = hdw->hdw_desc->default_tuner_type;
2196 hdw->tuner_updated = !0;
2197 hdw->std_mask_eeprom = V4L2_STD_ALL;
Mike Iselyd8554972006-06-26 20:58:46 -03002198 }
2199
Mike Isely13a88792009-01-14 04:22:56 -03002200 if (hdw->serial_number) {
2201 idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
2202 "sn-%lu", hdw->serial_number);
2203 } else if (hdw->unit_number >= 0) {
2204 idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
2205 "unit-%c",
2206 hdw->unit_number + 'a');
2207 } else {
2208 idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
2209 "unit-??");
2210 }
2211 hdw->identifier[idx] = 0;
2212
Mike Iselyd8554972006-06-26 20:58:46 -03002213 pvr2_hdw_setup_std(hdw);
2214
2215 if (!get_default_tuner_type(hdw)) {
2216 pvr2_trace(PVR2_TRACE_INIT,
2217 "pvr2_hdw_setup: Tuner type overridden to %d",
2218 hdw->tuner_type);
2219 }
2220
Mike Iselyd8554972006-06-26 20:58:46 -03002221 pvr2_i2c_core_check_stale(hdw);
2222 hdw->tuner_updated = 0;
2223
2224 if (!pvr2_hdw_dev_ok(hdw)) return;
2225
Mike Isely1df59f02008-04-21 03:50:39 -03002226 if (hdw->hdw_desc->signal_routing_scheme ==
2227 PVR2_ROUTING_SCHEME_GOTVIEW) {
2228 /* Ensure that GPIO 11 is set to output for GOTVIEW
2229 hardware. */
2230 pvr2_hdw_gpio_chg_dir(hdw,(1 << 11),~0);
2231 }
2232
Mike Isely681c7392007-11-26 01:48:52 -03002233 pvr2_hdw_commit_setup(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002234
2235 hdw->vid_stream = pvr2_stream_create();
2236 if (!pvr2_hdw_dev_ok(hdw)) return;
2237 pvr2_trace(PVR2_TRACE_INIT,
2238 "pvr2_hdw_setup: video stream is %p",hdw->vid_stream);
2239 if (hdw->vid_stream) {
2240 idx = get_default_error_tolerance(hdw);
2241 if (idx) {
2242 pvr2_trace(PVR2_TRACE_INIT,
2243 "pvr2_hdw_setup: video stream %p"
2244 " setting tolerance %u",
2245 hdw->vid_stream,idx);
2246 }
2247 pvr2_stream_setup(hdw->vid_stream,hdw->usb_dev,
2248 PVR2_VID_ENDPOINT,idx);
2249 }
2250
2251 if (!pvr2_hdw_dev_ok(hdw)) return;
2252
Mike Iselyd8554972006-06-26 20:58:46 -03002253 hdw->flag_init_ok = !0;
Mike Isely681c7392007-11-26 01:48:52 -03002254
2255 pvr2_hdw_state_sched(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002256}
2257
2258
Mike Isely681c7392007-11-26 01:48:52 -03002259/* Set up the structure and attempt to put the device into a usable state.
2260 This can be a time-consuming operation, which is why it is not done
2261 internally as part of the create() step. */
2262static void pvr2_hdw_setup(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002263{
2264 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_setup(hdw=%p) begin",hdw);
Mike Isely681c7392007-11-26 01:48:52 -03002265 do {
Mike Iselyd8554972006-06-26 20:58:46 -03002266 pvr2_hdw_setup_low(hdw);
2267 pvr2_trace(PVR2_TRACE_INIT,
2268 "pvr2_hdw_setup(hdw=%p) done, ok=%d init_ok=%d",
Mike Isely681c7392007-11-26 01:48:52 -03002269 hdw,pvr2_hdw_dev_ok(hdw),hdw->flag_init_ok);
Mike Iselyd8554972006-06-26 20:58:46 -03002270 if (pvr2_hdw_dev_ok(hdw)) {
Mike Isely681c7392007-11-26 01:48:52 -03002271 if (hdw->flag_init_ok) {
Mike Iselyd8554972006-06-26 20:58:46 -03002272 pvr2_trace(
2273 PVR2_TRACE_INFO,
2274 "Device initialization"
2275 " completed successfully.");
2276 break;
2277 }
2278 if (hdw->fw1_state == FW1_STATE_RELOAD) {
2279 pvr2_trace(
2280 PVR2_TRACE_INFO,
2281 "Device microcontroller firmware"
2282 " (re)loaded; it should now reset"
2283 " and reconnect.");
2284 break;
2285 }
2286 pvr2_trace(
2287 PVR2_TRACE_ERROR_LEGS,
2288 "Device initialization was not successful.");
2289 if (hdw->fw1_state == FW1_STATE_MISSING) {
2290 pvr2_trace(
2291 PVR2_TRACE_ERROR_LEGS,
2292 "Giving up since device"
2293 " microcontroller firmware"
2294 " appears to be missing.");
2295 break;
2296 }
2297 }
2298 if (procreload) {
2299 pvr2_trace(
2300 PVR2_TRACE_ERROR_LEGS,
2301 "Attempting pvrusb2 recovery by reloading"
2302 " primary firmware.");
2303 pvr2_trace(
2304 PVR2_TRACE_ERROR_LEGS,
2305 "If this works, device should disconnect"
2306 " and reconnect in a sane state.");
2307 hdw->fw1_state = FW1_STATE_UNKNOWN;
2308 pvr2_upload_firmware1(hdw);
2309 } else {
2310 pvr2_trace(
2311 PVR2_TRACE_ERROR_LEGS,
2312 "***WARNING*** pvrusb2 device hardware"
2313 " appears to be jammed"
2314 " and I can't clear it.");
2315 pvr2_trace(
2316 PVR2_TRACE_ERROR_LEGS,
2317 "You might need to power cycle"
2318 " the pvrusb2 device"
2319 " in order to recover.");
2320 }
Mike Isely681c7392007-11-26 01:48:52 -03002321 } while (0);
Mike Iselyd8554972006-06-26 20:58:46 -03002322 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_setup(hdw=%p) end",hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002323}
2324
2325
Mike Iselyc4a8828d2008-04-22 14:45:44 -03002326/* Perform second stage initialization. Set callback pointer first so that
2327 we can avoid a possible initialization race (if the kernel thread runs
2328 before the callback has been set). */
Mike Isely794b1602008-04-22 14:45:45 -03002329int pvr2_hdw_initialize(struct pvr2_hdw *hdw,
2330 void (*callback_func)(void *),
2331 void *callback_data)
Mike Iselyc4a8828d2008-04-22 14:45:44 -03002332{
2333 LOCK_TAKE(hdw->big_lock); do {
Mike Isely97f26ff2008-04-07 02:22:43 -03002334 if (hdw->flag_disconnected) {
2335 /* Handle a race here: If we're already
2336 disconnected by this point, then give up. If we
2337 get past this then we'll remain connected for
2338 the duration of initialization since the entire
2339 initialization sequence is now protected by the
2340 big_lock. */
2341 break;
2342 }
Mike Iselyc4a8828d2008-04-22 14:45:44 -03002343 hdw->state_data = callback_data;
2344 hdw->state_func = callback_func;
Mike Isely97f26ff2008-04-07 02:22:43 -03002345 pvr2_hdw_setup(hdw);
Mike Iselyc4a8828d2008-04-22 14:45:44 -03002346 } while (0); LOCK_GIVE(hdw->big_lock);
Mike Isely794b1602008-04-22 14:45:45 -03002347 return hdw->flag_init_ok;
Mike Iselyc4a8828d2008-04-22 14:45:44 -03002348}
2349
2350
2351/* Create, set up, and return a structure for interacting with the
2352 underlying hardware. */
Mike Iselyd8554972006-06-26 20:58:46 -03002353struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
2354 const struct usb_device_id *devid)
2355{
Mike Isely7fb20fa2008-04-22 14:45:37 -03002356 unsigned int idx,cnt1,cnt2,m;
Mike Iselyfe15f132008-08-30 18:11:40 -03002357 struct pvr2_hdw *hdw = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002358 int valid_std_mask;
2359 struct pvr2_ctrl *cptr;
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002360 struct usb_device *usb_dev;
Mike Isely989eb152007-11-26 01:53:12 -03002361 const struct pvr2_device_desc *hdw_desc;
Mike Iselyd8554972006-06-26 20:58:46 -03002362 __u8 ifnum;
Mike Iselyb30d2442006-06-25 20:05:01 -03002363 struct v4l2_queryctrl qctrl;
2364 struct pvr2_ctl_info *ciptr;
Mike Iselyd8554972006-06-26 20:58:46 -03002365
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002366 usb_dev = interface_to_usbdev(intf);
2367
Mike Iselyd130fa82007-12-08 17:20:06 -03002368 hdw_desc = (const struct pvr2_device_desc *)(devid->driver_info);
Mike Iselyd8554972006-06-26 20:58:46 -03002369
Mike Iselyfe15f132008-08-30 18:11:40 -03002370 if (hdw_desc == NULL) {
2371 pvr2_trace(PVR2_TRACE_INIT, "pvr2_hdw_create:"
2372 " No device description pointer,"
2373 " unable to continue.");
2374 pvr2_trace(PVR2_TRACE_INIT, "If you have a new device type,"
2375 " please contact Mike Isely <isely@pobox.com>"
2376 " to get it included in the driver\n");
2377 goto fail;
2378 }
2379
Mike Iselyca545f72007-01-20 00:37:11 -03002380 hdw = kzalloc(sizeof(*hdw),GFP_KERNEL);
Mike Iselyd8554972006-06-26 20:58:46 -03002381 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_create: hdw=%p, type \"%s\"",
Mike Isely989eb152007-11-26 01:53:12 -03002382 hdw,hdw_desc->description);
Mike Iselyd8554972006-06-26 20:58:46 -03002383 if (!hdw) goto fail;
Mike Isely681c7392007-11-26 01:48:52 -03002384
2385 init_timer(&hdw->quiescent_timer);
2386 hdw->quiescent_timer.data = (unsigned long)hdw;
2387 hdw->quiescent_timer.function = pvr2_hdw_quiescent_timeout;
2388
2389 init_timer(&hdw->encoder_wait_timer);
2390 hdw->encoder_wait_timer.data = (unsigned long)hdw;
2391 hdw->encoder_wait_timer.function = pvr2_hdw_encoder_wait_timeout;
2392
Mike Iselyd913d632008-04-06 04:04:35 -03002393 init_timer(&hdw->encoder_run_timer);
2394 hdw->encoder_run_timer.data = (unsigned long)hdw;
2395 hdw->encoder_run_timer.function = pvr2_hdw_encoder_run_timeout;
2396
Mike Isely681c7392007-11-26 01:48:52 -03002397 hdw->master_state = PVR2_STATE_DEAD;
2398
2399 init_waitqueue_head(&hdw->state_wait_data);
2400
Mike Isely18103c572007-01-20 00:09:47 -03002401 hdw->tuner_signal_stale = !0;
Mike Iselyb30d2442006-06-25 20:05:01 -03002402 cx2341x_fill_defaults(&hdw->enc_ctl_state);
Mike Iselyd8554972006-06-26 20:58:46 -03002403
Mike Isely7fb20fa2008-04-22 14:45:37 -03002404 /* Calculate which inputs are OK */
2405 m = 0;
2406 if (hdw_desc->flag_has_analogtuner) m |= 1 << PVR2_CVAL_INPUT_TV;
Mike Iselye8f5bac2008-04-22 14:45:40 -03002407 if (hdw_desc->digital_control_scheme != PVR2_DIGITAL_SCHEME_NONE) {
2408 m |= 1 << PVR2_CVAL_INPUT_DTV;
2409 }
Mike Isely7fb20fa2008-04-22 14:45:37 -03002410 if (hdw_desc->flag_has_svideo) m |= 1 << PVR2_CVAL_INPUT_SVIDEO;
2411 if (hdw_desc->flag_has_composite) m |= 1 << PVR2_CVAL_INPUT_COMPOSITE;
2412 if (hdw_desc->flag_has_fmradio) m |= 1 << PVR2_CVAL_INPUT_RADIO;
2413 hdw->input_avail_mask = m;
Mike Isely1cb03b72008-04-21 03:47:43 -03002414 hdw->input_allowed_mask = hdw->input_avail_mask;
Mike Isely7fb20fa2008-04-22 14:45:37 -03002415
Mike Isely62433e32008-04-22 14:45:40 -03002416 /* If not a hybrid device, pathway_state never changes. So
2417 initialize it here to what it should forever be. */
2418 if (!(hdw->input_avail_mask & (1 << PVR2_CVAL_INPUT_DTV))) {
2419 hdw->pathway_state = PVR2_PATHWAY_ANALOG;
2420 } else if (!(hdw->input_avail_mask & (1 << PVR2_CVAL_INPUT_TV))) {
2421 hdw->pathway_state = PVR2_PATHWAY_DIGITAL;
2422 }
2423
Mike Iselyc05c0462006-06-25 20:04:25 -03002424 hdw->control_cnt = CTRLDEF_COUNT;
Mike Iselyb30d2442006-06-25 20:05:01 -03002425 hdw->control_cnt += MPEGDEF_COUNT;
Mike Iselyca545f72007-01-20 00:37:11 -03002426 hdw->controls = kzalloc(sizeof(struct pvr2_ctrl) * hdw->control_cnt,
Mike Iselyd8554972006-06-26 20:58:46 -03002427 GFP_KERNEL);
2428 if (!hdw->controls) goto fail;
Mike Isely989eb152007-11-26 01:53:12 -03002429 hdw->hdw_desc = hdw_desc;
Mike Iselyc05c0462006-06-25 20:04:25 -03002430 for (idx = 0; idx < hdw->control_cnt; idx++) {
2431 cptr = hdw->controls + idx;
2432 cptr->hdw = hdw;
2433 }
Mike Iselyd8554972006-06-26 20:58:46 -03002434 for (idx = 0; idx < 32; idx++) {
2435 hdw->std_mask_ptrs[idx] = hdw->std_mask_names[idx];
2436 }
Mike Iselyc05c0462006-06-25 20:04:25 -03002437 for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002438 cptr = hdw->controls + idx;
Mike Iselyd8554972006-06-26 20:58:46 -03002439 cptr->info = control_defs+idx;
2440 }
Mike Iselydbc40a02008-04-22 14:45:39 -03002441
2442 /* Ensure that default input choice is a valid one. */
2443 m = hdw->input_avail_mask;
2444 if (m) for (idx = 0; idx < (sizeof(m) << 3); idx++) {
2445 if (!((1 << idx) & m)) continue;
2446 hdw->input_val = idx;
2447 break;
2448 }
2449
Mike Iselyb30d2442006-06-25 20:05:01 -03002450 /* Define and configure additional controls from cx2341x module. */
Mike Iselyca545f72007-01-20 00:37:11 -03002451 hdw->mpeg_ctrl_info = kzalloc(
Mike Iselyb30d2442006-06-25 20:05:01 -03002452 sizeof(*(hdw->mpeg_ctrl_info)) * MPEGDEF_COUNT, GFP_KERNEL);
2453 if (!hdw->mpeg_ctrl_info) goto fail;
Mike Iselyb30d2442006-06-25 20:05:01 -03002454 for (idx = 0; idx < MPEGDEF_COUNT; idx++) {
2455 cptr = hdw->controls + idx + CTRLDEF_COUNT;
2456 ciptr = &(hdw->mpeg_ctrl_info[idx].info);
2457 ciptr->desc = hdw->mpeg_ctrl_info[idx].desc;
2458 ciptr->name = mpeg_ids[idx].strid;
2459 ciptr->v4l_id = mpeg_ids[idx].id;
2460 ciptr->skip_init = !0;
2461 ciptr->get_value = ctrl_cx2341x_get;
2462 ciptr->get_v4lflags = ctrl_cx2341x_getv4lflags;
2463 ciptr->is_dirty = ctrl_cx2341x_is_dirty;
2464 if (!idx) ciptr->clear_dirty = ctrl_cx2341x_clear_dirty;
2465 qctrl.id = ciptr->v4l_id;
2466 cx2341x_ctrl_query(&hdw->enc_ctl_state,&qctrl);
2467 if (!(qctrl.flags & V4L2_CTRL_FLAG_READ_ONLY)) {
2468 ciptr->set_value = ctrl_cx2341x_set;
2469 }
2470 strncpy(hdw->mpeg_ctrl_info[idx].desc,qctrl.name,
2471 PVR2_CTLD_INFO_DESC_SIZE);
2472 hdw->mpeg_ctrl_info[idx].desc[PVR2_CTLD_INFO_DESC_SIZE-1] = 0;
2473 ciptr->default_value = qctrl.default_value;
2474 switch (qctrl.type) {
2475 default:
2476 case V4L2_CTRL_TYPE_INTEGER:
2477 ciptr->type = pvr2_ctl_int;
2478 ciptr->def.type_int.min_value = qctrl.minimum;
2479 ciptr->def.type_int.max_value = qctrl.maximum;
2480 break;
2481 case V4L2_CTRL_TYPE_BOOLEAN:
2482 ciptr->type = pvr2_ctl_bool;
2483 break;
2484 case V4L2_CTRL_TYPE_MENU:
2485 ciptr->type = pvr2_ctl_enum;
2486 ciptr->def.type_enum.value_names =
Hans Verkuile0e31cd2008-06-22 12:03:28 -03002487 cx2341x_ctrl_get_menu(&hdw->enc_ctl_state,
2488 ciptr->v4l_id);
Mike Iselyb30d2442006-06-25 20:05:01 -03002489 for (cnt1 = 0;
2490 ciptr->def.type_enum.value_names[cnt1] != NULL;
2491 cnt1++) { }
2492 ciptr->def.type_enum.count = cnt1;
2493 break;
2494 }
2495 cptr->info = ciptr;
2496 }
Mike Iselyd8554972006-06-26 20:58:46 -03002497
2498 // Initialize video standard enum dynamic control
2499 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDENUM);
2500 if (cptr) {
2501 memcpy(&hdw->std_info_enum,cptr->info,
2502 sizeof(hdw->std_info_enum));
2503 cptr->info = &hdw->std_info_enum;
2504
2505 }
2506 // Initialize control data regarding video standard masks
2507 valid_std_mask = pvr2_std_get_usable();
2508 for (idx = 0; idx < 32; idx++) {
2509 if (!(valid_std_mask & (1 << idx))) continue;
2510 cnt1 = pvr2_std_id_to_str(
2511 hdw->std_mask_names[idx],
2512 sizeof(hdw->std_mask_names[idx])-1,
2513 1 << idx);
2514 hdw->std_mask_names[idx][cnt1] = 0;
2515 }
2516 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDAVAIL);
2517 if (cptr) {
2518 memcpy(&hdw->std_info_avail,cptr->info,
2519 sizeof(hdw->std_info_avail));
2520 cptr->info = &hdw->std_info_avail;
2521 hdw->std_info_avail.def.type_bitmask.bit_names =
2522 hdw->std_mask_ptrs;
2523 hdw->std_info_avail.def.type_bitmask.valid_bits =
2524 valid_std_mask;
2525 }
2526 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDCUR);
2527 if (cptr) {
2528 memcpy(&hdw->std_info_cur,cptr->info,
2529 sizeof(hdw->std_info_cur));
2530 cptr->info = &hdw->std_info_cur;
2531 hdw->std_info_cur.def.type_bitmask.bit_names =
2532 hdw->std_mask_ptrs;
2533 hdw->std_info_avail.def.type_bitmask.valid_bits =
2534 valid_std_mask;
2535 }
2536
Mike Isely432907f2008-08-31 21:02:20 -03002537 hdw->cropcap_stale = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03002538 hdw->eeprom_addr = -1;
2539 hdw->unit_number = -1;
Mike Isely80793842006-12-27 23:12:28 -03002540 hdw->v4l_minor_number_video = -1;
2541 hdw->v4l_minor_number_vbi = -1;
Mike Iselyfd5a75f2006-12-27 23:11:22 -03002542 hdw->v4l_minor_number_radio = -1;
Mike Iselyd8554972006-06-26 20:58:46 -03002543 hdw->ctl_write_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL);
2544 if (!hdw->ctl_write_buffer) goto fail;
2545 hdw->ctl_read_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL);
2546 if (!hdw->ctl_read_buffer) goto fail;
2547 hdw->ctl_write_urb = usb_alloc_urb(0,GFP_KERNEL);
2548 if (!hdw->ctl_write_urb) goto fail;
2549 hdw->ctl_read_urb = usb_alloc_urb(0,GFP_KERNEL);
2550 if (!hdw->ctl_read_urb) goto fail;
2551
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002552 if (v4l2_device_register(&usb_dev->dev, &hdw->v4l2_dev) != 0) {
2553 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2554 "Error registering with v4l core, giving up");
2555 goto fail;
2556 }
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002557 mutex_lock(&pvr2_unit_mtx); do {
Mike Iselyd8554972006-06-26 20:58:46 -03002558 for (idx = 0; idx < PVR_NUM; idx++) {
2559 if (unit_pointers[idx]) continue;
2560 hdw->unit_number = idx;
2561 unit_pointers[idx] = hdw;
2562 break;
2563 }
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002564 } while (0); mutex_unlock(&pvr2_unit_mtx);
Mike Iselyd8554972006-06-26 20:58:46 -03002565
2566 cnt1 = 0;
2567 cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"pvrusb2");
2568 cnt1 += cnt2;
2569 if (hdw->unit_number >= 0) {
2570 cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"_%c",
2571 ('a' + hdw->unit_number));
2572 cnt1 += cnt2;
2573 }
2574 if (cnt1 >= sizeof(hdw->name)) cnt1 = sizeof(hdw->name)-1;
2575 hdw->name[cnt1] = 0;
2576
Mike Isely681c7392007-11-26 01:48:52 -03002577 hdw->workqueue = create_singlethread_workqueue(hdw->name);
2578 INIT_WORK(&hdw->workpoll,pvr2_hdw_worker_poll);
2579 INIT_WORK(&hdw->worki2csync,pvr2_hdw_worker_i2c);
Mike Isely681c7392007-11-26 01:48:52 -03002580
Mike Iselyd8554972006-06-26 20:58:46 -03002581 pvr2_trace(PVR2_TRACE_INIT,"Driver unit number is %d, name is %s",
2582 hdw->unit_number,hdw->name);
2583
2584 hdw->tuner_type = -1;
2585 hdw->flag_ok = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03002586
2587 hdw->usb_intf = intf;
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002588 hdw->usb_dev = usb_dev;
Mike Iselyd8554972006-06-26 20:58:46 -03002589
Mike Isely87e34952009-01-23 01:20:24 -03002590 usb_make_path(hdw->usb_dev, hdw->bus_info, sizeof(hdw->bus_info));
Mike Isely31a18542007-04-08 01:11:47 -03002591
Mike Iselyd8554972006-06-26 20:58:46 -03002592 ifnum = hdw->usb_intf->cur_altsetting->desc.bInterfaceNumber;
2593 usb_set_interface(hdw->usb_dev,ifnum,0);
2594
2595 mutex_init(&hdw->ctl_lock_mutex);
2596 mutex_init(&hdw->big_lock_mutex);
2597
2598 return hdw;
2599 fail:
2600 if (hdw) {
Mike Isely681c7392007-11-26 01:48:52 -03002601 del_timer_sync(&hdw->quiescent_timer);
Mike Iselyd913d632008-04-06 04:04:35 -03002602 del_timer_sync(&hdw->encoder_run_timer);
Mike Isely681c7392007-11-26 01:48:52 -03002603 del_timer_sync(&hdw->encoder_wait_timer);
2604 if (hdw->workqueue) {
2605 flush_workqueue(hdw->workqueue);
2606 destroy_workqueue(hdw->workqueue);
2607 hdw->workqueue = NULL;
2608 }
Mariusz Kozlowski5e55d2c2006-11-08 15:34:31 +01002609 usb_free_urb(hdw->ctl_read_urb);
2610 usb_free_urb(hdw->ctl_write_urb);
Mariusz Kozlowski22071a42007-01-07 10:33:39 -03002611 kfree(hdw->ctl_read_buffer);
2612 kfree(hdw->ctl_write_buffer);
2613 kfree(hdw->controls);
2614 kfree(hdw->mpeg_ctrl_info);
Mike Isely681c7392007-11-26 01:48:52 -03002615 kfree(hdw->std_defs);
2616 kfree(hdw->std_enum_names);
Mike Iselyd8554972006-06-26 20:58:46 -03002617 kfree(hdw);
2618 }
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002619 return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002620}
2621
2622
2623/* Remove _all_ associations between this driver and the underlying USB
2624 layer. */
Adrian Bunk07e337e2006-06-30 11:30:20 -03002625static void pvr2_hdw_remove_usb_stuff(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002626{
2627 if (hdw->flag_disconnected) return;
2628 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_remove_usb_stuff: hdw=%p",hdw);
2629 if (hdw->ctl_read_urb) {
2630 usb_kill_urb(hdw->ctl_read_urb);
2631 usb_free_urb(hdw->ctl_read_urb);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002632 hdw->ctl_read_urb = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002633 }
2634 if (hdw->ctl_write_urb) {
2635 usb_kill_urb(hdw->ctl_write_urb);
2636 usb_free_urb(hdw->ctl_write_urb);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002637 hdw->ctl_write_urb = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002638 }
2639 if (hdw->ctl_read_buffer) {
2640 kfree(hdw->ctl_read_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002641 hdw->ctl_read_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002642 }
2643 if (hdw->ctl_write_buffer) {
2644 kfree(hdw->ctl_write_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002645 hdw->ctl_write_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002646 }
Mike Iselyd8554972006-06-26 20:58:46 -03002647 hdw->flag_disconnected = !0;
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002648 /* If we don't do this, then there will be a dangling struct device
2649 reference to our disappearing device persisting inside the V4L
2650 core... */
2651 if (hdw->v4l2_dev.dev) {
2652 dev_set_drvdata(hdw->v4l2_dev.dev, NULL);
2653 hdw->v4l2_dev.dev = NULL;
2654 }
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002655 hdw->usb_dev = NULL;
2656 hdw->usb_intf = NULL;
Mike Isely681c7392007-11-26 01:48:52 -03002657 pvr2_hdw_render_useless(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002658}
2659
2660
2661/* Destroy hardware interaction structure */
2662void pvr2_hdw_destroy(struct pvr2_hdw *hdw)
2663{
Mike Isely401c27c2007-09-08 22:11:46 -03002664 if (!hdw) return;
Mike Iselyd8554972006-06-26 20:58:46 -03002665 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_destroy: hdw=%p",hdw);
Mike Isely681c7392007-11-26 01:48:52 -03002666 if (hdw->workqueue) {
2667 flush_workqueue(hdw->workqueue);
2668 destroy_workqueue(hdw->workqueue);
2669 hdw->workqueue = NULL;
2670 }
Mike Isely8f591002008-04-22 14:45:45 -03002671 del_timer_sync(&hdw->quiescent_timer);
Mike Iselyd913d632008-04-06 04:04:35 -03002672 del_timer_sync(&hdw->encoder_run_timer);
Mike Isely8f591002008-04-22 14:45:45 -03002673 del_timer_sync(&hdw->encoder_wait_timer);
Mike Iselyd8554972006-06-26 20:58:46 -03002674 if (hdw->fw_buffer) {
2675 kfree(hdw->fw_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002676 hdw->fw_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002677 }
2678 if (hdw->vid_stream) {
2679 pvr2_stream_destroy(hdw->vid_stream);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002680 hdw->vid_stream = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002681 }
Mike Iselyd8554972006-06-26 20:58:46 -03002682 if (hdw->decoder_ctrl) {
2683 hdw->decoder_ctrl->detach(hdw->decoder_ctrl->ctxt);
2684 }
2685 pvr2_i2c_core_done(hdw);
Mike Isely59af3362009-03-07 03:06:09 -03002686 pvr2_i2c_track_done(hdw);
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002687 v4l2_device_unregister(&hdw->v4l2_dev);
Mike Iselyd8554972006-06-26 20:58:46 -03002688 pvr2_hdw_remove_usb_stuff(hdw);
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002689 mutex_lock(&pvr2_unit_mtx); do {
Mike Iselyd8554972006-06-26 20:58:46 -03002690 if ((hdw->unit_number >= 0) &&
2691 (hdw->unit_number < PVR_NUM) &&
2692 (unit_pointers[hdw->unit_number] == hdw)) {
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002693 unit_pointers[hdw->unit_number] = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002694 }
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002695 } while (0); mutex_unlock(&pvr2_unit_mtx);
Mariusz Kozlowski22071a42007-01-07 10:33:39 -03002696 kfree(hdw->controls);
2697 kfree(hdw->mpeg_ctrl_info);
2698 kfree(hdw->std_defs);
2699 kfree(hdw->std_enum_names);
Mike Iselyd8554972006-06-26 20:58:46 -03002700 kfree(hdw);
2701}
2702
2703
Mike Iselyd8554972006-06-26 20:58:46 -03002704int pvr2_hdw_dev_ok(struct pvr2_hdw *hdw)
2705{
2706 return (hdw && hdw->flag_ok);
2707}
2708
2709
2710/* Called when hardware has been unplugged */
2711void pvr2_hdw_disconnect(struct pvr2_hdw *hdw)
2712{
2713 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_disconnect(hdw=%p)",hdw);
2714 LOCK_TAKE(hdw->big_lock);
2715 LOCK_TAKE(hdw->ctl_lock);
2716 pvr2_hdw_remove_usb_stuff(hdw);
2717 LOCK_GIVE(hdw->ctl_lock);
2718 LOCK_GIVE(hdw->big_lock);
2719}
2720
2721
2722// Attempt to autoselect an appropriate value for std_enum_cur given
2723// whatever is currently in std_mask_cur
Adrian Bunk07e337e2006-06-30 11:30:20 -03002724static void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002725{
2726 unsigned int idx;
2727 for (idx = 1; idx < hdw->std_enum_cnt; idx++) {
2728 if (hdw->std_defs[idx-1].id == hdw->std_mask_cur) {
2729 hdw->std_enum_cur = idx;
2730 return;
2731 }
2732 }
2733 hdw->std_enum_cur = 0;
2734}
2735
2736
2737// Calculate correct set of enumerated standards based on currently known
2738// set of available standards bits.
Adrian Bunk07e337e2006-06-30 11:30:20 -03002739static void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002740{
2741 struct v4l2_standard *newstd;
2742 unsigned int std_cnt;
2743 unsigned int idx;
2744
2745 newstd = pvr2_std_create_enum(&std_cnt,hdw->std_mask_avail);
2746
2747 if (hdw->std_defs) {
2748 kfree(hdw->std_defs);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002749 hdw->std_defs = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002750 }
2751 hdw->std_enum_cnt = 0;
2752 if (hdw->std_enum_names) {
2753 kfree(hdw->std_enum_names);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002754 hdw->std_enum_names = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002755 }
2756
2757 if (!std_cnt) {
2758 pvr2_trace(
2759 PVR2_TRACE_ERROR_LEGS,
2760 "WARNING: Failed to identify any viable standards");
2761 }
2762 hdw->std_enum_names = kmalloc(sizeof(char *)*(std_cnt+1),GFP_KERNEL);
2763 hdw->std_enum_names[0] = "none";
2764 for (idx = 0; idx < std_cnt; idx++) {
2765 hdw->std_enum_names[idx+1] =
2766 newstd[idx].name;
2767 }
2768 // Set up the dynamic control for this standard
2769 hdw->std_info_enum.def.type_enum.value_names = hdw->std_enum_names;
2770 hdw->std_info_enum.def.type_enum.count = std_cnt+1;
2771 hdw->std_defs = newstd;
2772 hdw->std_enum_cnt = std_cnt+1;
2773 hdw->std_enum_cur = 0;
2774 hdw->std_info_cur.def.type_bitmask.valid_bits = hdw->std_mask_avail;
2775}
2776
2777
2778int pvr2_hdw_get_stdenum_value(struct pvr2_hdw *hdw,
2779 struct v4l2_standard *std,
2780 unsigned int idx)
2781{
2782 int ret = -EINVAL;
2783 if (!idx) return ret;
2784 LOCK_TAKE(hdw->big_lock); do {
2785 if (idx >= hdw->std_enum_cnt) break;
2786 idx--;
2787 memcpy(std,hdw->std_defs+idx,sizeof(*std));
2788 ret = 0;
2789 } while (0); LOCK_GIVE(hdw->big_lock);
2790 return ret;
2791}
2792
2793
2794/* Get the number of defined controls */
2795unsigned int pvr2_hdw_get_ctrl_count(struct pvr2_hdw *hdw)
2796{
Mike Iselyc05c0462006-06-25 20:04:25 -03002797 return hdw->control_cnt;
Mike Iselyd8554972006-06-26 20:58:46 -03002798}
2799
2800
2801/* Retrieve a control handle given its index (0..count-1) */
2802struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_index(struct pvr2_hdw *hdw,
2803 unsigned int idx)
2804{
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002805 if (idx >= hdw->control_cnt) return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002806 return hdw->controls + idx;
2807}
2808
2809
2810/* Retrieve a control handle given its index (0..count-1) */
2811struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_id(struct pvr2_hdw *hdw,
2812 unsigned int ctl_id)
2813{
2814 struct pvr2_ctrl *cptr;
2815 unsigned int idx;
2816 int i;
2817
2818 /* This could be made a lot more efficient, but for now... */
Mike Iselyc05c0462006-06-25 20:04:25 -03002819 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002820 cptr = hdw->controls + idx;
2821 i = cptr->info->internal_id;
2822 if (i && (i == ctl_id)) return cptr;
2823 }
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002824 return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002825}
2826
2827
Mike Iselya761f432006-06-25 20:04:44 -03002828/* Given a V4L ID, retrieve the control structure associated with it. */
Mike Iselyd8554972006-06-26 20:58:46 -03002829struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *hdw,unsigned int ctl_id)
2830{
2831 struct pvr2_ctrl *cptr;
2832 unsigned int idx;
2833 int i;
2834
2835 /* This could be made a lot more efficient, but for now... */
Mike Iselyc05c0462006-06-25 20:04:25 -03002836 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002837 cptr = hdw->controls + idx;
2838 i = cptr->info->v4l_id;
2839 if (i && (i == ctl_id)) return cptr;
2840 }
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002841 return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002842}
2843
2844
Mike Iselya761f432006-06-25 20:04:44 -03002845/* Given a V4L ID for its immediate predecessor, retrieve the control
2846 structure associated with it. */
2847struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *hdw,
2848 unsigned int ctl_id)
2849{
2850 struct pvr2_ctrl *cptr,*cp2;
2851 unsigned int idx;
2852 int i;
2853
2854 /* This could be made a lot more efficient, but for now... */
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002855 cp2 = NULL;
Mike Iselya761f432006-06-25 20:04:44 -03002856 for (idx = 0; idx < hdw->control_cnt; idx++) {
2857 cptr = hdw->controls + idx;
2858 i = cptr->info->v4l_id;
2859 if (!i) continue;
2860 if (i <= ctl_id) continue;
2861 if (cp2 && (cp2->info->v4l_id < i)) continue;
2862 cp2 = cptr;
2863 }
2864 return cp2;
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002865 return NULL;
Mike Iselya761f432006-06-25 20:04:44 -03002866}
2867
2868
Mike Iselyd8554972006-06-26 20:58:46 -03002869static const char *get_ctrl_typename(enum pvr2_ctl_type tp)
2870{
2871 switch (tp) {
2872 case pvr2_ctl_int: return "integer";
2873 case pvr2_ctl_enum: return "enum";
Mike Isely33213962006-06-25 20:04:40 -03002874 case pvr2_ctl_bool: return "boolean";
Mike Iselyd8554972006-06-26 20:58:46 -03002875 case pvr2_ctl_bitmask: return "bitmask";
2876 }
2877 return "";
2878}
2879
2880
Mike Isely2641df32009-03-07 00:13:25 -03002881static void pvr2_subdev_set_control(struct pvr2_hdw *hdw, int id,
2882 const char *name, int val)
2883{
2884 struct v4l2_control ctrl;
2885 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 %s=%d", name, val);
2886 memset(&ctrl, 0, sizeof(ctrl));
2887 ctrl.id = id;
2888 ctrl.value = val;
2889 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, s_ctrl, &ctrl);
2890}
2891
2892#define PVR2_SUBDEV_SET_CONTROL(hdw, id, lab) \
2893 if ((hdw)->lab##_dirty) { \
2894 pvr2_subdev_set_control(hdw, id, #lab, (hdw)->lab##_val); \
2895 }
2896
Mike Isely5ceaad12009-03-07 00:01:20 -03002897/* Execute whatever commands are required to update the state of all the
Mike Isely2641df32009-03-07 00:13:25 -03002898 sub-devices so that they match our current control values. */
Mike Isely5ceaad12009-03-07 00:01:20 -03002899static void pvr2_subdev_update(struct pvr2_hdw *hdw)
2900{
Mike Isely2641df32009-03-07 00:13:25 -03002901 if (hdw->input_dirty || hdw->std_dirty) {
2902 pvr2_trace(PVR2_TRACE_CHIPS,"subdev v4l2 set_standard");
2903 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
2904 v4l2_device_call_all(&hdw->v4l2_dev, 0,
2905 tuner, s_radio);
2906 } else {
2907 v4l2_std_id vs;
2908 vs = hdw->std_mask_cur;
2909 v4l2_device_call_all(&hdw->v4l2_dev, 0,
2910 tuner, s_std, vs);
2911 }
2912 hdw->tuner_signal_stale = !0;
2913 hdw->cropcap_stale = !0;
2914 }
2915
2916 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_BRIGHTNESS, brightness);
2917 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_CONTRAST, contrast);
2918 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_SATURATION, saturation);
2919 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_HUE, hue);
2920 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_MUTE, mute);
2921 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_VOLUME, volume);
2922 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_BALANCE, balance);
2923 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_BASS, bass);
2924 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_TREBLE, treble);
2925
2926 if (hdw->input_dirty || hdw->audiomode_dirty) {
2927 struct v4l2_tuner vt;
2928 memset(&vt, 0, sizeof(vt));
2929 vt.audmode = hdw->audiomode_val;
2930 v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner, s_tuner, &vt);
2931 }
2932
2933 if (hdw->freqDirty) {
2934 unsigned long fv;
2935 struct v4l2_frequency freq;
2936 fv = pvr2_hdw_get_cur_freq(hdw);
2937 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_freq(%lu)", fv);
2938 if (hdw->tuner_signal_stale) pvr2_hdw_status_poll(hdw);
2939 memset(&freq, 0, sizeof(freq));
2940 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
2941 /* ((fv * 1000) / 62500) */
2942 freq.frequency = (fv * 2) / 125;
2943 } else {
2944 freq.frequency = fv / 62500;
2945 }
2946 /* tuner-core currently doesn't seem to care about this, but
2947 let's set it anyway for completeness. */
2948 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
2949 freq.type = V4L2_TUNER_RADIO;
2950 } else {
2951 freq.type = V4L2_TUNER_ANALOG_TV;
2952 }
2953 freq.tuner = 0;
2954 v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner,
2955 s_frequency, &freq);
2956 }
2957
2958 if (hdw->res_hor_dirty || hdw->res_ver_dirty) {
2959 struct v4l2_format fmt;
2960 memset(&fmt, 0, sizeof(fmt));
2961 fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2962 fmt.fmt.pix.width = hdw->res_hor_val;
2963 fmt.fmt.pix.height = hdw->res_ver_val;
2964 pvr2_trace(PVR2_TRACE_CHIPS,"subdev v4l2 set_size(%dx%d)",
2965 fmt.fmt.pix.width, fmt.fmt.pix.height);
2966 v4l2_device_call_all(&hdw->v4l2_dev, 0, video, s_fmt, &fmt);
2967 }
2968
2969 /* Unable to set crop parameters; there is apparently no equivalent
2970 for VIDIOC_S_CROP */
2971
2972 /* ????? Cover special cases for specific sub-devices. */
2973
2974 if (hdw->tuner_signal_stale && hdw->cropcap_stale) {
2975 pvr2_hdw_status_poll(hdw);
2976 }
Mike Isely5ceaad12009-03-07 00:01:20 -03002977}
2978
2979
Mike Isely681c7392007-11-26 01:48:52 -03002980/* Figure out if we need to commit control changes. If so, mark internal
2981 state flags to indicate this fact and return true. Otherwise do nothing
2982 else and return false. */
2983static int pvr2_hdw_commit_setup(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002984{
Mike Iselyd8554972006-06-26 20:58:46 -03002985 unsigned int idx;
2986 struct pvr2_ctrl *cptr;
2987 int value;
2988 int commit_flag = 0;
2989 char buf[100];
2990 unsigned int bcnt,ccnt;
2991
Mike Iselyc05c0462006-06-25 20:04:25 -03002992 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002993 cptr = hdw->controls + idx;
Al Viro5fa12472008-03-29 03:07:38 +00002994 if (!cptr->info->is_dirty) continue;
Mike Iselyd8554972006-06-26 20:58:46 -03002995 if (!cptr->info->is_dirty(cptr)) continue;
Mike Iselyfe23a282007-01-20 00:10:55 -03002996 commit_flag = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03002997
Mike Iselyfe23a282007-01-20 00:10:55 -03002998 if (!(pvrusb2_debug & PVR2_TRACE_CTL)) continue;
Mike Iselyd8554972006-06-26 20:58:46 -03002999 bcnt = scnprintf(buf,sizeof(buf),"\"%s\" <-- ",
3000 cptr->info->name);
3001 value = 0;
3002 cptr->info->get_value(cptr,&value);
3003 pvr2_ctrl_value_to_sym_internal(cptr,~0,value,
3004 buf+bcnt,
3005 sizeof(buf)-bcnt,&ccnt);
3006 bcnt += ccnt;
3007 bcnt += scnprintf(buf+bcnt,sizeof(buf)-bcnt," <%s>",
3008 get_ctrl_typename(cptr->info->type));
3009 pvr2_trace(PVR2_TRACE_CTL,
3010 "/*--TRACE_COMMIT--*/ %.*s",
3011 bcnt,buf);
3012 }
3013
3014 if (!commit_flag) {
3015 /* Nothing has changed */
3016 return 0;
3017 }
3018
Mike Isely681c7392007-11-26 01:48:52 -03003019 hdw->state_pipeline_config = 0;
3020 trace_stbit("state_pipeline_config",hdw->state_pipeline_config);
3021 pvr2_hdw_state_sched(hdw);
3022
3023 return !0;
3024}
3025
3026
3027/* Perform all operations needed to commit all control changes. This must
3028 be performed in synchronization with the pipeline state and is thus
3029 expected to be called as part of the driver's worker thread. Return
3030 true if commit successful, otherwise return false to indicate that
3031 commit isn't possible at this time. */
3032static int pvr2_hdw_commit_execute(struct pvr2_hdw *hdw)
3033{
3034 unsigned int idx;
3035 struct pvr2_ctrl *cptr;
3036 int disruptive_change;
3037
Mike Iselyab062fe2008-06-30 03:32:35 -03003038 /* Handle some required side effects when the video standard is
3039 changed.... */
Mike Iselyd8554972006-06-26 20:58:46 -03003040 if (hdw->std_dirty) {
Mike Iselyd8554972006-06-26 20:58:46 -03003041 int nvres;
Mike Isely00528d92008-06-30 03:35:52 -03003042 int gop_size;
Mike Iselyd8554972006-06-26 20:58:46 -03003043 if (hdw->std_mask_cur & V4L2_STD_525_60) {
3044 nvres = 480;
Mike Isely00528d92008-06-30 03:35:52 -03003045 gop_size = 15;
Mike Iselyd8554972006-06-26 20:58:46 -03003046 } else {
3047 nvres = 576;
Mike Isely00528d92008-06-30 03:35:52 -03003048 gop_size = 12;
Mike Iselyd8554972006-06-26 20:58:46 -03003049 }
Mike Isely00528d92008-06-30 03:35:52 -03003050 /* Rewrite the vertical resolution to be appropriate to the
3051 video standard that has been selected. */
Mike Iselyd8554972006-06-26 20:58:46 -03003052 if (nvres != hdw->res_ver_val) {
3053 hdw->res_ver_val = nvres;
3054 hdw->res_ver_dirty = !0;
3055 }
Mike Isely00528d92008-06-30 03:35:52 -03003056 /* Rewrite the GOP size to be appropriate to the video
3057 standard that has been selected. */
3058 if (gop_size != hdw->enc_ctl_state.video_gop_size) {
3059 struct v4l2_ext_controls cs;
3060 struct v4l2_ext_control c1;
3061 memset(&cs, 0, sizeof(cs));
3062 memset(&c1, 0, sizeof(c1));
3063 cs.controls = &c1;
3064 cs.count = 1;
3065 c1.id = V4L2_CID_MPEG_VIDEO_GOP_SIZE;
3066 c1.value = gop_size;
3067 cx2341x_ext_ctrls(&hdw->enc_ctl_state, 0, &cs,
3068 VIDIOC_S_EXT_CTRLS);
3069 }
Mike Iselyd8554972006-06-26 20:58:46 -03003070 }
3071
Mike Isely38d9a2c2008-03-28 05:30:48 -03003072 if (hdw->input_dirty && hdw->state_pathway_ok &&
Mike Isely62433e32008-04-22 14:45:40 -03003073 (((hdw->input_val == PVR2_CVAL_INPUT_DTV) ?
3074 PVR2_PATHWAY_DIGITAL : PVR2_PATHWAY_ANALOG) !=
3075 hdw->pathway_state)) {
3076 /* Change of mode being asked for... */
3077 hdw->state_pathway_ok = 0;
Mike Iselye9db1ff2008-04-22 14:45:41 -03003078 trace_stbit("state_pathway_ok",hdw->state_pathway_ok);
Mike Isely62433e32008-04-22 14:45:40 -03003079 }
3080 if (!hdw->state_pathway_ok) {
3081 /* Can't commit anything until pathway is ok. */
3082 return 0;
3083 }
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03003084 /* The broadcast decoder can only scale down, so if
3085 * res_*_dirty && crop window < output format ==> enlarge crop.
3086 *
3087 * The mpeg encoder receives fields of res_hor_val dots and
3088 * res_ver_val halflines. Limits: hor<=720, ver<=576.
3089 */
3090 if (hdw->res_hor_dirty && hdw->cropw_val < hdw->res_hor_val) {
3091 hdw->cropw_val = hdw->res_hor_val;
3092 hdw->cropw_dirty = !0;
3093 } else if (hdw->cropw_dirty) {
3094 hdw->res_hor_dirty = !0; /* must rescale */
3095 hdw->res_hor_val = min(720, hdw->cropw_val);
3096 }
3097 if (hdw->res_ver_dirty && hdw->croph_val < hdw->res_ver_val) {
3098 hdw->croph_val = hdw->res_ver_val;
3099 hdw->croph_dirty = !0;
3100 } else if (hdw->croph_dirty) {
3101 int nvres = hdw->std_mask_cur & V4L2_STD_525_60 ? 480 : 576;
3102 hdw->res_ver_dirty = !0;
3103 hdw->res_ver_val = min(nvres, hdw->croph_val);
3104 }
3105
Mike Isely681c7392007-11-26 01:48:52 -03003106 /* If any of the below has changed, then we can't do the update
3107 while the pipeline is running. Pipeline must be paused first
3108 and decoder -> encoder connection be made quiescent before we
3109 can proceed. */
3110 disruptive_change =
3111 (hdw->std_dirty ||
3112 hdw->enc_unsafe_stale ||
3113 hdw->srate_dirty ||
3114 hdw->res_ver_dirty ||
3115 hdw->res_hor_dirty ||
Mike Isely755879c2008-08-31 20:50:59 -03003116 hdw->cropw_dirty ||
3117 hdw->croph_dirty ||
Mike Isely681c7392007-11-26 01:48:52 -03003118 hdw->input_dirty ||
3119 (hdw->active_stream_type != hdw->desired_stream_type));
3120 if (disruptive_change && !hdw->state_pipeline_idle) {
3121 /* Pipeline is not idle; we can't proceed. Arrange to
3122 cause pipeline to stop so that we can try this again
3123 later.... */
3124 hdw->state_pipeline_pause = !0;
3125 return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03003126 }
3127
Mike Iselyb30d2442006-06-25 20:05:01 -03003128 if (hdw->srate_dirty) {
3129 /* Write new sample rate into control structure since
3130 * the master copy is stale. We must track srate
3131 * separate from the mpeg control structure because
3132 * other logic also uses this value. */
3133 struct v4l2_ext_controls cs;
3134 struct v4l2_ext_control c1;
3135 memset(&cs,0,sizeof(cs));
3136 memset(&c1,0,sizeof(c1));
3137 cs.controls = &c1;
3138 cs.count = 1;
3139 c1.id = V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ;
3140 c1.value = hdw->srate_val;
Hans Verkuil01f1e442007-08-21 18:32:42 -03003141 cx2341x_ext_ctrls(&hdw->enc_ctl_state, 0, &cs,VIDIOC_S_EXT_CTRLS);
Mike Iselyb30d2442006-06-25 20:05:01 -03003142 }
Mike Iselyc05c0462006-06-25 20:04:25 -03003143
Mike Iselyd8554972006-06-26 20:58:46 -03003144 /* Scan i2c core at this point - before we clear all the dirty
3145 bits. Various parts of the i2c core will notice dirty bits as
3146 appropriate and arrange to broadcast or directly send updates to
3147 the client drivers in order to keep everything in sync */
3148 pvr2_i2c_core_check_stale(hdw);
3149
Mike Isely681c7392007-11-26 01:48:52 -03003150 if (hdw->active_stream_type != hdw->desired_stream_type) {
3151 /* Handle any side effects of stream config here */
3152 hdw->active_stream_type = hdw->desired_stream_type;
3153 }
3154
Mike Isely1df59f02008-04-21 03:50:39 -03003155 if (hdw->hdw_desc->signal_routing_scheme ==
3156 PVR2_ROUTING_SCHEME_GOTVIEW) {
3157 u32 b;
3158 /* Handle GOTVIEW audio switching */
3159 pvr2_hdw_gpio_get_out(hdw,&b);
3160 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
3161 /* Set GPIO 11 */
3162 pvr2_hdw_gpio_chg_out(hdw,(1 << 11),~0);
3163 } else {
3164 /* Clear GPIO 11 */
3165 pvr2_hdw_gpio_chg_out(hdw,(1 << 11),0);
3166 }
3167 }
3168
Mike Isely5ceaad12009-03-07 00:01:20 -03003169 for (idx = 0; idx < hdw->control_cnt; idx++) {
3170 cptr = hdw->controls + idx;
3171 if (!cptr->info->clear_dirty) continue;
3172 cptr->info->clear_dirty(cptr);
3173 }
3174
3175 /* Check and update state for all sub-devices. */
3176 pvr2_subdev_update(hdw);
3177
Mike Iselyd8554972006-06-26 20:58:46 -03003178 /* Now execute i2c core update */
3179 pvr2_i2c_core_sync(hdw);
3180
Mike Isely62433e32008-04-22 14:45:40 -03003181 if ((hdw->pathway_state == PVR2_PATHWAY_ANALOG) &&
3182 hdw->state_encoder_run) {
3183 /* If encoder isn't running or it can't be touched, then
3184 this will get worked out later when we start the
3185 encoder. */
Mike Isely681c7392007-11-26 01:48:52 -03003186 if (pvr2_encoder_adjust(hdw) < 0) return !0;
3187 }
Mike Iselyd8554972006-06-26 20:58:46 -03003188
Mike Isely681c7392007-11-26 01:48:52 -03003189 hdw->state_pipeline_config = !0;
Mike Isely432907f2008-08-31 21:02:20 -03003190 /* Hardware state may have changed in a way to cause the cropping
3191 capabilities to have changed. So mark it stale, which will
3192 cause a later re-fetch. */
Mike Isely681c7392007-11-26 01:48:52 -03003193 trace_stbit("state_pipeline_config",hdw->state_pipeline_config);
3194 return !0;
Mike Iselyd8554972006-06-26 20:58:46 -03003195}
3196
3197
3198int pvr2_hdw_commit_ctl(struct pvr2_hdw *hdw)
3199{
Mike Isely681c7392007-11-26 01:48:52 -03003200 int fl;
3201 LOCK_TAKE(hdw->big_lock);
3202 fl = pvr2_hdw_commit_setup(hdw);
3203 LOCK_GIVE(hdw->big_lock);
3204 if (!fl) return 0;
3205 return pvr2_hdw_wait(hdw,0);
Mike Iselyd8554972006-06-26 20:58:46 -03003206}
3207
3208
Mike Isely681c7392007-11-26 01:48:52 -03003209static void pvr2_hdw_worker_i2c(struct work_struct *work)
Mike Iselyd8554972006-06-26 20:58:46 -03003210{
Mike Isely681c7392007-11-26 01:48:52 -03003211 struct pvr2_hdw *hdw = container_of(work,struct pvr2_hdw,worki2csync);
Mike Iselyd8554972006-06-26 20:58:46 -03003212 LOCK_TAKE(hdw->big_lock); do {
3213 pvr2_i2c_core_sync(hdw);
3214 } while (0); LOCK_GIVE(hdw->big_lock);
3215}
3216
3217
Mike Isely681c7392007-11-26 01:48:52 -03003218static void pvr2_hdw_worker_poll(struct work_struct *work)
Mike Iselyd8554972006-06-26 20:58:46 -03003219{
Mike Isely681c7392007-11-26 01:48:52 -03003220 int fl = 0;
3221 struct pvr2_hdw *hdw = container_of(work,struct pvr2_hdw,workpoll);
Mike Iselyd8554972006-06-26 20:58:46 -03003222 LOCK_TAKE(hdw->big_lock); do {
Mike Isely681c7392007-11-26 01:48:52 -03003223 fl = pvr2_hdw_state_eval(hdw);
3224 } while (0); LOCK_GIVE(hdw->big_lock);
3225 if (fl && hdw->state_func) {
3226 hdw->state_func(hdw->state_data);
3227 }
3228}
3229
3230
Mike Isely681c7392007-11-26 01:48:52 -03003231static int pvr2_hdw_wait(struct pvr2_hdw *hdw,int state)
Mike Iselyd8554972006-06-26 20:58:46 -03003232{
Mike Isely681c7392007-11-26 01:48:52 -03003233 return wait_event_interruptible(
3234 hdw->state_wait_data,
3235 (hdw->state_stale == 0) &&
3236 (!state || (hdw->master_state != state)));
Mike Iselyd8554972006-06-26 20:58:46 -03003237}
3238
Mike Isely681c7392007-11-26 01:48:52 -03003239
Mike Iselyd8554972006-06-26 20:58:46 -03003240/* Return name for this driver instance */
3241const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw)
3242{
3243 return hdw->name;
3244}
3245
3246
Mike Isely78a47102007-11-26 01:58:20 -03003247const char *pvr2_hdw_get_desc(struct pvr2_hdw *hdw)
3248{
3249 return hdw->hdw_desc->description;
3250}
3251
3252
3253const char *pvr2_hdw_get_type(struct pvr2_hdw *hdw)
3254{
3255 return hdw->hdw_desc->shortname;
3256}
3257
3258
Mike Iselyd8554972006-06-26 20:58:46 -03003259int pvr2_hdw_is_hsm(struct pvr2_hdw *hdw)
3260{
3261 int result;
3262 LOCK_TAKE(hdw->ctl_lock); do {
Michael Krufky8d364362007-01-22 02:17:55 -03003263 hdw->cmd_buffer[0] = FX2CMD_GET_USB_SPEED;
Mike Iselyd8554972006-06-26 20:58:46 -03003264 result = pvr2_send_request(hdw,
3265 hdw->cmd_buffer,1,
3266 hdw->cmd_buffer,1);
3267 if (result < 0) break;
3268 result = (hdw->cmd_buffer[0] != 0);
3269 } while(0); LOCK_GIVE(hdw->ctl_lock);
3270 return result;
3271}
3272
3273
Mike Isely18103c572007-01-20 00:09:47 -03003274/* Execute poll of tuner status */
3275void pvr2_hdw_execute_tuner_poll(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03003276{
Mike Iselyd8554972006-06-26 20:58:46 -03003277 LOCK_TAKE(hdw->big_lock); do {
Mike Iselya51f5002009-03-06 23:30:37 -03003278 pvr2_hdw_status_poll(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003279 } while (0); LOCK_GIVE(hdw->big_lock);
Mike Isely18103c572007-01-20 00:09:47 -03003280}
3281
3282
Mike Isely432907f2008-08-31 21:02:20 -03003283static int pvr2_hdw_check_cropcap(struct pvr2_hdw *hdw)
3284{
3285 if (!hdw->cropcap_stale) {
Mike Isely432907f2008-08-31 21:02:20 -03003286 return 0;
3287 }
Mike Iselya51f5002009-03-06 23:30:37 -03003288 pvr2_hdw_status_poll(hdw);
Mike Isely432907f2008-08-31 21:02:20 -03003289 if (hdw->cropcap_stale) {
Mike Isely432907f2008-08-31 21:02:20 -03003290 return -EIO;
3291 }
3292 return 0;
3293}
3294
3295
3296/* Return information about cropping capabilities */
3297int pvr2_hdw_get_cropcap(struct pvr2_hdw *hdw, struct v4l2_cropcap *pp)
3298{
3299 int stat = 0;
3300 LOCK_TAKE(hdw->big_lock);
3301 stat = pvr2_hdw_check_cropcap(hdw);
3302 if (!stat) {
Mike Isely432907f2008-08-31 21:02:20 -03003303 memcpy(pp, &hdw->cropcap_info, sizeof(hdw->cropcap_info));
3304 }
3305 LOCK_GIVE(hdw->big_lock);
3306 return stat;
3307}
3308
3309
Mike Isely18103c572007-01-20 00:09:47 -03003310/* Return information about the tuner */
3311int pvr2_hdw_get_tuner_status(struct pvr2_hdw *hdw,struct v4l2_tuner *vtp)
3312{
3313 LOCK_TAKE(hdw->big_lock); do {
3314 if (hdw->tuner_signal_stale) {
Mike Iselya51f5002009-03-06 23:30:37 -03003315 pvr2_hdw_status_poll(hdw);
Mike Isely18103c572007-01-20 00:09:47 -03003316 }
3317 memcpy(vtp,&hdw->tuner_signal_info,sizeof(struct v4l2_tuner));
3318 } while (0); LOCK_GIVE(hdw->big_lock);
3319 return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03003320}
3321
3322
3323/* Get handle to video output stream */
3324struct pvr2_stream *pvr2_hdw_get_video_stream(struct pvr2_hdw *hp)
3325{
3326 return hp->vid_stream;
3327}
3328
3329
3330void pvr2_hdw_trigger_module_log(struct pvr2_hdw *hdw)
3331{
Mike Isely4f1a3e52006-06-25 20:04:31 -03003332 int nr = pvr2_hdw_get_unit_number(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003333 LOCK_TAKE(hdw->big_lock); do {
Mike Isely4f1a3e52006-06-25 20:04:31 -03003334 printk(KERN_INFO "pvrusb2: ================= START STATUS CARD #%d =================\n", nr);
Mike Isely5ceaad12009-03-07 00:01:20 -03003335 hdw->log_requested = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03003336 pvr2_i2c_core_check_stale(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003337 pvr2_i2c_core_sync(hdw);
Mike Iselya51f5002009-03-06 23:30:37 -03003338 hdw->log_requested = 0;
Mike Iselyed3261a2009-03-07 00:02:33 -03003339 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, log_status);
Mike Iselyb30d2442006-06-25 20:05:01 -03003340 pvr2_trace(PVR2_TRACE_INFO,"cx2341x config:");
Hans Verkuil99eb44f2006-06-26 18:24:05 -03003341 cx2341x_log_status(&hdw->enc_ctl_state, "pvrusb2");
Mike Isely681c7392007-11-26 01:48:52 -03003342 pvr2_hdw_state_log_state(hdw);
Mike Isely4f1a3e52006-06-25 20:04:31 -03003343 printk(KERN_INFO "pvrusb2: ================== END STATUS CARD #%d ==================\n", nr);
Mike Iselyd8554972006-06-26 20:58:46 -03003344 } while (0); LOCK_GIVE(hdw->big_lock);
3345}
3346
Mike Isely4db666c2007-09-08 22:16:27 -03003347
3348/* Grab EEPROM contents, needed for direct method. */
3349#define EEPROM_SIZE 8192
3350#define trace_eeprom(...) pvr2_trace(PVR2_TRACE_EEPROM,__VA_ARGS__)
3351static u8 *pvr2_full_eeprom_fetch(struct pvr2_hdw *hdw)
3352{
3353 struct i2c_msg msg[2];
3354 u8 *eeprom;
3355 u8 iadd[2];
3356 u8 addr;
3357 u16 eepromSize;
3358 unsigned int offs;
3359 int ret;
3360 int mode16 = 0;
3361 unsigned pcnt,tcnt;
3362 eeprom = kmalloc(EEPROM_SIZE,GFP_KERNEL);
3363 if (!eeprom) {
3364 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3365 "Failed to allocate memory"
3366 " required to read eeprom");
3367 return NULL;
3368 }
3369
3370 trace_eeprom("Value for eeprom addr from controller was 0x%x",
3371 hdw->eeprom_addr);
3372 addr = hdw->eeprom_addr;
3373 /* Seems that if the high bit is set, then the *real* eeprom
3374 address is shifted right now bit position (noticed this in
3375 newer PVR USB2 hardware) */
3376 if (addr & 0x80) addr >>= 1;
3377
3378 /* FX2 documentation states that a 16bit-addressed eeprom is
3379 expected if the I2C address is an odd number (yeah, this is
3380 strange but it's what they do) */
3381 mode16 = (addr & 1);
3382 eepromSize = (mode16 ? EEPROM_SIZE : 256);
3383 trace_eeprom("Examining %d byte eeprom at location 0x%x"
3384 " using %d bit addressing",eepromSize,addr,
3385 mode16 ? 16 : 8);
3386
3387 msg[0].addr = addr;
3388 msg[0].flags = 0;
3389 msg[0].len = mode16 ? 2 : 1;
3390 msg[0].buf = iadd;
3391 msg[1].addr = addr;
3392 msg[1].flags = I2C_M_RD;
3393
3394 /* We have to do the actual eeprom data fetch ourselves, because
3395 (1) we're only fetching part of the eeprom, and (2) if we were
3396 getting the whole thing our I2C driver can't grab it in one
3397 pass - which is what tveeprom is otherwise going to attempt */
3398 memset(eeprom,0,EEPROM_SIZE);
3399 for (tcnt = 0; tcnt < EEPROM_SIZE; tcnt += pcnt) {
3400 pcnt = 16;
3401 if (pcnt + tcnt > EEPROM_SIZE) pcnt = EEPROM_SIZE-tcnt;
3402 offs = tcnt + (eepromSize - EEPROM_SIZE);
3403 if (mode16) {
3404 iadd[0] = offs >> 8;
3405 iadd[1] = offs;
3406 } else {
3407 iadd[0] = offs;
3408 }
3409 msg[1].len = pcnt;
3410 msg[1].buf = eeprom+tcnt;
3411 if ((ret = i2c_transfer(&hdw->i2c_adap,
3412 msg,ARRAY_SIZE(msg))) != 2) {
3413 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3414 "eeprom fetch set offs err=%d",ret);
3415 kfree(eeprom);
3416 return NULL;
3417 }
3418 }
3419 return eeprom;
3420}
3421
3422
3423void pvr2_hdw_cpufw_set_enabled(struct pvr2_hdw *hdw,
3424 int prom_flag,
3425 int enable_flag)
Mike Iselyd8554972006-06-26 20:58:46 -03003426{
3427 int ret;
3428 u16 address;
3429 unsigned int pipe;
3430 LOCK_TAKE(hdw->big_lock); do {
Al Viro5fa12472008-03-29 03:07:38 +00003431 if ((hdw->fw_buffer == NULL) == !enable_flag) break;
Mike Iselyd8554972006-06-26 20:58:46 -03003432
3433 if (!enable_flag) {
3434 pvr2_trace(PVR2_TRACE_FIRMWARE,
3435 "Cleaning up after CPU firmware fetch");
3436 kfree(hdw->fw_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03003437 hdw->fw_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03003438 hdw->fw_size = 0;
Mike Isely4db666c2007-09-08 22:16:27 -03003439 if (hdw->fw_cpu_flag) {
3440 /* Now release the CPU. It will disconnect
3441 and reconnect later. */
3442 pvr2_hdw_cpureset_assert(hdw,0);
3443 }
Mike Iselyd8554972006-06-26 20:58:46 -03003444 break;
3445 }
3446
Mike Isely4db666c2007-09-08 22:16:27 -03003447 hdw->fw_cpu_flag = (prom_flag == 0);
3448 if (hdw->fw_cpu_flag) {
3449 pvr2_trace(PVR2_TRACE_FIRMWARE,
3450 "Preparing to suck out CPU firmware");
3451 hdw->fw_size = 0x2000;
3452 hdw->fw_buffer = kzalloc(hdw->fw_size,GFP_KERNEL);
3453 if (!hdw->fw_buffer) {
3454 hdw->fw_size = 0;
3455 break;
3456 }
3457
3458 /* We have to hold the CPU during firmware upload. */
3459 pvr2_hdw_cpureset_assert(hdw,1);
3460
3461 /* download the firmware from address 0000-1fff in 2048
3462 (=0x800) bytes chunk. */
3463
3464 pvr2_trace(PVR2_TRACE_FIRMWARE,
3465 "Grabbing CPU firmware");
3466 pipe = usb_rcvctrlpipe(hdw->usb_dev, 0);
3467 for(address = 0; address < hdw->fw_size;
3468 address += 0x800) {
3469 ret = usb_control_msg(hdw->usb_dev,pipe,
3470 0xa0,0xc0,
3471 address,0,
3472 hdw->fw_buffer+address,
3473 0x800,HZ);
3474 if (ret < 0) break;
3475 }
3476
3477 pvr2_trace(PVR2_TRACE_FIRMWARE,
3478 "Done grabbing CPU firmware");
3479 } else {
3480 pvr2_trace(PVR2_TRACE_FIRMWARE,
3481 "Sucking down EEPROM contents");
3482 hdw->fw_buffer = pvr2_full_eeprom_fetch(hdw);
3483 if (!hdw->fw_buffer) {
3484 pvr2_trace(PVR2_TRACE_FIRMWARE,
3485 "EEPROM content suck failed.");
3486 break;
3487 }
3488 hdw->fw_size = EEPROM_SIZE;
3489 pvr2_trace(PVR2_TRACE_FIRMWARE,
3490 "Done sucking down EEPROM contents");
Mike Iselyd8554972006-06-26 20:58:46 -03003491 }
3492
Mike Iselyd8554972006-06-26 20:58:46 -03003493 } while (0); LOCK_GIVE(hdw->big_lock);
3494}
3495
3496
3497/* Return true if we're in a mode for retrieval CPU firmware */
3498int pvr2_hdw_cpufw_get_enabled(struct pvr2_hdw *hdw)
3499{
Al Viro5fa12472008-03-29 03:07:38 +00003500 return hdw->fw_buffer != NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03003501}
3502
3503
3504int pvr2_hdw_cpufw_get(struct pvr2_hdw *hdw,unsigned int offs,
3505 char *buf,unsigned int cnt)
3506{
3507 int ret = -EINVAL;
3508 LOCK_TAKE(hdw->big_lock); do {
3509 if (!buf) break;
3510 if (!cnt) break;
3511
3512 if (!hdw->fw_buffer) {
3513 ret = -EIO;
3514 break;
3515 }
3516
3517 if (offs >= hdw->fw_size) {
3518 pvr2_trace(PVR2_TRACE_FIRMWARE,
3519 "Read firmware data offs=%d EOF",
3520 offs);
3521 ret = 0;
3522 break;
3523 }
3524
3525 if (offs + cnt > hdw->fw_size) cnt = hdw->fw_size - offs;
3526
3527 memcpy(buf,hdw->fw_buffer+offs,cnt);
3528
3529 pvr2_trace(PVR2_TRACE_FIRMWARE,
3530 "Read firmware data offs=%d cnt=%d",
3531 offs,cnt);
3532 ret = cnt;
3533 } while (0); LOCK_GIVE(hdw->big_lock);
3534
3535 return ret;
3536}
3537
3538
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003539int pvr2_hdw_v4l_get_minor_number(struct pvr2_hdw *hdw,
Mike Isely80793842006-12-27 23:12:28 -03003540 enum pvr2_v4l_type index)
Mike Iselyd8554972006-06-26 20:58:46 -03003541{
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003542 switch (index) {
Mike Isely80793842006-12-27 23:12:28 -03003543 case pvr2_v4l_type_video: return hdw->v4l_minor_number_video;
3544 case pvr2_v4l_type_vbi: return hdw->v4l_minor_number_vbi;
3545 case pvr2_v4l_type_radio: return hdw->v4l_minor_number_radio;
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003546 default: return -1;
3547 }
Mike Iselyd8554972006-06-26 20:58:46 -03003548}
3549
3550
Pantelis Koukousoulas2fdf3d92006-12-27 23:07:58 -03003551/* Store a v4l minor device number */
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003552void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *hdw,
Mike Isely80793842006-12-27 23:12:28 -03003553 enum pvr2_v4l_type index,int v)
Mike Iselyd8554972006-06-26 20:58:46 -03003554{
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003555 switch (index) {
Mike Isely80793842006-12-27 23:12:28 -03003556 case pvr2_v4l_type_video: hdw->v4l_minor_number_video = v;
3557 case pvr2_v4l_type_vbi: hdw->v4l_minor_number_vbi = v;
3558 case pvr2_v4l_type_radio: hdw->v4l_minor_number_radio = v;
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003559 default: break;
3560 }
Mike Iselyd8554972006-06-26 20:58:46 -03003561}
3562
3563
David Howells7d12e782006-10-05 14:55:46 +01003564static void pvr2_ctl_write_complete(struct urb *urb)
Mike Iselyd8554972006-06-26 20:58:46 -03003565{
3566 struct pvr2_hdw *hdw = urb->context;
3567 hdw->ctl_write_pend_flag = 0;
3568 if (hdw->ctl_read_pend_flag) return;
3569 complete(&hdw->ctl_done);
3570}
3571
3572
David Howells7d12e782006-10-05 14:55:46 +01003573static void pvr2_ctl_read_complete(struct urb *urb)
Mike Iselyd8554972006-06-26 20:58:46 -03003574{
3575 struct pvr2_hdw *hdw = urb->context;
3576 hdw->ctl_read_pend_flag = 0;
3577 if (hdw->ctl_write_pend_flag) return;
3578 complete(&hdw->ctl_done);
3579}
3580
3581
3582static void pvr2_ctl_timeout(unsigned long data)
3583{
3584 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
3585 if (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
3586 hdw->ctl_timeout_flag = !0;
Mariusz Kozlowski5e55d2c2006-11-08 15:34:31 +01003587 if (hdw->ctl_write_pend_flag)
Mike Iselyd8554972006-06-26 20:58:46 -03003588 usb_unlink_urb(hdw->ctl_write_urb);
Mariusz Kozlowski5e55d2c2006-11-08 15:34:31 +01003589 if (hdw->ctl_read_pend_flag)
Mike Iselyd8554972006-06-26 20:58:46 -03003590 usb_unlink_urb(hdw->ctl_read_urb);
Mike Iselyd8554972006-06-26 20:58:46 -03003591 }
3592}
3593
3594
Mike Iselye61b6fc2006-07-18 22:42:18 -03003595/* Issue a command and get a response from the device. This extended
3596 version includes a probe flag (which if set means that device errors
3597 should not be logged or treated as fatal) and a timeout in jiffies.
3598 This can be used to non-lethally probe the health of endpoint 1. */
Adrian Bunk07e337e2006-06-30 11:30:20 -03003599static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
3600 unsigned int timeout,int probe_fl,
3601 void *write_data,unsigned int write_len,
3602 void *read_data,unsigned int read_len)
Mike Iselyd8554972006-06-26 20:58:46 -03003603{
3604 unsigned int idx;
3605 int status = 0;
3606 struct timer_list timer;
3607 if (!hdw->ctl_lock_held) {
3608 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3609 "Attempted to execute control transfer"
3610 " without lock!!");
3611 return -EDEADLK;
3612 }
Mike Isely681c7392007-11-26 01:48:52 -03003613 if (!hdw->flag_ok && !probe_fl) {
Mike Iselyd8554972006-06-26 20:58:46 -03003614 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3615 "Attempted to execute control transfer"
3616 " when device not ok");
3617 return -EIO;
3618 }
3619 if (!(hdw->ctl_read_urb && hdw->ctl_write_urb)) {
3620 if (!probe_fl) {
3621 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3622 "Attempted to execute control transfer"
3623 " when USB is disconnected");
3624 }
3625 return -ENOTTY;
3626 }
3627
3628 /* Ensure that we have sane parameters */
3629 if (!write_data) write_len = 0;
3630 if (!read_data) read_len = 0;
3631 if (write_len > PVR2_CTL_BUFFSIZE) {
3632 pvr2_trace(
3633 PVR2_TRACE_ERROR_LEGS,
3634 "Attempted to execute %d byte"
3635 " control-write transfer (limit=%d)",
3636 write_len,PVR2_CTL_BUFFSIZE);
3637 return -EINVAL;
3638 }
3639 if (read_len > PVR2_CTL_BUFFSIZE) {
3640 pvr2_trace(
3641 PVR2_TRACE_ERROR_LEGS,
3642 "Attempted to execute %d byte"
3643 " control-read transfer (limit=%d)",
3644 write_len,PVR2_CTL_BUFFSIZE);
3645 return -EINVAL;
3646 }
3647 if ((!write_len) && (!read_len)) {
3648 pvr2_trace(
3649 PVR2_TRACE_ERROR_LEGS,
3650 "Attempted to execute null control transfer?");
3651 return -EINVAL;
3652 }
3653
3654
3655 hdw->cmd_debug_state = 1;
3656 if (write_len) {
3657 hdw->cmd_debug_code = ((unsigned char *)write_data)[0];
3658 } else {
3659 hdw->cmd_debug_code = 0;
3660 }
3661 hdw->cmd_debug_write_len = write_len;
3662 hdw->cmd_debug_read_len = read_len;
3663
3664 /* Initialize common stuff */
3665 init_completion(&hdw->ctl_done);
3666 hdw->ctl_timeout_flag = 0;
3667 hdw->ctl_write_pend_flag = 0;
3668 hdw->ctl_read_pend_flag = 0;
3669 init_timer(&timer);
3670 timer.expires = jiffies + timeout;
3671 timer.data = (unsigned long)hdw;
3672 timer.function = pvr2_ctl_timeout;
3673
3674 if (write_len) {
3675 hdw->cmd_debug_state = 2;
3676 /* Transfer write data to internal buffer */
3677 for (idx = 0; idx < write_len; idx++) {
3678 hdw->ctl_write_buffer[idx] =
3679 ((unsigned char *)write_data)[idx];
3680 }
3681 /* Initiate a write request */
3682 usb_fill_bulk_urb(hdw->ctl_write_urb,
3683 hdw->usb_dev,
3684 usb_sndbulkpipe(hdw->usb_dev,
3685 PVR2_CTL_WRITE_ENDPOINT),
3686 hdw->ctl_write_buffer,
3687 write_len,
3688 pvr2_ctl_write_complete,
3689 hdw);
3690 hdw->ctl_write_urb->actual_length = 0;
3691 hdw->ctl_write_pend_flag = !0;
3692 status = usb_submit_urb(hdw->ctl_write_urb,GFP_KERNEL);
3693 if (status < 0) {
3694 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3695 "Failed to submit write-control"
3696 " URB status=%d",status);
3697 hdw->ctl_write_pend_flag = 0;
3698 goto done;
3699 }
3700 }
3701
3702 if (read_len) {
3703 hdw->cmd_debug_state = 3;
3704 memset(hdw->ctl_read_buffer,0x43,read_len);
3705 /* Initiate a read request */
3706 usb_fill_bulk_urb(hdw->ctl_read_urb,
3707 hdw->usb_dev,
3708 usb_rcvbulkpipe(hdw->usb_dev,
3709 PVR2_CTL_READ_ENDPOINT),
3710 hdw->ctl_read_buffer,
3711 read_len,
3712 pvr2_ctl_read_complete,
3713 hdw);
3714 hdw->ctl_read_urb->actual_length = 0;
3715 hdw->ctl_read_pend_flag = !0;
3716 status = usb_submit_urb(hdw->ctl_read_urb,GFP_KERNEL);
3717 if (status < 0) {
3718 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3719 "Failed to submit read-control"
3720 " URB status=%d",status);
3721 hdw->ctl_read_pend_flag = 0;
3722 goto done;
3723 }
3724 }
3725
3726 /* Start timer */
3727 add_timer(&timer);
3728
3729 /* Now wait for all I/O to complete */
3730 hdw->cmd_debug_state = 4;
3731 while (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
3732 wait_for_completion(&hdw->ctl_done);
3733 }
3734 hdw->cmd_debug_state = 5;
3735
3736 /* Stop timer */
3737 del_timer_sync(&timer);
3738
3739 hdw->cmd_debug_state = 6;
3740 status = 0;
3741
3742 if (hdw->ctl_timeout_flag) {
3743 status = -ETIMEDOUT;
3744 if (!probe_fl) {
3745 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3746 "Timed out control-write");
3747 }
3748 goto done;
3749 }
3750
3751 if (write_len) {
3752 /* Validate results of write request */
3753 if ((hdw->ctl_write_urb->status != 0) &&
3754 (hdw->ctl_write_urb->status != -ENOENT) &&
3755 (hdw->ctl_write_urb->status != -ESHUTDOWN) &&
3756 (hdw->ctl_write_urb->status != -ECONNRESET)) {
3757 /* USB subsystem is reporting some kind of failure
3758 on the write */
3759 status = hdw->ctl_write_urb->status;
3760 if (!probe_fl) {
3761 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3762 "control-write URB failure,"
3763 " status=%d",
3764 status);
3765 }
3766 goto done;
3767 }
3768 if (hdw->ctl_write_urb->actual_length < write_len) {
3769 /* Failed to write enough data */
3770 status = -EIO;
3771 if (!probe_fl) {
3772 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3773 "control-write URB short,"
3774 " expected=%d got=%d",
3775 write_len,
3776 hdw->ctl_write_urb->actual_length);
3777 }
3778 goto done;
3779 }
3780 }
3781 if (read_len) {
3782 /* Validate results of read request */
3783 if ((hdw->ctl_read_urb->status != 0) &&
3784 (hdw->ctl_read_urb->status != -ENOENT) &&
3785 (hdw->ctl_read_urb->status != -ESHUTDOWN) &&
3786 (hdw->ctl_read_urb->status != -ECONNRESET)) {
3787 /* USB subsystem is reporting some kind of failure
3788 on the read */
3789 status = hdw->ctl_read_urb->status;
3790 if (!probe_fl) {
3791 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3792 "control-read URB failure,"
3793 " status=%d",
3794 status);
3795 }
3796 goto done;
3797 }
3798 if (hdw->ctl_read_urb->actual_length < read_len) {
3799 /* Failed to read enough data */
3800 status = -EIO;
3801 if (!probe_fl) {
3802 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3803 "control-read URB short,"
3804 " expected=%d got=%d",
3805 read_len,
3806 hdw->ctl_read_urb->actual_length);
3807 }
3808 goto done;
3809 }
3810 /* Transfer retrieved data out from internal buffer */
3811 for (idx = 0; idx < read_len; idx++) {
3812 ((unsigned char *)read_data)[idx] =
3813 hdw->ctl_read_buffer[idx];
3814 }
3815 }
3816
3817 done:
3818
3819 hdw->cmd_debug_state = 0;
3820 if ((status < 0) && (!probe_fl)) {
Mike Isely681c7392007-11-26 01:48:52 -03003821 pvr2_hdw_render_useless(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003822 }
3823 return status;
3824}
3825
3826
3827int pvr2_send_request(struct pvr2_hdw *hdw,
3828 void *write_data,unsigned int write_len,
3829 void *read_data,unsigned int read_len)
3830{
3831 return pvr2_send_request_ex(hdw,HZ*4,0,
3832 write_data,write_len,
3833 read_data,read_len);
3834}
3835
Mike Isely1c9d10d2008-03-28 05:38:54 -03003836
3837static int pvr2_issue_simple_cmd(struct pvr2_hdw *hdw,u32 cmdcode)
3838{
3839 int ret;
3840 unsigned int cnt = 1;
3841 unsigned int args = 0;
3842 LOCK_TAKE(hdw->ctl_lock);
3843 hdw->cmd_buffer[0] = cmdcode & 0xffu;
3844 args = (cmdcode >> 8) & 0xffu;
3845 args = (args > 2) ? 2 : args;
3846 if (args) {
3847 cnt += args;
3848 hdw->cmd_buffer[1] = (cmdcode >> 16) & 0xffu;
3849 if (args > 1) {
3850 hdw->cmd_buffer[2] = (cmdcode >> 24) & 0xffu;
3851 }
3852 }
3853 if (pvrusb2_debug & PVR2_TRACE_INIT) {
3854 unsigned int idx;
3855 unsigned int ccnt,bcnt;
3856 char tbuf[50];
3857 cmdcode &= 0xffu;
3858 bcnt = 0;
3859 ccnt = scnprintf(tbuf+bcnt,
3860 sizeof(tbuf)-bcnt,
3861 "Sending FX2 command 0x%x",cmdcode);
3862 bcnt += ccnt;
3863 for (idx = 0; idx < ARRAY_SIZE(pvr2_fx2cmd_desc); idx++) {
3864 if (pvr2_fx2cmd_desc[idx].id == cmdcode) {
3865 ccnt = scnprintf(tbuf+bcnt,
3866 sizeof(tbuf)-bcnt,
3867 " \"%s\"",
3868 pvr2_fx2cmd_desc[idx].desc);
3869 bcnt += ccnt;
3870 break;
3871 }
3872 }
3873 if (args) {
3874 ccnt = scnprintf(tbuf+bcnt,
3875 sizeof(tbuf)-bcnt,
3876 " (%u",hdw->cmd_buffer[1]);
3877 bcnt += ccnt;
3878 if (args > 1) {
3879 ccnt = scnprintf(tbuf+bcnt,
3880 sizeof(tbuf)-bcnt,
3881 ",%u",hdw->cmd_buffer[2]);
3882 bcnt += ccnt;
3883 }
3884 ccnt = scnprintf(tbuf+bcnt,
3885 sizeof(tbuf)-bcnt,
3886 ")");
3887 bcnt += ccnt;
3888 }
3889 pvr2_trace(PVR2_TRACE_INIT,"%.*s",bcnt,tbuf);
3890 }
3891 ret = pvr2_send_request(hdw,hdw->cmd_buffer,cnt,NULL,0);
3892 LOCK_GIVE(hdw->ctl_lock);
3893 return ret;
3894}
3895
3896
Mike Iselyd8554972006-06-26 20:58:46 -03003897int pvr2_write_register(struct pvr2_hdw *hdw, u16 reg, u32 data)
3898{
3899 int ret;
3900
3901 LOCK_TAKE(hdw->ctl_lock);
3902
Michael Krufky8d364362007-01-22 02:17:55 -03003903 hdw->cmd_buffer[0] = FX2CMD_REG_WRITE; /* write register prefix */
Mike Iselyd8554972006-06-26 20:58:46 -03003904 PVR2_DECOMPOSE_LE(hdw->cmd_buffer,1,data);
3905 hdw->cmd_buffer[5] = 0;
3906 hdw->cmd_buffer[6] = (reg >> 8) & 0xff;
3907 hdw->cmd_buffer[7] = reg & 0xff;
3908
3909
3910 ret = pvr2_send_request(hdw, hdw->cmd_buffer, 8, hdw->cmd_buffer, 0);
3911
3912 LOCK_GIVE(hdw->ctl_lock);
3913
3914 return ret;
3915}
3916
3917
Adrian Bunk07e337e2006-06-30 11:30:20 -03003918static int pvr2_read_register(struct pvr2_hdw *hdw, u16 reg, u32 *data)
Mike Iselyd8554972006-06-26 20:58:46 -03003919{
3920 int ret = 0;
3921
3922 LOCK_TAKE(hdw->ctl_lock);
3923
Michael Krufky8d364362007-01-22 02:17:55 -03003924 hdw->cmd_buffer[0] = FX2CMD_REG_READ; /* read register prefix */
Mike Iselyd8554972006-06-26 20:58:46 -03003925 hdw->cmd_buffer[1] = 0;
3926 hdw->cmd_buffer[2] = 0;
3927 hdw->cmd_buffer[3] = 0;
3928 hdw->cmd_buffer[4] = 0;
3929 hdw->cmd_buffer[5] = 0;
3930 hdw->cmd_buffer[6] = (reg >> 8) & 0xff;
3931 hdw->cmd_buffer[7] = reg & 0xff;
3932
3933 ret |= pvr2_send_request(hdw, hdw->cmd_buffer, 8, hdw->cmd_buffer, 4);
3934 *data = PVR2_COMPOSE_LE(hdw->cmd_buffer,0);
3935
3936 LOCK_GIVE(hdw->ctl_lock);
3937
3938 return ret;
3939}
3940
3941
Mike Isely681c7392007-11-26 01:48:52 -03003942void pvr2_hdw_render_useless(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03003943{
3944 if (!hdw->flag_ok) return;
Mike Isely681c7392007-11-26 01:48:52 -03003945 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3946 "Device being rendered inoperable");
Mike Iselyd8554972006-06-26 20:58:46 -03003947 if (hdw->vid_stream) {
Mike Iselya0fd1cb2006-06-30 11:35:28 -03003948 pvr2_stream_setup(hdw->vid_stream,NULL,0,0);
Mike Iselyd8554972006-06-26 20:58:46 -03003949 }
Mike Isely681c7392007-11-26 01:48:52 -03003950 hdw->flag_ok = 0;
3951 trace_stbit("flag_ok",hdw->flag_ok);
3952 pvr2_hdw_state_sched(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003953}
3954
3955
3956void pvr2_hdw_device_reset(struct pvr2_hdw *hdw)
3957{
3958 int ret;
3959 pvr2_trace(PVR2_TRACE_INIT,"Performing a device reset...");
Mike Iselya0fd1cb2006-06-30 11:35:28 -03003960 ret = usb_lock_device_for_reset(hdw->usb_dev,NULL);
Alan Stern011b15d2008-11-04 11:29:27 -05003961 if (ret == 0) {
Mike Iselyd8554972006-06-26 20:58:46 -03003962 ret = usb_reset_device(hdw->usb_dev);
3963 usb_unlock_device(hdw->usb_dev);
3964 } else {
3965 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3966 "Failed to lock USB device ret=%d",ret);
3967 }
3968 if (init_pause_msec) {
3969 pvr2_trace(PVR2_TRACE_INFO,
3970 "Waiting %u msec for hardware to settle",
3971 init_pause_msec);
3972 msleep(init_pause_msec);
3973 }
3974
3975}
3976
3977
3978void pvr2_hdw_cpureset_assert(struct pvr2_hdw *hdw,int val)
3979{
3980 char da[1];
3981 unsigned int pipe;
3982 int ret;
3983
3984 if (!hdw->usb_dev) return;
3985
3986 pvr2_trace(PVR2_TRACE_INIT,"cpureset_assert(%d)",val);
3987
3988 da[0] = val ? 0x01 : 0x00;
3989
3990 /* Write the CPUCS register on the 8051. The lsb of the register
3991 is the reset bit; a 1 asserts reset while a 0 clears it. */
3992 pipe = usb_sndctrlpipe(hdw->usb_dev, 0);
3993 ret = usb_control_msg(hdw->usb_dev,pipe,0xa0,0x40,0xe600,0,da,1,HZ);
3994 if (ret < 0) {
3995 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3996 "cpureset_assert(%d) error=%d",val,ret);
3997 pvr2_hdw_render_useless(hdw);
3998 }
3999}
4000
4001
4002int pvr2_hdw_cmd_deep_reset(struct pvr2_hdw *hdw)
4003{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004004 return pvr2_issue_simple_cmd(hdw,FX2CMD_DEEP_RESET);
Mike Iselyd8554972006-06-26 20:58:46 -03004005}
4006
4007
Michael Krufkye1edb192008-04-22 14:45:39 -03004008int pvr2_hdw_cmd_powerup(struct pvr2_hdw *hdw)
4009{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004010 return pvr2_issue_simple_cmd(hdw,FX2CMD_POWER_ON);
Michael Krufkye1edb192008-04-22 14:45:39 -03004011}
4012
Mike Isely1c9d10d2008-03-28 05:38:54 -03004013
Michael Krufkye1edb192008-04-22 14:45:39 -03004014int pvr2_hdw_cmd_powerdown(struct pvr2_hdw *hdw)
4015{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004016 return pvr2_issue_simple_cmd(hdw,FX2CMD_POWER_OFF);
Michael Krufkye1edb192008-04-22 14:45:39 -03004017}
4018
Mike Iselyd8554972006-06-26 20:58:46 -03004019
4020int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw)
4021{
Mike Iselyd8554972006-06-26 20:58:46 -03004022 pvr2_trace(PVR2_TRACE_INIT,
4023 "Requesting decoder reset");
Mike Iselyaf78e162009-03-07 00:21:30 -03004024 if (hdw->decoder_ctrl) {
4025 if (!hdw->decoder_ctrl->force_reset) {
4026 pvr2_trace(PVR2_TRACE_INIT,
4027 "Unable to reset decoder: not implemented");
4028 return -ENOTTY;
4029 }
4030 hdw->decoder_ctrl->force_reset(hdw->decoder_ctrl->ctxt);
4031 return 0;
4032 } else {
4033 }
4034 if (hdw->decoder_client_id) {
4035 v4l2_device_call_all(&hdw->v4l2_dev, hdw->decoder_client_id,
4036 core, reset, 0);
4037 return 0;
4038 }
4039 pvr2_trace(PVR2_TRACE_INIT,
4040 "Unable to reset decoder: nothing attached");
4041 return -ENOTTY;
Mike Iselyd8554972006-06-26 20:58:46 -03004042}
4043
4044
Mike Isely62433e32008-04-22 14:45:40 -03004045static int pvr2_hdw_cmd_hcw_demod_reset(struct pvr2_hdw *hdw, int onoff)
Mike Isely84147f32008-04-22 14:45:40 -03004046{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004047 hdw->flag_ok = !0;
4048 return pvr2_issue_simple_cmd(hdw,
4049 FX2CMD_HCW_DEMOD_RESETIN |
4050 (1 << 8) |
4051 ((onoff ? 1 : 0) << 16));
Mike Isely84147f32008-04-22 14:45:40 -03004052}
4053
Mike Isely84147f32008-04-22 14:45:40 -03004054
Mike Isely62433e32008-04-22 14:45:40 -03004055static int pvr2_hdw_cmd_onair_fe_power_ctrl(struct pvr2_hdw *hdw, int onoff)
Mike Isely84147f32008-04-22 14:45:40 -03004056{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004057 hdw->flag_ok = !0;
4058 return pvr2_issue_simple_cmd(hdw,(onoff ?
4059 FX2CMD_ONAIR_DTV_POWER_ON :
4060 FX2CMD_ONAIR_DTV_POWER_OFF));
Mike Isely84147f32008-04-22 14:45:40 -03004061}
4062
Mike Isely62433e32008-04-22 14:45:40 -03004063
4064static int pvr2_hdw_cmd_onair_digital_path_ctrl(struct pvr2_hdw *hdw,
4065 int onoff)
Mike Isely84147f32008-04-22 14:45:40 -03004066{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004067 return pvr2_issue_simple_cmd(hdw,(onoff ?
4068 FX2CMD_ONAIR_DTV_STREAMING_ON :
4069 FX2CMD_ONAIR_DTV_STREAMING_OFF));
Mike Isely84147f32008-04-22 14:45:40 -03004070}
4071
Mike Isely62433e32008-04-22 14:45:40 -03004072
4073static void pvr2_hdw_cmd_modeswitch(struct pvr2_hdw *hdw,int digitalFl)
4074{
4075 int cmode;
4076 /* Compare digital/analog desired setting with current setting. If
4077 they don't match, fix it... */
4078 cmode = (digitalFl ? PVR2_PATHWAY_DIGITAL : PVR2_PATHWAY_ANALOG);
4079 if (cmode == hdw->pathway_state) {
4080 /* They match; nothing to do */
4081 return;
4082 }
4083
4084 switch (hdw->hdw_desc->digital_control_scheme) {
4085 case PVR2_DIGITAL_SCHEME_HAUPPAUGE:
4086 pvr2_hdw_cmd_hcw_demod_reset(hdw,digitalFl);
4087 if (cmode == PVR2_PATHWAY_ANALOG) {
4088 /* If moving to analog mode, also force the decoder
4089 to reset. If no decoder is attached, then it's
4090 ok to ignore this because if/when the decoder
4091 attaches, it will reset itself at that time. */
4092 pvr2_hdw_cmd_decoder_reset(hdw);
4093 }
4094 break;
4095 case PVR2_DIGITAL_SCHEME_ONAIR:
4096 /* Supposedly we should always have the power on whether in
4097 digital or analog mode. But for now do what appears to
4098 work... */
Mike Iselybb0c2fe2008-03-28 05:41:19 -03004099 pvr2_hdw_cmd_onair_fe_power_ctrl(hdw,digitalFl);
Mike Isely62433e32008-04-22 14:45:40 -03004100 break;
4101 default: break;
4102 }
4103
Mike Isely1b9c18c2008-04-22 14:45:41 -03004104 pvr2_hdw_untrip_unlocked(hdw);
Mike Isely62433e32008-04-22 14:45:40 -03004105 hdw->pathway_state = cmode;
4106}
4107
4108
Adrian Bunke9b59f62008-05-10 04:35:24 -03004109static void pvr2_led_ctrl_hauppauge(struct pvr2_hdw *hdw, int onoff)
Mike Iselyc55a97d2008-04-22 14:45:41 -03004110{
4111 /* change some GPIO data
4112 *
4113 * note: bit d7 of dir appears to control the LED,
4114 * so we shut it off here.
4115 *
Mike Iselyc55a97d2008-04-22 14:45:41 -03004116 */
Mike Isely40381cb2008-04-22 14:45:42 -03004117 if (onoff) {
Mike Iselyc55a97d2008-04-22 14:45:41 -03004118 pvr2_hdw_gpio_chg_dir(hdw, 0xffffffff, 0x00000481);
Mike Isely40381cb2008-04-22 14:45:42 -03004119 } else {
Mike Iselyc55a97d2008-04-22 14:45:41 -03004120 pvr2_hdw_gpio_chg_dir(hdw, 0xffffffff, 0x00000401);
Mike Isely40381cb2008-04-22 14:45:42 -03004121 }
Mike Iselyc55a97d2008-04-22 14:45:41 -03004122 pvr2_hdw_gpio_chg_out(hdw, 0xffffffff, 0x00000000);
Mike Isely40381cb2008-04-22 14:45:42 -03004123}
Mike Iselyc55a97d2008-04-22 14:45:41 -03004124
Mike Isely40381cb2008-04-22 14:45:42 -03004125
4126typedef void (*led_method_func)(struct pvr2_hdw *,int);
4127
4128static led_method_func led_methods[] = {
4129 [PVR2_LED_SCHEME_HAUPPAUGE] = pvr2_led_ctrl_hauppauge,
4130};
4131
4132
4133/* Toggle LED */
4134static void pvr2_led_ctrl(struct pvr2_hdw *hdw,int onoff)
4135{
4136 unsigned int scheme_id;
4137 led_method_func fp;
4138
4139 if ((!onoff) == (!hdw->led_on)) return;
4140
4141 hdw->led_on = onoff != 0;
4142
4143 scheme_id = hdw->hdw_desc->led_scheme;
4144 if (scheme_id < ARRAY_SIZE(led_methods)) {
4145 fp = led_methods[scheme_id];
4146 } else {
4147 fp = NULL;
4148 }
4149
4150 if (fp) (*fp)(hdw,onoff);
Mike Iselyc55a97d2008-04-22 14:45:41 -03004151}
4152
4153
Mike Iselye61b6fc2006-07-18 22:42:18 -03004154/* Stop / start video stream transport */
Adrian Bunk07e337e2006-06-30 11:30:20 -03004155static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl)
Mike Iselyd8554972006-06-26 20:58:46 -03004156{
Mike Iselybb0c2fe2008-03-28 05:41:19 -03004157 int ret;
4158
4159 /* If we're in analog mode, then just issue the usual analog
4160 command. */
4161 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
4162 return pvr2_issue_simple_cmd(hdw,
4163 (runFl ?
4164 FX2CMD_STREAMING_ON :
4165 FX2CMD_STREAMING_OFF));
4166 /*Note: Not reached */
Mike Isely62433e32008-04-22 14:45:40 -03004167 }
Mike Iselybb0c2fe2008-03-28 05:41:19 -03004168
4169 if (hdw->pathway_state != PVR2_PATHWAY_DIGITAL) {
4170 /* Whoops, we don't know what mode we're in... */
4171 return -EINVAL;
4172 }
4173
4174 /* To get here we have to be in digital mode. The mechanism here
4175 is unfortunately different for different vendors. So we switch
4176 on the device's digital scheme attribute in order to figure out
4177 what to do. */
4178 switch (hdw->hdw_desc->digital_control_scheme) {
4179 case PVR2_DIGITAL_SCHEME_HAUPPAUGE:
4180 return pvr2_issue_simple_cmd(hdw,
4181 (runFl ?
4182 FX2CMD_HCW_DTV_STREAMING_ON :
4183 FX2CMD_HCW_DTV_STREAMING_OFF));
4184 case PVR2_DIGITAL_SCHEME_ONAIR:
4185 ret = pvr2_issue_simple_cmd(hdw,
4186 (runFl ?
4187 FX2CMD_STREAMING_ON :
4188 FX2CMD_STREAMING_OFF));
4189 if (ret) return ret;
4190 return pvr2_hdw_cmd_onair_digital_path_ctrl(hdw,runFl);
4191 default:
4192 return -EINVAL;
4193 }
Mike Iselyd8554972006-06-26 20:58:46 -03004194}
4195
4196
Mike Isely62433e32008-04-22 14:45:40 -03004197/* Evaluate whether or not state_pathway_ok can change */
4198static int state_eval_pathway_ok(struct pvr2_hdw *hdw)
4199{
4200 if (hdw->state_pathway_ok) {
4201 /* Nothing to do if pathway is already ok */
4202 return 0;
4203 }
4204 if (!hdw->state_pipeline_idle) {
4205 /* Not allowed to change anything if pipeline is not idle */
4206 return 0;
4207 }
4208 pvr2_hdw_cmd_modeswitch(hdw,hdw->input_val == PVR2_CVAL_INPUT_DTV);
4209 hdw->state_pathway_ok = !0;
Mike Iselye9db1ff2008-04-22 14:45:41 -03004210 trace_stbit("state_pathway_ok",hdw->state_pathway_ok);
Mike Isely62433e32008-04-22 14:45:40 -03004211 return !0;
4212}
4213
4214
Mike Isely681c7392007-11-26 01:48:52 -03004215/* Evaluate whether or not state_encoder_ok can change */
4216static int state_eval_encoder_ok(struct pvr2_hdw *hdw)
4217{
4218 if (hdw->state_encoder_ok) return 0;
4219 if (hdw->flag_tripped) return 0;
4220 if (hdw->state_encoder_run) return 0;
4221 if (hdw->state_encoder_config) return 0;
4222 if (hdw->state_decoder_run) return 0;
4223 if (hdw->state_usbstream_run) return 0;
Mike Isely72998b72008-04-03 04:51:19 -03004224 if (hdw->pathway_state == PVR2_PATHWAY_DIGITAL) {
4225 if (!hdw->hdw_desc->flag_digital_requires_cx23416) return 0;
4226 } else if (hdw->pathway_state != PVR2_PATHWAY_ANALOG) {
4227 return 0;
4228 }
4229
Mike Isely681c7392007-11-26 01:48:52 -03004230 if (pvr2_upload_firmware2(hdw) < 0) {
4231 hdw->flag_tripped = !0;
4232 trace_stbit("flag_tripped",hdw->flag_tripped);
4233 return !0;
4234 }
4235 hdw->state_encoder_ok = !0;
4236 trace_stbit("state_encoder_ok",hdw->state_encoder_ok);
4237 return !0;
4238}
4239
4240
4241/* Evaluate whether or not state_encoder_config can change */
4242static int state_eval_encoder_config(struct pvr2_hdw *hdw)
4243{
4244 if (hdw->state_encoder_config) {
4245 if (hdw->state_encoder_ok) {
4246 if (hdw->state_pipeline_req &&
4247 !hdw->state_pipeline_pause) return 0;
4248 }
4249 hdw->state_encoder_config = 0;
4250 hdw->state_encoder_waitok = 0;
4251 trace_stbit("state_encoder_waitok",hdw->state_encoder_waitok);
4252 /* paranoia - solve race if timer just completed */
4253 del_timer_sync(&hdw->encoder_wait_timer);
4254 } else {
Mike Isely62433e32008-04-22 14:45:40 -03004255 if (!hdw->state_pathway_ok ||
4256 (hdw->pathway_state != PVR2_PATHWAY_ANALOG) ||
4257 !hdw->state_encoder_ok ||
Mike Isely681c7392007-11-26 01:48:52 -03004258 !hdw->state_pipeline_idle ||
4259 hdw->state_pipeline_pause ||
4260 !hdw->state_pipeline_req ||
4261 !hdw->state_pipeline_config) {
4262 /* We must reset the enforced wait interval if
4263 anything has happened that might have disturbed
4264 the encoder. This should be a rare case. */
4265 if (timer_pending(&hdw->encoder_wait_timer)) {
4266 del_timer_sync(&hdw->encoder_wait_timer);
4267 }
4268 if (hdw->state_encoder_waitok) {
4269 /* Must clear the state - therefore we did
4270 something to a state bit and must also
4271 return true. */
4272 hdw->state_encoder_waitok = 0;
4273 trace_stbit("state_encoder_waitok",
4274 hdw->state_encoder_waitok);
4275 return !0;
4276 }
4277 return 0;
4278 }
4279 if (!hdw->state_encoder_waitok) {
4280 if (!timer_pending(&hdw->encoder_wait_timer)) {
4281 /* waitok flag wasn't set and timer isn't
4282 running. Check flag once more to avoid
4283 a race then start the timer. This is
4284 the point when we measure out a minimal
4285 quiet interval before doing something to
4286 the encoder. */
4287 if (!hdw->state_encoder_waitok) {
4288 hdw->encoder_wait_timer.expires =
Mike Isely83ce57a2008-05-26 05:51:57 -03004289 jiffies +
4290 (HZ * TIME_MSEC_ENCODER_WAIT
4291 / 1000);
Mike Isely681c7392007-11-26 01:48:52 -03004292 add_timer(&hdw->encoder_wait_timer);
4293 }
4294 }
4295 /* We can't continue until we know we have been
4296 quiet for the interval measured by this
4297 timer. */
4298 return 0;
4299 }
4300 pvr2_encoder_configure(hdw);
4301 if (hdw->state_encoder_ok) hdw->state_encoder_config = !0;
4302 }
4303 trace_stbit("state_encoder_config",hdw->state_encoder_config);
4304 return !0;
4305}
4306
4307
Mike Iselyd913d632008-04-06 04:04:35 -03004308/* Return true if the encoder should not be running. */
4309static int state_check_disable_encoder_run(struct pvr2_hdw *hdw)
4310{
4311 if (!hdw->state_encoder_ok) {
4312 /* Encoder isn't healthy at the moment, so stop it. */
4313 return !0;
4314 }
4315 if (!hdw->state_pathway_ok) {
4316 /* Mode is not understood at the moment (i.e. it wants to
4317 change), so encoder must be stopped. */
4318 return !0;
4319 }
4320
4321 switch (hdw->pathway_state) {
4322 case PVR2_PATHWAY_ANALOG:
4323 if (!hdw->state_decoder_run) {
4324 /* We're in analog mode and the decoder is not
4325 running; thus the encoder should be stopped as
4326 well. */
4327 return !0;
4328 }
4329 break;
4330 case PVR2_PATHWAY_DIGITAL:
4331 if (hdw->state_encoder_runok) {
4332 /* This is a funny case. We're in digital mode so
4333 really the encoder should be stopped. However
4334 if it really is running, only kill it after
4335 runok has been set. This gives a chance for the
4336 onair quirk to function (encoder must run
4337 briefly first, at least once, before onair
4338 digital streaming can work). */
4339 return !0;
4340 }
4341 break;
4342 default:
4343 /* Unknown mode; so encoder should be stopped. */
4344 return !0;
4345 }
4346
4347 /* If we get here, we haven't found a reason to stop the
4348 encoder. */
4349 return 0;
4350}
4351
4352
4353/* Return true if the encoder should be running. */
4354static int state_check_enable_encoder_run(struct pvr2_hdw *hdw)
4355{
4356 if (!hdw->state_encoder_ok) {
4357 /* Don't run the encoder if it isn't healthy... */
4358 return 0;
4359 }
4360 if (!hdw->state_pathway_ok) {
4361 /* Don't run the encoder if we don't (yet) know what mode
4362 we need to be in... */
4363 return 0;
4364 }
4365
4366 switch (hdw->pathway_state) {
4367 case PVR2_PATHWAY_ANALOG:
4368 if (hdw->state_decoder_run) {
4369 /* In analog mode, if the decoder is running, then
4370 run the encoder. */
4371 return !0;
4372 }
4373 break;
4374 case PVR2_PATHWAY_DIGITAL:
4375 if ((hdw->hdw_desc->digital_control_scheme ==
4376 PVR2_DIGITAL_SCHEME_ONAIR) &&
4377 !hdw->state_encoder_runok) {
4378 /* This is a quirk. OnAir hardware won't stream
4379 digital until the encoder has been run at least
4380 once, for a minimal period of time (empiricially
4381 measured to be 1/4 second). So if we're on
4382 OnAir hardware and the encoder has never been
4383 run at all, then start the encoder. Normal
4384 state machine logic in the driver will
4385 automatically handle the remaining bits. */
4386 return !0;
4387 }
4388 break;
4389 default:
4390 /* For completeness (unknown mode; encoder won't run ever) */
4391 break;
4392 }
4393 /* If we get here, then we haven't found any reason to run the
4394 encoder, so don't run it. */
4395 return 0;
4396}
4397
4398
Mike Isely681c7392007-11-26 01:48:52 -03004399/* Evaluate whether or not state_encoder_run can change */
4400static int state_eval_encoder_run(struct pvr2_hdw *hdw)
4401{
4402 if (hdw->state_encoder_run) {
Mike Iselyd913d632008-04-06 04:04:35 -03004403 if (!state_check_disable_encoder_run(hdw)) return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004404 if (hdw->state_encoder_ok) {
Mike Iselyd913d632008-04-06 04:04:35 -03004405 del_timer_sync(&hdw->encoder_run_timer);
Mike Isely681c7392007-11-26 01:48:52 -03004406 if (pvr2_encoder_stop(hdw) < 0) return !0;
4407 }
4408 hdw->state_encoder_run = 0;
4409 } else {
Mike Iselyd913d632008-04-06 04:04:35 -03004410 if (!state_check_enable_encoder_run(hdw)) return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004411 if (pvr2_encoder_start(hdw) < 0) return !0;
4412 hdw->state_encoder_run = !0;
Mike Iselyd913d632008-04-06 04:04:35 -03004413 if (!hdw->state_encoder_runok) {
4414 hdw->encoder_run_timer.expires =
Mike Isely83ce57a2008-05-26 05:51:57 -03004415 jiffies + (HZ * TIME_MSEC_ENCODER_OK / 1000);
Mike Iselyd913d632008-04-06 04:04:35 -03004416 add_timer(&hdw->encoder_run_timer);
4417 }
Mike Isely681c7392007-11-26 01:48:52 -03004418 }
4419 trace_stbit("state_encoder_run",hdw->state_encoder_run);
4420 return !0;
4421}
4422
4423
4424/* Timeout function for quiescent timer. */
4425static void pvr2_hdw_quiescent_timeout(unsigned long data)
4426{
4427 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4428 hdw->state_decoder_quiescent = !0;
4429 trace_stbit("state_decoder_quiescent",hdw->state_decoder_quiescent);
4430 hdw->state_stale = !0;
4431 queue_work(hdw->workqueue,&hdw->workpoll);
4432}
4433
4434
4435/* Timeout function for encoder wait timer. */
4436static void pvr2_hdw_encoder_wait_timeout(unsigned long data)
4437{
4438 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4439 hdw->state_encoder_waitok = !0;
4440 trace_stbit("state_encoder_waitok",hdw->state_encoder_waitok);
4441 hdw->state_stale = !0;
4442 queue_work(hdw->workqueue,&hdw->workpoll);
4443}
4444
4445
Mike Iselyd913d632008-04-06 04:04:35 -03004446/* Timeout function for encoder run timer. */
4447static void pvr2_hdw_encoder_run_timeout(unsigned long data)
4448{
4449 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4450 if (!hdw->state_encoder_runok) {
4451 hdw->state_encoder_runok = !0;
4452 trace_stbit("state_encoder_runok",hdw->state_encoder_runok);
4453 hdw->state_stale = !0;
4454 queue_work(hdw->workqueue,&hdw->workpoll);
4455 }
4456}
4457
4458
Mike Isely681c7392007-11-26 01:48:52 -03004459/* Evaluate whether or not state_decoder_run can change */
4460static int state_eval_decoder_run(struct pvr2_hdw *hdw)
4461{
4462 if (hdw->state_decoder_run) {
4463 if (hdw->state_encoder_ok) {
4464 if (hdw->state_pipeline_req &&
Mike Isely62433e32008-04-22 14:45:40 -03004465 !hdw->state_pipeline_pause &&
4466 hdw->state_pathway_ok) return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004467 }
4468 if (!hdw->flag_decoder_missed) {
4469 pvr2_decoder_enable(hdw,0);
4470 }
4471 hdw->state_decoder_quiescent = 0;
4472 hdw->state_decoder_run = 0;
4473 /* paranoia - solve race if timer just completed */
4474 del_timer_sync(&hdw->quiescent_timer);
4475 } else {
4476 if (!hdw->state_decoder_quiescent) {
4477 if (!timer_pending(&hdw->quiescent_timer)) {
4478 /* We don't do something about the
4479 quiescent timer until right here because
4480 we also want to catch cases where the
4481 decoder was already not running (like
4482 after initialization) as opposed to
4483 knowing that we had just stopped it.
4484 The second flag check is here to cover a
4485 race - the timer could have run and set
4486 this flag just after the previous check
4487 but before we did the pending check. */
4488 if (!hdw->state_decoder_quiescent) {
4489 hdw->quiescent_timer.expires =
Mike Isely83ce57a2008-05-26 05:51:57 -03004490 jiffies +
4491 (HZ * TIME_MSEC_DECODER_WAIT
4492 / 1000);
Mike Isely681c7392007-11-26 01:48:52 -03004493 add_timer(&hdw->quiescent_timer);
4494 }
4495 }
4496 /* Don't allow decoder to start again until it has
4497 been quiesced first. This little detail should
4498 hopefully further stabilize the encoder. */
4499 return 0;
4500 }
Mike Isely62433e32008-04-22 14:45:40 -03004501 if (!hdw->state_pathway_ok ||
4502 (hdw->pathway_state != PVR2_PATHWAY_ANALOG) ||
4503 !hdw->state_pipeline_req ||
Mike Isely681c7392007-11-26 01:48:52 -03004504 hdw->state_pipeline_pause ||
4505 !hdw->state_pipeline_config ||
4506 !hdw->state_encoder_config ||
4507 !hdw->state_encoder_ok) return 0;
4508 del_timer_sync(&hdw->quiescent_timer);
4509 if (hdw->flag_decoder_missed) return 0;
4510 if (pvr2_decoder_enable(hdw,!0) < 0) return 0;
4511 hdw->state_decoder_quiescent = 0;
4512 hdw->state_decoder_run = !0;
4513 }
4514 trace_stbit("state_decoder_quiescent",hdw->state_decoder_quiescent);
4515 trace_stbit("state_decoder_run",hdw->state_decoder_run);
4516 return !0;
4517}
4518
4519
4520/* Evaluate whether or not state_usbstream_run can change */
4521static int state_eval_usbstream_run(struct pvr2_hdw *hdw)
4522{
4523 if (hdw->state_usbstream_run) {
Mike Isely72998b72008-04-03 04:51:19 -03004524 int fl = !0;
Mike Isely62433e32008-04-22 14:45:40 -03004525 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
Mike Isely72998b72008-04-03 04:51:19 -03004526 fl = (hdw->state_encoder_ok &&
4527 hdw->state_encoder_run);
4528 } else if ((hdw->pathway_state == PVR2_PATHWAY_DIGITAL) &&
4529 (hdw->hdw_desc->flag_digital_requires_cx23416)) {
4530 fl = hdw->state_encoder_ok;
4531 }
4532 if (fl &&
4533 hdw->state_pipeline_req &&
4534 !hdw->state_pipeline_pause &&
4535 hdw->state_pathway_ok) {
4536 return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004537 }
4538 pvr2_hdw_cmd_usbstream(hdw,0);
4539 hdw->state_usbstream_run = 0;
4540 } else {
Mike Isely62433e32008-04-22 14:45:40 -03004541 if (!hdw->state_pipeline_req ||
4542 hdw->state_pipeline_pause ||
4543 !hdw->state_pathway_ok) return 0;
4544 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
4545 if (!hdw->state_encoder_ok ||
4546 !hdw->state_encoder_run) return 0;
Mike Isely72998b72008-04-03 04:51:19 -03004547 } else if ((hdw->pathway_state == PVR2_PATHWAY_DIGITAL) &&
4548 (hdw->hdw_desc->flag_digital_requires_cx23416)) {
4549 if (!hdw->state_encoder_ok) return 0;
Mike Iselyd913d632008-04-06 04:04:35 -03004550 if (hdw->state_encoder_run) return 0;
4551 if (hdw->hdw_desc->digital_control_scheme ==
4552 PVR2_DIGITAL_SCHEME_ONAIR) {
4553 /* OnAir digital receivers won't stream
4554 unless the analog encoder has run first.
4555 Why? I have no idea. But don't even
4556 try until we know the analog side is
4557 known to have run. */
4558 if (!hdw->state_encoder_runok) return 0;
4559 }
Mike Isely62433e32008-04-22 14:45:40 -03004560 }
Mike Isely681c7392007-11-26 01:48:52 -03004561 if (pvr2_hdw_cmd_usbstream(hdw,!0) < 0) return 0;
4562 hdw->state_usbstream_run = !0;
4563 }
4564 trace_stbit("state_usbstream_run",hdw->state_usbstream_run);
4565 return !0;
4566}
4567
4568
4569/* Attempt to configure pipeline, if needed */
4570static int state_eval_pipeline_config(struct pvr2_hdw *hdw)
4571{
4572 if (hdw->state_pipeline_config ||
4573 hdw->state_pipeline_pause) return 0;
4574 pvr2_hdw_commit_execute(hdw);
4575 return !0;
4576}
4577
4578
4579/* Update pipeline idle and pipeline pause tracking states based on other
4580 inputs. This must be called whenever the other relevant inputs have
4581 changed. */
4582static int state_update_pipeline_state(struct pvr2_hdw *hdw)
4583{
4584 unsigned int st;
4585 int updatedFl = 0;
4586 /* Update pipeline state */
4587 st = !(hdw->state_encoder_run ||
4588 hdw->state_decoder_run ||
4589 hdw->state_usbstream_run ||
4590 (!hdw->state_decoder_quiescent));
4591 if (!st != !hdw->state_pipeline_idle) {
4592 hdw->state_pipeline_idle = st;
4593 updatedFl = !0;
4594 }
4595 if (hdw->state_pipeline_idle && hdw->state_pipeline_pause) {
4596 hdw->state_pipeline_pause = 0;
4597 updatedFl = !0;
4598 }
4599 return updatedFl;
4600}
4601
4602
4603typedef int (*state_eval_func)(struct pvr2_hdw *);
4604
4605/* Set of functions to be run to evaluate various states in the driver. */
Tobias Klauserebff0332008-04-22 14:45:45 -03004606static const state_eval_func eval_funcs[] = {
Mike Isely62433e32008-04-22 14:45:40 -03004607 state_eval_pathway_ok,
Mike Isely681c7392007-11-26 01:48:52 -03004608 state_eval_pipeline_config,
4609 state_eval_encoder_ok,
4610 state_eval_encoder_config,
4611 state_eval_decoder_run,
4612 state_eval_encoder_run,
4613 state_eval_usbstream_run,
4614};
4615
4616
4617/* Process various states and return true if we did anything interesting. */
4618static int pvr2_hdw_state_update(struct pvr2_hdw *hdw)
4619{
4620 unsigned int i;
4621 int state_updated = 0;
4622 int check_flag;
4623
4624 if (!hdw->state_stale) return 0;
4625 if ((hdw->fw1_state != FW1_STATE_OK) ||
4626 !hdw->flag_ok) {
4627 hdw->state_stale = 0;
4628 return !0;
4629 }
4630 /* This loop is the heart of the entire driver. It keeps trying to
4631 evaluate various bits of driver state until nothing changes for
4632 one full iteration. Each "bit of state" tracks some global
4633 aspect of the driver, e.g. whether decoder should run, if
4634 pipeline is configured, usb streaming is on, etc. We separately
4635 evaluate each of those questions based on other driver state to
4636 arrive at the correct running configuration. */
4637 do {
4638 check_flag = 0;
4639 state_update_pipeline_state(hdw);
4640 /* Iterate over each bit of state */
4641 for (i = 0; (i<ARRAY_SIZE(eval_funcs)) && hdw->flag_ok; i++) {
4642 if ((*eval_funcs[i])(hdw)) {
4643 check_flag = !0;
4644 state_updated = !0;
4645 state_update_pipeline_state(hdw);
4646 }
4647 }
4648 } while (check_flag && hdw->flag_ok);
4649 hdw->state_stale = 0;
4650 trace_stbit("state_stale",hdw->state_stale);
4651 return state_updated;
4652}
4653
4654
Mike Isely1cb03b72008-04-21 03:47:43 -03004655static unsigned int print_input_mask(unsigned int msk,
4656 char *buf,unsigned int acnt)
4657{
4658 unsigned int idx,ccnt;
4659 unsigned int tcnt = 0;
4660 for (idx = 0; idx < ARRAY_SIZE(control_values_input); idx++) {
4661 if (!((1 << idx) & msk)) continue;
4662 ccnt = scnprintf(buf+tcnt,
4663 acnt-tcnt,
4664 "%s%s",
4665 (tcnt ? ", " : ""),
4666 control_values_input[idx]);
4667 tcnt += ccnt;
4668 }
4669 return tcnt;
4670}
4671
4672
Mike Isely62433e32008-04-22 14:45:40 -03004673static const char *pvr2_pathway_state_name(int id)
4674{
4675 switch (id) {
4676 case PVR2_PATHWAY_ANALOG: return "analog";
4677 case PVR2_PATHWAY_DIGITAL: return "digital";
4678 default: return "unknown";
4679 }
4680}
4681
4682
Mike Isely681c7392007-11-26 01:48:52 -03004683static unsigned int pvr2_hdw_report_unlocked(struct pvr2_hdw *hdw,int which,
4684 char *buf,unsigned int acnt)
4685{
4686 switch (which) {
4687 case 0:
4688 return scnprintf(
4689 buf,acnt,
Mike Iselye9db1ff2008-04-22 14:45:41 -03004690 "driver:%s%s%s%s%s <mode=%s>",
Mike Isely681c7392007-11-26 01:48:52 -03004691 (hdw->flag_ok ? " <ok>" : " <fail>"),
4692 (hdw->flag_init_ok ? " <init>" : " <uninitialized>"),
4693 (hdw->flag_disconnected ? " <disconnected>" :
4694 " <connected>"),
4695 (hdw->flag_tripped ? " <tripped>" : ""),
Mike Isely62433e32008-04-22 14:45:40 -03004696 (hdw->flag_decoder_missed ? " <no decoder>" : ""),
4697 pvr2_pathway_state_name(hdw->pathway_state));
4698
Mike Isely681c7392007-11-26 01:48:52 -03004699 case 1:
4700 return scnprintf(
4701 buf,acnt,
4702 "pipeline:%s%s%s%s",
4703 (hdw->state_pipeline_idle ? " <idle>" : ""),
4704 (hdw->state_pipeline_config ?
4705 " <configok>" : " <stale>"),
4706 (hdw->state_pipeline_req ? " <req>" : ""),
4707 (hdw->state_pipeline_pause ? " <pause>" : ""));
4708 case 2:
4709 return scnprintf(
4710 buf,acnt,
Mike Isely62433e32008-04-22 14:45:40 -03004711 "worker:%s%s%s%s%s%s%s",
Mike Isely681c7392007-11-26 01:48:52 -03004712 (hdw->state_decoder_run ?
4713 " <decode:run>" :
4714 (hdw->state_decoder_quiescent ?
4715 "" : " <decode:stop>")),
4716 (hdw->state_decoder_quiescent ?
4717 " <decode:quiescent>" : ""),
4718 (hdw->state_encoder_ok ?
4719 "" : " <encode:init>"),
4720 (hdw->state_encoder_run ?
Mike Iselyd913d632008-04-06 04:04:35 -03004721 (hdw->state_encoder_runok ?
4722 " <encode:run>" :
4723 " <encode:firstrun>") :
4724 (hdw->state_encoder_runok ?
4725 " <encode:stop>" :
4726 " <encode:virgin>")),
Mike Isely681c7392007-11-26 01:48:52 -03004727 (hdw->state_encoder_config ?
4728 " <encode:configok>" :
4729 (hdw->state_encoder_waitok ?
Mike Iselyb9a37d92008-03-28 05:31:40 -03004730 "" : " <encode:waitok>")),
Mike Isely681c7392007-11-26 01:48:52 -03004731 (hdw->state_usbstream_run ?
Mike Isely62433e32008-04-22 14:45:40 -03004732 " <usb:run>" : " <usb:stop>"),
4733 (hdw->state_pathway_ok ?
Mike Iselye9db1ff2008-04-22 14:45:41 -03004734 " <pathway:ok>" : ""));
Mike Isely681c7392007-11-26 01:48:52 -03004735 case 3:
4736 return scnprintf(
4737 buf,acnt,
4738 "state: %s",
4739 pvr2_get_state_name(hdw->master_state));
Mike Iselyad0992e2008-03-28 05:34:45 -03004740 case 4: {
Mike Isely1cb03b72008-04-21 03:47:43 -03004741 unsigned int tcnt = 0;
4742 unsigned int ccnt;
4743
4744 ccnt = scnprintf(buf,
4745 acnt,
4746 "Hardware supported inputs: ");
4747 tcnt += ccnt;
4748 tcnt += print_input_mask(hdw->input_avail_mask,
4749 buf+tcnt,
4750 acnt-tcnt);
4751 if (hdw->input_avail_mask != hdw->input_allowed_mask) {
4752 ccnt = scnprintf(buf+tcnt,
4753 acnt-tcnt,
4754 "; allowed inputs: ");
4755 tcnt += ccnt;
4756 tcnt += print_input_mask(hdw->input_allowed_mask,
4757 buf+tcnt,
4758 acnt-tcnt);
4759 }
4760 return tcnt;
4761 }
4762 case 5: {
Mike Iselyad0992e2008-03-28 05:34:45 -03004763 struct pvr2_stream_stats stats;
4764 if (!hdw->vid_stream) break;
4765 pvr2_stream_get_stats(hdw->vid_stream,
4766 &stats,
4767 0);
4768 return scnprintf(
4769 buf,acnt,
4770 "Bytes streamed=%u"
4771 " URBs: queued=%u idle=%u ready=%u"
4772 " processed=%u failed=%u",
4773 stats.bytes_processed,
4774 stats.buffers_in_queue,
4775 stats.buffers_in_idle,
4776 stats.buffers_in_ready,
4777 stats.buffers_processed,
4778 stats.buffers_failed);
4779 }
Mike Isely681c7392007-11-26 01:48:52 -03004780 default: break;
4781 }
4782 return 0;
4783}
4784
4785
4786unsigned int pvr2_hdw_state_report(struct pvr2_hdw *hdw,
4787 char *buf,unsigned int acnt)
4788{
4789 unsigned int bcnt,ccnt,idx;
4790 bcnt = 0;
4791 LOCK_TAKE(hdw->big_lock);
4792 for (idx = 0; ; idx++) {
4793 ccnt = pvr2_hdw_report_unlocked(hdw,idx,buf,acnt);
4794 if (!ccnt) break;
4795 bcnt += ccnt; acnt -= ccnt; buf += ccnt;
4796 if (!acnt) break;
4797 buf[0] = '\n'; ccnt = 1;
4798 bcnt += ccnt; acnt -= ccnt; buf += ccnt;
4799 }
4800 LOCK_GIVE(hdw->big_lock);
4801 return bcnt;
4802}
4803
4804
4805static void pvr2_hdw_state_log_state(struct pvr2_hdw *hdw)
4806{
4807 char buf[128];
4808 unsigned int idx,ccnt;
4809
4810 for (idx = 0; ; idx++) {
4811 ccnt = pvr2_hdw_report_unlocked(hdw,idx,buf,sizeof(buf));
4812 if (!ccnt) break;
4813 printk(KERN_INFO "%s %.*s\n",hdw->name,ccnt,buf);
4814 }
4815}
4816
4817
4818/* Evaluate and update the driver's current state, taking various actions
4819 as appropriate for the update. */
4820static int pvr2_hdw_state_eval(struct pvr2_hdw *hdw)
4821{
4822 unsigned int st;
4823 int state_updated = 0;
4824 int callback_flag = 0;
Mike Isely1b9c18c2008-04-22 14:45:41 -03004825 int analog_mode;
Mike Isely681c7392007-11-26 01:48:52 -03004826
4827 pvr2_trace(PVR2_TRACE_STBITS,
4828 "Drive state check START");
4829 if (pvrusb2_debug & PVR2_TRACE_STBITS) {
4830 pvr2_hdw_state_log_state(hdw);
4831 }
4832
4833 /* Process all state and get back over disposition */
4834 state_updated = pvr2_hdw_state_update(hdw);
4835
Mike Isely1b9c18c2008-04-22 14:45:41 -03004836 analog_mode = (hdw->pathway_state != PVR2_PATHWAY_DIGITAL);
4837
Mike Isely681c7392007-11-26 01:48:52 -03004838 /* Update master state based upon all other states. */
4839 if (!hdw->flag_ok) {
4840 st = PVR2_STATE_DEAD;
4841 } else if (hdw->fw1_state != FW1_STATE_OK) {
4842 st = PVR2_STATE_COLD;
Mike Isely72998b72008-04-03 04:51:19 -03004843 } else if ((analog_mode ||
4844 hdw->hdw_desc->flag_digital_requires_cx23416) &&
4845 !hdw->state_encoder_ok) {
Mike Isely681c7392007-11-26 01:48:52 -03004846 st = PVR2_STATE_WARM;
Mike Isely1b9c18c2008-04-22 14:45:41 -03004847 } else if (hdw->flag_tripped ||
4848 (analog_mode && hdw->flag_decoder_missed)) {
Mike Isely681c7392007-11-26 01:48:52 -03004849 st = PVR2_STATE_ERROR;
Mike Isely62433e32008-04-22 14:45:40 -03004850 } else if (hdw->state_usbstream_run &&
Mike Isely1b9c18c2008-04-22 14:45:41 -03004851 (!analog_mode ||
Mike Isely62433e32008-04-22 14:45:40 -03004852 (hdw->state_encoder_run && hdw->state_decoder_run))) {
Mike Isely681c7392007-11-26 01:48:52 -03004853 st = PVR2_STATE_RUN;
4854 } else {
4855 st = PVR2_STATE_READY;
4856 }
4857 if (hdw->master_state != st) {
4858 pvr2_trace(PVR2_TRACE_STATE,
4859 "Device state change from %s to %s",
4860 pvr2_get_state_name(hdw->master_state),
4861 pvr2_get_state_name(st));
Mike Isely40381cb2008-04-22 14:45:42 -03004862 pvr2_led_ctrl(hdw,st == PVR2_STATE_RUN);
Mike Isely681c7392007-11-26 01:48:52 -03004863 hdw->master_state = st;
4864 state_updated = !0;
4865 callback_flag = !0;
4866 }
4867 if (state_updated) {
4868 /* Trigger anyone waiting on any state changes here. */
4869 wake_up(&hdw->state_wait_data);
4870 }
4871
4872 if (pvrusb2_debug & PVR2_TRACE_STBITS) {
4873 pvr2_hdw_state_log_state(hdw);
4874 }
4875 pvr2_trace(PVR2_TRACE_STBITS,
4876 "Drive state check DONE callback=%d",callback_flag);
4877
4878 return callback_flag;
4879}
4880
4881
4882/* Cause kernel thread to check / update driver state */
4883static void pvr2_hdw_state_sched(struct pvr2_hdw *hdw)
4884{
4885 if (hdw->state_stale) return;
4886 hdw->state_stale = !0;
4887 trace_stbit("state_stale",hdw->state_stale);
4888 queue_work(hdw->workqueue,&hdw->workpoll);
4889}
4890
4891
Mike Iselyd8554972006-06-26 20:58:46 -03004892int pvr2_hdw_gpio_get_dir(struct pvr2_hdw *hdw,u32 *dp)
4893{
4894 return pvr2_read_register(hdw,PVR2_GPIO_DIR,dp);
4895}
4896
4897
4898int pvr2_hdw_gpio_get_out(struct pvr2_hdw *hdw,u32 *dp)
4899{
4900 return pvr2_read_register(hdw,PVR2_GPIO_OUT,dp);
4901}
4902
4903
4904int pvr2_hdw_gpio_get_in(struct pvr2_hdw *hdw,u32 *dp)
4905{
4906 return pvr2_read_register(hdw,PVR2_GPIO_IN,dp);
4907}
4908
4909
4910int pvr2_hdw_gpio_chg_dir(struct pvr2_hdw *hdw,u32 msk,u32 val)
4911{
4912 u32 cval,nval;
4913 int ret;
4914 if (~msk) {
4915 ret = pvr2_read_register(hdw,PVR2_GPIO_DIR,&cval);
4916 if (ret) return ret;
4917 nval = (cval & ~msk) | (val & msk);
4918 pvr2_trace(PVR2_TRACE_GPIO,
4919 "GPIO direction changing 0x%x:0x%x"
4920 " from 0x%x to 0x%x",
4921 msk,val,cval,nval);
4922 } else {
4923 nval = val;
4924 pvr2_trace(PVR2_TRACE_GPIO,
4925 "GPIO direction changing to 0x%x",nval);
4926 }
4927 return pvr2_write_register(hdw,PVR2_GPIO_DIR,nval);
4928}
4929
4930
4931int pvr2_hdw_gpio_chg_out(struct pvr2_hdw *hdw,u32 msk,u32 val)
4932{
4933 u32 cval,nval;
4934 int ret;
4935 if (~msk) {
4936 ret = pvr2_read_register(hdw,PVR2_GPIO_OUT,&cval);
4937 if (ret) return ret;
4938 nval = (cval & ~msk) | (val & msk);
4939 pvr2_trace(PVR2_TRACE_GPIO,
4940 "GPIO output changing 0x%x:0x%x from 0x%x to 0x%x",
4941 msk,val,cval,nval);
4942 } else {
4943 nval = val;
4944 pvr2_trace(PVR2_TRACE_GPIO,
4945 "GPIO output changing to 0x%x",nval);
4946 }
4947 return pvr2_write_register(hdw,PVR2_GPIO_OUT,nval);
4948}
4949
4950
Mike Iselya51f5002009-03-06 23:30:37 -03004951void pvr2_hdw_status_poll(struct pvr2_hdw *hdw)
4952{
Mike Isely40f07112009-03-07 00:08:17 -03004953 struct v4l2_tuner *vtp = &hdw->tuner_signal_info;
4954 memset(vtp, 0, sizeof(*vtp));
Mike Isely2641df32009-03-07 00:13:25 -03004955 hdw->tuner_signal_stale = 0;
Mike Iselya51f5002009-03-06 23:30:37 -03004956 pvr2_i2c_core_status_poll(hdw);
Mike Isely40f07112009-03-07 00:08:17 -03004957 /* Note: There apparently is no replacement for VIDIOC_CROPCAP
4958 using v4l2-subdev - therefore we can't support that AT ALL right
4959 now. (Of course, no sub-drivers seem to implement it either.
4960 But now it's a a chicken and egg problem...) */
4961 v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner, g_tuner,
4962 &hdw->tuner_signal_info);
Mike Isely2641df32009-03-07 00:13:25 -03004963 pvr2_trace(PVR2_TRACE_CHIPS, "subdev status poll"
Mike Isely40f07112009-03-07 00:08:17 -03004964 " type=%u strength=%u audio=0x%x cap=0x%x"
4965 " low=%u hi=%u",
4966 vtp->type,
4967 vtp->signal, vtp->rxsubchans, vtp->capability,
4968 vtp->rangelow, vtp->rangehigh);
Mike Isely2641df32009-03-07 00:13:25 -03004969
4970 /* We have to do this to avoid getting into constant polling if
4971 there's nobody to answer a poll of cropcap info. */
4972 hdw->cropcap_stale = 0;
Mike Iselya51f5002009-03-06 23:30:37 -03004973}
4974
4975
Mike Isely7fb20fa2008-04-22 14:45:37 -03004976unsigned int pvr2_hdw_get_input_available(struct pvr2_hdw *hdw)
4977{
4978 return hdw->input_avail_mask;
4979}
4980
4981
Mike Isely1cb03b72008-04-21 03:47:43 -03004982unsigned int pvr2_hdw_get_input_allowed(struct pvr2_hdw *hdw)
4983{
4984 return hdw->input_allowed_mask;
4985}
4986
4987
4988static int pvr2_hdw_set_input(struct pvr2_hdw *hdw,int v)
4989{
4990 if (hdw->input_val != v) {
4991 hdw->input_val = v;
4992 hdw->input_dirty = !0;
4993 }
4994
4995 /* Handle side effects - if we switch to a mode that needs the RF
4996 tuner, then select the right frequency choice as well and mark
4997 it dirty. */
4998 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
4999 hdw->freqSelector = 0;
5000 hdw->freqDirty = !0;
5001 } else if ((hdw->input_val == PVR2_CVAL_INPUT_TV) ||
5002 (hdw->input_val == PVR2_CVAL_INPUT_DTV)) {
5003 hdw->freqSelector = 1;
5004 hdw->freqDirty = !0;
5005 }
5006 return 0;
5007}
5008
5009
5010int pvr2_hdw_set_input_allowed(struct pvr2_hdw *hdw,
5011 unsigned int change_mask,
5012 unsigned int change_val)
5013{
5014 int ret = 0;
5015 unsigned int nv,m,idx;
5016 LOCK_TAKE(hdw->big_lock);
5017 do {
5018 nv = hdw->input_allowed_mask & ~change_mask;
5019 nv |= (change_val & change_mask);
5020 nv &= hdw->input_avail_mask;
5021 if (!nv) {
5022 /* No legal modes left; return error instead. */
5023 ret = -EPERM;
5024 break;
5025 }
5026 hdw->input_allowed_mask = nv;
5027 if ((1 << hdw->input_val) & hdw->input_allowed_mask) {
5028 /* Current mode is still in the allowed mask, so
5029 we're done. */
5030 break;
5031 }
5032 /* Select and switch to a mode that is still in the allowed
5033 mask */
5034 if (!hdw->input_allowed_mask) {
5035 /* Nothing legal; give up */
5036 break;
5037 }
5038 m = hdw->input_allowed_mask;
5039 for (idx = 0; idx < (sizeof(m) << 3); idx++) {
5040 if (!((1 << idx) & m)) continue;
5041 pvr2_hdw_set_input(hdw,idx);
5042 break;
5043 }
5044 } while (0);
5045 LOCK_GIVE(hdw->big_lock);
5046 return ret;
5047}
5048
5049
Mike Iselye61b6fc2006-07-18 22:42:18 -03005050/* Find I2C address of eeprom */
Adrian Bunk07e337e2006-06-30 11:30:20 -03005051static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03005052{
5053 int result;
5054 LOCK_TAKE(hdw->ctl_lock); do {
Michael Krufky8d364362007-01-22 02:17:55 -03005055 hdw->cmd_buffer[0] = FX2CMD_GET_EEPROM_ADDR;
Mike Iselyd8554972006-06-26 20:58:46 -03005056 result = pvr2_send_request(hdw,
5057 hdw->cmd_buffer,1,
5058 hdw->cmd_buffer,1);
5059 if (result < 0) break;
5060 result = hdw->cmd_buffer[0];
5061 } while(0); LOCK_GIVE(hdw->ctl_lock);
5062 return result;
5063}
5064
5065
Mike Isely32ffa9a2006-09-23 22:26:52 -03005066int pvr2_hdw_register_access(struct pvr2_hdw *hdw,
Hans Verkuilaecde8b2008-12-30 07:14:19 -03005067 struct v4l2_dbg_match *match, u64 reg_id,
5068 int setFl, u64 *val_ptr)
Mike Isely32ffa9a2006-09-23 22:26:52 -03005069{
5070#ifdef CONFIG_VIDEO_ADV_DEBUG
Mike Isely32ffa9a2006-09-23 22:26:52 -03005071 struct pvr2_i2c_client *cp;
Hans Verkuilaecde8b2008-12-30 07:14:19 -03005072 struct v4l2_dbg_register req;
Mike Isely6d988162006-09-28 17:53:49 -03005073 int stat = 0;
5074 int okFl = 0;
Mike Isely32ffa9a2006-09-23 22:26:52 -03005075
Mike Isely201f5c92007-01-28 16:08:36 -03005076 if (!capable(CAP_SYS_ADMIN)) return -EPERM;
5077
Hans Verkuilaecde8b2008-12-30 07:14:19 -03005078 req.match = *match;
Mike Isely32ffa9a2006-09-23 22:26:52 -03005079 req.reg = reg_id;
5080 if (setFl) req.val = *val_ptr;
Mike Iselyd8f5b9b2009-03-07 00:05:00 -03005081 /* It would be nice to know if a sub-device answered the request */
5082 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, g_register, &req);
5083 if (!setFl) *val_ptr = req.val;
5084 if (!okFl) mutex_lock(&hdw->i2c_list_lock); do {
Trent Piephoe77e2c22007-10-10 05:37:42 -03005085 list_for_each_entry(cp, &hdw->i2c_clients, list) {
Mike Isely8481a752007-04-27 12:31:31 -03005086 if (!v4l2_chip_match_i2c_client(
5087 cp->client,
Hans Verkuilaecde8b2008-12-30 07:14:19 -03005088 &req.match)) {
Hans Verkuilf3d092b2007-02-23 20:55:14 -03005089 continue;
5090 }
Mike Isely32ffa9a2006-09-23 22:26:52 -03005091 stat = pvr2_i2c_client_cmd(
Trent Piepho52ebc762007-01-23 22:38:13 -03005092 cp,(setFl ? VIDIOC_DBG_S_REGISTER :
5093 VIDIOC_DBG_G_REGISTER),&req);
Mike Isely32ffa9a2006-09-23 22:26:52 -03005094 if (!setFl) *val_ptr = req.val;
Mike Isely6d988162006-09-28 17:53:49 -03005095 okFl = !0;
5096 break;
Mike Isely32ffa9a2006-09-23 22:26:52 -03005097 }
5098 } while (0); mutex_unlock(&hdw->i2c_list_lock);
Mike Isely6d988162006-09-28 17:53:49 -03005099 if (okFl) {
5100 return stat;
5101 }
Mike Isely32ffa9a2006-09-23 22:26:52 -03005102 return -EINVAL;
5103#else
5104 return -ENOSYS;
5105#endif
5106}
5107
5108
Mike Iselyd8554972006-06-26 20:58:46 -03005109/*
5110 Stuff for Emacs to see, in order to encourage consistent editing style:
5111 *** Local Variables: ***
5112 *** mode: c ***
5113 *** fill-column: 75 ***
5114 *** tab-width: 8 ***
5115 *** c-basic-offset: 8 ***
5116 *** End: ***
5117 */