blob: 48859370c57b820ade8a25b00e626a47daf346ba [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 Isely75212a02009-03-07 01:48:42 -030027#include <media/tuner.h>
Mike Iselyd8554972006-06-26 20:58:46 -030028#include "pvrusb2.h"
29#include "pvrusb2-std.h"
30#include "pvrusb2-util.h"
31#include "pvrusb2-hdw.h"
32#include "pvrusb2-i2c-core.h"
Mike Iselyd8554972006-06-26 20:58:46 -030033#include "pvrusb2-eeprom.h"
34#include "pvrusb2-hdw-internal.h"
35#include "pvrusb2-encoder.h"
36#include "pvrusb2-debug.h"
Michael Krufky8d364362007-01-22 02:17:55 -030037#include "pvrusb2-fx2-cmd.h"
Mike Isely5f6dae82009-03-07 00:39:34 -030038#include "pvrusb2-wm8775.h"
Mike Isely6f956512009-03-07 00:43:26 -030039#include "pvrusb2-video-v4l.h"
Mike Isely634ba262009-03-07 00:54:02 -030040#include "pvrusb2-cx2584x-v4l.h"
Mike Isely2a6b6272009-03-15 17:53:29 -030041#include "pvrusb2-cs53l32a.h"
Mike Isely76891d62009-03-07 00:52:06 -030042#include "pvrusb2-audio.h"
Mike Iselyd8554972006-06-26 20:58:46 -030043
Mike Isely1bde0282006-12-27 23:30:13 -030044#define TV_MIN_FREQ 55250000L
45#define TV_MAX_FREQ 850000000L
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -030046
Mike Isely83ce57a2008-05-26 05:51:57 -030047/* This defines a minimum interval that the decoder must remain quiet
48 before we are allowed to start it running. */
49#define TIME_MSEC_DECODER_WAIT 50
50
Mike Isely6e931372010-02-06 02:10:38 -030051/* This defines a minimum interval that the decoder must be allowed to run
52 before we can safely begin using its streaming output. */
53#define TIME_MSEC_DECODER_STABILIZATION_WAIT 300
54
Mike Isely83ce57a2008-05-26 05:51:57 -030055/* This defines a minimum interval that the encoder must remain quiet
Mike Isely91b5b482010-02-06 02:12:33 -030056 before we are allowed to configure it. */
57#define TIME_MSEC_ENCODER_WAIT 50
Mike Isely83ce57a2008-05-26 05:51:57 -030058
59/* This defines the minimum interval that the encoder must successfully run
60 before we consider that the encoder has run at least once since its
61 firmware has been loaded. This measurement is in important for cases
62 where we can't do something until we know that the encoder has been run
63 at least once. */
64#define TIME_MSEC_ENCODER_OK 250
65
Mike Iselya0fd1cb2006-06-30 11:35:28 -030066static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = NULL};
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -030067static DEFINE_MUTEX(pvr2_unit_mtx);
Mike Iselyd8554972006-06-26 20:58:46 -030068
Douglas Schilling Landgrafff699e62008-04-22 14:41:48 -030069static int ctlchg;
Douglas Schilling Landgrafff699e62008-04-22 14:41:48 -030070static int procreload;
Mike Iselyd8554972006-06-26 20:58:46 -030071static int tuner[PVR_NUM] = { [0 ... PVR_NUM-1] = -1 };
72static int tolerance[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
73static int video_std[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
Douglas Schilling Landgrafff699e62008-04-22 14:41:48 -030074static int init_pause_msec;
Mike Iselyd8554972006-06-26 20:58:46 -030075
76module_param(ctlchg, int, S_IRUGO|S_IWUSR);
77MODULE_PARM_DESC(ctlchg, "0=optimize ctl change 1=always accept new ctl value");
78module_param(init_pause_msec, int, S_IRUGO|S_IWUSR);
79MODULE_PARM_DESC(init_pause_msec, "hardware initialization settling delay");
Mike Iselyd8554972006-06-26 20:58:46 -030080module_param(procreload, int, S_IRUGO|S_IWUSR);
81MODULE_PARM_DESC(procreload,
82 "Attempt init failure recovery with firmware reload");
83module_param_array(tuner, int, NULL, 0444);
84MODULE_PARM_DESC(tuner,"specify installed tuner type");
85module_param_array(video_std, int, NULL, 0444);
86MODULE_PARM_DESC(video_std,"specify initial video standard");
87module_param_array(tolerance, int, NULL, 0444);
88MODULE_PARM_DESC(tolerance,"specify stream error tolerance");
89
Mike Isely6f441ed2009-06-20 14:51:29 -030090/* US Broadcast channel 3 (61.25 MHz), to help with testing */
91static int default_tv_freq = 61250000L;
Michael Krufky5a4f5da62008-05-11 16:37:50 -030092/* 104.3 MHz, a usable FM station for my area */
93static int default_radio_freq = 104300000L;
94
95module_param_named(tv_freq, default_tv_freq, int, 0444);
96MODULE_PARM_DESC(tv_freq, "specify initial television frequency");
97module_param_named(radio_freq, default_radio_freq, int, 0444);
98MODULE_PARM_DESC(radio_freq, "specify initial radio frequency");
99
Mike Iselyd8554972006-06-26 20:58:46 -0300100#define PVR2_CTL_WRITE_ENDPOINT 0x01
101#define PVR2_CTL_READ_ENDPOINT 0x81
102
103#define PVR2_GPIO_IN 0x9008
104#define PVR2_GPIO_OUT 0x900c
105#define PVR2_GPIO_DIR 0x9020
106
107#define trace_firmware(...) pvr2_trace(PVR2_TRACE_FIRMWARE,__VA_ARGS__)
108
109#define PVR2_FIRMWARE_ENDPOINT 0x02
110
111/* size of a firmware chunk */
112#define FIRMWARE_CHUNK_SIZE 0x2000
113
Mike Iselyedb9dcb2009-03-07 00:37:10 -0300114typedef void (*pvr2_subdev_update_func)(struct pvr2_hdw *,
115 struct v4l2_subdev *);
116
117static const pvr2_subdev_update_func pvr2_module_update_functions[] = {
Mike Isely4ecbc282009-03-07 00:49:19 -0300118 [PVR2_CLIENT_ID_WM8775] = pvr2_wm8775_subdev_update,
Mike Isely6f956512009-03-07 00:43:26 -0300119 [PVR2_CLIENT_ID_SAA7115] = pvr2_saa7115_subdev_update,
Mike Isely76891d62009-03-07 00:52:06 -0300120 [PVR2_CLIENT_ID_MSP3400] = pvr2_msp3400_subdev_update,
Mike Isely634ba262009-03-07 00:54:02 -0300121 [PVR2_CLIENT_ID_CX25840] = pvr2_cx25840_subdev_update,
Mike Isely2a6b6272009-03-15 17:53:29 -0300122 [PVR2_CLIENT_ID_CS53L32A] = pvr2_cs53l32a_subdev_update,
Mike Iselyedb9dcb2009-03-07 00:37:10 -0300123};
124
Mike Iselye9c64a72009-03-06 23:42:20 -0300125static const char *module_names[] = {
126 [PVR2_CLIENT_ID_MSP3400] = "msp3400",
127 [PVR2_CLIENT_ID_CX25840] = "cx25840",
128 [PVR2_CLIENT_ID_SAA7115] = "saa7115",
129 [PVR2_CLIENT_ID_TUNER] = "tuner",
Mike Iselybb652422009-03-14 14:09:04 -0300130 [PVR2_CLIENT_ID_DEMOD] = "tuner",
Mike Isely851981a2009-03-07 02:02:32 -0300131 [PVR2_CLIENT_ID_CS53L32A] = "cs53l32a",
Mike Isely5f6dae82009-03-07 00:39:34 -0300132 [PVR2_CLIENT_ID_WM8775] = "wm8775",
Mike Iselye9c64a72009-03-06 23:42:20 -0300133};
134
135
136static const unsigned char *module_i2c_addresses[] = {
137 [PVR2_CLIENT_ID_TUNER] = "\x60\x61\x62\x63",
Mike Iselybb652422009-03-14 14:09:04 -0300138 [PVR2_CLIENT_ID_DEMOD] = "\x43",
Mike Isely1dfe6c72009-03-07 02:00:21 -0300139 [PVR2_CLIENT_ID_MSP3400] = "\x40",
140 [PVR2_CLIENT_ID_SAA7115] = "\x21",
Mike Iselyae111f72009-03-07 00:57:42 -0300141 [PVR2_CLIENT_ID_WM8775] = "\x1b",
Mike Isely0b467012009-03-07 01:49:37 -0300142 [PVR2_CLIENT_ID_CX25840] = "\x44",
Mike Isely23334a22009-03-07 02:03:28 -0300143 [PVR2_CLIENT_ID_CS53L32A] = "\x11",
Mike Iselye9c64a72009-03-06 23:42:20 -0300144};
145
146
Mike Isely27eab382009-04-06 01:51:38 -0300147static const char *ir_scheme_names[] = {
148 [PVR2_IR_SCHEME_NONE] = "none",
149 [PVR2_IR_SCHEME_29XXX] = "29xxx",
150 [PVR2_IR_SCHEME_24XXX] = "24xxx (29xxx emulation)",
151 [PVR2_IR_SCHEME_24XXX_MCE] = "24xxx (MCE device)",
152 [PVR2_IR_SCHEME_ZILOG] = "Zilog",
153};
154
155
Mike Iselyb30d2442006-06-25 20:05:01 -0300156/* Define the list of additional controls we'll dynamically construct based
157 on query of the cx2341x module. */
158struct pvr2_mpeg_ids {
159 const char *strid;
160 int id;
161};
162static const struct pvr2_mpeg_ids mpeg_ids[] = {
163 {
164 .strid = "audio_layer",
165 .id = V4L2_CID_MPEG_AUDIO_ENCODING,
166 },{
167 .strid = "audio_bitrate",
168 .id = V4L2_CID_MPEG_AUDIO_L2_BITRATE,
169 },{
170 /* Already using audio_mode elsewhere :-( */
171 .strid = "mpeg_audio_mode",
172 .id = V4L2_CID_MPEG_AUDIO_MODE,
173 },{
174 .strid = "mpeg_audio_mode_extension",
175 .id = V4L2_CID_MPEG_AUDIO_MODE_EXTENSION,
176 },{
177 .strid = "audio_emphasis",
178 .id = V4L2_CID_MPEG_AUDIO_EMPHASIS,
179 },{
180 .strid = "audio_crc",
181 .id = V4L2_CID_MPEG_AUDIO_CRC,
182 },{
183 .strid = "video_aspect",
184 .id = V4L2_CID_MPEG_VIDEO_ASPECT,
185 },{
186 .strid = "video_b_frames",
187 .id = V4L2_CID_MPEG_VIDEO_B_FRAMES,
188 },{
189 .strid = "video_gop_size",
190 .id = V4L2_CID_MPEG_VIDEO_GOP_SIZE,
191 },{
192 .strid = "video_gop_closure",
193 .id = V4L2_CID_MPEG_VIDEO_GOP_CLOSURE,
194 },{
Mike Iselyb30d2442006-06-25 20:05:01 -0300195 .strid = "video_bitrate_mode",
196 .id = V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
197 },{
198 .strid = "video_bitrate",
199 .id = V4L2_CID_MPEG_VIDEO_BITRATE,
200 },{
201 .strid = "video_bitrate_peak",
202 .id = V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
203 },{
204 .strid = "video_temporal_decimation",
205 .id = V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION,
206 },{
207 .strid = "stream_type",
208 .id = V4L2_CID_MPEG_STREAM_TYPE,
209 },{
210 .strid = "video_spatial_filter_mode",
211 .id = V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE,
212 },{
213 .strid = "video_spatial_filter",
214 .id = V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER,
215 },{
216 .strid = "video_luma_spatial_filter_type",
217 .id = V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE,
218 },{
219 .strid = "video_chroma_spatial_filter_type",
220 .id = V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE,
221 },{
222 .strid = "video_temporal_filter_mode",
223 .id = V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE,
224 },{
225 .strid = "video_temporal_filter",
226 .id = V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER,
227 },{
228 .strid = "video_median_filter_type",
229 .id = V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE,
230 },{
231 .strid = "video_luma_median_filter_top",
232 .id = V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP,
233 },{
234 .strid = "video_luma_median_filter_bottom",
235 .id = V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM,
236 },{
237 .strid = "video_chroma_median_filter_top",
238 .id = V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP,
239 },{
240 .strid = "video_chroma_median_filter_bottom",
241 .id = V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM,
242 }
243};
Ahmed S. Darwisheca8ebf2007-01-20 00:35:03 -0300244#define MPEGDEF_COUNT ARRAY_SIZE(mpeg_ids)
Mike Iselyc05c0462006-06-25 20:04:25 -0300245
Mike Iselyd8554972006-06-26 20:58:46 -0300246
Mike Isely434449f2006-08-08 09:10:06 -0300247static const char *control_values_srate[] = {
248 [V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100] = "44.1 kHz",
249 [V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000] = "48 kHz",
250 [V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000] = "32 kHz",
251};
Mike Iselyd8554972006-06-26 20:58:46 -0300252
Mike Iselyd8554972006-06-26 20:58:46 -0300253
254
255static const char *control_values_input[] = {
256 [PVR2_CVAL_INPUT_TV] = "television", /*xawtv needs this name*/
Mike Isely29bf5b12008-04-22 14:45:37 -0300257 [PVR2_CVAL_INPUT_DTV] = "dtv",
Mike Iselyd8554972006-06-26 20:58:46 -0300258 [PVR2_CVAL_INPUT_RADIO] = "radio",
259 [PVR2_CVAL_INPUT_SVIDEO] = "s-video",
260 [PVR2_CVAL_INPUT_COMPOSITE] = "composite",
261};
262
263
264static const char *control_values_audiomode[] = {
265 [V4L2_TUNER_MODE_MONO] = "Mono",
266 [V4L2_TUNER_MODE_STEREO] = "Stereo",
267 [V4L2_TUNER_MODE_LANG1] = "Lang1",
268 [V4L2_TUNER_MODE_LANG2] = "Lang2",
269 [V4L2_TUNER_MODE_LANG1_LANG2] = "Lang1+Lang2",
270};
271
272
273static const char *control_values_hsm[] = {
274 [PVR2_CVAL_HSM_FAIL] = "Fail",
275 [PVR2_CVAL_HSM_HIGH] = "High",
276 [PVR2_CVAL_HSM_FULL] = "Full",
277};
278
279
Mike Isely681c7392007-11-26 01:48:52 -0300280static const char *pvr2_state_names[] = {
281 [PVR2_STATE_NONE] = "none",
282 [PVR2_STATE_DEAD] = "dead",
283 [PVR2_STATE_COLD] = "cold",
284 [PVR2_STATE_WARM] = "warm",
285 [PVR2_STATE_ERROR] = "error",
286 [PVR2_STATE_READY] = "ready",
287 [PVR2_STATE_RUN] = "run",
Mike Iselyd8554972006-06-26 20:58:46 -0300288};
289
Mike Isely681c7392007-11-26 01:48:52 -0300290
Mike Isely694dca2b2008-03-28 05:42:10 -0300291struct pvr2_fx2cmd_descdef {
Mike Isely1c9d10d2008-03-28 05:38:54 -0300292 unsigned char id;
293 unsigned char *desc;
294};
295
Mike Isely694dca2b2008-03-28 05:42:10 -0300296static const struct pvr2_fx2cmd_descdef pvr2_fx2cmd_desc[] = {
Mike Isely1c9d10d2008-03-28 05:38:54 -0300297 {FX2CMD_MEM_WRITE_DWORD, "write encoder dword"},
298 {FX2CMD_MEM_READ_DWORD, "read encoder dword"},
Mike Isely31335b12008-07-25 19:35:31 -0300299 {FX2CMD_HCW_ZILOG_RESET, "zilog IR reset control"},
Mike Isely1c9d10d2008-03-28 05:38:54 -0300300 {FX2CMD_MEM_READ_64BYTES, "read encoder 64bytes"},
301 {FX2CMD_REG_WRITE, "write encoder register"},
302 {FX2CMD_REG_READ, "read encoder register"},
303 {FX2CMD_MEMSEL, "encoder memsel"},
304 {FX2CMD_I2C_WRITE, "i2c write"},
305 {FX2CMD_I2C_READ, "i2c read"},
306 {FX2CMD_GET_USB_SPEED, "get USB speed"},
307 {FX2CMD_STREAMING_ON, "stream on"},
308 {FX2CMD_STREAMING_OFF, "stream off"},
309 {FX2CMD_FWPOST1, "fwpost1"},
310 {FX2CMD_POWER_OFF, "power off"},
311 {FX2CMD_POWER_ON, "power on"},
312 {FX2CMD_DEEP_RESET, "deep reset"},
313 {FX2CMD_GET_EEPROM_ADDR, "get rom addr"},
314 {FX2CMD_GET_IR_CODE, "get IR code"},
315 {FX2CMD_HCW_DEMOD_RESETIN, "hcw demod resetin"},
316 {FX2CMD_HCW_DTV_STREAMING_ON, "hcw dtv stream on"},
317 {FX2CMD_HCW_DTV_STREAMING_OFF, "hcw dtv stream off"},
318 {FX2CMD_ONAIR_DTV_STREAMING_ON, "onair dtv stream on"},
319 {FX2CMD_ONAIR_DTV_STREAMING_OFF, "onair dtv stream off"},
320 {FX2CMD_ONAIR_DTV_POWER_ON, "onair dtv power on"},
321 {FX2CMD_ONAIR_DTV_POWER_OFF, "onair dtv power off"},
322};
323
324
Mike Isely1cb03b72008-04-21 03:47:43 -0300325static int pvr2_hdw_set_input(struct pvr2_hdw *hdw,int v);
Mike Isely681c7392007-11-26 01:48:52 -0300326static void pvr2_hdw_state_sched(struct pvr2_hdw *);
327static int pvr2_hdw_state_eval(struct pvr2_hdw *);
Mike Isely1bde0282006-12-27 23:30:13 -0300328static void pvr2_hdw_set_cur_freq(struct pvr2_hdw *,unsigned long);
Mike Isely681c7392007-11-26 01:48:52 -0300329static void pvr2_hdw_worker_poll(struct work_struct *work);
Mike Isely681c7392007-11-26 01:48:52 -0300330static int pvr2_hdw_wait(struct pvr2_hdw *,int state);
331static int pvr2_hdw_untrip_unlocked(struct pvr2_hdw *);
332static void pvr2_hdw_state_log_state(struct pvr2_hdw *);
Adrian Bunk07e337e2006-06-30 11:30:20 -0300333static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl);
Mike Isely681c7392007-11-26 01:48:52 -0300334static int pvr2_hdw_commit_setup(struct pvr2_hdw *hdw);
Adrian Bunk07e337e2006-06-30 11:30:20 -0300335static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw);
Adrian Bunk07e337e2006-06-30 11:30:20 -0300336static void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw);
337static void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw);
Mike Isely681c7392007-11-26 01:48:52 -0300338static void pvr2_hdw_quiescent_timeout(unsigned long);
Mike Isely6e931372010-02-06 02:10:38 -0300339static void pvr2_hdw_decoder_stabilization_timeout(unsigned long);
Mike Isely681c7392007-11-26 01:48:52 -0300340static void pvr2_hdw_encoder_wait_timeout(unsigned long);
Mike Iselyd913d632008-04-06 04:04:35 -0300341static void pvr2_hdw_encoder_run_timeout(unsigned long);
Mike Isely1c9d10d2008-03-28 05:38:54 -0300342static int pvr2_issue_simple_cmd(struct pvr2_hdw *,u32);
Adrian Bunk07e337e2006-06-30 11:30:20 -0300343static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
344 unsigned int timeout,int probe_fl,
345 void *write_data,unsigned int write_len,
346 void *read_data,unsigned int read_len);
Mike Isely432907f2008-08-31 21:02:20 -0300347static int pvr2_hdw_check_cropcap(struct pvr2_hdw *hdw);
Mike Iselyd8554972006-06-26 20:58:46 -0300348
Mike Isely681c7392007-11-26 01:48:52 -0300349
350static void trace_stbit(const char *name,int val)
351{
352 pvr2_trace(PVR2_TRACE_STBITS,
353 "State bit %s <-- %s",
354 name,(val ? "true" : "false"));
355}
356
Mike Iselyd8554972006-06-26 20:58:46 -0300357static int ctrl_channelfreq_get(struct pvr2_ctrl *cptr,int *vp)
358{
359 struct pvr2_hdw *hdw = cptr->hdw;
360 if ((hdw->freqProgSlot > 0) && (hdw->freqProgSlot <= FREQTABLE_SIZE)) {
361 *vp = hdw->freqTable[hdw->freqProgSlot-1];
362 } else {
363 *vp = 0;
364 }
365 return 0;
366}
367
368static int ctrl_channelfreq_set(struct pvr2_ctrl *cptr,int m,int v)
369{
370 struct pvr2_hdw *hdw = cptr->hdw;
Mike Isely1bde0282006-12-27 23:30:13 -0300371 unsigned int slotId = hdw->freqProgSlot;
372 if ((slotId > 0) && (slotId <= FREQTABLE_SIZE)) {
373 hdw->freqTable[slotId-1] = v;
374 /* Handle side effects correctly - if we're tuned to this
375 slot, then forgot the slot id relation since the stored
376 frequency has been changed. */
377 if (hdw->freqSelector) {
378 if (hdw->freqSlotRadio == slotId) {
379 hdw->freqSlotRadio = 0;
380 }
381 } else {
382 if (hdw->freqSlotTelevision == slotId) {
383 hdw->freqSlotTelevision = 0;
384 }
385 }
Mike Iselyd8554972006-06-26 20:58:46 -0300386 }
387 return 0;
388}
389
390static int ctrl_channelprog_get(struct pvr2_ctrl *cptr,int *vp)
391{
392 *vp = cptr->hdw->freqProgSlot;
393 return 0;
394}
395
396static int ctrl_channelprog_set(struct pvr2_ctrl *cptr,int m,int v)
397{
398 struct pvr2_hdw *hdw = cptr->hdw;
399 if ((v >= 0) && (v <= FREQTABLE_SIZE)) {
400 hdw->freqProgSlot = v;
401 }
402 return 0;
403}
404
405static int ctrl_channel_get(struct pvr2_ctrl *cptr,int *vp)
406{
Mike Isely1bde0282006-12-27 23:30:13 -0300407 struct pvr2_hdw *hdw = cptr->hdw;
408 *vp = hdw->freqSelector ? hdw->freqSlotRadio : hdw->freqSlotTelevision;
Mike Iselyd8554972006-06-26 20:58:46 -0300409 return 0;
410}
411
Mike Isely1bde0282006-12-27 23:30:13 -0300412static int ctrl_channel_set(struct pvr2_ctrl *cptr,int m,int slotId)
Mike Iselyd8554972006-06-26 20:58:46 -0300413{
414 unsigned freq = 0;
415 struct pvr2_hdw *hdw = cptr->hdw;
Mike Isely1bde0282006-12-27 23:30:13 -0300416 if ((slotId < 0) || (slotId > FREQTABLE_SIZE)) return 0;
417 if (slotId > 0) {
418 freq = hdw->freqTable[slotId-1];
419 if (!freq) return 0;
420 pvr2_hdw_set_cur_freq(hdw,freq);
Mike Iselyd8554972006-06-26 20:58:46 -0300421 }
Mike Isely1bde0282006-12-27 23:30:13 -0300422 if (hdw->freqSelector) {
423 hdw->freqSlotRadio = slotId;
424 } else {
425 hdw->freqSlotTelevision = slotId;
Mike Iselyd8554972006-06-26 20:58:46 -0300426 }
427 return 0;
428}
429
430static int ctrl_freq_get(struct pvr2_ctrl *cptr,int *vp)
431{
Mike Isely1bde0282006-12-27 23:30:13 -0300432 *vp = pvr2_hdw_get_cur_freq(cptr->hdw);
Mike Iselyd8554972006-06-26 20:58:46 -0300433 return 0;
434}
435
436static int ctrl_freq_is_dirty(struct pvr2_ctrl *cptr)
437{
438 return cptr->hdw->freqDirty != 0;
439}
440
441static void ctrl_freq_clear_dirty(struct pvr2_ctrl *cptr)
442{
443 cptr->hdw->freqDirty = 0;
444}
445
446static int ctrl_freq_set(struct pvr2_ctrl *cptr,int m,int v)
447{
Mike Isely1bde0282006-12-27 23:30:13 -0300448 pvr2_hdw_set_cur_freq(cptr->hdw,v);
Mike Iselyd8554972006-06-26 20:58:46 -0300449 return 0;
450}
451
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300452static int ctrl_cropl_min_get(struct pvr2_ctrl *cptr, int *left)
453{
Mike Isely432907f2008-08-31 21:02:20 -0300454 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
455 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
456 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300457 return stat;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300458 }
Mike Isely432907f2008-08-31 21:02:20 -0300459 *left = cap->bounds.left;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300460 return 0;
461}
462
463static int ctrl_cropl_max_get(struct pvr2_ctrl *cptr, int *left)
464{
Mike Isely432907f2008-08-31 21:02:20 -0300465 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
466 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
467 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300468 return stat;
469 }
470 *left = cap->bounds.left;
471 if (cap->bounds.width > cptr->hdw->cropw_val) {
Mike Isely432907f2008-08-31 21:02:20 -0300472 *left += cap->bounds.width - cptr->hdw->cropw_val;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300473 }
474 return 0;
475}
476
477static int ctrl_cropt_min_get(struct pvr2_ctrl *cptr, int *top)
478{
Mike Isely432907f2008-08-31 21:02:20 -0300479 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
480 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
481 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300482 return stat;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300483 }
Mike Isely432907f2008-08-31 21:02:20 -0300484 *top = cap->bounds.top;
485 return 0;
486}
487
488static int ctrl_cropt_max_get(struct pvr2_ctrl *cptr, int *top)
489{
490 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
491 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
492 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300493 return stat;
494 }
495 *top = cap->bounds.top;
496 if (cap->bounds.height > cptr->hdw->croph_val) {
Mike Isely432907f2008-08-31 21:02:20 -0300497 *top += cap->bounds.height - cptr->hdw->croph_val;
498 }
499 return 0;
500}
501
Servaas Vandenberghe6188a0f2011-02-13 17:51:09 -0300502static int ctrl_cropw_max_get(struct pvr2_ctrl *cptr, int *width)
Mike Isely432907f2008-08-31 21:02:20 -0300503{
504 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
Servaas Vandenberghe6188a0f2011-02-13 17:51:09 -0300505 int stat, bleftend, cleft;
506
507 stat = pvr2_hdw_check_cropcap(cptr->hdw);
Mike Isely432907f2008-08-31 21:02:20 -0300508 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300509 return stat;
510 }
Servaas Vandenberghe6188a0f2011-02-13 17:51:09 -0300511 bleftend = cap->bounds.left+cap->bounds.width;
512 cleft = cptr->hdw->cropl_val;
513
514 *width = cleft < bleftend ? bleftend-cleft : 0;
Mike Isely432907f2008-08-31 21:02:20 -0300515 return 0;
516}
517
Servaas Vandenberghe6188a0f2011-02-13 17:51:09 -0300518static int ctrl_croph_max_get(struct pvr2_ctrl *cptr, int *height)
Mike Isely432907f2008-08-31 21:02:20 -0300519{
520 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
Servaas Vandenberghe6188a0f2011-02-13 17:51:09 -0300521 int stat, btopend, ctop;
522
523 stat = pvr2_hdw_check_cropcap(cptr->hdw);
Mike Isely432907f2008-08-31 21:02:20 -0300524 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300525 return stat;
526 }
Servaas Vandenberghe6188a0f2011-02-13 17:51:09 -0300527 btopend = cap->bounds.top+cap->bounds.height;
528 ctop = cptr->hdw->cropt_val;
529
530 *height = ctop < btopend ? btopend-ctop : 0;
Mike Isely432907f2008-08-31 21:02:20 -0300531 return 0;
532}
533
534static int ctrl_get_cropcapbl(struct pvr2_ctrl *cptr, int *val)
535{
536 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
537 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
538 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300539 return stat;
540 }
541 *val = cap->bounds.left;
542 return 0;
543}
544
545static int ctrl_get_cropcapbt(struct pvr2_ctrl *cptr, int *val)
546{
547 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
548 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
549 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300550 return stat;
551 }
552 *val = cap->bounds.top;
553 return 0;
554}
555
556static int ctrl_get_cropcapbw(struct pvr2_ctrl *cptr, int *val)
557{
558 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
559 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
560 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300561 return stat;
562 }
563 *val = cap->bounds.width;
564 return 0;
565}
566
567static int ctrl_get_cropcapbh(struct pvr2_ctrl *cptr, int *val)
568{
569 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
570 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
571 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300572 return stat;
573 }
574 *val = cap->bounds.height;
575 return 0;
576}
577
578static int ctrl_get_cropcapdl(struct pvr2_ctrl *cptr, int *val)
579{
580 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
581 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
582 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300583 return stat;
584 }
585 *val = cap->defrect.left;
586 return 0;
587}
588
589static int ctrl_get_cropcapdt(struct pvr2_ctrl *cptr, int *val)
590{
591 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
592 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
593 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300594 return stat;
595 }
596 *val = cap->defrect.top;
597 return 0;
598}
599
600static int ctrl_get_cropcapdw(struct pvr2_ctrl *cptr, int *val)
601{
602 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
603 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
604 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300605 return stat;
606 }
607 *val = cap->defrect.width;
608 return 0;
609}
610
611static int ctrl_get_cropcapdh(struct pvr2_ctrl *cptr, int *val)
612{
613 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
614 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
615 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300616 return stat;
617 }
618 *val = cap->defrect.height;
619 return 0;
620}
621
622static int ctrl_get_cropcappan(struct pvr2_ctrl *cptr, int *val)
623{
624 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
625 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
626 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300627 return stat;
628 }
629 *val = cap->pixelaspect.numerator;
630 return 0;
631}
632
633static int ctrl_get_cropcappad(struct pvr2_ctrl *cptr, int *val)
634{
635 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
636 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
637 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300638 return stat;
639 }
640 *val = cap->pixelaspect.denominator;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300641 return 0;
642}
643
Mike Isely3ad9fc32006-09-02 22:37:52 -0300644static int ctrl_vres_max_get(struct pvr2_ctrl *cptr,int *vp)
645{
646 /* Actual maximum depends on the video standard in effect. */
647 if (cptr->hdw->std_mask_cur & V4L2_STD_525_60) {
648 *vp = 480;
649 } else {
650 *vp = 576;
651 }
652 return 0;
653}
654
655static int ctrl_vres_min_get(struct pvr2_ctrl *cptr,int *vp)
656{
Mike Isely989eb152007-11-26 01:53:12 -0300657 /* Actual minimum depends on device digitizer type. */
658 if (cptr->hdw->hdw_desc->flag_has_cx25840) {
Mike Isely3ad9fc32006-09-02 22:37:52 -0300659 *vp = 75;
660 } else {
661 *vp = 17;
662 }
663 return 0;
664}
665
Mike Isely1bde0282006-12-27 23:30:13 -0300666static int ctrl_get_input(struct pvr2_ctrl *cptr,int *vp)
667{
668 *vp = cptr->hdw->input_val;
669 return 0;
670}
671
Mike Isely29bf5b12008-04-22 14:45:37 -0300672static int ctrl_check_input(struct pvr2_ctrl *cptr,int v)
673{
Mike Isely1cb03b72008-04-21 03:47:43 -0300674 return ((1 << v) & cptr->hdw->input_allowed_mask) != 0;
Mike Isely29bf5b12008-04-22 14:45:37 -0300675}
676
Mike Isely1bde0282006-12-27 23:30:13 -0300677static int ctrl_set_input(struct pvr2_ctrl *cptr,int m,int v)
678{
Mike Isely1cb03b72008-04-21 03:47:43 -0300679 return pvr2_hdw_set_input(cptr->hdw,v);
Mike Isely1bde0282006-12-27 23:30:13 -0300680}
681
682static int ctrl_isdirty_input(struct pvr2_ctrl *cptr)
683{
684 return cptr->hdw->input_dirty != 0;
685}
686
687static void ctrl_cleardirty_input(struct pvr2_ctrl *cptr)
688{
689 cptr->hdw->input_dirty = 0;
690}
691
Mike Isely5549f542006-12-27 23:28:54 -0300692
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300693static int ctrl_freq_max_get(struct pvr2_ctrl *cptr, int *vp)
694{
Mike Isely644afdb2007-01-20 00:19:23 -0300695 unsigned long fv;
696 struct pvr2_hdw *hdw = cptr->hdw;
697 if (hdw->tuner_signal_stale) {
Mike Iselya51f5002009-03-06 23:30:37 -0300698 pvr2_hdw_status_poll(hdw);
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300699 }
Mike Isely644afdb2007-01-20 00:19:23 -0300700 fv = hdw->tuner_signal_info.rangehigh;
701 if (!fv) {
702 /* Safety fallback */
703 *vp = TV_MAX_FREQ;
704 return 0;
705 }
706 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
707 fv = (fv * 125) / 2;
708 } else {
709 fv = fv * 62500;
710 }
711 *vp = fv;
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300712 return 0;
713}
714
715static int ctrl_freq_min_get(struct pvr2_ctrl *cptr, int *vp)
716{
Mike Isely644afdb2007-01-20 00:19:23 -0300717 unsigned long fv;
718 struct pvr2_hdw *hdw = cptr->hdw;
719 if (hdw->tuner_signal_stale) {
Mike Iselya51f5002009-03-06 23:30:37 -0300720 pvr2_hdw_status_poll(hdw);
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300721 }
Mike Isely644afdb2007-01-20 00:19:23 -0300722 fv = hdw->tuner_signal_info.rangelow;
723 if (!fv) {
724 /* Safety fallback */
725 *vp = TV_MIN_FREQ;
726 return 0;
727 }
728 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
729 fv = (fv * 125) / 2;
730 } else {
731 fv = fv * 62500;
732 }
733 *vp = fv;
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300734 return 0;
735}
736
Mike Iselyb30d2442006-06-25 20:05:01 -0300737static int ctrl_cx2341x_is_dirty(struct pvr2_ctrl *cptr)
738{
739 return cptr->hdw->enc_stale != 0;
740}
741
742static void ctrl_cx2341x_clear_dirty(struct pvr2_ctrl *cptr)
743{
744 cptr->hdw->enc_stale = 0;
Mike Isely681c7392007-11-26 01:48:52 -0300745 cptr->hdw->enc_unsafe_stale = 0;
Mike Iselyb30d2442006-06-25 20:05:01 -0300746}
747
748static int ctrl_cx2341x_get(struct pvr2_ctrl *cptr,int *vp)
749{
750 int ret;
751 struct v4l2_ext_controls cs;
752 struct v4l2_ext_control c1;
753 memset(&cs,0,sizeof(cs));
754 memset(&c1,0,sizeof(c1));
755 cs.controls = &c1;
756 cs.count = 1;
757 c1.id = cptr->info->v4l_id;
Hans Verkuil01f1e442007-08-21 18:32:42 -0300758 ret = cx2341x_ext_ctrls(&cptr->hdw->enc_ctl_state, 0, &cs,
Mike Iselyb30d2442006-06-25 20:05:01 -0300759 VIDIOC_G_EXT_CTRLS);
760 if (ret) return ret;
761 *vp = c1.value;
762 return 0;
763}
764
765static int ctrl_cx2341x_set(struct pvr2_ctrl *cptr,int m,int v)
766{
767 int ret;
Mike Isely681c7392007-11-26 01:48:52 -0300768 struct pvr2_hdw *hdw = cptr->hdw;
Mike Iselyb30d2442006-06-25 20:05:01 -0300769 struct v4l2_ext_controls cs;
770 struct v4l2_ext_control c1;
771 memset(&cs,0,sizeof(cs));
772 memset(&c1,0,sizeof(c1));
773 cs.controls = &c1;
774 cs.count = 1;
775 c1.id = cptr->info->v4l_id;
776 c1.value = v;
Mike Isely681c7392007-11-26 01:48:52 -0300777 ret = cx2341x_ext_ctrls(&hdw->enc_ctl_state,
778 hdw->state_encoder_run, &cs,
Mike Iselyb30d2442006-06-25 20:05:01 -0300779 VIDIOC_S_EXT_CTRLS);
Mike Isely681c7392007-11-26 01:48:52 -0300780 if (ret == -EBUSY) {
781 /* Oops. cx2341x is telling us it's not safe to change
782 this control while we're capturing. Make a note of this
783 fact so that the pipeline will be stopped the next time
784 controls are committed. Then go on ahead and store this
785 change anyway. */
786 ret = cx2341x_ext_ctrls(&hdw->enc_ctl_state,
787 0, &cs,
788 VIDIOC_S_EXT_CTRLS);
789 if (!ret) hdw->enc_unsafe_stale = !0;
790 }
Mike Iselyb30d2442006-06-25 20:05:01 -0300791 if (ret) return ret;
Mike Isely681c7392007-11-26 01:48:52 -0300792 hdw->enc_stale = !0;
Mike Iselyb30d2442006-06-25 20:05:01 -0300793 return 0;
794}
795
796static unsigned int ctrl_cx2341x_getv4lflags(struct pvr2_ctrl *cptr)
797{
798 struct v4l2_queryctrl qctrl;
799 struct pvr2_ctl_info *info;
800 qctrl.id = cptr->info->v4l_id;
801 cx2341x_ctrl_query(&cptr->hdw->enc_ctl_state,&qctrl);
802 /* Strip out the const so we can adjust a function pointer. It's
803 OK to do this here because we know this is a dynamically created
804 control, so the underlying storage for the info pointer is (a)
805 private to us, and (b) not in read-only storage. Either we do
806 this or we significantly complicate the underlying control
807 implementation. */
808 info = (struct pvr2_ctl_info *)(cptr->info);
809 if (qctrl.flags & V4L2_CTRL_FLAG_READ_ONLY) {
810 if (info->set_value) {
Mike Iselya0fd1cb2006-06-30 11:35:28 -0300811 info->set_value = NULL;
Mike Iselyb30d2442006-06-25 20:05:01 -0300812 }
813 } else {
814 if (!(info->set_value)) {
815 info->set_value = ctrl_cx2341x_set;
816 }
817 }
818 return qctrl.flags;
819}
820
Mike Iselyd8554972006-06-26 20:58:46 -0300821static int ctrl_streamingenabled_get(struct pvr2_ctrl *cptr,int *vp)
822{
Mike Isely681c7392007-11-26 01:48:52 -0300823 *vp = cptr->hdw->state_pipeline_req;
824 return 0;
825}
826
827static int ctrl_masterstate_get(struct pvr2_ctrl *cptr,int *vp)
828{
829 *vp = cptr->hdw->master_state;
Mike Iselyd8554972006-06-26 20:58:46 -0300830 return 0;
831}
832
833static int ctrl_hsm_get(struct pvr2_ctrl *cptr,int *vp)
834{
835 int result = pvr2_hdw_is_hsm(cptr->hdw);
836 *vp = PVR2_CVAL_HSM_FULL;
837 if (result < 0) *vp = PVR2_CVAL_HSM_FAIL;
838 if (result) *vp = PVR2_CVAL_HSM_HIGH;
839 return 0;
840}
841
842static int ctrl_stdavail_get(struct pvr2_ctrl *cptr,int *vp)
843{
844 *vp = cptr->hdw->std_mask_avail;
845 return 0;
846}
847
848static int ctrl_stdavail_set(struct pvr2_ctrl *cptr,int m,int v)
849{
850 struct pvr2_hdw *hdw = cptr->hdw;
851 v4l2_std_id ns;
852 ns = hdw->std_mask_avail;
853 ns = (ns & ~m) | (v & m);
854 if (ns == hdw->std_mask_avail) return 0;
855 hdw->std_mask_avail = ns;
856 pvr2_hdw_internal_set_std_avail(hdw);
857 pvr2_hdw_internal_find_stdenum(hdw);
858 return 0;
859}
860
861static int ctrl_std_val_to_sym(struct pvr2_ctrl *cptr,int msk,int val,
862 char *bufPtr,unsigned int bufSize,
863 unsigned int *len)
864{
865 *len = pvr2_std_id_to_str(bufPtr,bufSize,msk & val);
866 return 0;
867}
868
869static int ctrl_std_sym_to_val(struct pvr2_ctrl *cptr,
870 const char *bufPtr,unsigned int bufSize,
871 int *mskp,int *valp)
872{
873 int ret;
874 v4l2_std_id id;
875 ret = pvr2_std_str_to_id(&id,bufPtr,bufSize);
876 if (ret < 0) return ret;
877 if (mskp) *mskp = id;
878 if (valp) *valp = id;
879 return 0;
880}
881
882static int ctrl_stdcur_get(struct pvr2_ctrl *cptr,int *vp)
883{
884 *vp = cptr->hdw->std_mask_cur;
885 return 0;
886}
887
888static int ctrl_stdcur_set(struct pvr2_ctrl *cptr,int m,int v)
889{
890 struct pvr2_hdw *hdw = cptr->hdw;
891 v4l2_std_id ns;
892 ns = hdw->std_mask_cur;
893 ns = (ns & ~m) | (v & m);
894 if (ns == hdw->std_mask_cur) return 0;
895 hdw->std_mask_cur = ns;
896 hdw->std_dirty = !0;
897 pvr2_hdw_internal_find_stdenum(hdw);
898 return 0;
899}
900
901static int ctrl_stdcur_is_dirty(struct pvr2_ctrl *cptr)
902{
903 return cptr->hdw->std_dirty != 0;
904}
905
906static void ctrl_stdcur_clear_dirty(struct pvr2_ctrl *cptr)
907{
908 cptr->hdw->std_dirty = 0;
909}
910
911static int ctrl_signal_get(struct pvr2_ctrl *cptr,int *vp)
912{
Mike Isely18103c572007-01-20 00:09:47 -0300913 struct pvr2_hdw *hdw = cptr->hdw;
Mike Iselya51f5002009-03-06 23:30:37 -0300914 pvr2_hdw_status_poll(hdw);
Mike Isely18103c572007-01-20 00:09:47 -0300915 *vp = hdw->tuner_signal_info.signal;
916 return 0;
917}
918
919static int ctrl_audio_modes_present_get(struct pvr2_ctrl *cptr,int *vp)
920{
921 int val = 0;
922 unsigned int subchan;
923 struct pvr2_hdw *hdw = cptr->hdw;
Mike Iselya51f5002009-03-06 23:30:37 -0300924 pvr2_hdw_status_poll(hdw);
Mike Isely18103c572007-01-20 00:09:47 -0300925 subchan = hdw->tuner_signal_info.rxsubchans;
926 if (subchan & V4L2_TUNER_SUB_MONO) {
927 val |= (1 << V4L2_TUNER_MODE_MONO);
928 }
929 if (subchan & V4L2_TUNER_SUB_STEREO) {
930 val |= (1 << V4L2_TUNER_MODE_STEREO);
931 }
932 if (subchan & V4L2_TUNER_SUB_LANG1) {
933 val |= (1 << V4L2_TUNER_MODE_LANG1);
934 }
935 if (subchan & V4L2_TUNER_SUB_LANG2) {
936 val |= (1 << V4L2_TUNER_MODE_LANG2);
937 }
938 *vp = val;
Mike Iselyd8554972006-06-26 20:58:46 -0300939 return 0;
940}
941
Mike Iselyd8554972006-06-26 20:58:46 -0300942
943static int ctrl_stdenumcur_set(struct pvr2_ctrl *cptr,int m,int v)
944{
945 struct pvr2_hdw *hdw = cptr->hdw;
946 if (v < 0) return -EINVAL;
947 if (v > hdw->std_enum_cnt) return -EINVAL;
948 hdw->std_enum_cur = v;
949 if (!v) return 0;
950 v--;
951 if (hdw->std_mask_cur == hdw->std_defs[v].id) return 0;
952 hdw->std_mask_cur = hdw->std_defs[v].id;
953 hdw->std_dirty = !0;
954 return 0;
955}
956
957
958static int ctrl_stdenumcur_get(struct pvr2_ctrl *cptr,int *vp)
959{
960 *vp = cptr->hdw->std_enum_cur;
961 return 0;
962}
963
964
965static int ctrl_stdenumcur_is_dirty(struct pvr2_ctrl *cptr)
966{
967 return cptr->hdw->std_dirty != 0;
968}
969
970
971static void ctrl_stdenumcur_clear_dirty(struct pvr2_ctrl *cptr)
972{
973 cptr->hdw->std_dirty = 0;
974}
975
976
977#define DEFINT(vmin,vmax) \
978 .type = pvr2_ctl_int, \
979 .def.type_int.min_value = vmin, \
980 .def.type_int.max_value = vmax
981
982#define DEFENUM(tab) \
983 .type = pvr2_ctl_enum, \
Mike Isely27c7b712007-01-20 00:39:17 -0300984 .def.type_enum.count = ARRAY_SIZE(tab), \
Mike Iselyd8554972006-06-26 20:58:46 -0300985 .def.type_enum.value_names = tab
986
Mike Isely33213962006-06-25 20:04:40 -0300987#define DEFBOOL \
988 .type = pvr2_ctl_bool
989
Mike Iselyd8554972006-06-26 20:58:46 -0300990#define DEFMASK(msk,tab) \
991 .type = pvr2_ctl_bitmask, \
992 .def.type_bitmask.valid_bits = msk, \
993 .def.type_bitmask.bit_names = tab
994
995#define DEFREF(vname) \
996 .set_value = ctrl_set_##vname, \
997 .get_value = ctrl_get_##vname, \
998 .is_dirty = ctrl_isdirty_##vname, \
999 .clear_dirty = ctrl_cleardirty_##vname
1000
1001
1002#define VCREATE_FUNCS(vname) \
1003static int ctrl_get_##vname(struct pvr2_ctrl *cptr,int *vp) \
1004{*vp = cptr->hdw->vname##_val; return 0;} \
1005static int ctrl_set_##vname(struct pvr2_ctrl *cptr,int m,int v) \
1006{cptr->hdw->vname##_val = v; cptr->hdw->vname##_dirty = !0; return 0;} \
1007static int ctrl_isdirty_##vname(struct pvr2_ctrl *cptr) \
1008{return cptr->hdw->vname##_dirty != 0;} \
1009static void ctrl_cleardirty_##vname(struct pvr2_ctrl *cptr) \
1010{cptr->hdw->vname##_dirty = 0;}
1011
1012VCREATE_FUNCS(brightness)
1013VCREATE_FUNCS(contrast)
1014VCREATE_FUNCS(saturation)
1015VCREATE_FUNCS(hue)
1016VCREATE_FUNCS(volume)
1017VCREATE_FUNCS(balance)
1018VCREATE_FUNCS(bass)
1019VCREATE_FUNCS(treble)
1020VCREATE_FUNCS(mute)
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001021VCREATE_FUNCS(cropl)
1022VCREATE_FUNCS(cropt)
1023VCREATE_FUNCS(cropw)
1024VCREATE_FUNCS(croph)
Mike Iselyc05c0462006-06-25 20:04:25 -03001025VCREATE_FUNCS(audiomode)
1026VCREATE_FUNCS(res_hor)
1027VCREATE_FUNCS(res_ver)
Mike Iselyd8554972006-06-26 20:58:46 -03001028VCREATE_FUNCS(srate)
Mike Iselyd8554972006-06-26 20:58:46 -03001029
Mike Iselyd8554972006-06-26 20:58:46 -03001030/* Table definition of all controls which can be manipulated */
1031static const struct pvr2_ctl_info control_defs[] = {
1032 {
1033 .v4l_id = V4L2_CID_BRIGHTNESS,
1034 .desc = "Brightness",
1035 .name = "brightness",
1036 .default_value = 128,
1037 DEFREF(brightness),
1038 DEFINT(0,255),
1039 },{
1040 .v4l_id = V4L2_CID_CONTRAST,
1041 .desc = "Contrast",
1042 .name = "contrast",
1043 .default_value = 68,
1044 DEFREF(contrast),
1045 DEFINT(0,127),
1046 },{
1047 .v4l_id = V4L2_CID_SATURATION,
1048 .desc = "Saturation",
1049 .name = "saturation",
1050 .default_value = 64,
1051 DEFREF(saturation),
1052 DEFINT(0,127),
1053 },{
1054 .v4l_id = V4L2_CID_HUE,
1055 .desc = "Hue",
1056 .name = "hue",
1057 .default_value = 0,
1058 DEFREF(hue),
1059 DEFINT(-128,127),
1060 },{
1061 .v4l_id = V4L2_CID_AUDIO_VOLUME,
1062 .desc = "Volume",
1063 .name = "volume",
Mike Isely139eecf2006-12-27 23:36:33 -03001064 .default_value = 62000,
Mike Iselyd8554972006-06-26 20:58:46 -03001065 DEFREF(volume),
1066 DEFINT(0,65535),
1067 },{
1068 .v4l_id = V4L2_CID_AUDIO_BALANCE,
1069 .desc = "Balance",
1070 .name = "balance",
1071 .default_value = 0,
1072 DEFREF(balance),
1073 DEFINT(-32768,32767),
1074 },{
1075 .v4l_id = V4L2_CID_AUDIO_BASS,
1076 .desc = "Bass",
1077 .name = "bass",
1078 .default_value = 0,
1079 DEFREF(bass),
1080 DEFINT(-32768,32767),
1081 },{
1082 .v4l_id = V4L2_CID_AUDIO_TREBLE,
1083 .desc = "Treble",
1084 .name = "treble",
1085 .default_value = 0,
1086 DEFREF(treble),
1087 DEFINT(-32768,32767),
1088 },{
1089 .v4l_id = V4L2_CID_AUDIO_MUTE,
1090 .desc = "Mute",
1091 .name = "mute",
1092 .default_value = 0,
1093 DEFREF(mute),
Mike Isely33213962006-06-25 20:04:40 -03001094 DEFBOOL,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001095 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001096 .desc = "Capture crop left margin",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001097 .name = "crop_left",
1098 .internal_id = PVR2_CID_CROPL,
1099 .default_value = 0,
1100 DEFREF(cropl),
1101 DEFINT(-129, 340),
1102 .get_min_value = ctrl_cropl_min_get,
1103 .get_max_value = ctrl_cropl_max_get,
Mike Isely432907f2008-08-31 21:02:20 -03001104 .get_def_value = ctrl_get_cropcapdl,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001105 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001106 .desc = "Capture crop top margin",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001107 .name = "crop_top",
1108 .internal_id = PVR2_CID_CROPT,
1109 .default_value = 0,
1110 DEFREF(cropt),
1111 DEFINT(-35, 544),
1112 .get_min_value = ctrl_cropt_min_get,
1113 .get_max_value = ctrl_cropt_max_get,
Mike Isely432907f2008-08-31 21:02:20 -03001114 .get_def_value = ctrl_get_cropcapdt,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001115 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001116 .desc = "Capture crop width",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001117 .name = "crop_width",
1118 .internal_id = PVR2_CID_CROPW,
1119 .default_value = 720,
1120 DEFREF(cropw),
Mike Isely35fa5d42011-02-13 17:34:33 -03001121 DEFINT(0, 864),
Mike Isely432907f2008-08-31 21:02:20 -03001122 .get_max_value = ctrl_cropw_max_get,
1123 .get_def_value = ctrl_get_cropcapdw,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001124 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001125 .desc = "Capture crop height",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001126 .name = "crop_height",
1127 .internal_id = PVR2_CID_CROPH,
1128 .default_value = 480,
1129 DEFREF(croph),
Mike Isely35fa5d42011-02-13 17:34:33 -03001130 DEFINT(0, 576),
Mike Isely432907f2008-08-31 21:02:20 -03001131 .get_max_value = ctrl_croph_max_get,
1132 .get_def_value = ctrl_get_cropcapdh,
1133 }, {
1134 .desc = "Capture capability pixel aspect numerator",
1135 .name = "cropcap_pixel_numerator",
1136 .internal_id = PVR2_CID_CROPCAPPAN,
1137 .get_value = ctrl_get_cropcappan,
1138 }, {
1139 .desc = "Capture capability pixel aspect denominator",
1140 .name = "cropcap_pixel_denominator",
1141 .internal_id = PVR2_CID_CROPCAPPAD,
1142 .get_value = ctrl_get_cropcappad,
1143 }, {
1144 .desc = "Capture capability bounds top",
1145 .name = "cropcap_bounds_top",
1146 .internal_id = PVR2_CID_CROPCAPBT,
1147 .get_value = ctrl_get_cropcapbt,
1148 }, {
1149 .desc = "Capture capability bounds left",
1150 .name = "cropcap_bounds_left",
1151 .internal_id = PVR2_CID_CROPCAPBL,
1152 .get_value = ctrl_get_cropcapbl,
1153 }, {
1154 .desc = "Capture capability bounds width",
1155 .name = "cropcap_bounds_width",
1156 .internal_id = PVR2_CID_CROPCAPBW,
1157 .get_value = ctrl_get_cropcapbw,
1158 }, {
1159 .desc = "Capture capability bounds height",
1160 .name = "cropcap_bounds_height",
1161 .internal_id = PVR2_CID_CROPCAPBH,
1162 .get_value = ctrl_get_cropcapbh,
Mike Iselyd8554972006-06-26 20:58:46 -03001163 },{
Mike Iselyc05c0462006-06-25 20:04:25 -03001164 .desc = "Video Source",
1165 .name = "input",
1166 .internal_id = PVR2_CID_INPUT,
1167 .default_value = PVR2_CVAL_INPUT_TV,
Mike Isely29bf5b12008-04-22 14:45:37 -03001168 .check_value = ctrl_check_input,
Mike Iselyc05c0462006-06-25 20:04:25 -03001169 DEFREF(input),
1170 DEFENUM(control_values_input),
1171 },{
1172 .desc = "Audio Mode",
1173 .name = "audio_mode",
1174 .internal_id = PVR2_CID_AUDIOMODE,
1175 .default_value = V4L2_TUNER_MODE_STEREO,
1176 DEFREF(audiomode),
1177 DEFENUM(control_values_audiomode),
1178 },{
1179 .desc = "Horizontal capture resolution",
1180 .name = "resolution_hor",
1181 .internal_id = PVR2_CID_HRES,
1182 .default_value = 720,
1183 DEFREF(res_hor),
Mike Isely3ad9fc32006-09-02 22:37:52 -03001184 DEFINT(19,720),
Mike Iselyc05c0462006-06-25 20:04:25 -03001185 },{
1186 .desc = "Vertical capture resolution",
1187 .name = "resolution_ver",
1188 .internal_id = PVR2_CID_VRES,
1189 .default_value = 480,
1190 DEFREF(res_ver),
Mike Isely3ad9fc32006-09-02 22:37:52 -03001191 DEFINT(17,576),
1192 /* Hook in check for video standard and adjust maximum
1193 depending on the standard. */
1194 .get_max_value = ctrl_vres_max_get,
1195 .get_min_value = ctrl_vres_min_get,
Mike Iselyc05c0462006-06-25 20:04:25 -03001196 },{
Mike Iselyb30d2442006-06-25 20:05:01 -03001197 .v4l_id = V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
Mike Isely434449f2006-08-08 09:10:06 -03001198 .default_value = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000,
1199 .desc = "Audio Sampling Frequency",
Mike Iselyd8554972006-06-26 20:58:46 -03001200 .name = "srate",
Mike Iselyd8554972006-06-26 20:58:46 -03001201 DEFREF(srate),
1202 DEFENUM(control_values_srate),
1203 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001204 .desc = "Tuner Frequency (Hz)",
1205 .name = "frequency",
1206 .internal_id = PVR2_CID_FREQUENCY,
Mike Isely1bde0282006-12-27 23:30:13 -03001207 .default_value = 0,
Mike Iselyd8554972006-06-26 20:58:46 -03001208 .set_value = ctrl_freq_set,
1209 .get_value = ctrl_freq_get,
1210 .is_dirty = ctrl_freq_is_dirty,
1211 .clear_dirty = ctrl_freq_clear_dirty,
Mike Isely644afdb2007-01-20 00:19:23 -03001212 DEFINT(0,0),
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -03001213 /* Hook in check for input value (tv/radio) and adjust
1214 max/min values accordingly */
1215 .get_max_value = ctrl_freq_max_get,
1216 .get_min_value = ctrl_freq_min_get,
Mike Iselyd8554972006-06-26 20:58:46 -03001217 },{
1218 .desc = "Channel",
1219 .name = "channel",
1220 .set_value = ctrl_channel_set,
1221 .get_value = ctrl_channel_get,
1222 DEFINT(0,FREQTABLE_SIZE),
1223 },{
1224 .desc = "Channel Program Frequency",
1225 .name = "freq_table_value",
1226 .set_value = ctrl_channelfreq_set,
1227 .get_value = ctrl_channelfreq_get,
Mike Isely644afdb2007-01-20 00:19:23 -03001228 DEFINT(0,0),
Mike Isely1bde0282006-12-27 23:30:13 -03001229 /* Hook in check for input value (tv/radio) and adjust
1230 max/min values accordingly */
Mike Isely1bde0282006-12-27 23:30:13 -03001231 .get_max_value = ctrl_freq_max_get,
1232 .get_min_value = ctrl_freq_min_get,
Mike Iselyd8554972006-06-26 20:58:46 -03001233 },{
1234 .desc = "Channel Program ID",
1235 .name = "freq_table_channel",
1236 .set_value = ctrl_channelprog_set,
1237 .get_value = ctrl_channelprog_get,
1238 DEFINT(0,FREQTABLE_SIZE),
1239 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001240 .desc = "Streaming Enabled",
1241 .name = "streaming_enabled",
1242 .get_value = ctrl_streamingenabled_get,
Mike Isely33213962006-06-25 20:04:40 -03001243 DEFBOOL,
Mike Iselyd8554972006-06-26 20:58:46 -03001244 },{
1245 .desc = "USB Speed",
1246 .name = "usb_speed",
1247 .get_value = ctrl_hsm_get,
1248 DEFENUM(control_values_hsm),
1249 },{
Mike Isely681c7392007-11-26 01:48:52 -03001250 .desc = "Master State",
1251 .name = "master_state",
1252 .get_value = ctrl_masterstate_get,
1253 DEFENUM(pvr2_state_names),
1254 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001255 .desc = "Signal Present",
1256 .name = "signal_present",
1257 .get_value = ctrl_signal_get,
Mike Isely18103c572007-01-20 00:09:47 -03001258 DEFINT(0,65535),
1259 },{
1260 .desc = "Audio Modes Present",
1261 .name = "audio_modes_present",
1262 .get_value = ctrl_audio_modes_present_get,
1263 /* For this type we "borrow" the V4L2_TUNER_MODE enum from
1264 v4l. Nothing outside of this module cares about this,
1265 but I reuse it in order to also reuse the
1266 control_values_audiomode string table. */
1267 DEFMASK(((1 << V4L2_TUNER_MODE_MONO)|
1268 (1 << V4L2_TUNER_MODE_STEREO)|
1269 (1 << V4L2_TUNER_MODE_LANG1)|
1270 (1 << V4L2_TUNER_MODE_LANG2)),
1271 control_values_audiomode),
Mike Iselyd8554972006-06-26 20:58:46 -03001272 },{
1273 .desc = "Video Standards Available Mask",
1274 .name = "video_standard_mask_available",
1275 .internal_id = PVR2_CID_STDAVAIL,
1276 .skip_init = !0,
1277 .get_value = ctrl_stdavail_get,
1278 .set_value = ctrl_stdavail_set,
1279 .val_to_sym = ctrl_std_val_to_sym,
1280 .sym_to_val = ctrl_std_sym_to_val,
1281 .type = pvr2_ctl_bitmask,
1282 },{
1283 .desc = "Video Standards In Use Mask",
1284 .name = "video_standard_mask_active",
1285 .internal_id = PVR2_CID_STDCUR,
1286 .skip_init = !0,
1287 .get_value = ctrl_stdcur_get,
1288 .set_value = ctrl_stdcur_set,
1289 .is_dirty = ctrl_stdcur_is_dirty,
1290 .clear_dirty = ctrl_stdcur_clear_dirty,
1291 .val_to_sym = ctrl_std_val_to_sym,
1292 .sym_to_val = ctrl_std_sym_to_val,
1293 .type = pvr2_ctl_bitmask,
1294 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001295 .desc = "Video Standard Name",
1296 .name = "video_standard",
1297 .internal_id = PVR2_CID_STDENUM,
1298 .skip_init = !0,
1299 .get_value = ctrl_stdenumcur_get,
1300 .set_value = ctrl_stdenumcur_set,
1301 .is_dirty = ctrl_stdenumcur_is_dirty,
1302 .clear_dirty = ctrl_stdenumcur_clear_dirty,
1303 .type = pvr2_ctl_enum,
1304 }
1305};
1306
Ahmed S. Darwisheca8ebf2007-01-20 00:35:03 -03001307#define CTRLDEF_COUNT ARRAY_SIZE(control_defs)
Mike Iselyd8554972006-06-26 20:58:46 -03001308
1309
1310const char *pvr2_config_get_name(enum pvr2_config cfg)
1311{
1312 switch (cfg) {
1313 case pvr2_config_empty: return "empty";
1314 case pvr2_config_mpeg: return "mpeg";
1315 case pvr2_config_vbi: return "vbi";
Mike Isely16eb40d2006-12-30 18:27:32 -03001316 case pvr2_config_pcm: return "pcm";
1317 case pvr2_config_rawvideo: return "raw video";
Mike Iselyd8554972006-06-26 20:58:46 -03001318 }
1319 return "<unknown>";
1320}
1321
1322
1323struct usb_device *pvr2_hdw_get_dev(struct pvr2_hdw *hdw)
1324{
1325 return hdw->usb_dev;
1326}
1327
1328
1329unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw)
1330{
1331 return hdw->serial_number;
1332}
1333
Mike Isely31a18542007-04-08 01:11:47 -03001334
1335const char *pvr2_hdw_get_bus_info(struct pvr2_hdw *hdw)
1336{
1337 return hdw->bus_info;
1338}
1339
1340
Mike Isely13a88792009-01-14 04:22:56 -03001341const char *pvr2_hdw_get_device_identifier(struct pvr2_hdw *hdw)
1342{
1343 return hdw->identifier;
1344}
1345
1346
Mike Isely1bde0282006-12-27 23:30:13 -03001347unsigned long pvr2_hdw_get_cur_freq(struct pvr2_hdw *hdw)
1348{
1349 return hdw->freqSelector ? hdw->freqValTelevision : hdw->freqValRadio;
1350}
1351
1352/* Set the currently tuned frequency and account for all possible
1353 driver-core side effects of this action. */
Adrian Bunkf55a8712008-04-18 05:38:56 -03001354static void pvr2_hdw_set_cur_freq(struct pvr2_hdw *hdw,unsigned long val)
Mike Isely1bde0282006-12-27 23:30:13 -03001355{
Mike Isely7c74e572007-01-20 00:15:41 -03001356 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
Mike Isely1bde0282006-12-27 23:30:13 -03001357 if (hdw->freqSelector) {
1358 /* Swing over to radio frequency selection */
1359 hdw->freqSelector = 0;
1360 hdw->freqDirty = !0;
1361 }
Mike Isely1bde0282006-12-27 23:30:13 -03001362 if (hdw->freqValRadio != val) {
1363 hdw->freqValRadio = val;
1364 hdw->freqSlotRadio = 0;
Mike Isely7c74e572007-01-20 00:15:41 -03001365 hdw->freqDirty = !0;
Mike Isely1bde0282006-12-27 23:30:13 -03001366 }
Mike Isely7c74e572007-01-20 00:15:41 -03001367 } else {
Mike Isely1bde0282006-12-27 23:30:13 -03001368 if (!(hdw->freqSelector)) {
1369 /* Swing over to television frequency selection */
1370 hdw->freqSelector = 1;
1371 hdw->freqDirty = !0;
1372 }
Mike Isely1bde0282006-12-27 23:30:13 -03001373 if (hdw->freqValTelevision != val) {
1374 hdw->freqValTelevision = val;
1375 hdw->freqSlotTelevision = 0;
Mike Isely7c74e572007-01-20 00:15:41 -03001376 hdw->freqDirty = !0;
Mike Isely1bde0282006-12-27 23:30:13 -03001377 }
Mike Isely1bde0282006-12-27 23:30:13 -03001378 }
1379}
1380
Mike Iselyd8554972006-06-26 20:58:46 -03001381int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw)
1382{
1383 return hdw->unit_number;
1384}
1385
1386
1387/* Attempt to locate one of the given set of files. Messages are logged
1388 appropriate to what has been found. The return value will be 0 or
1389 greater on success (it will be the index of the file name found) and
1390 fw_entry will be filled in. Otherwise a negative error is returned on
1391 failure. If the return value is -ENOENT then no viable firmware file
1392 could be located. */
1393static int pvr2_locate_firmware(struct pvr2_hdw *hdw,
1394 const struct firmware **fw_entry,
1395 const char *fwtypename,
1396 unsigned int fwcount,
1397 const char *fwnames[])
1398{
1399 unsigned int idx;
1400 int ret = -EINVAL;
1401 for (idx = 0; idx < fwcount; idx++) {
1402 ret = request_firmware(fw_entry,
1403 fwnames[idx],
1404 &hdw->usb_dev->dev);
1405 if (!ret) {
1406 trace_firmware("Located %s firmware: %s;"
1407 " uploading...",
1408 fwtypename,
1409 fwnames[idx]);
1410 return idx;
1411 }
1412 if (ret == -ENOENT) continue;
1413 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1414 "request_firmware fatal error with code=%d",ret);
1415 return ret;
1416 }
1417 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1418 "***WARNING***"
1419 " Device %s firmware"
1420 " seems to be missing.",
1421 fwtypename);
1422 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1423 "Did you install the pvrusb2 firmware files"
1424 " in their proper location?");
1425 if (fwcount == 1) {
1426 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1427 "request_firmware unable to locate %s file %s",
1428 fwtypename,fwnames[0]);
1429 } else {
1430 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1431 "request_firmware unable to locate"
1432 " one of the following %s files:",
1433 fwtypename);
1434 for (idx = 0; idx < fwcount; idx++) {
1435 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1436 "request_firmware: Failed to find %s",
1437 fwnames[idx]);
1438 }
1439 }
1440 return ret;
1441}
1442
1443
1444/*
1445 * pvr2_upload_firmware1().
1446 *
1447 * Send the 8051 firmware to the device. After the upload, arrange for
1448 * device to re-enumerate.
1449 *
1450 * NOTE : the pointer to the firmware data given by request_firmware()
1451 * is not suitable for an usb transaction.
1452 *
1453 */
Adrian Bunk07e337e2006-06-30 11:30:20 -03001454static int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03001455{
Mike Iselya0fd1cb2006-06-30 11:35:28 -03001456 const struct firmware *fw_entry = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03001457 void *fw_ptr;
1458 unsigned int pipe;
Mike Isely9081d902009-11-25 02:59:34 -03001459 unsigned int fwsize;
Mike Iselyd8554972006-06-26 20:58:46 -03001460 int ret;
1461 u16 address;
Mike Isely1d643a32007-09-08 22:18:50 -03001462
Mike Isely989eb152007-11-26 01:53:12 -03001463 if (!hdw->hdw_desc->fx2_firmware.cnt) {
Mike Isely1d643a32007-09-08 22:18:50 -03001464 hdw->fw1_state = FW1_STATE_OK;
Mike Isely56dcbfa2007-11-26 02:00:51 -03001465 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1466 "Connected device type defines"
1467 " no firmware to upload; ignoring firmware");
1468 return -ENOTTY;
Mike Isely1d643a32007-09-08 22:18:50 -03001469 }
1470
Mike Iselyd8554972006-06-26 20:58:46 -03001471 hdw->fw1_state = FW1_STATE_FAILED; // default result
1472
1473 trace_firmware("pvr2_upload_firmware1");
1474
1475 ret = pvr2_locate_firmware(hdw,&fw_entry,"fx2 controller",
Mike Isely989eb152007-11-26 01:53:12 -03001476 hdw->hdw_desc->fx2_firmware.cnt,
1477 hdw->hdw_desc->fx2_firmware.lst);
Mike Iselyd8554972006-06-26 20:58:46 -03001478 if (ret < 0) {
1479 if (ret == -ENOENT) hdw->fw1_state = FW1_STATE_MISSING;
1480 return ret;
1481 }
1482
Mike Iselyd8554972006-06-26 20:58:46 -03001483 usb_clear_halt(hdw->usb_dev, usb_sndbulkpipe(hdw->usb_dev, 0 & 0x7f));
1484
1485 pipe = usb_sndctrlpipe(hdw->usb_dev, 0);
Mike Isely9081d902009-11-25 02:59:34 -03001486 fwsize = fw_entry->size;
Mike Iselyd8554972006-06-26 20:58:46 -03001487
Mike Isely9081d902009-11-25 02:59:34 -03001488 if ((fwsize != 0x2000) &&
1489 (!(hdw->hdw_desc->flag_fx2_16kb && (fwsize == 0x4000)))) {
Mike Iselyc21c2db2009-11-25 02:49:21 -03001490 if (hdw->hdw_desc->flag_fx2_16kb) {
1491 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1492 "Wrong fx2 firmware size"
1493 " (expected 8192 or 16384, got %u)",
Mike Isely9081d902009-11-25 02:59:34 -03001494 fwsize);
Mike Iselyc21c2db2009-11-25 02:49:21 -03001495 } else {
1496 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1497 "Wrong fx2 firmware size"
1498 " (expected 8192, got %u)",
Mike Isely9081d902009-11-25 02:59:34 -03001499 fwsize);
Mike Iselyc21c2db2009-11-25 02:49:21 -03001500 }
Mike Iselyd8554972006-06-26 20:58:46 -03001501 release_firmware(fw_entry);
1502 return -ENOMEM;
1503 }
1504
1505 fw_ptr = kmalloc(0x800, GFP_KERNEL);
1506 if (fw_ptr == NULL){
1507 release_firmware(fw_entry);
1508 return -ENOMEM;
1509 }
1510
1511 /* We have to hold the CPU during firmware upload. */
1512 pvr2_hdw_cpureset_assert(hdw,1);
1513
1514 /* upload the firmware to address 0000-1fff in 2048 (=0x800) bytes
1515 chunk. */
1516
1517 ret = 0;
Mike Isely9081d902009-11-25 02:59:34 -03001518 for (address = 0; address < fwsize; address += 0x800) {
Mike Iselyd8554972006-06-26 20:58:46 -03001519 memcpy(fw_ptr, fw_entry->data + address, 0x800);
1520 ret += usb_control_msg(hdw->usb_dev, pipe, 0xa0, 0x40, address,
1521 0, fw_ptr, 0x800, HZ);
1522 }
1523
1524 trace_firmware("Upload done, releasing device's CPU");
1525
1526 /* Now release the CPU. It will disconnect and reconnect later. */
1527 pvr2_hdw_cpureset_assert(hdw,0);
1528
1529 kfree(fw_ptr);
1530 release_firmware(fw_entry);
1531
1532 trace_firmware("Upload done (%d bytes sent)",ret);
1533
Gary Francis75727462009-11-25 03:03:31 -03001534 /* We should have written fwsize bytes */
1535 if (ret == fwsize) {
Mike Iselyd8554972006-06-26 20:58:46 -03001536 hdw->fw1_state = FW1_STATE_RELOAD;
1537 return 0;
1538 }
1539
1540 return -EIO;
1541}
1542
1543
1544/*
1545 * pvr2_upload_firmware2()
1546 *
1547 * This uploads encoder firmware on endpoint 2.
1548 *
1549 */
1550
1551int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
1552{
Mike Iselya0fd1cb2006-06-30 11:35:28 -03001553 const struct firmware *fw_entry = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03001554 void *fw_ptr;
Mike Isely90060d32007-02-08 02:02:53 -03001555 unsigned int pipe, fw_len, fw_done, bcnt, icnt;
Mike Iselyd8554972006-06-26 20:58:46 -03001556 int actual_length;
1557 int ret = 0;
1558 int fwidx;
1559 static const char *fw_files[] = {
1560 CX2341X_FIRM_ENC_FILENAME,
1561 };
1562
Mike Isely989eb152007-11-26 01:53:12 -03001563 if (hdw->hdw_desc->flag_skip_cx23416_firmware) {
Mike Isely1d643a32007-09-08 22:18:50 -03001564 return 0;
1565 }
1566
Mike Iselyd8554972006-06-26 20:58:46 -03001567 trace_firmware("pvr2_upload_firmware2");
1568
1569 ret = pvr2_locate_firmware(hdw,&fw_entry,"encoder",
Ahmed S. Darwisheca8ebf2007-01-20 00:35:03 -03001570 ARRAY_SIZE(fw_files), fw_files);
Mike Iselyd8554972006-06-26 20:58:46 -03001571 if (ret < 0) return ret;
1572 fwidx = ret;
1573 ret = 0;
Mike Iselyb30d2442006-06-25 20:05:01 -03001574 /* Since we're about to completely reinitialize the encoder,
1575 invalidate our cached copy of its configuration state. Next
1576 time we configure the encoder, then we'll fully configure it. */
1577 hdw->enc_cur_valid = 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001578
Mike Iselyd913d632008-04-06 04:04:35 -03001579 /* Encoder is about to be reset so note that as far as we're
1580 concerned now, the encoder has never been run. */
1581 del_timer_sync(&hdw->encoder_run_timer);
1582 if (hdw->state_encoder_runok) {
1583 hdw->state_encoder_runok = 0;
1584 trace_stbit("state_encoder_runok",hdw->state_encoder_runok);
1585 }
1586
Mike Iselyd8554972006-06-26 20:58:46 -03001587 /* First prepare firmware loading */
1588 ret |= pvr2_write_register(hdw, 0x0048, 0xffffffff); /*interrupt mask*/
1589 ret |= pvr2_hdw_gpio_chg_dir(hdw,0xffffffff,0x00000088); /*gpio dir*/
1590 ret |= pvr2_hdw_gpio_chg_out(hdw,0xffffffff,0x00000008); /*gpio output state*/
1591 ret |= pvr2_hdw_cmd_deep_reset(hdw);
1592 ret |= pvr2_write_register(hdw, 0xa064, 0x00000000); /*APU command*/
1593 ret |= pvr2_hdw_gpio_chg_dir(hdw,0xffffffff,0x00000408); /*gpio dir*/
1594 ret |= pvr2_hdw_gpio_chg_out(hdw,0xffffffff,0x00000008); /*gpio output state*/
1595 ret |= pvr2_write_register(hdw, 0x9058, 0xffffffed); /*VPU ctrl*/
1596 ret |= pvr2_write_register(hdw, 0x9054, 0xfffffffd); /*reset hw blocks*/
1597 ret |= pvr2_write_register(hdw, 0x07f8, 0x80000800); /*encoder SDRAM refresh*/
1598 ret |= pvr2_write_register(hdw, 0x07fc, 0x0000001a); /*encoder SDRAM pre-charge*/
1599 ret |= pvr2_write_register(hdw, 0x0700, 0x00000000); /*I2C clock*/
1600 ret |= pvr2_write_register(hdw, 0xaa00, 0x00000000); /*unknown*/
1601 ret |= pvr2_write_register(hdw, 0xaa04, 0x00057810); /*unknown*/
1602 ret |= pvr2_write_register(hdw, 0xaa10, 0x00148500); /*unknown*/
1603 ret |= pvr2_write_register(hdw, 0xaa18, 0x00840000); /*unknown*/
Mike Isely1c9d10d2008-03-28 05:38:54 -03001604 ret |= pvr2_issue_simple_cmd(hdw,FX2CMD_FWPOST1);
1605 ret |= pvr2_issue_simple_cmd(hdw,FX2CMD_MEMSEL | (1 << 8) | (0 << 16));
Mike Iselyd8554972006-06-26 20:58:46 -03001606
1607 if (ret) {
1608 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1609 "firmware2 upload prep failed, ret=%d",ret);
1610 release_firmware(fw_entry);
Mike Isely21684ba2008-04-21 03:49:33 -03001611 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001612 }
1613
1614 /* Now send firmware */
1615
1616 fw_len = fw_entry->size;
1617
Mike Isely90060d32007-02-08 02:02:53 -03001618 if (fw_len % sizeof(u32)) {
Mike Iselyd8554972006-06-26 20:58:46 -03001619 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1620 "size of %s firmware"
Mike Isely48dc30a2007-03-03 10:13:05 -02001621 " must be a multiple of %zu bytes",
Mike Isely90060d32007-02-08 02:02:53 -03001622 fw_files[fwidx],sizeof(u32));
Mike Iselyd8554972006-06-26 20:58:46 -03001623 release_firmware(fw_entry);
Mike Isely21684ba2008-04-21 03:49:33 -03001624 ret = -EINVAL;
1625 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001626 }
1627
1628 fw_ptr = kmalloc(FIRMWARE_CHUNK_SIZE, GFP_KERNEL);
1629 if (fw_ptr == NULL){
1630 release_firmware(fw_entry);
1631 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1632 "failed to allocate memory for firmware2 upload");
Mike Isely21684ba2008-04-21 03:49:33 -03001633 ret = -ENOMEM;
1634 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001635 }
1636
1637 pipe = usb_sndbulkpipe(hdw->usb_dev, PVR2_FIRMWARE_ENDPOINT);
1638
Mike Isely90060d32007-02-08 02:02:53 -03001639 fw_done = 0;
1640 for (fw_done = 0; fw_done < fw_len;) {
1641 bcnt = fw_len - fw_done;
1642 if (bcnt > FIRMWARE_CHUNK_SIZE) bcnt = FIRMWARE_CHUNK_SIZE;
1643 memcpy(fw_ptr, fw_entry->data + fw_done, bcnt);
1644 /* Usbsnoop log shows that we must swap bytes... */
Mike Isely5f33df12008-08-30 15:09:31 -03001645 /* Some background info: The data being swapped here is a
1646 firmware image destined for the mpeg encoder chip that
1647 lives at the other end of a USB endpoint. The encoder
1648 chip always talks in 32 bit chunks and its storage is
1649 organized into 32 bit words. However from the file
1650 system to the encoder chip everything is purely a byte
1651 stream. The firmware file's contents are always 32 bit
1652 swapped from what the encoder expects. Thus the need
1653 always exists to swap the bytes regardless of the endian
1654 type of the host processor and therefore swab32() makes
1655 the most sense. */
Mike Isely90060d32007-02-08 02:02:53 -03001656 for (icnt = 0; icnt < bcnt/4 ; icnt++)
Harvey Harrison513edce2008-08-18 17:38:01 -03001657 ((u32 *)fw_ptr)[icnt] = swab32(((u32 *)fw_ptr)[icnt]);
Mike Iselyd8554972006-06-26 20:58:46 -03001658
Mike Isely90060d32007-02-08 02:02:53 -03001659 ret |= usb_bulk_msg(hdw->usb_dev, pipe, fw_ptr,bcnt,
Mike Iselyd8554972006-06-26 20:58:46 -03001660 &actual_length, HZ);
Mike Isely90060d32007-02-08 02:02:53 -03001661 ret |= (actual_length != bcnt);
1662 if (ret) break;
1663 fw_done += bcnt;
Mike Iselyd8554972006-06-26 20:58:46 -03001664 }
1665
1666 trace_firmware("upload of %s : %i / %i ",
1667 fw_files[fwidx],fw_done,fw_len);
1668
1669 kfree(fw_ptr);
1670 release_firmware(fw_entry);
1671
1672 if (ret) {
1673 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1674 "firmware2 upload transfer failure");
Mike Isely21684ba2008-04-21 03:49:33 -03001675 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001676 }
1677
1678 /* Finish upload */
1679
1680 ret |= pvr2_write_register(hdw, 0x9054, 0xffffffff); /*reset hw blocks*/
1681 ret |= pvr2_write_register(hdw, 0x9058, 0xffffffe8); /*VPU ctrl*/
Mike Isely1c9d10d2008-03-28 05:38:54 -03001682 ret |= pvr2_issue_simple_cmd(hdw,FX2CMD_MEMSEL | (1 << 8) | (0 << 16));
Mike Iselyd8554972006-06-26 20:58:46 -03001683
1684 if (ret) {
1685 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1686 "firmware2 upload post-proc failure");
Mike Iselyd8554972006-06-26 20:58:46 -03001687 }
Mike Isely21684ba2008-04-21 03:49:33 -03001688
1689 done:
Mike Isely1df59f02008-04-21 03:50:39 -03001690 if (hdw->hdw_desc->signal_routing_scheme ==
1691 PVR2_ROUTING_SCHEME_GOTVIEW) {
1692 /* Ensure that GPIO 11 is set to output for GOTVIEW
1693 hardware. */
1694 pvr2_hdw_gpio_chg_dir(hdw,(1 << 11),~0);
1695 }
Mike Iselyd8554972006-06-26 20:58:46 -03001696 return ret;
1697}
1698
1699
Mike Isely681c7392007-11-26 01:48:52 -03001700static const char *pvr2_get_state_name(unsigned int st)
Mike Iselyd8554972006-06-26 20:58:46 -03001701{
Mike Isely681c7392007-11-26 01:48:52 -03001702 if (st < ARRAY_SIZE(pvr2_state_names)) {
1703 return pvr2_state_names[st];
Mike Iselyd8554972006-06-26 20:58:46 -03001704 }
Mike Isely681c7392007-11-26 01:48:52 -03001705 return "???";
Mike Iselyd8554972006-06-26 20:58:46 -03001706}
1707
Mike Isely681c7392007-11-26 01:48:52 -03001708static int pvr2_decoder_enable(struct pvr2_hdw *hdw,int enablefl)
Mike Iselyd8554972006-06-26 20:58:46 -03001709{
Mike Iselyaf78e162009-03-07 00:21:30 -03001710 /* Even though we really only care about the video decoder chip at
1711 this point, we'll broadcast stream on/off to all sub-devices
1712 anyway, just in case somebody else wants to hear the
1713 command... */
Mike Iselye2605082009-03-07 01:50:48 -03001714 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 stream=%s",
1715 (enablefl ? "on" : "off"));
Mike Iselyaf78e162009-03-07 00:21:30 -03001716 v4l2_device_call_all(&hdw->v4l2_dev, 0, video, s_stream, enablefl);
Andy Walls3ccc6462009-12-24 13:06:08 -03001717 v4l2_device_call_all(&hdw->v4l2_dev, 0, audio, s_stream, enablefl);
Mike Iselyaf78e162009-03-07 00:21:30 -03001718 if (hdw->decoder_client_id) {
1719 /* We get here if the encoder has been noticed. Otherwise
1720 we'll issue a warning to the user (which should
1721 normally never happen). */
1722 return 0;
1723 }
1724 if (!hdw->flag_decoder_missed) {
1725 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1726 "WARNING: No decoder present");
1727 hdw->flag_decoder_missed = !0;
1728 trace_stbit("flag_decoder_missed",
1729 hdw->flag_decoder_missed);
1730 }
1731 return -EIO;
Mike Iselyd8554972006-06-26 20:58:46 -03001732}
1733
1734
Mike Isely681c7392007-11-26 01:48:52 -03001735int pvr2_hdw_get_state(struct pvr2_hdw *hdw)
1736{
1737 return hdw->master_state;
1738}
1739
1740
1741static int pvr2_hdw_untrip_unlocked(struct pvr2_hdw *hdw)
1742{
1743 if (!hdw->flag_tripped) return 0;
1744 hdw->flag_tripped = 0;
1745 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1746 "Clearing driver error statuss");
1747 return !0;
1748}
1749
1750
1751int pvr2_hdw_untrip(struct pvr2_hdw *hdw)
1752{
1753 int fl;
1754 LOCK_TAKE(hdw->big_lock); do {
1755 fl = pvr2_hdw_untrip_unlocked(hdw);
1756 } while (0); LOCK_GIVE(hdw->big_lock);
1757 if (fl) pvr2_hdw_state_sched(hdw);
1758 return 0;
1759}
1760
1761
Mike Isely681c7392007-11-26 01:48:52 -03001762
1763
Mike Iselyd8554972006-06-26 20:58:46 -03001764int pvr2_hdw_get_streaming(struct pvr2_hdw *hdw)
1765{
Mike Isely681c7392007-11-26 01:48:52 -03001766 return hdw->state_pipeline_req != 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001767}
1768
1769
1770int pvr2_hdw_set_streaming(struct pvr2_hdw *hdw,int enable_flag)
1771{
Mike Isely681c7392007-11-26 01:48:52 -03001772 int ret,st;
Mike Iselyd8554972006-06-26 20:58:46 -03001773 LOCK_TAKE(hdw->big_lock); do {
Mike Isely681c7392007-11-26 01:48:52 -03001774 pvr2_hdw_untrip_unlocked(hdw);
1775 if ((!enable_flag) != !(hdw->state_pipeline_req)) {
1776 hdw->state_pipeline_req = enable_flag != 0;
1777 pvr2_trace(PVR2_TRACE_START_STOP,
1778 "/*--TRACE_STREAM--*/ %s",
1779 enable_flag ? "enable" : "disable");
1780 }
1781 pvr2_hdw_state_sched(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03001782 } while (0); LOCK_GIVE(hdw->big_lock);
Mike Isely681c7392007-11-26 01:48:52 -03001783 if ((ret = pvr2_hdw_wait(hdw,0)) < 0) return ret;
1784 if (enable_flag) {
1785 while ((st = hdw->master_state) != PVR2_STATE_RUN) {
1786 if (st != PVR2_STATE_READY) return -EIO;
1787 if ((ret = pvr2_hdw_wait(hdw,st)) < 0) return ret;
1788 }
1789 }
Mike Iselyd8554972006-06-26 20:58:46 -03001790 return 0;
1791}
1792
1793
1794int pvr2_hdw_set_stream_type(struct pvr2_hdw *hdw,enum pvr2_config config)
1795{
Mike Isely681c7392007-11-26 01:48:52 -03001796 int fl;
Mike Iselyd8554972006-06-26 20:58:46 -03001797 LOCK_TAKE(hdw->big_lock);
Mike Isely681c7392007-11-26 01:48:52 -03001798 if ((fl = (hdw->desired_stream_type != config)) != 0) {
1799 hdw->desired_stream_type = config;
1800 hdw->state_pipeline_config = 0;
1801 trace_stbit("state_pipeline_config",
1802 hdw->state_pipeline_config);
1803 pvr2_hdw_state_sched(hdw);
1804 }
Mike Iselyd8554972006-06-26 20:58:46 -03001805 LOCK_GIVE(hdw->big_lock);
Mike Isely681c7392007-11-26 01:48:52 -03001806 if (fl) return 0;
1807 return pvr2_hdw_wait(hdw,0);
Mike Iselyd8554972006-06-26 20:58:46 -03001808}
1809
1810
1811static int get_default_tuner_type(struct pvr2_hdw *hdw)
1812{
1813 int unit_number = hdw->unit_number;
1814 int tp = -1;
1815 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1816 tp = tuner[unit_number];
1817 }
1818 if (tp < 0) return -EINVAL;
1819 hdw->tuner_type = tp;
Mike Iselyaaf78842007-11-26 02:04:11 -03001820 hdw->tuner_updated = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03001821 return 0;
1822}
1823
1824
1825static v4l2_std_id get_default_standard(struct pvr2_hdw *hdw)
1826{
1827 int unit_number = hdw->unit_number;
1828 int tp = 0;
1829 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1830 tp = video_std[unit_number];
Mike Isely6a540252007-12-02 23:51:34 -03001831 if (tp) return tp;
Mike Iselyd8554972006-06-26 20:58:46 -03001832 }
Mike Isely6a540252007-12-02 23:51:34 -03001833 return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001834}
1835
1836
1837static unsigned int get_default_error_tolerance(struct pvr2_hdw *hdw)
1838{
1839 int unit_number = hdw->unit_number;
1840 int tp = 0;
1841 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1842 tp = tolerance[unit_number];
1843 }
1844 return tp;
1845}
1846
1847
1848static int pvr2_hdw_check_firmware(struct pvr2_hdw *hdw)
1849{
1850 /* Try a harmless request to fetch the eeprom's address over
1851 endpoint 1. See what happens. Only the full FX2 image can
1852 respond to this. If this probe fails then likely the FX2
1853 firmware needs be loaded. */
1854 int result;
1855 LOCK_TAKE(hdw->ctl_lock); do {
Michael Krufky8d364362007-01-22 02:17:55 -03001856 hdw->cmd_buffer[0] = FX2CMD_GET_EEPROM_ADDR;
Mike Iselyd8554972006-06-26 20:58:46 -03001857 result = pvr2_send_request_ex(hdw,HZ*1,!0,
1858 hdw->cmd_buffer,1,
1859 hdw->cmd_buffer,1);
1860 if (result < 0) break;
1861 } while(0); LOCK_GIVE(hdw->ctl_lock);
1862 if (result) {
1863 pvr2_trace(PVR2_TRACE_INIT,
1864 "Probe of device endpoint 1 result status %d",
1865 result);
1866 } else {
1867 pvr2_trace(PVR2_TRACE_INIT,
1868 "Probe of device endpoint 1 succeeded");
1869 }
1870 return result == 0;
1871}
1872
Mike Isely9f66d4e2007-09-08 22:28:51 -03001873struct pvr2_std_hack {
1874 v4l2_std_id pat; /* Pattern to match */
1875 v4l2_std_id msk; /* Which bits we care about */
1876 v4l2_std_id std; /* What additional standards or default to set */
1877};
1878
1879/* This data structure labels specific combinations of standards from
1880 tveeprom that we'll try to recognize. If we recognize one, then assume
1881 a specified default standard to use. This is here because tveeprom only
1882 tells us about available standards not the intended default standard (if
1883 any) for the device in question. We guess the default based on what has
1884 been reported as available. Note that this is only for guessing a
1885 default - which can always be overridden explicitly - and if the user
1886 has otherwise named a default then that default will always be used in
1887 place of this table. */
Tobias Klauserebff0332008-04-22 14:45:45 -03001888static const struct pvr2_std_hack std_eeprom_maps[] = {
Mike Isely9f66d4e2007-09-08 22:28:51 -03001889 { /* PAL(B/G) */
1890 .pat = V4L2_STD_B|V4L2_STD_GH,
1891 .std = V4L2_STD_PAL_B|V4L2_STD_PAL_B1|V4L2_STD_PAL_G,
1892 },
1893 { /* NTSC(M) */
1894 .pat = V4L2_STD_MN,
1895 .std = V4L2_STD_NTSC_M,
1896 },
1897 { /* PAL(I) */
1898 .pat = V4L2_STD_PAL_I,
1899 .std = V4L2_STD_PAL_I,
1900 },
1901 { /* SECAM(L/L') */
1902 .pat = V4L2_STD_SECAM_L|V4L2_STD_SECAM_LC,
1903 .std = V4L2_STD_SECAM_L|V4L2_STD_SECAM_LC,
1904 },
1905 { /* PAL(D/D1/K) */
1906 .pat = V4L2_STD_DK,
Roel Kluinea2562d2007-12-02 23:04:57 -03001907 .std = V4L2_STD_PAL_D|V4L2_STD_PAL_D1|V4L2_STD_PAL_K,
Mike Isely9f66d4e2007-09-08 22:28:51 -03001908 },
1909};
1910
Mike Iselyd8554972006-06-26 20:58:46 -03001911static void pvr2_hdw_setup_std(struct pvr2_hdw *hdw)
1912{
1913 char buf[40];
1914 unsigned int bcnt;
Mike Isely3d290bd2007-12-03 01:47:12 -03001915 v4l2_std_id std1,std2,std3;
Mike Iselyd8554972006-06-26 20:58:46 -03001916
1917 std1 = get_default_standard(hdw);
Mike Isely3d290bd2007-12-03 01:47:12 -03001918 std3 = std1 ? 0 : hdw->hdw_desc->default_std_mask;
Mike Iselyd8554972006-06-26 20:58:46 -03001919
1920 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),hdw->std_mask_eeprom);
Mike Isely56585382007-09-08 22:32:12 -03001921 pvr2_trace(PVR2_TRACE_STD,
Mike Isely56dcbfa2007-11-26 02:00:51 -03001922 "Supported video standard(s) reported available"
1923 " in hardware: %.*s",
Mike Iselyd8554972006-06-26 20:58:46 -03001924 bcnt,buf);
1925
1926 hdw->std_mask_avail = hdw->std_mask_eeprom;
1927
Mike Isely3d290bd2007-12-03 01:47:12 -03001928 std2 = (std1|std3) & ~hdw->std_mask_avail;
Mike Iselyd8554972006-06-26 20:58:46 -03001929 if (std2) {
1930 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std2);
Mike Isely56585382007-09-08 22:32:12 -03001931 pvr2_trace(PVR2_TRACE_STD,
Mike Iselyd8554972006-06-26 20:58:46 -03001932 "Expanding supported video standards"
1933 " to include: %.*s",
1934 bcnt,buf);
1935 hdw->std_mask_avail |= std2;
1936 }
1937
1938 pvr2_hdw_internal_set_std_avail(hdw);
1939
1940 if (std1) {
1941 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std1);
Mike Isely56585382007-09-08 22:32:12 -03001942 pvr2_trace(PVR2_TRACE_STD,
Mike Iselyd8554972006-06-26 20:58:46 -03001943 "Initial video standard forced to %.*s",
1944 bcnt,buf);
1945 hdw->std_mask_cur = std1;
1946 hdw->std_dirty = !0;
1947 pvr2_hdw_internal_find_stdenum(hdw);
1948 return;
1949 }
Mike Isely3d290bd2007-12-03 01:47:12 -03001950 if (std3) {
1951 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std3);
1952 pvr2_trace(PVR2_TRACE_STD,
1953 "Initial video standard"
1954 " (determined by device type): %.*s",bcnt,buf);
1955 hdw->std_mask_cur = std3;
1956 hdw->std_dirty = !0;
1957 pvr2_hdw_internal_find_stdenum(hdw);
1958 return;
1959 }
Mike Iselyd8554972006-06-26 20:58:46 -03001960
Mike Isely9f66d4e2007-09-08 22:28:51 -03001961 {
1962 unsigned int idx;
1963 for (idx = 0; idx < ARRAY_SIZE(std_eeprom_maps); idx++) {
1964 if (std_eeprom_maps[idx].msk ?
1965 ((std_eeprom_maps[idx].pat ^
1966 hdw->std_mask_eeprom) &
1967 std_eeprom_maps[idx].msk) :
1968 (std_eeprom_maps[idx].pat !=
1969 hdw->std_mask_eeprom)) continue;
1970 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),
1971 std_eeprom_maps[idx].std);
Mike Isely56585382007-09-08 22:32:12 -03001972 pvr2_trace(PVR2_TRACE_STD,
Mike Isely9f66d4e2007-09-08 22:28:51 -03001973 "Initial video standard guessed as %.*s",
1974 bcnt,buf);
1975 hdw->std_mask_cur = std_eeprom_maps[idx].std;
1976 hdw->std_dirty = !0;
1977 pvr2_hdw_internal_find_stdenum(hdw);
1978 return;
1979 }
1980 }
1981
Mike Iselyd8554972006-06-26 20:58:46 -03001982 if (hdw->std_enum_cnt > 1) {
1983 // Autoselect the first listed standard
1984 hdw->std_enum_cur = 1;
1985 hdw->std_mask_cur = hdw->std_defs[hdw->std_enum_cur-1].id;
1986 hdw->std_dirty = !0;
Mike Isely56585382007-09-08 22:32:12 -03001987 pvr2_trace(PVR2_TRACE_STD,
Mike Iselyd8554972006-06-26 20:58:46 -03001988 "Initial video standard auto-selected to %s",
1989 hdw->std_defs[hdw->std_enum_cur-1].name);
1990 return;
1991 }
1992
Mike Isely0885ba12006-06-25 21:30:47 -03001993 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Iselyd8554972006-06-26 20:58:46 -03001994 "Unable to select a viable initial video standard");
1995}
1996
1997
Mike Iselye9c64a72009-03-06 23:42:20 -03001998static unsigned int pvr2_copy_i2c_addr_list(
1999 unsigned short *dst, const unsigned char *src,
2000 unsigned int dst_max)
2001{
Mike Isely3ab8d292009-03-07 01:37:58 -03002002 unsigned int cnt = 0;
Mike Iselye9c64a72009-03-06 23:42:20 -03002003 if (!src) return 0;
2004 while (src[cnt] && (cnt + 1) < dst_max) {
2005 dst[cnt] = src[cnt];
2006 cnt++;
2007 }
2008 dst[cnt] = I2C_CLIENT_END;
2009 return cnt;
2010}
2011
2012
Mike Iselye17d7872009-06-20 14:45:52 -03002013static void pvr2_hdw_cx25840_vbi_hack(struct pvr2_hdw *hdw)
2014{
2015 /*
2016 Mike Isely <isely@pobox.com> 19-Nov-2006 - This bit of nuttiness
2017 for cx25840 causes that module to correctly set up its video
2018 scaling. This is really a problem in the cx25840 module itself,
2019 but we work around it here. The problem has not been seen in
2020 ivtv because there VBI is supported and set up. We don't do VBI
2021 here (at least not yet) and thus we never attempted to even set
2022 it up.
2023 */
2024 struct v4l2_format fmt;
2025 if (hdw->decoder_client_id != PVR2_CLIENT_ID_CX25840) {
2026 /* We're not using a cx25840 so don't enable the hack */
2027 return;
2028 }
2029
2030 pvr2_trace(PVR2_TRACE_INIT,
2031 "Module ID %u:"
2032 " Executing cx25840 VBI hack",
2033 hdw->decoder_client_id);
2034 memset(&fmt, 0, sizeof(fmt));
2035 fmt.type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
2036 v4l2_device_call_all(&hdw->v4l2_dev, hdw->decoder_client_id,
Hans Verkuil09419af2010-03-14 12:27:48 -03002037 vbi, s_sliced_fmt, &fmt.fmt.sliced);
Mike Iselye17d7872009-06-20 14:45:52 -03002038}
2039
2040
Mike Isely1ab5e742009-03-07 00:24:24 -03002041static int pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
2042 const struct pvr2_device_client_desc *cd)
Mike Iselye9c64a72009-03-06 23:42:20 -03002043{
2044 const char *fname;
2045 unsigned char mid;
2046 struct v4l2_subdev *sd;
2047 unsigned int i2ccnt;
2048 const unsigned char *p;
2049 /* Arbitrary count - max # i2c addresses we will probe */
2050 unsigned short i2caddr[25];
2051
2052 mid = cd->module_id;
2053 fname = (mid < ARRAY_SIZE(module_names)) ? module_names[mid] : NULL;
2054 if (!fname) {
2055 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Isely27108142009-10-12 00:21:20 -03002056 "Module ID %u for device %s has no name?"
2057 " The driver might have a configuration problem.",
Mike Iselye9c64a72009-03-06 23:42:20 -03002058 mid,
2059 hdw->hdw_desc->description);
Mike Isely1ab5e742009-03-07 00:24:24 -03002060 return -EINVAL;
Mike Iselye9c64a72009-03-06 23:42:20 -03002061 }
Mike Iselybd14d4f2009-03-07 00:56:52 -03002062 pvr2_trace(PVR2_TRACE_INIT,
2063 "Module ID %u (%s) for device %s being loaded...",
2064 mid, fname,
2065 hdw->hdw_desc->description);
Mike Iselye9c64a72009-03-06 23:42:20 -03002066
2067 i2ccnt = pvr2_copy_i2c_addr_list(i2caddr, cd->i2c_address_list,
2068 ARRAY_SIZE(i2caddr));
2069 if (!i2ccnt && ((p = (mid < ARRAY_SIZE(module_i2c_addresses)) ?
2070 module_i2c_addresses[mid] : NULL) != NULL)) {
2071 /* Second chance: Try default i2c address list */
2072 i2ccnt = pvr2_copy_i2c_addr_list(i2caddr, p,
2073 ARRAY_SIZE(i2caddr));
Mike Iselybd14d4f2009-03-07 00:56:52 -03002074 if (i2ccnt) {
2075 pvr2_trace(PVR2_TRACE_INIT,
2076 "Module ID %u:"
2077 " Using default i2c address list",
2078 mid);
2079 }
Mike Iselye9c64a72009-03-06 23:42:20 -03002080 }
2081
2082 if (!i2ccnt) {
2083 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Isely1ab5e742009-03-07 00:24:24 -03002084 "Module ID %u (%s) for device %s:"
Mike Isely27108142009-10-12 00:21:20 -03002085 " No i2c addresses."
2086 " The driver might have a configuration problem.",
Mike Isely1ab5e742009-03-07 00:24:24 -03002087 mid, fname, hdw->hdw_desc->description);
2088 return -EINVAL;
Mike Iselye9c64a72009-03-06 23:42:20 -03002089 }
2090
Mike Iselye9c64a72009-03-06 23:42:20 -03002091 if (i2ccnt == 1) {
Mike Iselybd14d4f2009-03-07 00:56:52 -03002092 pvr2_trace(PVR2_TRACE_INIT,
2093 "Module ID %u:"
2094 " Setting up with specified i2c address 0x%x",
2095 mid, i2caddr[0]);
Hans Verkuile6574f22009-04-01 03:57:53 -03002096 sd = v4l2_i2c_new_subdev(&hdw->v4l2_dev, &hdw->i2c_adap,
Laurent Pinchart9a1f8b32010-09-24 10:16:44 -03002097 fname, i2caddr[0], NULL);
Mike Iselye9c64a72009-03-06 23:42:20 -03002098 } else {
Mike Iselybd14d4f2009-03-07 00:56:52 -03002099 pvr2_trace(PVR2_TRACE_INIT,
2100 "Module ID %u:"
2101 " Setting up with address probe list",
2102 mid);
Hans Verkuil53dacb12009-08-10 02:49:08 -03002103 sd = v4l2_i2c_new_subdev(&hdw->v4l2_dev, &hdw->i2c_adap,
Laurent Pinchart9a1f8b32010-09-24 10:16:44 -03002104 fname, 0, i2caddr);
Mike Iselye9c64a72009-03-06 23:42:20 -03002105 }
2106
Mike Isely446dfdc2009-03-06 23:58:15 -03002107 if (!sd) {
2108 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Isely27108142009-10-12 00:21:20 -03002109 "Module ID %u (%s) for device %s failed to load."
2110 " Possible missing sub-device kernel module or"
2111 " initialization failure within module.",
Mike Isely1ab5e742009-03-07 00:24:24 -03002112 mid, fname, hdw->hdw_desc->description);
2113 return -EIO;
Mike Isely446dfdc2009-03-06 23:58:15 -03002114 }
2115
2116 /* Tag this sub-device instance with the module ID we know about.
2117 In other places we'll use that tag to determine if the instance
2118 requires special handling. */
2119 sd->grp_id = mid;
2120
Mike Iselybd14d4f2009-03-07 00:56:52 -03002121 pvr2_trace(PVR2_TRACE_INFO, "Attached sub-driver %s", fname);
Mike Iselya932f502009-03-06 23:47:10 -03002122
Mike Iselye9c64a72009-03-06 23:42:20 -03002123
Mike Isely00e5f732009-03-07 00:17:11 -03002124 /* client-specific setup... */
2125 switch (mid) {
2126 case PVR2_CLIENT_ID_CX25840:
Mike Isely00e5f732009-03-07 00:17:11 -03002127 case PVR2_CLIENT_ID_SAA7115:
2128 hdw->decoder_client_id = mid;
2129 break;
2130 default: break;
2131 }
Mike Isely1ab5e742009-03-07 00:24:24 -03002132
2133 return 0;
Mike Iselye9c64a72009-03-06 23:42:20 -03002134}
2135
2136
2137static void pvr2_hdw_load_modules(struct pvr2_hdw *hdw)
2138{
2139 unsigned int idx;
2140 const struct pvr2_string_table *cm;
2141 const struct pvr2_device_client_table *ct;
Mike Isely1ab5e742009-03-07 00:24:24 -03002142 int okFl = !0;
Mike Iselye9c64a72009-03-06 23:42:20 -03002143
2144 cm = &hdw->hdw_desc->client_modules;
2145 for (idx = 0; idx < cm->cnt; idx++) {
2146 request_module(cm->lst[idx]);
2147 }
2148
2149 ct = &hdw->hdw_desc->client_table;
2150 for (idx = 0; idx < ct->cnt; idx++) {
Mike Iselybd14d4f2009-03-07 00:56:52 -03002151 if (pvr2_hdw_load_subdev(hdw, &ct->lst[idx]) < 0) okFl = 0;
Mike Iselye9c64a72009-03-06 23:42:20 -03002152 }
Mike Isely27108142009-10-12 00:21:20 -03002153 if (!okFl) {
2154 hdw->flag_modulefail = !0;
2155 pvr2_hdw_render_useless(hdw);
2156 }
Mike Iselye9c64a72009-03-06 23:42:20 -03002157}
2158
2159
Mike Iselyd8554972006-06-26 20:58:46 -03002160static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
2161{
2162 int ret;
2163 unsigned int idx;
2164 struct pvr2_ctrl *cptr;
2165 int reloadFl = 0;
Mike Isely989eb152007-11-26 01:53:12 -03002166 if (hdw->hdw_desc->fx2_firmware.cnt) {
Mike Isely1d643a32007-09-08 22:18:50 -03002167 if (!reloadFl) {
2168 reloadFl =
2169 (hdw->usb_intf->cur_altsetting->desc.bNumEndpoints
2170 == 0);
2171 if (reloadFl) {
2172 pvr2_trace(PVR2_TRACE_INIT,
2173 "USB endpoint config looks strange"
2174 "; possibly firmware needs to be"
2175 " loaded");
2176 }
2177 }
2178 if (!reloadFl) {
2179 reloadFl = !pvr2_hdw_check_firmware(hdw);
2180 if (reloadFl) {
2181 pvr2_trace(PVR2_TRACE_INIT,
2182 "Check for FX2 firmware failed"
2183 "; possibly firmware needs to be"
2184 " loaded");
2185 }
2186 }
Mike Iselyd8554972006-06-26 20:58:46 -03002187 if (reloadFl) {
Mike Isely1d643a32007-09-08 22:18:50 -03002188 if (pvr2_upload_firmware1(hdw) != 0) {
2189 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2190 "Failure uploading firmware1");
2191 }
2192 return;
Mike Iselyd8554972006-06-26 20:58:46 -03002193 }
2194 }
Mike Iselyd8554972006-06-26 20:58:46 -03002195 hdw->fw1_state = FW1_STATE_OK;
2196
Mike Iselyd8554972006-06-26 20:58:46 -03002197 if (!pvr2_hdw_dev_ok(hdw)) return;
2198
Mike Isely27764722009-03-07 01:57:25 -03002199 hdw->force_dirty = !0;
2200
Mike Isely989eb152007-11-26 01:53:12 -03002201 if (!hdw->hdw_desc->flag_no_powerup) {
Mike Isely1d643a32007-09-08 22:18:50 -03002202 pvr2_hdw_cmd_powerup(hdw);
2203 if (!pvr2_hdw_dev_ok(hdw)) return;
Mike Iselyd8554972006-06-26 20:58:46 -03002204 }
2205
Mike Isely31335b12008-07-25 19:35:31 -03002206 /* Take the IR chip out of reset, if appropriate */
Mike Isely27eab382009-04-06 01:51:38 -03002207 if (hdw->ir_scheme_active == PVR2_IR_SCHEME_ZILOG) {
Mike Isely31335b12008-07-25 19:35:31 -03002208 pvr2_issue_simple_cmd(hdw,
2209 FX2CMD_HCW_ZILOG_RESET |
2210 (1 << 8) |
2211 ((0) << 16));
2212 }
2213
Mike Iselyd8554972006-06-26 20:58:46 -03002214 // This step MUST happen after the earlier powerup step.
2215 pvr2_i2c_core_init(hdw);
2216 if (!pvr2_hdw_dev_ok(hdw)) return;
2217
Mike Iselye9c64a72009-03-06 23:42:20 -03002218 pvr2_hdw_load_modules(hdw);
Mike Isely1ab5e742009-03-07 00:24:24 -03002219 if (!pvr2_hdw_dev_ok(hdw)) return;
Mike Iselye9c64a72009-03-06 23:42:20 -03002220
Hans Verkuilcc26b072009-03-29 19:20:26 -03002221 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, load_fw);
Mike Isely5c6cb4e2009-03-07 01:59:34 -03002222
Mike Iselyc05c0462006-06-25 20:04:25 -03002223 for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002224 cptr = hdw->controls + idx;
2225 if (cptr->info->skip_init) continue;
2226 if (!cptr->info->set_value) continue;
2227 cptr->info->set_value(cptr,~0,cptr->info->default_value);
2228 }
2229
Mike Iselye17d7872009-06-20 14:45:52 -03002230 pvr2_hdw_cx25840_vbi_hack(hdw);
2231
Mike Isely1bde0282006-12-27 23:30:13 -03002232 /* Set up special default values for the television and radio
2233 frequencies here. It's not really important what these defaults
2234 are, but I set them to something usable in the Chicago area just
2235 to make driver testing a little easier. */
2236
Michael Krufky5a4f5da62008-05-11 16:37:50 -03002237 hdw->freqValTelevision = default_tv_freq;
2238 hdw->freqValRadio = default_radio_freq;
Mike Isely1bde0282006-12-27 23:30:13 -03002239
Mike Iselyd8554972006-06-26 20:58:46 -03002240 // Do not use pvr2_reset_ctl_endpoints() here. It is not
2241 // thread-safe against the normal pvr2_send_request() mechanism.
2242 // (We should make it thread safe).
2243
Mike Iselyaaf78842007-11-26 02:04:11 -03002244 if (hdw->hdw_desc->flag_has_hauppauge_rom) {
2245 ret = pvr2_hdw_get_eeprom_addr(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002246 if (!pvr2_hdw_dev_ok(hdw)) return;
Mike Iselyaaf78842007-11-26 02:04:11 -03002247 if (ret < 0) {
2248 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2249 "Unable to determine location of eeprom,"
2250 " skipping");
2251 } else {
2252 hdw->eeprom_addr = ret;
2253 pvr2_eeprom_analyze(hdw);
2254 if (!pvr2_hdw_dev_ok(hdw)) return;
2255 }
2256 } else {
2257 hdw->tuner_type = hdw->hdw_desc->default_tuner_type;
2258 hdw->tuner_updated = !0;
2259 hdw->std_mask_eeprom = V4L2_STD_ALL;
Mike Iselyd8554972006-06-26 20:58:46 -03002260 }
2261
Mike Isely13a88792009-01-14 04:22:56 -03002262 if (hdw->serial_number) {
2263 idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
2264 "sn-%lu", hdw->serial_number);
2265 } else if (hdw->unit_number >= 0) {
2266 idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
2267 "unit-%c",
2268 hdw->unit_number + 'a');
2269 } else {
2270 idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
2271 "unit-??");
2272 }
2273 hdw->identifier[idx] = 0;
2274
Mike Iselyd8554972006-06-26 20:58:46 -03002275 pvr2_hdw_setup_std(hdw);
2276
2277 if (!get_default_tuner_type(hdw)) {
2278 pvr2_trace(PVR2_TRACE_INIT,
2279 "pvr2_hdw_setup: Tuner type overridden to %d",
2280 hdw->tuner_type);
2281 }
2282
Mike Iselyd8554972006-06-26 20:58:46 -03002283
2284 if (!pvr2_hdw_dev_ok(hdw)) return;
2285
Mike Isely1df59f02008-04-21 03:50:39 -03002286 if (hdw->hdw_desc->signal_routing_scheme ==
2287 PVR2_ROUTING_SCHEME_GOTVIEW) {
2288 /* Ensure that GPIO 11 is set to output for GOTVIEW
2289 hardware. */
2290 pvr2_hdw_gpio_chg_dir(hdw,(1 << 11),~0);
2291 }
2292
Mike Isely681c7392007-11-26 01:48:52 -03002293 pvr2_hdw_commit_setup(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002294
2295 hdw->vid_stream = pvr2_stream_create();
2296 if (!pvr2_hdw_dev_ok(hdw)) return;
2297 pvr2_trace(PVR2_TRACE_INIT,
2298 "pvr2_hdw_setup: video stream is %p",hdw->vid_stream);
2299 if (hdw->vid_stream) {
2300 idx = get_default_error_tolerance(hdw);
2301 if (idx) {
2302 pvr2_trace(PVR2_TRACE_INIT,
2303 "pvr2_hdw_setup: video stream %p"
2304 " setting tolerance %u",
2305 hdw->vid_stream,idx);
2306 }
2307 pvr2_stream_setup(hdw->vid_stream,hdw->usb_dev,
2308 PVR2_VID_ENDPOINT,idx);
2309 }
2310
2311 if (!pvr2_hdw_dev_ok(hdw)) return;
2312
Mike Iselyd8554972006-06-26 20:58:46 -03002313 hdw->flag_init_ok = !0;
Mike Isely681c7392007-11-26 01:48:52 -03002314
2315 pvr2_hdw_state_sched(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002316}
2317
2318
Mike Isely681c7392007-11-26 01:48:52 -03002319/* Set up the structure and attempt to put the device into a usable state.
2320 This can be a time-consuming operation, which is why it is not done
2321 internally as part of the create() step. */
2322static void pvr2_hdw_setup(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002323{
2324 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_setup(hdw=%p) begin",hdw);
Mike Isely681c7392007-11-26 01:48:52 -03002325 do {
Mike Iselyd8554972006-06-26 20:58:46 -03002326 pvr2_hdw_setup_low(hdw);
2327 pvr2_trace(PVR2_TRACE_INIT,
2328 "pvr2_hdw_setup(hdw=%p) done, ok=%d init_ok=%d",
Mike Isely681c7392007-11-26 01:48:52 -03002329 hdw,pvr2_hdw_dev_ok(hdw),hdw->flag_init_ok);
Mike Iselyd8554972006-06-26 20:58:46 -03002330 if (pvr2_hdw_dev_ok(hdw)) {
Mike Isely681c7392007-11-26 01:48:52 -03002331 if (hdw->flag_init_ok) {
Mike Iselyd8554972006-06-26 20:58:46 -03002332 pvr2_trace(
2333 PVR2_TRACE_INFO,
2334 "Device initialization"
2335 " completed successfully.");
2336 break;
2337 }
2338 if (hdw->fw1_state == FW1_STATE_RELOAD) {
2339 pvr2_trace(
2340 PVR2_TRACE_INFO,
2341 "Device microcontroller firmware"
2342 " (re)loaded; it should now reset"
2343 " and reconnect.");
2344 break;
2345 }
2346 pvr2_trace(
2347 PVR2_TRACE_ERROR_LEGS,
2348 "Device initialization was not successful.");
2349 if (hdw->fw1_state == FW1_STATE_MISSING) {
2350 pvr2_trace(
2351 PVR2_TRACE_ERROR_LEGS,
2352 "Giving up since device"
2353 " microcontroller firmware"
2354 " appears to be missing.");
2355 break;
2356 }
2357 }
Mike Isely27108142009-10-12 00:21:20 -03002358 if (hdw->flag_modulefail) {
2359 pvr2_trace(
2360 PVR2_TRACE_ERROR_LEGS,
2361 "***WARNING*** pvrusb2 driver initialization"
2362 " failed due to the failure of one or more"
2363 " sub-device kernel modules.");
2364 pvr2_trace(
2365 PVR2_TRACE_ERROR_LEGS,
2366 "You need to resolve the failing condition"
2367 " before this driver can function. There"
2368 " should be some earlier messages giving more"
2369 " information about the problem.");
Mike Isely515ebf72009-10-12 00:27:38 -03002370 break;
Mike Isely27108142009-10-12 00:21:20 -03002371 }
Mike Iselyd8554972006-06-26 20:58:46 -03002372 if (procreload) {
2373 pvr2_trace(
2374 PVR2_TRACE_ERROR_LEGS,
2375 "Attempting pvrusb2 recovery by reloading"
2376 " primary firmware.");
2377 pvr2_trace(
2378 PVR2_TRACE_ERROR_LEGS,
2379 "If this works, device should disconnect"
2380 " and reconnect in a sane state.");
2381 hdw->fw1_state = FW1_STATE_UNKNOWN;
2382 pvr2_upload_firmware1(hdw);
2383 } else {
2384 pvr2_trace(
2385 PVR2_TRACE_ERROR_LEGS,
2386 "***WARNING*** pvrusb2 device hardware"
2387 " appears to be jammed"
2388 " and I can't clear it.");
2389 pvr2_trace(
2390 PVR2_TRACE_ERROR_LEGS,
2391 "You might need to power cycle"
2392 " the pvrusb2 device"
2393 " in order to recover.");
2394 }
Mike Isely681c7392007-11-26 01:48:52 -03002395 } while (0);
Mike Iselyd8554972006-06-26 20:58:46 -03002396 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_setup(hdw=%p) end",hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002397}
2398
2399
Mike Iselyc4a8828d2008-04-22 14:45:44 -03002400/* Perform second stage initialization. Set callback pointer first so that
2401 we can avoid a possible initialization race (if the kernel thread runs
2402 before the callback has been set). */
Mike Isely794b1602008-04-22 14:45:45 -03002403int pvr2_hdw_initialize(struct pvr2_hdw *hdw,
2404 void (*callback_func)(void *),
2405 void *callback_data)
Mike Iselyc4a8828d2008-04-22 14:45:44 -03002406{
2407 LOCK_TAKE(hdw->big_lock); do {
Mike Isely97f26ff2008-04-07 02:22:43 -03002408 if (hdw->flag_disconnected) {
2409 /* Handle a race here: If we're already
2410 disconnected by this point, then give up. If we
2411 get past this then we'll remain connected for
2412 the duration of initialization since the entire
2413 initialization sequence is now protected by the
2414 big_lock. */
2415 break;
2416 }
Mike Iselyc4a8828d2008-04-22 14:45:44 -03002417 hdw->state_data = callback_data;
2418 hdw->state_func = callback_func;
Mike Isely97f26ff2008-04-07 02:22:43 -03002419 pvr2_hdw_setup(hdw);
Mike Iselyc4a8828d2008-04-22 14:45:44 -03002420 } while (0); LOCK_GIVE(hdw->big_lock);
Mike Isely794b1602008-04-22 14:45:45 -03002421 return hdw->flag_init_ok;
Mike Iselyc4a8828d2008-04-22 14:45:44 -03002422}
2423
2424
2425/* Create, set up, and return a structure for interacting with the
2426 underlying hardware. */
Mike Iselyd8554972006-06-26 20:58:46 -03002427struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
2428 const struct usb_device_id *devid)
2429{
Mike Isely7fb20fa2008-04-22 14:45:37 -03002430 unsigned int idx,cnt1,cnt2,m;
Mike Iselyfe15f132008-08-30 18:11:40 -03002431 struct pvr2_hdw *hdw = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002432 int valid_std_mask;
2433 struct pvr2_ctrl *cptr;
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002434 struct usb_device *usb_dev;
Mike Isely989eb152007-11-26 01:53:12 -03002435 const struct pvr2_device_desc *hdw_desc;
Mike Iselyd8554972006-06-26 20:58:46 -03002436 __u8 ifnum;
Mike Iselyb30d2442006-06-25 20:05:01 -03002437 struct v4l2_queryctrl qctrl;
2438 struct pvr2_ctl_info *ciptr;
Mike Iselyd8554972006-06-26 20:58:46 -03002439
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002440 usb_dev = interface_to_usbdev(intf);
2441
Mike Iselyd130fa82007-12-08 17:20:06 -03002442 hdw_desc = (const struct pvr2_device_desc *)(devid->driver_info);
Mike Iselyd8554972006-06-26 20:58:46 -03002443
Mike Iselyfe15f132008-08-30 18:11:40 -03002444 if (hdw_desc == NULL) {
2445 pvr2_trace(PVR2_TRACE_INIT, "pvr2_hdw_create:"
2446 " No device description pointer,"
2447 " unable to continue.");
2448 pvr2_trace(PVR2_TRACE_INIT, "If you have a new device type,"
2449 " please contact Mike Isely <isely@pobox.com>"
2450 " to get it included in the driver\n");
2451 goto fail;
2452 }
2453
Mike Iselyca545f72007-01-20 00:37:11 -03002454 hdw = kzalloc(sizeof(*hdw),GFP_KERNEL);
Mike Iselyd8554972006-06-26 20:58:46 -03002455 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_create: hdw=%p, type \"%s\"",
Mike Isely989eb152007-11-26 01:53:12 -03002456 hdw,hdw_desc->description);
Mike Iselye67e3762009-10-12 00:28:19 -03002457 pvr2_trace(PVR2_TRACE_INFO, "Hardware description: %s",
Mike Isely00970be2009-10-12 00:23:37 -03002458 hdw_desc->description);
Mike Isely8fd04442010-05-15 00:13:35 -03002459 if (hdw_desc->flag_is_experimental) {
2460 pvr2_trace(PVR2_TRACE_INFO, "**********");
2461 pvr2_trace(PVR2_TRACE_INFO,
2462 "WARNING: Support for this device (%s) is"
2463 " experimental.", hdw_desc->description);
2464 pvr2_trace(PVR2_TRACE_INFO,
2465 "Important functionality might not be"
2466 " entirely working.");
2467 pvr2_trace(PVR2_TRACE_INFO,
2468 "Please consider contacting the driver author to"
2469 " help with further stabilization of the driver.");
2470 pvr2_trace(PVR2_TRACE_INFO, "**********");
2471 }
Mike Iselyd8554972006-06-26 20:58:46 -03002472 if (!hdw) goto fail;
Mike Isely681c7392007-11-26 01:48:52 -03002473
2474 init_timer(&hdw->quiescent_timer);
2475 hdw->quiescent_timer.data = (unsigned long)hdw;
2476 hdw->quiescent_timer.function = pvr2_hdw_quiescent_timeout;
2477
Mike Isely6e931372010-02-06 02:10:38 -03002478 init_timer(&hdw->decoder_stabilization_timer);
2479 hdw->decoder_stabilization_timer.data = (unsigned long)hdw;
2480 hdw->decoder_stabilization_timer.function =
2481 pvr2_hdw_decoder_stabilization_timeout;
2482
Mike Isely681c7392007-11-26 01:48:52 -03002483 init_timer(&hdw->encoder_wait_timer);
2484 hdw->encoder_wait_timer.data = (unsigned long)hdw;
2485 hdw->encoder_wait_timer.function = pvr2_hdw_encoder_wait_timeout;
2486
Mike Iselyd913d632008-04-06 04:04:35 -03002487 init_timer(&hdw->encoder_run_timer);
2488 hdw->encoder_run_timer.data = (unsigned long)hdw;
2489 hdw->encoder_run_timer.function = pvr2_hdw_encoder_run_timeout;
2490
Mike Isely681c7392007-11-26 01:48:52 -03002491 hdw->master_state = PVR2_STATE_DEAD;
2492
2493 init_waitqueue_head(&hdw->state_wait_data);
2494
Mike Isely18103c572007-01-20 00:09:47 -03002495 hdw->tuner_signal_stale = !0;
Mike Iselyb30d2442006-06-25 20:05:01 -03002496 cx2341x_fill_defaults(&hdw->enc_ctl_state);
Mike Iselyd8554972006-06-26 20:58:46 -03002497
Mike Isely7fb20fa2008-04-22 14:45:37 -03002498 /* Calculate which inputs are OK */
2499 m = 0;
2500 if (hdw_desc->flag_has_analogtuner) m |= 1 << PVR2_CVAL_INPUT_TV;
Mike Iselye8f5bac2008-04-22 14:45:40 -03002501 if (hdw_desc->digital_control_scheme != PVR2_DIGITAL_SCHEME_NONE) {
2502 m |= 1 << PVR2_CVAL_INPUT_DTV;
2503 }
Mike Isely7fb20fa2008-04-22 14:45:37 -03002504 if (hdw_desc->flag_has_svideo) m |= 1 << PVR2_CVAL_INPUT_SVIDEO;
2505 if (hdw_desc->flag_has_composite) m |= 1 << PVR2_CVAL_INPUT_COMPOSITE;
2506 if (hdw_desc->flag_has_fmradio) m |= 1 << PVR2_CVAL_INPUT_RADIO;
2507 hdw->input_avail_mask = m;
Mike Isely1cb03b72008-04-21 03:47:43 -03002508 hdw->input_allowed_mask = hdw->input_avail_mask;
Mike Isely7fb20fa2008-04-22 14:45:37 -03002509
Mike Isely62433e32008-04-22 14:45:40 -03002510 /* If not a hybrid device, pathway_state never changes. So
2511 initialize it here to what it should forever be. */
2512 if (!(hdw->input_avail_mask & (1 << PVR2_CVAL_INPUT_DTV))) {
2513 hdw->pathway_state = PVR2_PATHWAY_ANALOG;
2514 } else if (!(hdw->input_avail_mask & (1 << PVR2_CVAL_INPUT_TV))) {
2515 hdw->pathway_state = PVR2_PATHWAY_DIGITAL;
2516 }
2517
Mike Iselyc05c0462006-06-25 20:04:25 -03002518 hdw->control_cnt = CTRLDEF_COUNT;
Mike Iselyb30d2442006-06-25 20:05:01 -03002519 hdw->control_cnt += MPEGDEF_COUNT;
Mike Iselyca545f72007-01-20 00:37:11 -03002520 hdw->controls = kzalloc(sizeof(struct pvr2_ctrl) * hdw->control_cnt,
Mike Iselyd8554972006-06-26 20:58:46 -03002521 GFP_KERNEL);
2522 if (!hdw->controls) goto fail;
Mike Isely989eb152007-11-26 01:53:12 -03002523 hdw->hdw_desc = hdw_desc;
Mike Isely27eab382009-04-06 01:51:38 -03002524 hdw->ir_scheme_active = hdw->hdw_desc->ir_scheme;
Mike Iselyc05c0462006-06-25 20:04:25 -03002525 for (idx = 0; idx < hdw->control_cnt; idx++) {
2526 cptr = hdw->controls + idx;
2527 cptr->hdw = hdw;
2528 }
Mike Iselyd8554972006-06-26 20:58:46 -03002529 for (idx = 0; idx < 32; idx++) {
2530 hdw->std_mask_ptrs[idx] = hdw->std_mask_names[idx];
2531 }
Mike Iselyc05c0462006-06-25 20:04:25 -03002532 for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002533 cptr = hdw->controls + idx;
Mike Iselyd8554972006-06-26 20:58:46 -03002534 cptr->info = control_defs+idx;
2535 }
Mike Iselydbc40a02008-04-22 14:45:39 -03002536
2537 /* Ensure that default input choice is a valid one. */
2538 m = hdw->input_avail_mask;
2539 if (m) for (idx = 0; idx < (sizeof(m) << 3); idx++) {
2540 if (!((1 << idx) & m)) continue;
2541 hdw->input_val = idx;
2542 break;
2543 }
2544
Mike Iselyb30d2442006-06-25 20:05:01 -03002545 /* Define and configure additional controls from cx2341x module. */
Mike Iselyca545f72007-01-20 00:37:11 -03002546 hdw->mpeg_ctrl_info = kzalloc(
Mike Iselyb30d2442006-06-25 20:05:01 -03002547 sizeof(*(hdw->mpeg_ctrl_info)) * MPEGDEF_COUNT, GFP_KERNEL);
2548 if (!hdw->mpeg_ctrl_info) goto fail;
Mike Iselyb30d2442006-06-25 20:05:01 -03002549 for (idx = 0; idx < MPEGDEF_COUNT; idx++) {
2550 cptr = hdw->controls + idx + CTRLDEF_COUNT;
2551 ciptr = &(hdw->mpeg_ctrl_info[idx].info);
2552 ciptr->desc = hdw->mpeg_ctrl_info[idx].desc;
2553 ciptr->name = mpeg_ids[idx].strid;
2554 ciptr->v4l_id = mpeg_ids[idx].id;
2555 ciptr->skip_init = !0;
2556 ciptr->get_value = ctrl_cx2341x_get;
2557 ciptr->get_v4lflags = ctrl_cx2341x_getv4lflags;
2558 ciptr->is_dirty = ctrl_cx2341x_is_dirty;
2559 if (!idx) ciptr->clear_dirty = ctrl_cx2341x_clear_dirty;
2560 qctrl.id = ciptr->v4l_id;
2561 cx2341x_ctrl_query(&hdw->enc_ctl_state,&qctrl);
2562 if (!(qctrl.flags & V4L2_CTRL_FLAG_READ_ONLY)) {
2563 ciptr->set_value = ctrl_cx2341x_set;
2564 }
2565 strncpy(hdw->mpeg_ctrl_info[idx].desc,qctrl.name,
2566 PVR2_CTLD_INFO_DESC_SIZE);
2567 hdw->mpeg_ctrl_info[idx].desc[PVR2_CTLD_INFO_DESC_SIZE-1] = 0;
2568 ciptr->default_value = qctrl.default_value;
2569 switch (qctrl.type) {
2570 default:
2571 case V4L2_CTRL_TYPE_INTEGER:
2572 ciptr->type = pvr2_ctl_int;
2573 ciptr->def.type_int.min_value = qctrl.minimum;
2574 ciptr->def.type_int.max_value = qctrl.maximum;
2575 break;
2576 case V4L2_CTRL_TYPE_BOOLEAN:
2577 ciptr->type = pvr2_ctl_bool;
2578 break;
2579 case V4L2_CTRL_TYPE_MENU:
2580 ciptr->type = pvr2_ctl_enum;
2581 ciptr->def.type_enum.value_names =
Hans Verkuile0e31cd2008-06-22 12:03:28 -03002582 cx2341x_ctrl_get_menu(&hdw->enc_ctl_state,
2583 ciptr->v4l_id);
Mike Iselyb30d2442006-06-25 20:05:01 -03002584 for (cnt1 = 0;
2585 ciptr->def.type_enum.value_names[cnt1] != NULL;
2586 cnt1++) { }
2587 ciptr->def.type_enum.count = cnt1;
2588 break;
2589 }
2590 cptr->info = ciptr;
2591 }
Mike Iselyd8554972006-06-26 20:58:46 -03002592
2593 // Initialize video standard enum dynamic control
2594 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDENUM);
2595 if (cptr) {
2596 memcpy(&hdw->std_info_enum,cptr->info,
2597 sizeof(hdw->std_info_enum));
2598 cptr->info = &hdw->std_info_enum;
2599
2600 }
2601 // Initialize control data regarding video standard masks
2602 valid_std_mask = pvr2_std_get_usable();
2603 for (idx = 0; idx < 32; idx++) {
2604 if (!(valid_std_mask & (1 << idx))) continue;
2605 cnt1 = pvr2_std_id_to_str(
2606 hdw->std_mask_names[idx],
2607 sizeof(hdw->std_mask_names[idx])-1,
2608 1 << idx);
2609 hdw->std_mask_names[idx][cnt1] = 0;
2610 }
2611 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDAVAIL);
2612 if (cptr) {
2613 memcpy(&hdw->std_info_avail,cptr->info,
2614 sizeof(hdw->std_info_avail));
2615 cptr->info = &hdw->std_info_avail;
2616 hdw->std_info_avail.def.type_bitmask.bit_names =
2617 hdw->std_mask_ptrs;
2618 hdw->std_info_avail.def.type_bitmask.valid_bits =
2619 valid_std_mask;
2620 }
2621 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDCUR);
2622 if (cptr) {
2623 memcpy(&hdw->std_info_cur,cptr->info,
2624 sizeof(hdw->std_info_cur));
2625 cptr->info = &hdw->std_info_cur;
2626 hdw->std_info_cur.def.type_bitmask.bit_names =
2627 hdw->std_mask_ptrs;
2628 hdw->std_info_avail.def.type_bitmask.valid_bits =
2629 valid_std_mask;
2630 }
2631
Mike Isely432907f2008-08-31 21:02:20 -03002632 hdw->cropcap_stale = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03002633 hdw->eeprom_addr = -1;
2634 hdw->unit_number = -1;
Mike Isely80793842006-12-27 23:12:28 -03002635 hdw->v4l_minor_number_video = -1;
2636 hdw->v4l_minor_number_vbi = -1;
Mike Iselyfd5a75f2006-12-27 23:11:22 -03002637 hdw->v4l_minor_number_radio = -1;
Mike Iselyd8554972006-06-26 20:58:46 -03002638 hdw->ctl_write_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL);
2639 if (!hdw->ctl_write_buffer) goto fail;
2640 hdw->ctl_read_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL);
2641 if (!hdw->ctl_read_buffer) goto fail;
2642 hdw->ctl_write_urb = usb_alloc_urb(0,GFP_KERNEL);
2643 if (!hdw->ctl_write_urb) goto fail;
2644 hdw->ctl_read_urb = usb_alloc_urb(0,GFP_KERNEL);
2645 if (!hdw->ctl_read_urb) goto fail;
2646
Janne Grunau70ad6382009-04-01 08:46:50 -03002647 if (v4l2_device_register(&intf->dev, &hdw->v4l2_dev) != 0) {
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002648 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2649 "Error registering with v4l core, giving up");
2650 goto fail;
2651 }
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002652 mutex_lock(&pvr2_unit_mtx); do {
Mike Iselyd8554972006-06-26 20:58:46 -03002653 for (idx = 0; idx < PVR_NUM; idx++) {
2654 if (unit_pointers[idx]) continue;
2655 hdw->unit_number = idx;
2656 unit_pointers[idx] = hdw;
2657 break;
2658 }
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002659 } while (0); mutex_unlock(&pvr2_unit_mtx);
Mike Iselyd8554972006-06-26 20:58:46 -03002660
2661 cnt1 = 0;
2662 cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"pvrusb2");
2663 cnt1 += cnt2;
2664 if (hdw->unit_number >= 0) {
2665 cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"_%c",
2666 ('a' + hdw->unit_number));
2667 cnt1 += cnt2;
2668 }
2669 if (cnt1 >= sizeof(hdw->name)) cnt1 = sizeof(hdw->name)-1;
2670 hdw->name[cnt1] = 0;
2671
Mike Isely681c7392007-11-26 01:48:52 -03002672 hdw->workqueue = create_singlethread_workqueue(hdw->name);
2673 INIT_WORK(&hdw->workpoll,pvr2_hdw_worker_poll);
Mike Isely681c7392007-11-26 01:48:52 -03002674
Mike Iselyd8554972006-06-26 20:58:46 -03002675 pvr2_trace(PVR2_TRACE_INIT,"Driver unit number is %d, name is %s",
2676 hdw->unit_number,hdw->name);
2677
2678 hdw->tuner_type = -1;
2679 hdw->flag_ok = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03002680
2681 hdw->usb_intf = intf;
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002682 hdw->usb_dev = usb_dev;
Mike Iselyd8554972006-06-26 20:58:46 -03002683
Mike Isely87e34952009-01-23 01:20:24 -03002684 usb_make_path(hdw->usb_dev, hdw->bus_info, sizeof(hdw->bus_info));
Mike Isely31a18542007-04-08 01:11:47 -03002685
Mike Iselyd8554972006-06-26 20:58:46 -03002686 ifnum = hdw->usb_intf->cur_altsetting->desc.bInterfaceNumber;
2687 usb_set_interface(hdw->usb_dev,ifnum,0);
2688
2689 mutex_init(&hdw->ctl_lock_mutex);
2690 mutex_init(&hdw->big_lock_mutex);
2691
2692 return hdw;
2693 fail:
2694 if (hdw) {
Mike Isely681c7392007-11-26 01:48:52 -03002695 del_timer_sync(&hdw->quiescent_timer);
Mike Isely6e931372010-02-06 02:10:38 -03002696 del_timer_sync(&hdw->decoder_stabilization_timer);
Mike Iselyd913d632008-04-06 04:04:35 -03002697 del_timer_sync(&hdw->encoder_run_timer);
Mike Isely681c7392007-11-26 01:48:52 -03002698 del_timer_sync(&hdw->encoder_wait_timer);
2699 if (hdw->workqueue) {
2700 flush_workqueue(hdw->workqueue);
2701 destroy_workqueue(hdw->workqueue);
2702 hdw->workqueue = NULL;
2703 }
Mariusz Kozlowski5e55d2c2006-11-08 15:34:31 +01002704 usb_free_urb(hdw->ctl_read_urb);
2705 usb_free_urb(hdw->ctl_write_urb);
Mariusz Kozlowski22071a42007-01-07 10:33:39 -03002706 kfree(hdw->ctl_read_buffer);
2707 kfree(hdw->ctl_write_buffer);
2708 kfree(hdw->controls);
2709 kfree(hdw->mpeg_ctrl_info);
Mike Isely681c7392007-11-26 01:48:52 -03002710 kfree(hdw->std_defs);
2711 kfree(hdw->std_enum_names);
Mike Iselyd8554972006-06-26 20:58:46 -03002712 kfree(hdw);
2713 }
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002714 return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002715}
2716
2717
2718/* Remove _all_ associations between this driver and the underlying USB
2719 layer. */
Adrian Bunk07e337e2006-06-30 11:30:20 -03002720static void pvr2_hdw_remove_usb_stuff(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002721{
2722 if (hdw->flag_disconnected) return;
2723 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_remove_usb_stuff: hdw=%p",hdw);
2724 if (hdw->ctl_read_urb) {
2725 usb_kill_urb(hdw->ctl_read_urb);
2726 usb_free_urb(hdw->ctl_read_urb);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002727 hdw->ctl_read_urb = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002728 }
2729 if (hdw->ctl_write_urb) {
2730 usb_kill_urb(hdw->ctl_write_urb);
2731 usb_free_urb(hdw->ctl_write_urb);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002732 hdw->ctl_write_urb = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002733 }
2734 if (hdw->ctl_read_buffer) {
2735 kfree(hdw->ctl_read_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002736 hdw->ctl_read_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002737 }
2738 if (hdw->ctl_write_buffer) {
2739 kfree(hdw->ctl_write_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002740 hdw->ctl_write_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002741 }
Mike Iselyd8554972006-06-26 20:58:46 -03002742 hdw->flag_disconnected = !0;
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002743 /* If we don't do this, then there will be a dangling struct device
2744 reference to our disappearing device persisting inside the V4L
2745 core... */
Mike Iselydc070bc2009-03-25 00:30:45 -03002746 v4l2_device_disconnect(&hdw->v4l2_dev);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002747 hdw->usb_dev = NULL;
2748 hdw->usb_intf = NULL;
Mike Isely681c7392007-11-26 01:48:52 -03002749 pvr2_hdw_render_useless(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002750}
2751
2752
2753/* Destroy hardware interaction structure */
2754void pvr2_hdw_destroy(struct pvr2_hdw *hdw)
2755{
Mike Isely401c27c2007-09-08 22:11:46 -03002756 if (!hdw) return;
Mike Iselyd8554972006-06-26 20:58:46 -03002757 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_destroy: hdw=%p",hdw);
Mike Isely681c7392007-11-26 01:48:52 -03002758 if (hdw->workqueue) {
2759 flush_workqueue(hdw->workqueue);
2760 destroy_workqueue(hdw->workqueue);
2761 hdw->workqueue = NULL;
2762 }
Mike Isely8f591002008-04-22 14:45:45 -03002763 del_timer_sync(&hdw->quiescent_timer);
Mike Isely6e931372010-02-06 02:10:38 -03002764 del_timer_sync(&hdw->decoder_stabilization_timer);
Mike Iselyd913d632008-04-06 04:04:35 -03002765 del_timer_sync(&hdw->encoder_run_timer);
Mike Isely8f591002008-04-22 14:45:45 -03002766 del_timer_sync(&hdw->encoder_wait_timer);
Mike Iselyd8554972006-06-26 20:58:46 -03002767 if (hdw->fw_buffer) {
2768 kfree(hdw->fw_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002769 hdw->fw_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002770 }
2771 if (hdw->vid_stream) {
2772 pvr2_stream_destroy(hdw->vid_stream);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002773 hdw->vid_stream = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002774 }
Mike Iselyd8554972006-06-26 20:58:46 -03002775 pvr2_i2c_core_done(hdw);
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002776 v4l2_device_unregister(&hdw->v4l2_dev);
Mike Iselyd8554972006-06-26 20:58:46 -03002777 pvr2_hdw_remove_usb_stuff(hdw);
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002778 mutex_lock(&pvr2_unit_mtx); do {
Mike Iselyd8554972006-06-26 20:58:46 -03002779 if ((hdw->unit_number >= 0) &&
2780 (hdw->unit_number < PVR_NUM) &&
2781 (unit_pointers[hdw->unit_number] == hdw)) {
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002782 unit_pointers[hdw->unit_number] = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002783 }
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002784 } while (0); mutex_unlock(&pvr2_unit_mtx);
Mariusz Kozlowski22071a42007-01-07 10:33:39 -03002785 kfree(hdw->controls);
2786 kfree(hdw->mpeg_ctrl_info);
2787 kfree(hdw->std_defs);
2788 kfree(hdw->std_enum_names);
Mike Iselyd8554972006-06-26 20:58:46 -03002789 kfree(hdw);
2790}
2791
2792
Mike Iselyd8554972006-06-26 20:58:46 -03002793int pvr2_hdw_dev_ok(struct pvr2_hdw *hdw)
2794{
2795 return (hdw && hdw->flag_ok);
2796}
2797
2798
2799/* Called when hardware has been unplugged */
2800void pvr2_hdw_disconnect(struct pvr2_hdw *hdw)
2801{
2802 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_disconnect(hdw=%p)",hdw);
2803 LOCK_TAKE(hdw->big_lock);
2804 LOCK_TAKE(hdw->ctl_lock);
2805 pvr2_hdw_remove_usb_stuff(hdw);
2806 LOCK_GIVE(hdw->ctl_lock);
2807 LOCK_GIVE(hdw->big_lock);
2808}
2809
2810
2811// Attempt to autoselect an appropriate value for std_enum_cur given
2812// whatever is currently in std_mask_cur
Adrian Bunk07e337e2006-06-30 11:30:20 -03002813static void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002814{
2815 unsigned int idx;
2816 for (idx = 1; idx < hdw->std_enum_cnt; idx++) {
2817 if (hdw->std_defs[idx-1].id == hdw->std_mask_cur) {
2818 hdw->std_enum_cur = idx;
2819 return;
2820 }
2821 }
2822 hdw->std_enum_cur = 0;
2823}
2824
2825
2826// Calculate correct set of enumerated standards based on currently known
2827// set of available standards bits.
Adrian Bunk07e337e2006-06-30 11:30:20 -03002828static void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002829{
2830 struct v4l2_standard *newstd;
2831 unsigned int std_cnt;
2832 unsigned int idx;
2833
2834 newstd = pvr2_std_create_enum(&std_cnt,hdw->std_mask_avail);
2835
2836 if (hdw->std_defs) {
2837 kfree(hdw->std_defs);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002838 hdw->std_defs = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002839 }
2840 hdw->std_enum_cnt = 0;
2841 if (hdw->std_enum_names) {
2842 kfree(hdw->std_enum_names);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002843 hdw->std_enum_names = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002844 }
2845
2846 if (!std_cnt) {
2847 pvr2_trace(
2848 PVR2_TRACE_ERROR_LEGS,
2849 "WARNING: Failed to identify any viable standards");
2850 }
2851 hdw->std_enum_names = kmalloc(sizeof(char *)*(std_cnt+1),GFP_KERNEL);
2852 hdw->std_enum_names[0] = "none";
2853 for (idx = 0; idx < std_cnt; idx++) {
2854 hdw->std_enum_names[idx+1] =
2855 newstd[idx].name;
2856 }
2857 // Set up the dynamic control for this standard
2858 hdw->std_info_enum.def.type_enum.value_names = hdw->std_enum_names;
2859 hdw->std_info_enum.def.type_enum.count = std_cnt+1;
2860 hdw->std_defs = newstd;
2861 hdw->std_enum_cnt = std_cnt+1;
2862 hdw->std_enum_cur = 0;
2863 hdw->std_info_cur.def.type_bitmask.valid_bits = hdw->std_mask_avail;
2864}
2865
2866
2867int pvr2_hdw_get_stdenum_value(struct pvr2_hdw *hdw,
2868 struct v4l2_standard *std,
2869 unsigned int idx)
2870{
2871 int ret = -EINVAL;
2872 if (!idx) return ret;
2873 LOCK_TAKE(hdw->big_lock); do {
2874 if (idx >= hdw->std_enum_cnt) break;
2875 idx--;
2876 memcpy(std,hdw->std_defs+idx,sizeof(*std));
2877 ret = 0;
2878 } while (0); LOCK_GIVE(hdw->big_lock);
2879 return ret;
2880}
2881
2882
2883/* Get the number of defined controls */
2884unsigned int pvr2_hdw_get_ctrl_count(struct pvr2_hdw *hdw)
2885{
Mike Iselyc05c0462006-06-25 20:04:25 -03002886 return hdw->control_cnt;
Mike Iselyd8554972006-06-26 20:58:46 -03002887}
2888
2889
2890/* Retrieve a control handle given its index (0..count-1) */
2891struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_index(struct pvr2_hdw *hdw,
2892 unsigned int idx)
2893{
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002894 if (idx >= hdw->control_cnt) return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002895 return hdw->controls + idx;
2896}
2897
2898
2899/* Retrieve a control handle given its index (0..count-1) */
2900struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_id(struct pvr2_hdw *hdw,
2901 unsigned int ctl_id)
2902{
2903 struct pvr2_ctrl *cptr;
2904 unsigned int idx;
2905 int i;
2906
2907 /* This could be made a lot more efficient, but for now... */
Mike Iselyc05c0462006-06-25 20:04:25 -03002908 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002909 cptr = hdw->controls + idx;
2910 i = cptr->info->internal_id;
2911 if (i && (i == ctl_id)) return cptr;
2912 }
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002913 return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002914}
2915
2916
Mike Iselya761f432006-06-25 20:04:44 -03002917/* Given a V4L ID, retrieve the control structure associated with it. */
Mike Iselyd8554972006-06-26 20:58:46 -03002918struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *hdw,unsigned int ctl_id)
2919{
2920 struct pvr2_ctrl *cptr;
2921 unsigned int idx;
2922 int i;
2923
2924 /* This could be made a lot more efficient, but for now... */
Mike Iselyc05c0462006-06-25 20:04:25 -03002925 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002926 cptr = hdw->controls + idx;
2927 i = cptr->info->v4l_id;
2928 if (i && (i == ctl_id)) return cptr;
2929 }
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002930 return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002931}
2932
2933
Mike Iselya761f432006-06-25 20:04:44 -03002934/* Given a V4L ID for its immediate predecessor, retrieve the control
2935 structure associated with it. */
2936struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *hdw,
2937 unsigned int ctl_id)
2938{
2939 struct pvr2_ctrl *cptr,*cp2;
2940 unsigned int idx;
2941 int i;
2942
2943 /* This could be made a lot more efficient, but for now... */
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002944 cp2 = NULL;
Mike Iselya761f432006-06-25 20:04:44 -03002945 for (idx = 0; idx < hdw->control_cnt; idx++) {
2946 cptr = hdw->controls + idx;
2947 i = cptr->info->v4l_id;
2948 if (!i) continue;
2949 if (i <= ctl_id) continue;
2950 if (cp2 && (cp2->info->v4l_id < i)) continue;
2951 cp2 = cptr;
2952 }
2953 return cp2;
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002954 return NULL;
Mike Iselya761f432006-06-25 20:04:44 -03002955}
2956
2957
Mike Iselyd8554972006-06-26 20:58:46 -03002958static const char *get_ctrl_typename(enum pvr2_ctl_type tp)
2959{
2960 switch (tp) {
2961 case pvr2_ctl_int: return "integer";
2962 case pvr2_ctl_enum: return "enum";
Mike Isely33213962006-06-25 20:04:40 -03002963 case pvr2_ctl_bool: return "boolean";
Mike Iselyd8554972006-06-26 20:58:46 -03002964 case pvr2_ctl_bitmask: return "bitmask";
2965 }
2966 return "";
2967}
2968
2969
Mike Isely2641df32009-03-07 00:13:25 -03002970static void pvr2_subdev_set_control(struct pvr2_hdw *hdw, int id,
2971 const char *name, int val)
2972{
2973 struct v4l2_control ctrl;
2974 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 %s=%d", name, val);
2975 memset(&ctrl, 0, sizeof(ctrl));
2976 ctrl.id = id;
2977 ctrl.value = val;
2978 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, s_ctrl, &ctrl);
2979}
2980
2981#define PVR2_SUBDEV_SET_CONTROL(hdw, id, lab) \
Mike Isely27764722009-03-07 01:57:25 -03002982 if ((hdw)->lab##_dirty || (hdw)->force_dirty) { \
Mike Isely2641df32009-03-07 00:13:25 -03002983 pvr2_subdev_set_control(hdw, id, #lab, (hdw)->lab##_val); \
2984 }
2985
Mike Isely5ceaad12009-03-07 00:01:20 -03002986/* Execute whatever commands are required to update the state of all the
Mike Isely2641df32009-03-07 00:13:25 -03002987 sub-devices so that they match our current control values. */
Mike Isely5ceaad12009-03-07 00:01:20 -03002988static void pvr2_subdev_update(struct pvr2_hdw *hdw)
2989{
Mike Iselyedb9dcb2009-03-07 00:37:10 -03002990 struct v4l2_subdev *sd;
2991 unsigned int id;
2992 pvr2_subdev_update_func fp;
2993
Mike Isely75212a02009-03-07 01:48:42 -03002994 pvr2_trace(PVR2_TRACE_CHIPS, "subdev update...");
2995
Mike Isely27764722009-03-07 01:57:25 -03002996 if (hdw->tuner_updated || hdw->force_dirty) {
Mike Isely75212a02009-03-07 01:48:42 -03002997 struct tuner_setup setup;
2998 pvr2_trace(PVR2_TRACE_CHIPS, "subdev tuner set_type(%d)",
2999 hdw->tuner_type);
3000 if (((int)(hdw->tuner_type)) >= 0) {
Mike Iselyfcd62cf2009-04-01 01:55:26 -03003001 memset(&setup, 0, sizeof(setup));
Mike Isely75212a02009-03-07 01:48:42 -03003002 setup.addr = ADDR_UNSET;
3003 setup.type = hdw->tuner_type;
3004 setup.mode_mask = T_RADIO | T_ANALOG_TV;
3005 v4l2_device_call_all(&hdw->v4l2_dev, 0,
3006 tuner, s_type_addr, &setup);
3007 }
3008 }
3009
Mike Isely27764722009-03-07 01:57:25 -03003010 if (hdw->input_dirty || hdw->std_dirty || hdw->force_dirty) {
Mike Iselyb4818802009-03-07 01:46:17 -03003011 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_standard");
Mike Isely2641df32009-03-07 00:13:25 -03003012 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
3013 v4l2_device_call_all(&hdw->v4l2_dev, 0,
3014 tuner, s_radio);
3015 } else {
3016 v4l2_std_id vs;
3017 vs = hdw->std_mask_cur;
3018 v4l2_device_call_all(&hdw->v4l2_dev, 0,
Hans Verkuilf41737e2009-04-01 03:52:39 -03003019 core, s_std, vs);
Mike Iselya6862da2009-06-20 14:50:14 -03003020 pvr2_hdw_cx25840_vbi_hack(hdw);
Mike Isely2641df32009-03-07 00:13:25 -03003021 }
3022 hdw->tuner_signal_stale = !0;
3023 hdw->cropcap_stale = !0;
3024 }
3025
3026 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_BRIGHTNESS, brightness);
3027 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_CONTRAST, contrast);
3028 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_SATURATION, saturation);
3029 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_HUE, hue);
3030 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_MUTE, mute);
3031 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_VOLUME, volume);
3032 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_BALANCE, balance);
3033 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_BASS, bass);
3034 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_TREBLE, treble);
3035
Mike Isely27764722009-03-07 01:57:25 -03003036 if (hdw->input_dirty || hdw->audiomode_dirty || hdw->force_dirty) {
Mike Isely2641df32009-03-07 00:13:25 -03003037 struct v4l2_tuner vt;
3038 memset(&vt, 0, sizeof(vt));
3039 vt.audmode = hdw->audiomode_val;
3040 v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner, s_tuner, &vt);
3041 }
3042
Mike Isely27764722009-03-07 01:57:25 -03003043 if (hdw->freqDirty || hdw->force_dirty) {
Mike Isely2641df32009-03-07 00:13:25 -03003044 unsigned long fv;
3045 struct v4l2_frequency freq;
3046 fv = pvr2_hdw_get_cur_freq(hdw);
3047 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_freq(%lu)", fv);
3048 if (hdw->tuner_signal_stale) pvr2_hdw_status_poll(hdw);
3049 memset(&freq, 0, sizeof(freq));
3050 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
3051 /* ((fv * 1000) / 62500) */
3052 freq.frequency = (fv * 2) / 125;
3053 } else {
3054 freq.frequency = fv / 62500;
3055 }
3056 /* tuner-core currently doesn't seem to care about this, but
3057 let's set it anyway for completeness. */
3058 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
3059 freq.type = V4L2_TUNER_RADIO;
3060 } else {
3061 freq.type = V4L2_TUNER_ANALOG_TV;
3062 }
3063 freq.tuner = 0;
3064 v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner,
3065 s_frequency, &freq);
3066 }
3067
Mike Isely27764722009-03-07 01:57:25 -03003068 if (hdw->res_hor_dirty || hdw->res_ver_dirty || hdw->force_dirty) {
Hans Verkuilfa190ee2010-05-08 17:16:18 -03003069 struct v4l2_mbus_framefmt fmt;
Mike Isely2641df32009-03-07 00:13:25 -03003070 memset(&fmt, 0, sizeof(fmt));
Hans Verkuilfa190ee2010-05-08 17:16:18 -03003071 fmt.width = hdw->res_hor_val;
3072 fmt.height = hdw->res_ver_val;
3073 fmt.code = V4L2_MBUS_FMT_FIXED;
Mike Isely7dfdf1e2009-03-07 02:11:12 -03003074 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_size(%dx%d)",
Hans Verkuilfa190ee2010-05-08 17:16:18 -03003075 fmt.width, fmt.height);
3076 v4l2_device_call_all(&hdw->v4l2_dev, 0, video, s_mbus_fmt, &fmt);
Mike Isely2641df32009-03-07 00:13:25 -03003077 }
3078
Mike Isely27764722009-03-07 01:57:25 -03003079 if (hdw->srate_dirty || hdw->force_dirty) {
Mike Isely01c59df2009-03-07 00:48:09 -03003080 u32 val;
3081 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_audio %d",
3082 hdw->srate_val);
3083 switch (hdw->srate_val) {
3084 default:
3085 case V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000:
3086 val = 48000;
3087 break;
3088 case V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100:
3089 val = 44100;
3090 break;
3091 case V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000:
3092 val = 32000;
3093 break;
3094 }
3095 v4l2_device_call_all(&hdw->v4l2_dev, 0,
3096 audio, s_clock_freq, val);
3097 }
3098
Mike Isely2641df32009-03-07 00:13:25 -03003099 /* Unable to set crop parameters; there is apparently no equivalent
3100 for VIDIOC_S_CROP */
3101
Mike Iselyedb9dcb2009-03-07 00:37:10 -03003102 v4l2_device_for_each_subdev(sd, &hdw->v4l2_dev) {
3103 id = sd->grp_id;
3104 if (id >= ARRAY_SIZE(pvr2_module_update_functions)) continue;
3105 fp = pvr2_module_update_functions[id];
3106 if (!fp) continue;
3107 (*fp)(hdw, sd);
3108 }
Mike Isely2641df32009-03-07 00:13:25 -03003109
Mike Isely27764722009-03-07 01:57:25 -03003110 if (hdw->tuner_signal_stale || hdw->cropcap_stale) {
Mike Isely2641df32009-03-07 00:13:25 -03003111 pvr2_hdw_status_poll(hdw);
3112 }
Mike Isely5ceaad12009-03-07 00:01:20 -03003113}
3114
3115
Mike Isely681c7392007-11-26 01:48:52 -03003116/* Figure out if we need to commit control changes. If so, mark internal
3117 state flags to indicate this fact and return true. Otherwise do nothing
3118 else and return false. */
3119static int pvr2_hdw_commit_setup(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03003120{
Mike Iselyd8554972006-06-26 20:58:46 -03003121 unsigned int idx;
3122 struct pvr2_ctrl *cptr;
3123 int value;
Mike Isely27764722009-03-07 01:57:25 -03003124 int commit_flag = hdw->force_dirty;
Mike Iselyd8554972006-06-26 20:58:46 -03003125 char buf[100];
3126 unsigned int bcnt,ccnt;
3127
Mike Iselyc05c0462006-06-25 20:04:25 -03003128 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03003129 cptr = hdw->controls + idx;
Al Viro5fa12472008-03-29 03:07:38 +00003130 if (!cptr->info->is_dirty) continue;
Mike Iselyd8554972006-06-26 20:58:46 -03003131 if (!cptr->info->is_dirty(cptr)) continue;
Mike Iselyfe23a282007-01-20 00:10:55 -03003132 commit_flag = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03003133
Mike Iselyfe23a282007-01-20 00:10:55 -03003134 if (!(pvrusb2_debug & PVR2_TRACE_CTL)) continue;
Mike Iselyd8554972006-06-26 20:58:46 -03003135 bcnt = scnprintf(buf,sizeof(buf),"\"%s\" <-- ",
3136 cptr->info->name);
3137 value = 0;
3138 cptr->info->get_value(cptr,&value);
3139 pvr2_ctrl_value_to_sym_internal(cptr,~0,value,
3140 buf+bcnt,
3141 sizeof(buf)-bcnt,&ccnt);
3142 bcnt += ccnt;
3143 bcnt += scnprintf(buf+bcnt,sizeof(buf)-bcnt," <%s>",
3144 get_ctrl_typename(cptr->info->type));
3145 pvr2_trace(PVR2_TRACE_CTL,
3146 "/*--TRACE_COMMIT--*/ %.*s",
3147 bcnt,buf);
3148 }
3149
3150 if (!commit_flag) {
3151 /* Nothing has changed */
3152 return 0;
3153 }
3154
Mike Isely681c7392007-11-26 01:48:52 -03003155 hdw->state_pipeline_config = 0;
3156 trace_stbit("state_pipeline_config",hdw->state_pipeline_config);
3157 pvr2_hdw_state_sched(hdw);
3158
3159 return !0;
3160}
3161
3162
3163/* Perform all operations needed to commit all control changes. This must
3164 be performed in synchronization with the pipeline state and is thus
3165 expected to be called as part of the driver's worker thread. Return
3166 true if commit successful, otherwise return false to indicate that
3167 commit isn't possible at this time. */
3168static int pvr2_hdw_commit_execute(struct pvr2_hdw *hdw)
3169{
3170 unsigned int idx;
3171 struct pvr2_ctrl *cptr;
3172 int disruptive_change;
3173
Mike Isely9bf98322011-02-13 17:31:55 -03003174 if (hdw->input_dirty && hdw->state_pathway_ok &&
3175 (((hdw->input_val == PVR2_CVAL_INPUT_DTV) ?
3176 PVR2_PATHWAY_DIGITAL : PVR2_PATHWAY_ANALOG) !=
3177 hdw->pathway_state)) {
3178 /* Change of mode being asked for... */
3179 hdw->state_pathway_ok = 0;
3180 trace_stbit("state_pathway_ok", hdw->state_pathway_ok);
3181 }
3182 if (!hdw->state_pathway_ok) {
3183 /* Can't commit anything until pathway is ok. */
3184 return 0;
3185 }
3186
Mike Iselyab062fe2008-06-30 03:32:35 -03003187 /* Handle some required side effects when the video standard is
3188 changed.... */
Mike Iselyd8554972006-06-26 20:58:46 -03003189 if (hdw->std_dirty) {
Mike Iselyd8554972006-06-26 20:58:46 -03003190 int nvres;
Mike Isely00528d92008-06-30 03:35:52 -03003191 int gop_size;
Mike Iselyd8554972006-06-26 20:58:46 -03003192 if (hdw->std_mask_cur & V4L2_STD_525_60) {
3193 nvres = 480;
Mike Isely00528d92008-06-30 03:35:52 -03003194 gop_size = 15;
Mike Iselyd8554972006-06-26 20:58:46 -03003195 } else {
3196 nvres = 576;
Mike Isely00528d92008-06-30 03:35:52 -03003197 gop_size = 12;
Mike Iselyd8554972006-06-26 20:58:46 -03003198 }
Mike Isely00528d92008-06-30 03:35:52 -03003199 /* Rewrite the vertical resolution to be appropriate to the
3200 video standard that has been selected. */
Mike Iselyd8554972006-06-26 20:58:46 -03003201 if (nvres != hdw->res_ver_val) {
3202 hdw->res_ver_val = nvres;
3203 hdw->res_ver_dirty = !0;
3204 }
Mike Isely00528d92008-06-30 03:35:52 -03003205 /* Rewrite the GOP size to be appropriate to the video
3206 standard that has been selected. */
3207 if (gop_size != hdw->enc_ctl_state.video_gop_size) {
3208 struct v4l2_ext_controls cs;
3209 struct v4l2_ext_control c1;
3210 memset(&cs, 0, sizeof(cs));
3211 memset(&c1, 0, sizeof(c1));
3212 cs.controls = &c1;
3213 cs.count = 1;
3214 c1.id = V4L2_CID_MPEG_VIDEO_GOP_SIZE;
3215 c1.value = gop_size;
3216 cx2341x_ext_ctrls(&hdw->enc_ctl_state, 0, &cs,
3217 VIDIOC_S_EXT_CTRLS);
3218 }
Mike Iselyd8554972006-06-26 20:58:46 -03003219 }
3220
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03003221 /* The broadcast decoder can only scale down, so if
3222 * res_*_dirty && crop window < output format ==> enlarge crop.
3223 *
3224 * The mpeg encoder receives fields of res_hor_val dots and
3225 * res_ver_val halflines. Limits: hor<=720, ver<=576.
3226 */
3227 if (hdw->res_hor_dirty && hdw->cropw_val < hdw->res_hor_val) {
3228 hdw->cropw_val = hdw->res_hor_val;
3229 hdw->cropw_dirty = !0;
3230 } else if (hdw->cropw_dirty) {
3231 hdw->res_hor_dirty = !0; /* must rescale */
3232 hdw->res_hor_val = min(720, hdw->cropw_val);
3233 }
3234 if (hdw->res_ver_dirty && hdw->croph_val < hdw->res_ver_val) {
3235 hdw->croph_val = hdw->res_ver_val;
3236 hdw->croph_dirty = !0;
3237 } else if (hdw->croph_dirty) {
3238 int nvres = hdw->std_mask_cur & V4L2_STD_525_60 ? 480 : 576;
3239 hdw->res_ver_dirty = !0;
3240 hdw->res_ver_val = min(nvres, hdw->croph_val);
3241 }
3242
Mike Isely681c7392007-11-26 01:48:52 -03003243 /* If any of the below has changed, then we can't do the update
3244 while the pipeline is running. Pipeline must be paused first
3245 and decoder -> encoder connection be made quiescent before we
3246 can proceed. */
3247 disruptive_change =
3248 (hdw->std_dirty ||
3249 hdw->enc_unsafe_stale ||
3250 hdw->srate_dirty ||
3251 hdw->res_ver_dirty ||
3252 hdw->res_hor_dirty ||
Mike Isely755879c2008-08-31 20:50:59 -03003253 hdw->cropw_dirty ||
3254 hdw->croph_dirty ||
Mike Isely681c7392007-11-26 01:48:52 -03003255 hdw->input_dirty ||
3256 (hdw->active_stream_type != hdw->desired_stream_type));
3257 if (disruptive_change && !hdw->state_pipeline_idle) {
3258 /* Pipeline is not idle; we can't proceed. Arrange to
3259 cause pipeline to stop so that we can try this again
3260 later.... */
3261 hdw->state_pipeline_pause = !0;
3262 return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03003263 }
3264
Mike Iselyb30d2442006-06-25 20:05:01 -03003265 if (hdw->srate_dirty) {
3266 /* Write new sample rate into control structure since
3267 * the master copy is stale. We must track srate
3268 * separate from the mpeg control structure because
3269 * other logic also uses this value. */
3270 struct v4l2_ext_controls cs;
3271 struct v4l2_ext_control c1;
3272 memset(&cs,0,sizeof(cs));
3273 memset(&c1,0,sizeof(c1));
3274 cs.controls = &c1;
3275 cs.count = 1;
3276 c1.id = V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ;
3277 c1.value = hdw->srate_val;
Hans Verkuil01f1e442007-08-21 18:32:42 -03003278 cx2341x_ext_ctrls(&hdw->enc_ctl_state, 0, &cs,VIDIOC_S_EXT_CTRLS);
Mike Iselyb30d2442006-06-25 20:05:01 -03003279 }
Mike Iselyc05c0462006-06-25 20:04:25 -03003280
Mike Isely681c7392007-11-26 01:48:52 -03003281 if (hdw->active_stream_type != hdw->desired_stream_type) {
3282 /* Handle any side effects of stream config here */
3283 hdw->active_stream_type = hdw->desired_stream_type;
3284 }
3285
Mike Isely1df59f02008-04-21 03:50:39 -03003286 if (hdw->hdw_desc->signal_routing_scheme ==
3287 PVR2_ROUTING_SCHEME_GOTVIEW) {
3288 u32 b;
3289 /* Handle GOTVIEW audio switching */
3290 pvr2_hdw_gpio_get_out(hdw,&b);
3291 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
3292 /* Set GPIO 11 */
3293 pvr2_hdw_gpio_chg_out(hdw,(1 << 11),~0);
3294 } else {
3295 /* Clear GPIO 11 */
3296 pvr2_hdw_gpio_chg_out(hdw,(1 << 11),0);
3297 }
3298 }
3299
Mike Iselye68a6192009-03-07 01:45:10 -03003300 /* Check and update state for all sub-devices. */
3301 pvr2_subdev_update(hdw);
3302
Mike Isely75212a02009-03-07 01:48:42 -03003303 hdw->tuner_updated = 0;
Mike Isely27764722009-03-07 01:57:25 -03003304 hdw->force_dirty = 0;
Mike Isely5ceaad12009-03-07 00:01:20 -03003305 for (idx = 0; idx < hdw->control_cnt; idx++) {
3306 cptr = hdw->controls + idx;
3307 if (!cptr->info->clear_dirty) continue;
3308 cptr->info->clear_dirty(cptr);
3309 }
3310
Mike Isely62433e32008-04-22 14:45:40 -03003311 if ((hdw->pathway_state == PVR2_PATHWAY_ANALOG) &&
3312 hdw->state_encoder_run) {
3313 /* If encoder isn't running or it can't be touched, then
3314 this will get worked out later when we start the
3315 encoder. */
Mike Isely681c7392007-11-26 01:48:52 -03003316 if (pvr2_encoder_adjust(hdw) < 0) return !0;
3317 }
Mike Iselyd8554972006-06-26 20:58:46 -03003318
Mike Isely681c7392007-11-26 01:48:52 -03003319 hdw->state_pipeline_config = !0;
Mike Isely432907f2008-08-31 21:02:20 -03003320 /* Hardware state may have changed in a way to cause the cropping
3321 capabilities to have changed. So mark it stale, which will
3322 cause a later re-fetch. */
Mike Isely681c7392007-11-26 01:48:52 -03003323 trace_stbit("state_pipeline_config",hdw->state_pipeline_config);
3324 return !0;
Mike Iselyd8554972006-06-26 20:58:46 -03003325}
3326
3327
3328int pvr2_hdw_commit_ctl(struct pvr2_hdw *hdw)
3329{
Mike Isely681c7392007-11-26 01:48:52 -03003330 int fl;
3331 LOCK_TAKE(hdw->big_lock);
3332 fl = pvr2_hdw_commit_setup(hdw);
3333 LOCK_GIVE(hdw->big_lock);
3334 if (!fl) return 0;
3335 return pvr2_hdw_wait(hdw,0);
Mike Iselyd8554972006-06-26 20:58:46 -03003336}
3337
3338
Mike Isely681c7392007-11-26 01:48:52 -03003339static void pvr2_hdw_worker_poll(struct work_struct *work)
Mike Iselyd8554972006-06-26 20:58:46 -03003340{
Mike Isely681c7392007-11-26 01:48:52 -03003341 int fl = 0;
3342 struct pvr2_hdw *hdw = container_of(work,struct pvr2_hdw,workpoll);
Mike Iselyd8554972006-06-26 20:58:46 -03003343 LOCK_TAKE(hdw->big_lock); do {
Mike Isely681c7392007-11-26 01:48:52 -03003344 fl = pvr2_hdw_state_eval(hdw);
3345 } while (0); LOCK_GIVE(hdw->big_lock);
3346 if (fl && hdw->state_func) {
3347 hdw->state_func(hdw->state_data);
3348 }
3349}
3350
3351
Mike Isely681c7392007-11-26 01:48:52 -03003352static int pvr2_hdw_wait(struct pvr2_hdw *hdw,int state)
Mike Iselyd8554972006-06-26 20:58:46 -03003353{
Mike Isely681c7392007-11-26 01:48:52 -03003354 return wait_event_interruptible(
3355 hdw->state_wait_data,
3356 (hdw->state_stale == 0) &&
3357 (!state || (hdw->master_state != state)));
Mike Iselyd8554972006-06-26 20:58:46 -03003358}
3359
Mike Isely681c7392007-11-26 01:48:52 -03003360
Mike Iselyd8554972006-06-26 20:58:46 -03003361/* Return name for this driver instance */
3362const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw)
3363{
3364 return hdw->name;
3365}
3366
3367
Mike Isely78a47102007-11-26 01:58:20 -03003368const char *pvr2_hdw_get_desc(struct pvr2_hdw *hdw)
3369{
3370 return hdw->hdw_desc->description;
3371}
3372
3373
3374const char *pvr2_hdw_get_type(struct pvr2_hdw *hdw)
3375{
3376 return hdw->hdw_desc->shortname;
3377}
3378
3379
Mike Iselyd8554972006-06-26 20:58:46 -03003380int pvr2_hdw_is_hsm(struct pvr2_hdw *hdw)
3381{
3382 int result;
3383 LOCK_TAKE(hdw->ctl_lock); do {
Michael Krufky8d364362007-01-22 02:17:55 -03003384 hdw->cmd_buffer[0] = FX2CMD_GET_USB_SPEED;
Mike Iselyd8554972006-06-26 20:58:46 -03003385 result = pvr2_send_request(hdw,
3386 hdw->cmd_buffer,1,
3387 hdw->cmd_buffer,1);
3388 if (result < 0) break;
3389 result = (hdw->cmd_buffer[0] != 0);
3390 } while(0); LOCK_GIVE(hdw->ctl_lock);
3391 return result;
3392}
3393
3394
Mike Isely18103c572007-01-20 00:09:47 -03003395/* Execute poll of tuner status */
3396void pvr2_hdw_execute_tuner_poll(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03003397{
Mike Iselyd8554972006-06-26 20:58:46 -03003398 LOCK_TAKE(hdw->big_lock); do {
Mike Iselya51f5002009-03-06 23:30:37 -03003399 pvr2_hdw_status_poll(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003400 } while (0); LOCK_GIVE(hdw->big_lock);
Mike Isely18103c572007-01-20 00:09:47 -03003401}
3402
3403
Mike Isely432907f2008-08-31 21:02:20 -03003404static int pvr2_hdw_check_cropcap(struct pvr2_hdw *hdw)
3405{
3406 if (!hdw->cropcap_stale) {
Mike Isely432907f2008-08-31 21:02:20 -03003407 return 0;
3408 }
Mike Iselya51f5002009-03-06 23:30:37 -03003409 pvr2_hdw_status_poll(hdw);
Mike Isely432907f2008-08-31 21:02:20 -03003410 if (hdw->cropcap_stale) {
Mike Isely432907f2008-08-31 21:02:20 -03003411 return -EIO;
3412 }
3413 return 0;
3414}
3415
3416
3417/* Return information about cropping capabilities */
3418int pvr2_hdw_get_cropcap(struct pvr2_hdw *hdw, struct v4l2_cropcap *pp)
3419{
3420 int stat = 0;
3421 LOCK_TAKE(hdw->big_lock);
3422 stat = pvr2_hdw_check_cropcap(hdw);
3423 if (!stat) {
Mike Isely432907f2008-08-31 21:02:20 -03003424 memcpy(pp, &hdw->cropcap_info, sizeof(hdw->cropcap_info));
3425 }
3426 LOCK_GIVE(hdw->big_lock);
3427 return stat;
3428}
3429
3430
Mike Isely18103c572007-01-20 00:09:47 -03003431/* Return information about the tuner */
3432int pvr2_hdw_get_tuner_status(struct pvr2_hdw *hdw,struct v4l2_tuner *vtp)
3433{
3434 LOCK_TAKE(hdw->big_lock); do {
3435 if (hdw->tuner_signal_stale) {
Mike Iselya51f5002009-03-06 23:30:37 -03003436 pvr2_hdw_status_poll(hdw);
Mike Isely18103c572007-01-20 00:09:47 -03003437 }
3438 memcpy(vtp,&hdw->tuner_signal_info,sizeof(struct v4l2_tuner));
3439 } while (0); LOCK_GIVE(hdw->big_lock);
3440 return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03003441}
3442
3443
3444/* Get handle to video output stream */
3445struct pvr2_stream *pvr2_hdw_get_video_stream(struct pvr2_hdw *hp)
3446{
3447 return hp->vid_stream;
3448}
3449
3450
3451void pvr2_hdw_trigger_module_log(struct pvr2_hdw *hdw)
3452{
Mike Isely4f1a3e52006-06-25 20:04:31 -03003453 int nr = pvr2_hdw_get_unit_number(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003454 LOCK_TAKE(hdw->big_lock); do {
Mike Isely4f1a3e52006-06-25 20:04:31 -03003455 printk(KERN_INFO "pvrusb2: ================= START STATUS CARD #%d =================\n", nr);
Mike Iselyed3261a2009-03-07 00:02:33 -03003456 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, log_status);
Mike Iselyb30d2442006-06-25 20:05:01 -03003457 pvr2_trace(PVR2_TRACE_INFO,"cx2341x config:");
Hans Verkuil99eb44f2006-06-26 18:24:05 -03003458 cx2341x_log_status(&hdw->enc_ctl_state, "pvrusb2");
Mike Isely681c7392007-11-26 01:48:52 -03003459 pvr2_hdw_state_log_state(hdw);
Mike Isely4f1a3e52006-06-25 20:04:31 -03003460 printk(KERN_INFO "pvrusb2: ================== END STATUS CARD #%d ==================\n", nr);
Mike Iselyd8554972006-06-26 20:58:46 -03003461 } while (0); LOCK_GIVE(hdw->big_lock);
3462}
3463
Mike Isely4db666c2007-09-08 22:16:27 -03003464
3465/* Grab EEPROM contents, needed for direct method. */
3466#define EEPROM_SIZE 8192
3467#define trace_eeprom(...) pvr2_trace(PVR2_TRACE_EEPROM,__VA_ARGS__)
3468static u8 *pvr2_full_eeprom_fetch(struct pvr2_hdw *hdw)
3469{
3470 struct i2c_msg msg[2];
3471 u8 *eeprom;
3472 u8 iadd[2];
3473 u8 addr;
3474 u16 eepromSize;
3475 unsigned int offs;
3476 int ret;
3477 int mode16 = 0;
3478 unsigned pcnt,tcnt;
3479 eeprom = kmalloc(EEPROM_SIZE,GFP_KERNEL);
3480 if (!eeprom) {
3481 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3482 "Failed to allocate memory"
3483 " required to read eeprom");
3484 return NULL;
3485 }
3486
3487 trace_eeprom("Value for eeprom addr from controller was 0x%x",
3488 hdw->eeprom_addr);
3489 addr = hdw->eeprom_addr;
3490 /* Seems that if the high bit is set, then the *real* eeprom
3491 address is shifted right now bit position (noticed this in
3492 newer PVR USB2 hardware) */
3493 if (addr & 0x80) addr >>= 1;
3494
3495 /* FX2 documentation states that a 16bit-addressed eeprom is
3496 expected if the I2C address is an odd number (yeah, this is
3497 strange but it's what they do) */
3498 mode16 = (addr & 1);
3499 eepromSize = (mode16 ? EEPROM_SIZE : 256);
3500 trace_eeprom("Examining %d byte eeprom at location 0x%x"
3501 " using %d bit addressing",eepromSize,addr,
3502 mode16 ? 16 : 8);
3503
3504 msg[0].addr = addr;
3505 msg[0].flags = 0;
3506 msg[0].len = mode16 ? 2 : 1;
3507 msg[0].buf = iadd;
3508 msg[1].addr = addr;
3509 msg[1].flags = I2C_M_RD;
3510
3511 /* We have to do the actual eeprom data fetch ourselves, because
3512 (1) we're only fetching part of the eeprom, and (2) if we were
3513 getting the whole thing our I2C driver can't grab it in one
3514 pass - which is what tveeprom is otherwise going to attempt */
3515 memset(eeprom,0,EEPROM_SIZE);
3516 for (tcnt = 0; tcnt < EEPROM_SIZE; tcnt += pcnt) {
3517 pcnt = 16;
3518 if (pcnt + tcnt > EEPROM_SIZE) pcnt = EEPROM_SIZE-tcnt;
3519 offs = tcnt + (eepromSize - EEPROM_SIZE);
3520 if (mode16) {
3521 iadd[0] = offs >> 8;
3522 iadd[1] = offs;
3523 } else {
3524 iadd[0] = offs;
3525 }
3526 msg[1].len = pcnt;
3527 msg[1].buf = eeprom+tcnt;
3528 if ((ret = i2c_transfer(&hdw->i2c_adap,
3529 msg,ARRAY_SIZE(msg))) != 2) {
3530 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3531 "eeprom fetch set offs err=%d",ret);
3532 kfree(eeprom);
3533 return NULL;
3534 }
3535 }
3536 return eeprom;
3537}
3538
3539
3540void pvr2_hdw_cpufw_set_enabled(struct pvr2_hdw *hdw,
Mike Isely568efaa2009-11-25 02:52:06 -03003541 int mode,
Mike Isely4db666c2007-09-08 22:16:27 -03003542 int enable_flag)
Mike Iselyd8554972006-06-26 20:58:46 -03003543{
3544 int ret;
3545 u16 address;
3546 unsigned int pipe;
3547 LOCK_TAKE(hdw->big_lock); do {
Al Viro5fa12472008-03-29 03:07:38 +00003548 if ((hdw->fw_buffer == NULL) == !enable_flag) break;
Mike Iselyd8554972006-06-26 20:58:46 -03003549
3550 if (!enable_flag) {
3551 pvr2_trace(PVR2_TRACE_FIRMWARE,
3552 "Cleaning up after CPU firmware fetch");
3553 kfree(hdw->fw_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03003554 hdw->fw_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03003555 hdw->fw_size = 0;
Mike Isely4db666c2007-09-08 22:16:27 -03003556 if (hdw->fw_cpu_flag) {
3557 /* Now release the CPU. It will disconnect
3558 and reconnect later. */
3559 pvr2_hdw_cpureset_assert(hdw,0);
3560 }
Mike Iselyd8554972006-06-26 20:58:46 -03003561 break;
3562 }
3563
Mike Isely568efaa2009-11-25 02:52:06 -03003564 hdw->fw_cpu_flag = (mode != 2);
Mike Isely4db666c2007-09-08 22:16:27 -03003565 if (hdw->fw_cpu_flag) {
Mike Isely568efaa2009-11-25 02:52:06 -03003566 hdw->fw_size = (mode == 1) ? 0x4000 : 0x2000;
Mike Isely4db666c2007-09-08 22:16:27 -03003567 pvr2_trace(PVR2_TRACE_FIRMWARE,
Mike Isely568efaa2009-11-25 02:52:06 -03003568 "Preparing to suck out CPU firmware"
3569 " (size=%u)", hdw->fw_size);
Mike Isely4db666c2007-09-08 22:16:27 -03003570 hdw->fw_buffer = kzalloc(hdw->fw_size,GFP_KERNEL);
3571 if (!hdw->fw_buffer) {
3572 hdw->fw_size = 0;
3573 break;
3574 }
3575
3576 /* We have to hold the CPU during firmware upload. */
3577 pvr2_hdw_cpureset_assert(hdw,1);
3578
3579 /* download the firmware from address 0000-1fff in 2048
3580 (=0x800) bytes chunk. */
3581
3582 pvr2_trace(PVR2_TRACE_FIRMWARE,
3583 "Grabbing CPU firmware");
3584 pipe = usb_rcvctrlpipe(hdw->usb_dev, 0);
3585 for(address = 0; address < hdw->fw_size;
3586 address += 0x800) {
3587 ret = usb_control_msg(hdw->usb_dev,pipe,
3588 0xa0,0xc0,
3589 address,0,
3590 hdw->fw_buffer+address,
3591 0x800,HZ);
3592 if (ret < 0) break;
3593 }
3594
3595 pvr2_trace(PVR2_TRACE_FIRMWARE,
3596 "Done grabbing CPU firmware");
3597 } else {
3598 pvr2_trace(PVR2_TRACE_FIRMWARE,
3599 "Sucking down EEPROM contents");
3600 hdw->fw_buffer = pvr2_full_eeprom_fetch(hdw);
3601 if (!hdw->fw_buffer) {
3602 pvr2_trace(PVR2_TRACE_FIRMWARE,
3603 "EEPROM content suck failed.");
3604 break;
3605 }
3606 hdw->fw_size = EEPROM_SIZE;
3607 pvr2_trace(PVR2_TRACE_FIRMWARE,
3608 "Done sucking down EEPROM contents");
Mike Iselyd8554972006-06-26 20:58:46 -03003609 }
3610
Mike Iselyd8554972006-06-26 20:58:46 -03003611 } while (0); LOCK_GIVE(hdw->big_lock);
3612}
3613
3614
3615/* Return true if we're in a mode for retrieval CPU firmware */
3616int pvr2_hdw_cpufw_get_enabled(struct pvr2_hdw *hdw)
3617{
Al Viro5fa12472008-03-29 03:07:38 +00003618 return hdw->fw_buffer != NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03003619}
3620
3621
3622int pvr2_hdw_cpufw_get(struct pvr2_hdw *hdw,unsigned int offs,
3623 char *buf,unsigned int cnt)
3624{
3625 int ret = -EINVAL;
3626 LOCK_TAKE(hdw->big_lock); do {
3627 if (!buf) break;
3628 if (!cnt) break;
3629
3630 if (!hdw->fw_buffer) {
3631 ret = -EIO;
3632 break;
3633 }
3634
3635 if (offs >= hdw->fw_size) {
3636 pvr2_trace(PVR2_TRACE_FIRMWARE,
3637 "Read firmware data offs=%d EOF",
3638 offs);
3639 ret = 0;
3640 break;
3641 }
3642
3643 if (offs + cnt > hdw->fw_size) cnt = hdw->fw_size - offs;
3644
3645 memcpy(buf,hdw->fw_buffer+offs,cnt);
3646
3647 pvr2_trace(PVR2_TRACE_FIRMWARE,
3648 "Read firmware data offs=%d cnt=%d",
3649 offs,cnt);
3650 ret = cnt;
3651 } while (0); LOCK_GIVE(hdw->big_lock);
3652
3653 return ret;
3654}
3655
3656
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003657int pvr2_hdw_v4l_get_minor_number(struct pvr2_hdw *hdw,
Mike Isely80793842006-12-27 23:12:28 -03003658 enum pvr2_v4l_type index)
Mike Iselyd8554972006-06-26 20:58:46 -03003659{
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003660 switch (index) {
Mike Isely80793842006-12-27 23:12:28 -03003661 case pvr2_v4l_type_video: return hdw->v4l_minor_number_video;
3662 case pvr2_v4l_type_vbi: return hdw->v4l_minor_number_vbi;
3663 case pvr2_v4l_type_radio: return hdw->v4l_minor_number_radio;
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003664 default: return -1;
3665 }
Mike Iselyd8554972006-06-26 20:58:46 -03003666}
3667
3668
Pantelis Koukousoulas2fdf3d92006-12-27 23:07:58 -03003669/* Store a v4l minor device number */
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003670void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *hdw,
Mike Isely80793842006-12-27 23:12:28 -03003671 enum pvr2_v4l_type index,int v)
Mike Iselyd8554972006-06-26 20:58:46 -03003672{
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003673 switch (index) {
Mike Isely80793842006-12-27 23:12:28 -03003674 case pvr2_v4l_type_video: hdw->v4l_minor_number_video = v;
3675 case pvr2_v4l_type_vbi: hdw->v4l_minor_number_vbi = v;
3676 case pvr2_v4l_type_radio: hdw->v4l_minor_number_radio = v;
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003677 default: break;
3678 }
Mike Iselyd8554972006-06-26 20:58:46 -03003679}
3680
3681
David Howells7d12e782006-10-05 14:55:46 +01003682static void pvr2_ctl_write_complete(struct urb *urb)
Mike Iselyd8554972006-06-26 20:58:46 -03003683{
3684 struct pvr2_hdw *hdw = urb->context;
3685 hdw->ctl_write_pend_flag = 0;
3686 if (hdw->ctl_read_pend_flag) return;
3687 complete(&hdw->ctl_done);
3688}
3689
3690
David Howells7d12e782006-10-05 14:55:46 +01003691static void pvr2_ctl_read_complete(struct urb *urb)
Mike Iselyd8554972006-06-26 20:58:46 -03003692{
3693 struct pvr2_hdw *hdw = urb->context;
3694 hdw->ctl_read_pend_flag = 0;
3695 if (hdw->ctl_write_pend_flag) return;
3696 complete(&hdw->ctl_done);
3697}
3698
3699
3700static void pvr2_ctl_timeout(unsigned long data)
3701{
3702 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
3703 if (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
3704 hdw->ctl_timeout_flag = !0;
Mariusz Kozlowski5e55d2c2006-11-08 15:34:31 +01003705 if (hdw->ctl_write_pend_flag)
Mike Iselyd8554972006-06-26 20:58:46 -03003706 usb_unlink_urb(hdw->ctl_write_urb);
Mariusz Kozlowski5e55d2c2006-11-08 15:34:31 +01003707 if (hdw->ctl_read_pend_flag)
Mike Iselyd8554972006-06-26 20:58:46 -03003708 usb_unlink_urb(hdw->ctl_read_urb);
Mike Iselyd8554972006-06-26 20:58:46 -03003709 }
3710}
3711
3712
Mike Iselye61b6fc2006-07-18 22:42:18 -03003713/* Issue a command and get a response from the device. This extended
3714 version includes a probe flag (which if set means that device errors
3715 should not be logged or treated as fatal) and a timeout in jiffies.
3716 This can be used to non-lethally probe the health of endpoint 1. */
Adrian Bunk07e337e2006-06-30 11:30:20 -03003717static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
3718 unsigned int timeout,int probe_fl,
3719 void *write_data,unsigned int write_len,
3720 void *read_data,unsigned int read_len)
Mike Iselyd8554972006-06-26 20:58:46 -03003721{
3722 unsigned int idx;
3723 int status = 0;
3724 struct timer_list timer;
3725 if (!hdw->ctl_lock_held) {
3726 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3727 "Attempted to execute control transfer"
3728 " without lock!!");
3729 return -EDEADLK;
3730 }
Mike Isely681c7392007-11-26 01:48:52 -03003731 if (!hdw->flag_ok && !probe_fl) {
Mike Iselyd8554972006-06-26 20:58:46 -03003732 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3733 "Attempted to execute control transfer"
3734 " when device not ok");
3735 return -EIO;
3736 }
3737 if (!(hdw->ctl_read_urb && hdw->ctl_write_urb)) {
3738 if (!probe_fl) {
3739 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3740 "Attempted to execute control transfer"
3741 " when USB is disconnected");
3742 }
3743 return -ENOTTY;
3744 }
3745
3746 /* Ensure that we have sane parameters */
3747 if (!write_data) write_len = 0;
3748 if (!read_data) read_len = 0;
3749 if (write_len > PVR2_CTL_BUFFSIZE) {
3750 pvr2_trace(
3751 PVR2_TRACE_ERROR_LEGS,
3752 "Attempted to execute %d byte"
3753 " control-write transfer (limit=%d)",
3754 write_len,PVR2_CTL_BUFFSIZE);
3755 return -EINVAL;
3756 }
3757 if (read_len > PVR2_CTL_BUFFSIZE) {
3758 pvr2_trace(
3759 PVR2_TRACE_ERROR_LEGS,
3760 "Attempted to execute %d byte"
3761 " control-read transfer (limit=%d)",
3762 write_len,PVR2_CTL_BUFFSIZE);
3763 return -EINVAL;
3764 }
3765 if ((!write_len) && (!read_len)) {
3766 pvr2_trace(
3767 PVR2_TRACE_ERROR_LEGS,
3768 "Attempted to execute null control transfer?");
3769 return -EINVAL;
3770 }
3771
3772
3773 hdw->cmd_debug_state = 1;
3774 if (write_len) {
3775 hdw->cmd_debug_code = ((unsigned char *)write_data)[0];
3776 } else {
3777 hdw->cmd_debug_code = 0;
3778 }
3779 hdw->cmd_debug_write_len = write_len;
3780 hdw->cmd_debug_read_len = read_len;
3781
3782 /* Initialize common stuff */
3783 init_completion(&hdw->ctl_done);
3784 hdw->ctl_timeout_flag = 0;
3785 hdw->ctl_write_pend_flag = 0;
3786 hdw->ctl_read_pend_flag = 0;
3787 init_timer(&timer);
3788 timer.expires = jiffies + timeout;
3789 timer.data = (unsigned long)hdw;
3790 timer.function = pvr2_ctl_timeout;
3791
3792 if (write_len) {
3793 hdw->cmd_debug_state = 2;
3794 /* Transfer write data to internal buffer */
3795 for (idx = 0; idx < write_len; idx++) {
3796 hdw->ctl_write_buffer[idx] =
3797 ((unsigned char *)write_data)[idx];
3798 }
3799 /* Initiate a write request */
3800 usb_fill_bulk_urb(hdw->ctl_write_urb,
3801 hdw->usb_dev,
3802 usb_sndbulkpipe(hdw->usb_dev,
3803 PVR2_CTL_WRITE_ENDPOINT),
3804 hdw->ctl_write_buffer,
3805 write_len,
3806 pvr2_ctl_write_complete,
3807 hdw);
3808 hdw->ctl_write_urb->actual_length = 0;
3809 hdw->ctl_write_pend_flag = !0;
3810 status = usb_submit_urb(hdw->ctl_write_urb,GFP_KERNEL);
3811 if (status < 0) {
3812 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3813 "Failed to submit write-control"
3814 " URB status=%d",status);
3815 hdw->ctl_write_pend_flag = 0;
3816 goto done;
3817 }
3818 }
3819
3820 if (read_len) {
3821 hdw->cmd_debug_state = 3;
3822 memset(hdw->ctl_read_buffer,0x43,read_len);
3823 /* Initiate a read request */
3824 usb_fill_bulk_urb(hdw->ctl_read_urb,
3825 hdw->usb_dev,
3826 usb_rcvbulkpipe(hdw->usb_dev,
3827 PVR2_CTL_READ_ENDPOINT),
3828 hdw->ctl_read_buffer,
3829 read_len,
3830 pvr2_ctl_read_complete,
3831 hdw);
3832 hdw->ctl_read_urb->actual_length = 0;
3833 hdw->ctl_read_pend_flag = !0;
3834 status = usb_submit_urb(hdw->ctl_read_urb,GFP_KERNEL);
3835 if (status < 0) {
3836 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3837 "Failed to submit read-control"
3838 " URB status=%d",status);
3839 hdw->ctl_read_pend_flag = 0;
3840 goto done;
3841 }
3842 }
3843
3844 /* Start timer */
3845 add_timer(&timer);
3846
3847 /* Now wait for all I/O to complete */
3848 hdw->cmd_debug_state = 4;
3849 while (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
3850 wait_for_completion(&hdw->ctl_done);
3851 }
3852 hdw->cmd_debug_state = 5;
3853
3854 /* Stop timer */
3855 del_timer_sync(&timer);
3856
3857 hdw->cmd_debug_state = 6;
3858 status = 0;
3859
3860 if (hdw->ctl_timeout_flag) {
3861 status = -ETIMEDOUT;
3862 if (!probe_fl) {
3863 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3864 "Timed out control-write");
3865 }
3866 goto done;
3867 }
3868
3869 if (write_len) {
3870 /* Validate results of write request */
3871 if ((hdw->ctl_write_urb->status != 0) &&
3872 (hdw->ctl_write_urb->status != -ENOENT) &&
3873 (hdw->ctl_write_urb->status != -ESHUTDOWN) &&
3874 (hdw->ctl_write_urb->status != -ECONNRESET)) {
3875 /* USB subsystem is reporting some kind of failure
3876 on the write */
3877 status = hdw->ctl_write_urb->status;
3878 if (!probe_fl) {
3879 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3880 "control-write URB failure,"
3881 " status=%d",
3882 status);
3883 }
3884 goto done;
3885 }
3886 if (hdw->ctl_write_urb->actual_length < write_len) {
3887 /* Failed to write enough data */
3888 status = -EIO;
3889 if (!probe_fl) {
3890 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3891 "control-write URB short,"
3892 " expected=%d got=%d",
3893 write_len,
3894 hdw->ctl_write_urb->actual_length);
3895 }
3896 goto done;
3897 }
3898 }
3899 if (read_len) {
3900 /* Validate results of read request */
3901 if ((hdw->ctl_read_urb->status != 0) &&
3902 (hdw->ctl_read_urb->status != -ENOENT) &&
3903 (hdw->ctl_read_urb->status != -ESHUTDOWN) &&
3904 (hdw->ctl_read_urb->status != -ECONNRESET)) {
3905 /* USB subsystem is reporting some kind of failure
3906 on the read */
3907 status = hdw->ctl_read_urb->status;
3908 if (!probe_fl) {
3909 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3910 "control-read URB failure,"
3911 " status=%d",
3912 status);
3913 }
3914 goto done;
3915 }
3916 if (hdw->ctl_read_urb->actual_length < read_len) {
3917 /* Failed to read enough data */
3918 status = -EIO;
3919 if (!probe_fl) {
3920 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3921 "control-read URB short,"
3922 " expected=%d got=%d",
3923 read_len,
3924 hdw->ctl_read_urb->actual_length);
3925 }
3926 goto done;
3927 }
3928 /* Transfer retrieved data out from internal buffer */
3929 for (idx = 0; idx < read_len; idx++) {
3930 ((unsigned char *)read_data)[idx] =
3931 hdw->ctl_read_buffer[idx];
3932 }
3933 }
3934
3935 done:
3936
3937 hdw->cmd_debug_state = 0;
3938 if ((status < 0) && (!probe_fl)) {
Mike Isely681c7392007-11-26 01:48:52 -03003939 pvr2_hdw_render_useless(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003940 }
3941 return status;
3942}
3943
3944
3945int pvr2_send_request(struct pvr2_hdw *hdw,
3946 void *write_data,unsigned int write_len,
3947 void *read_data,unsigned int read_len)
3948{
3949 return pvr2_send_request_ex(hdw,HZ*4,0,
3950 write_data,write_len,
3951 read_data,read_len);
3952}
3953
Mike Isely1c9d10d2008-03-28 05:38:54 -03003954
3955static int pvr2_issue_simple_cmd(struct pvr2_hdw *hdw,u32 cmdcode)
3956{
3957 int ret;
3958 unsigned int cnt = 1;
3959 unsigned int args = 0;
3960 LOCK_TAKE(hdw->ctl_lock);
3961 hdw->cmd_buffer[0] = cmdcode & 0xffu;
3962 args = (cmdcode >> 8) & 0xffu;
3963 args = (args > 2) ? 2 : args;
3964 if (args) {
3965 cnt += args;
3966 hdw->cmd_buffer[1] = (cmdcode >> 16) & 0xffu;
3967 if (args > 1) {
3968 hdw->cmd_buffer[2] = (cmdcode >> 24) & 0xffu;
3969 }
3970 }
3971 if (pvrusb2_debug & PVR2_TRACE_INIT) {
3972 unsigned int idx;
3973 unsigned int ccnt,bcnt;
3974 char tbuf[50];
3975 cmdcode &= 0xffu;
3976 bcnt = 0;
3977 ccnt = scnprintf(tbuf+bcnt,
3978 sizeof(tbuf)-bcnt,
3979 "Sending FX2 command 0x%x",cmdcode);
3980 bcnt += ccnt;
3981 for (idx = 0; idx < ARRAY_SIZE(pvr2_fx2cmd_desc); idx++) {
3982 if (pvr2_fx2cmd_desc[idx].id == cmdcode) {
3983 ccnt = scnprintf(tbuf+bcnt,
3984 sizeof(tbuf)-bcnt,
3985 " \"%s\"",
3986 pvr2_fx2cmd_desc[idx].desc);
3987 bcnt += ccnt;
3988 break;
3989 }
3990 }
3991 if (args) {
3992 ccnt = scnprintf(tbuf+bcnt,
3993 sizeof(tbuf)-bcnt,
3994 " (%u",hdw->cmd_buffer[1]);
3995 bcnt += ccnt;
3996 if (args > 1) {
3997 ccnt = scnprintf(tbuf+bcnt,
3998 sizeof(tbuf)-bcnt,
3999 ",%u",hdw->cmd_buffer[2]);
4000 bcnt += ccnt;
4001 }
4002 ccnt = scnprintf(tbuf+bcnt,
4003 sizeof(tbuf)-bcnt,
4004 ")");
4005 bcnt += ccnt;
4006 }
4007 pvr2_trace(PVR2_TRACE_INIT,"%.*s",bcnt,tbuf);
4008 }
4009 ret = pvr2_send_request(hdw,hdw->cmd_buffer,cnt,NULL,0);
4010 LOCK_GIVE(hdw->ctl_lock);
4011 return ret;
4012}
4013
4014
Mike Iselyd8554972006-06-26 20:58:46 -03004015int pvr2_write_register(struct pvr2_hdw *hdw, u16 reg, u32 data)
4016{
4017 int ret;
4018
4019 LOCK_TAKE(hdw->ctl_lock);
4020
Michael Krufky8d364362007-01-22 02:17:55 -03004021 hdw->cmd_buffer[0] = FX2CMD_REG_WRITE; /* write register prefix */
Mike Iselyd8554972006-06-26 20:58:46 -03004022 PVR2_DECOMPOSE_LE(hdw->cmd_buffer,1,data);
4023 hdw->cmd_buffer[5] = 0;
4024 hdw->cmd_buffer[6] = (reg >> 8) & 0xff;
4025 hdw->cmd_buffer[7] = reg & 0xff;
4026
4027
4028 ret = pvr2_send_request(hdw, hdw->cmd_buffer, 8, hdw->cmd_buffer, 0);
4029
4030 LOCK_GIVE(hdw->ctl_lock);
4031
4032 return ret;
4033}
4034
4035
Adrian Bunk07e337e2006-06-30 11:30:20 -03004036static int pvr2_read_register(struct pvr2_hdw *hdw, u16 reg, u32 *data)
Mike Iselyd8554972006-06-26 20:58:46 -03004037{
4038 int ret = 0;
4039
4040 LOCK_TAKE(hdw->ctl_lock);
4041
Michael Krufky8d364362007-01-22 02:17:55 -03004042 hdw->cmd_buffer[0] = FX2CMD_REG_READ; /* read register prefix */
Mike Iselyd8554972006-06-26 20:58:46 -03004043 hdw->cmd_buffer[1] = 0;
4044 hdw->cmd_buffer[2] = 0;
4045 hdw->cmd_buffer[3] = 0;
4046 hdw->cmd_buffer[4] = 0;
4047 hdw->cmd_buffer[5] = 0;
4048 hdw->cmd_buffer[6] = (reg >> 8) & 0xff;
4049 hdw->cmd_buffer[7] = reg & 0xff;
4050
4051 ret |= pvr2_send_request(hdw, hdw->cmd_buffer, 8, hdw->cmd_buffer, 4);
4052 *data = PVR2_COMPOSE_LE(hdw->cmd_buffer,0);
4053
4054 LOCK_GIVE(hdw->ctl_lock);
4055
4056 return ret;
4057}
4058
4059
Mike Isely681c7392007-11-26 01:48:52 -03004060void pvr2_hdw_render_useless(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03004061{
4062 if (!hdw->flag_ok) return;
Mike Isely681c7392007-11-26 01:48:52 -03004063 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
4064 "Device being rendered inoperable");
Mike Iselyd8554972006-06-26 20:58:46 -03004065 if (hdw->vid_stream) {
Mike Iselya0fd1cb2006-06-30 11:35:28 -03004066 pvr2_stream_setup(hdw->vid_stream,NULL,0,0);
Mike Iselyd8554972006-06-26 20:58:46 -03004067 }
Mike Isely681c7392007-11-26 01:48:52 -03004068 hdw->flag_ok = 0;
4069 trace_stbit("flag_ok",hdw->flag_ok);
4070 pvr2_hdw_state_sched(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03004071}
4072
4073
4074void pvr2_hdw_device_reset(struct pvr2_hdw *hdw)
4075{
4076 int ret;
4077 pvr2_trace(PVR2_TRACE_INIT,"Performing a device reset...");
Mike Iselya0fd1cb2006-06-30 11:35:28 -03004078 ret = usb_lock_device_for_reset(hdw->usb_dev,NULL);
Alan Stern011b15d2008-11-04 11:29:27 -05004079 if (ret == 0) {
Mike Iselyd8554972006-06-26 20:58:46 -03004080 ret = usb_reset_device(hdw->usb_dev);
4081 usb_unlock_device(hdw->usb_dev);
4082 } else {
4083 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
4084 "Failed to lock USB device ret=%d",ret);
4085 }
4086 if (init_pause_msec) {
4087 pvr2_trace(PVR2_TRACE_INFO,
4088 "Waiting %u msec for hardware to settle",
4089 init_pause_msec);
4090 msleep(init_pause_msec);
4091 }
4092
4093}
4094
4095
4096void pvr2_hdw_cpureset_assert(struct pvr2_hdw *hdw,int val)
4097{
Mike Isely68618002010-05-15 00:09:47 -03004098 char *da;
Mike Iselyd8554972006-06-26 20:58:46 -03004099 unsigned int pipe;
4100 int ret;
4101
4102 if (!hdw->usb_dev) return;
4103
Mike Isely68618002010-05-15 00:09:47 -03004104 da = kmalloc(16, GFP_KERNEL);
4105
4106 if (da == NULL) {
4107 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
4108 "Unable to allocate memory to control CPU reset");
4109 return;
4110 }
4111
Mike Iselyd8554972006-06-26 20:58:46 -03004112 pvr2_trace(PVR2_TRACE_INIT,"cpureset_assert(%d)",val);
4113
4114 da[0] = val ? 0x01 : 0x00;
4115
4116 /* Write the CPUCS register on the 8051. The lsb of the register
4117 is the reset bit; a 1 asserts reset while a 0 clears it. */
4118 pipe = usb_sndctrlpipe(hdw->usb_dev, 0);
4119 ret = usb_control_msg(hdw->usb_dev,pipe,0xa0,0x40,0xe600,0,da,1,HZ);
4120 if (ret < 0) {
4121 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
4122 "cpureset_assert(%d) error=%d",val,ret);
4123 pvr2_hdw_render_useless(hdw);
4124 }
Mike Isely68618002010-05-15 00:09:47 -03004125
4126 kfree(da);
Mike Iselyd8554972006-06-26 20:58:46 -03004127}
4128
4129
4130int pvr2_hdw_cmd_deep_reset(struct pvr2_hdw *hdw)
4131{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004132 return pvr2_issue_simple_cmd(hdw,FX2CMD_DEEP_RESET);
Mike Iselyd8554972006-06-26 20:58:46 -03004133}
4134
4135
Michael Krufkye1edb192008-04-22 14:45:39 -03004136int pvr2_hdw_cmd_powerup(struct pvr2_hdw *hdw)
4137{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004138 return pvr2_issue_simple_cmd(hdw,FX2CMD_POWER_ON);
Michael Krufkye1edb192008-04-22 14:45:39 -03004139}
4140
Mike Isely1c9d10d2008-03-28 05:38:54 -03004141
Michael Krufkye1edb192008-04-22 14:45:39 -03004142int pvr2_hdw_cmd_powerdown(struct pvr2_hdw *hdw)
4143{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004144 return pvr2_issue_simple_cmd(hdw,FX2CMD_POWER_OFF);
Michael Krufkye1edb192008-04-22 14:45:39 -03004145}
4146
Mike Iselyd8554972006-06-26 20:58:46 -03004147
4148int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw)
4149{
Mike Iselyd8554972006-06-26 20:58:46 -03004150 pvr2_trace(PVR2_TRACE_INIT,
4151 "Requesting decoder reset");
Mike Iselyaf78e162009-03-07 00:21:30 -03004152 if (hdw->decoder_client_id) {
4153 v4l2_device_call_all(&hdw->v4l2_dev, hdw->decoder_client_id,
4154 core, reset, 0);
Mike Iselye17d7872009-06-20 14:45:52 -03004155 pvr2_hdw_cx25840_vbi_hack(hdw);
Mike Iselyaf78e162009-03-07 00:21:30 -03004156 return 0;
4157 }
4158 pvr2_trace(PVR2_TRACE_INIT,
4159 "Unable to reset decoder: nothing attached");
4160 return -ENOTTY;
Mike Iselyd8554972006-06-26 20:58:46 -03004161}
4162
4163
Mike Isely62433e32008-04-22 14:45:40 -03004164static int pvr2_hdw_cmd_hcw_demod_reset(struct pvr2_hdw *hdw, int onoff)
Mike Isely84147f32008-04-22 14:45:40 -03004165{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004166 hdw->flag_ok = !0;
4167 return pvr2_issue_simple_cmd(hdw,
4168 FX2CMD_HCW_DEMOD_RESETIN |
4169 (1 << 8) |
4170 ((onoff ? 1 : 0) << 16));
Mike Isely84147f32008-04-22 14:45:40 -03004171}
4172
Mike Isely84147f32008-04-22 14:45:40 -03004173
Mike Isely62433e32008-04-22 14:45:40 -03004174static int pvr2_hdw_cmd_onair_fe_power_ctrl(struct pvr2_hdw *hdw, int onoff)
Mike Isely84147f32008-04-22 14:45:40 -03004175{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004176 hdw->flag_ok = !0;
4177 return pvr2_issue_simple_cmd(hdw,(onoff ?
4178 FX2CMD_ONAIR_DTV_POWER_ON :
4179 FX2CMD_ONAIR_DTV_POWER_OFF));
Mike Isely84147f32008-04-22 14:45:40 -03004180}
4181
Mike Isely62433e32008-04-22 14:45:40 -03004182
4183static int pvr2_hdw_cmd_onair_digital_path_ctrl(struct pvr2_hdw *hdw,
4184 int onoff)
Mike Isely84147f32008-04-22 14:45:40 -03004185{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004186 return pvr2_issue_simple_cmd(hdw,(onoff ?
4187 FX2CMD_ONAIR_DTV_STREAMING_ON :
4188 FX2CMD_ONAIR_DTV_STREAMING_OFF));
Mike Isely84147f32008-04-22 14:45:40 -03004189}
4190
Mike Isely62433e32008-04-22 14:45:40 -03004191
4192static void pvr2_hdw_cmd_modeswitch(struct pvr2_hdw *hdw,int digitalFl)
4193{
4194 int cmode;
4195 /* Compare digital/analog desired setting with current setting. If
4196 they don't match, fix it... */
4197 cmode = (digitalFl ? PVR2_PATHWAY_DIGITAL : PVR2_PATHWAY_ANALOG);
4198 if (cmode == hdw->pathway_state) {
4199 /* They match; nothing to do */
4200 return;
4201 }
4202
4203 switch (hdw->hdw_desc->digital_control_scheme) {
4204 case PVR2_DIGITAL_SCHEME_HAUPPAUGE:
4205 pvr2_hdw_cmd_hcw_demod_reset(hdw,digitalFl);
4206 if (cmode == PVR2_PATHWAY_ANALOG) {
4207 /* If moving to analog mode, also force the decoder
4208 to reset. If no decoder is attached, then it's
4209 ok to ignore this because if/when the decoder
4210 attaches, it will reset itself at that time. */
4211 pvr2_hdw_cmd_decoder_reset(hdw);
4212 }
4213 break;
4214 case PVR2_DIGITAL_SCHEME_ONAIR:
4215 /* Supposedly we should always have the power on whether in
4216 digital or analog mode. But for now do what appears to
4217 work... */
Mike Iselybb0c2fe2008-03-28 05:41:19 -03004218 pvr2_hdw_cmd_onair_fe_power_ctrl(hdw,digitalFl);
Mike Isely62433e32008-04-22 14:45:40 -03004219 break;
4220 default: break;
4221 }
4222
Mike Isely1b9c18c2008-04-22 14:45:41 -03004223 pvr2_hdw_untrip_unlocked(hdw);
Mike Isely62433e32008-04-22 14:45:40 -03004224 hdw->pathway_state = cmode;
4225}
4226
4227
Adrian Bunke9b59f62008-05-10 04:35:24 -03004228static void pvr2_led_ctrl_hauppauge(struct pvr2_hdw *hdw, int onoff)
Mike Iselyc55a97d2008-04-22 14:45:41 -03004229{
4230 /* change some GPIO data
4231 *
4232 * note: bit d7 of dir appears to control the LED,
4233 * so we shut it off here.
4234 *
Mike Iselyc55a97d2008-04-22 14:45:41 -03004235 */
Mike Isely40381cb2008-04-22 14:45:42 -03004236 if (onoff) {
Mike Iselyc55a97d2008-04-22 14:45:41 -03004237 pvr2_hdw_gpio_chg_dir(hdw, 0xffffffff, 0x00000481);
Mike Isely40381cb2008-04-22 14:45:42 -03004238 } else {
Mike Iselyc55a97d2008-04-22 14:45:41 -03004239 pvr2_hdw_gpio_chg_dir(hdw, 0xffffffff, 0x00000401);
Mike Isely40381cb2008-04-22 14:45:42 -03004240 }
Mike Iselyc55a97d2008-04-22 14:45:41 -03004241 pvr2_hdw_gpio_chg_out(hdw, 0xffffffff, 0x00000000);
Mike Isely40381cb2008-04-22 14:45:42 -03004242}
Mike Iselyc55a97d2008-04-22 14:45:41 -03004243
Mike Isely40381cb2008-04-22 14:45:42 -03004244
4245typedef void (*led_method_func)(struct pvr2_hdw *,int);
4246
4247static led_method_func led_methods[] = {
4248 [PVR2_LED_SCHEME_HAUPPAUGE] = pvr2_led_ctrl_hauppauge,
4249};
4250
4251
4252/* Toggle LED */
4253static void pvr2_led_ctrl(struct pvr2_hdw *hdw,int onoff)
4254{
4255 unsigned int scheme_id;
4256 led_method_func fp;
4257
4258 if ((!onoff) == (!hdw->led_on)) return;
4259
4260 hdw->led_on = onoff != 0;
4261
4262 scheme_id = hdw->hdw_desc->led_scheme;
4263 if (scheme_id < ARRAY_SIZE(led_methods)) {
4264 fp = led_methods[scheme_id];
4265 } else {
4266 fp = NULL;
4267 }
4268
4269 if (fp) (*fp)(hdw,onoff);
Mike Iselyc55a97d2008-04-22 14:45:41 -03004270}
4271
4272
Mike Iselye61b6fc2006-07-18 22:42:18 -03004273/* Stop / start video stream transport */
Adrian Bunk07e337e2006-06-30 11:30:20 -03004274static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl)
Mike Iselyd8554972006-06-26 20:58:46 -03004275{
Mike Iselybb0c2fe2008-03-28 05:41:19 -03004276 int ret;
4277
4278 /* If we're in analog mode, then just issue the usual analog
4279 command. */
4280 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
4281 return pvr2_issue_simple_cmd(hdw,
4282 (runFl ?
4283 FX2CMD_STREAMING_ON :
4284 FX2CMD_STREAMING_OFF));
4285 /*Note: Not reached */
Mike Isely62433e32008-04-22 14:45:40 -03004286 }
Mike Iselybb0c2fe2008-03-28 05:41:19 -03004287
4288 if (hdw->pathway_state != PVR2_PATHWAY_DIGITAL) {
4289 /* Whoops, we don't know what mode we're in... */
4290 return -EINVAL;
4291 }
4292
4293 /* To get here we have to be in digital mode. The mechanism here
4294 is unfortunately different for different vendors. So we switch
4295 on the device's digital scheme attribute in order to figure out
4296 what to do. */
4297 switch (hdw->hdw_desc->digital_control_scheme) {
4298 case PVR2_DIGITAL_SCHEME_HAUPPAUGE:
4299 return pvr2_issue_simple_cmd(hdw,
4300 (runFl ?
4301 FX2CMD_HCW_DTV_STREAMING_ON :
4302 FX2CMD_HCW_DTV_STREAMING_OFF));
4303 case PVR2_DIGITAL_SCHEME_ONAIR:
4304 ret = pvr2_issue_simple_cmd(hdw,
4305 (runFl ?
4306 FX2CMD_STREAMING_ON :
4307 FX2CMD_STREAMING_OFF));
4308 if (ret) return ret;
4309 return pvr2_hdw_cmd_onair_digital_path_ctrl(hdw,runFl);
4310 default:
4311 return -EINVAL;
4312 }
Mike Iselyd8554972006-06-26 20:58:46 -03004313}
4314
4315
Mike Isely62433e32008-04-22 14:45:40 -03004316/* Evaluate whether or not state_pathway_ok can change */
4317static int state_eval_pathway_ok(struct pvr2_hdw *hdw)
4318{
4319 if (hdw->state_pathway_ok) {
4320 /* Nothing to do if pathway is already ok */
4321 return 0;
4322 }
4323 if (!hdw->state_pipeline_idle) {
4324 /* Not allowed to change anything if pipeline is not idle */
4325 return 0;
4326 }
4327 pvr2_hdw_cmd_modeswitch(hdw,hdw->input_val == PVR2_CVAL_INPUT_DTV);
4328 hdw->state_pathway_ok = !0;
Mike Iselye9db1ff2008-04-22 14:45:41 -03004329 trace_stbit("state_pathway_ok",hdw->state_pathway_ok);
Mike Isely62433e32008-04-22 14:45:40 -03004330 return !0;
4331}
4332
4333
Mike Isely681c7392007-11-26 01:48:52 -03004334/* Evaluate whether or not state_encoder_ok can change */
4335static int state_eval_encoder_ok(struct pvr2_hdw *hdw)
4336{
4337 if (hdw->state_encoder_ok) return 0;
4338 if (hdw->flag_tripped) return 0;
4339 if (hdw->state_encoder_run) return 0;
4340 if (hdw->state_encoder_config) return 0;
4341 if (hdw->state_decoder_run) return 0;
4342 if (hdw->state_usbstream_run) return 0;
Mike Isely72998b72008-04-03 04:51:19 -03004343 if (hdw->pathway_state == PVR2_PATHWAY_DIGITAL) {
4344 if (!hdw->hdw_desc->flag_digital_requires_cx23416) return 0;
4345 } else if (hdw->pathway_state != PVR2_PATHWAY_ANALOG) {
4346 return 0;
4347 }
4348
Mike Isely681c7392007-11-26 01:48:52 -03004349 if (pvr2_upload_firmware2(hdw) < 0) {
4350 hdw->flag_tripped = !0;
4351 trace_stbit("flag_tripped",hdw->flag_tripped);
4352 return !0;
4353 }
4354 hdw->state_encoder_ok = !0;
4355 trace_stbit("state_encoder_ok",hdw->state_encoder_ok);
4356 return !0;
4357}
4358
4359
4360/* Evaluate whether or not state_encoder_config can change */
4361static int state_eval_encoder_config(struct pvr2_hdw *hdw)
4362{
4363 if (hdw->state_encoder_config) {
4364 if (hdw->state_encoder_ok) {
4365 if (hdw->state_pipeline_req &&
4366 !hdw->state_pipeline_pause) return 0;
4367 }
4368 hdw->state_encoder_config = 0;
4369 hdw->state_encoder_waitok = 0;
4370 trace_stbit("state_encoder_waitok",hdw->state_encoder_waitok);
4371 /* paranoia - solve race if timer just completed */
4372 del_timer_sync(&hdw->encoder_wait_timer);
4373 } else {
Mike Isely62433e32008-04-22 14:45:40 -03004374 if (!hdw->state_pathway_ok ||
4375 (hdw->pathway_state != PVR2_PATHWAY_ANALOG) ||
4376 !hdw->state_encoder_ok ||
Mike Isely681c7392007-11-26 01:48:52 -03004377 !hdw->state_pipeline_idle ||
4378 hdw->state_pipeline_pause ||
4379 !hdw->state_pipeline_req ||
4380 !hdw->state_pipeline_config) {
4381 /* We must reset the enforced wait interval if
4382 anything has happened that might have disturbed
4383 the encoder. This should be a rare case. */
4384 if (timer_pending(&hdw->encoder_wait_timer)) {
4385 del_timer_sync(&hdw->encoder_wait_timer);
4386 }
4387 if (hdw->state_encoder_waitok) {
4388 /* Must clear the state - therefore we did
4389 something to a state bit and must also
4390 return true. */
4391 hdw->state_encoder_waitok = 0;
4392 trace_stbit("state_encoder_waitok",
4393 hdw->state_encoder_waitok);
4394 return !0;
4395 }
4396 return 0;
4397 }
4398 if (!hdw->state_encoder_waitok) {
4399 if (!timer_pending(&hdw->encoder_wait_timer)) {
4400 /* waitok flag wasn't set and timer isn't
4401 running. Check flag once more to avoid
4402 a race then start the timer. This is
4403 the point when we measure out a minimal
4404 quiet interval before doing something to
4405 the encoder. */
4406 if (!hdw->state_encoder_waitok) {
4407 hdw->encoder_wait_timer.expires =
Mike Isely83ce57a2008-05-26 05:51:57 -03004408 jiffies +
4409 (HZ * TIME_MSEC_ENCODER_WAIT
4410 / 1000);
Mike Isely681c7392007-11-26 01:48:52 -03004411 add_timer(&hdw->encoder_wait_timer);
4412 }
4413 }
4414 /* We can't continue until we know we have been
4415 quiet for the interval measured by this
4416 timer. */
4417 return 0;
4418 }
4419 pvr2_encoder_configure(hdw);
4420 if (hdw->state_encoder_ok) hdw->state_encoder_config = !0;
4421 }
4422 trace_stbit("state_encoder_config",hdw->state_encoder_config);
4423 return !0;
4424}
4425
4426
Mike Iselyd913d632008-04-06 04:04:35 -03004427/* Return true if the encoder should not be running. */
4428static int state_check_disable_encoder_run(struct pvr2_hdw *hdw)
4429{
4430 if (!hdw->state_encoder_ok) {
4431 /* Encoder isn't healthy at the moment, so stop it. */
4432 return !0;
4433 }
4434 if (!hdw->state_pathway_ok) {
4435 /* Mode is not understood at the moment (i.e. it wants to
4436 change), so encoder must be stopped. */
4437 return !0;
4438 }
4439
4440 switch (hdw->pathway_state) {
4441 case PVR2_PATHWAY_ANALOG:
4442 if (!hdw->state_decoder_run) {
4443 /* We're in analog mode and the decoder is not
4444 running; thus the encoder should be stopped as
4445 well. */
4446 return !0;
4447 }
4448 break;
4449 case PVR2_PATHWAY_DIGITAL:
4450 if (hdw->state_encoder_runok) {
4451 /* This is a funny case. We're in digital mode so
4452 really the encoder should be stopped. However
4453 if it really is running, only kill it after
4454 runok has been set. This gives a chance for the
4455 onair quirk to function (encoder must run
4456 briefly first, at least once, before onair
4457 digital streaming can work). */
4458 return !0;
4459 }
4460 break;
4461 default:
4462 /* Unknown mode; so encoder should be stopped. */
4463 return !0;
4464 }
4465
4466 /* If we get here, we haven't found a reason to stop the
4467 encoder. */
4468 return 0;
4469}
4470
4471
4472/* Return true if the encoder should be running. */
4473static int state_check_enable_encoder_run(struct pvr2_hdw *hdw)
4474{
4475 if (!hdw->state_encoder_ok) {
4476 /* Don't run the encoder if it isn't healthy... */
4477 return 0;
4478 }
4479 if (!hdw->state_pathway_ok) {
4480 /* Don't run the encoder if we don't (yet) know what mode
4481 we need to be in... */
4482 return 0;
4483 }
4484
4485 switch (hdw->pathway_state) {
4486 case PVR2_PATHWAY_ANALOG:
Mike Isely6e931372010-02-06 02:10:38 -03004487 if (hdw->state_decoder_run && hdw->state_decoder_ready) {
Mike Iselyd913d632008-04-06 04:04:35 -03004488 /* In analog mode, if the decoder is running, then
4489 run the encoder. */
4490 return !0;
4491 }
4492 break;
4493 case PVR2_PATHWAY_DIGITAL:
4494 if ((hdw->hdw_desc->digital_control_scheme ==
4495 PVR2_DIGITAL_SCHEME_ONAIR) &&
4496 !hdw->state_encoder_runok) {
4497 /* This is a quirk. OnAir hardware won't stream
4498 digital until the encoder has been run at least
4499 once, for a minimal period of time (empiricially
4500 measured to be 1/4 second). So if we're on
4501 OnAir hardware and the encoder has never been
4502 run at all, then start the encoder. Normal
4503 state machine logic in the driver will
4504 automatically handle the remaining bits. */
4505 return !0;
4506 }
4507 break;
4508 default:
4509 /* For completeness (unknown mode; encoder won't run ever) */
4510 break;
4511 }
4512 /* If we get here, then we haven't found any reason to run the
4513 encoder, so don't run it. */
4514 return 0;
4515}
4516
4517
Mike Isely681c7392007-11-26 01:48:52 -03004518/* Evaluate whether or not state_encoder_run can change */
4519static int state_eval_encoder_run(struct pvr2_hdw *hdw)
4520{
4521 if (hdw->state_encoder_run) {
Mike Iselyd913d632008-04-06 04:04:35 -03004522 if (!state_check_disable_encoder_run(hdw)) return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004523 if (hdw->state_encoder_ok) {
Mike Iselyd913d632008-04-06 04:04:35 -03004524 del_timer_sync(&hdw->encoder_run_timer);
Mike Isely681c7392007-11-26 01:48:52 -03004525 if (pvr2_encoder_stop(hdw) < 0) return !0;
4526 }
4527 hdw->state_encoder_run = 0;
4528 } else {
Mike Iselyd913d632008-04-06 04:04:35 -03004529 if (!state_check_enable_encoder_run(hdw)) return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004530 if (pvr2_encoder_start(hdw) < 0) return !0;
4531 hdw->state_encoder_run = !0;
Mike Iselyd913d632008-04-06 04:04:35 -03004532 if (!hdw->state_encoder_runok) {
4533 hdw->encoder_run_timer.expires =
Mike Isely83ce57a2008-05-26 05:51:57 -03004534 jiffies + (HZ * TIME_MSEC_ENCODER_OK / 1000);
Mike Iselyd913d632008-04-06 04:04:35 -03004535 add_timer(&hdw->encoder_run_timer);
4536 }
Mike Isely681c7392007-11-26 01:48:52 -03004537 }
4538 trace_stbit("state_encoder_run",hdw->state_encoder_run);
4539 return !0;
4540}
4541
4542
4543/* Timeout function for quiescent timer. */
4544static void pvr2_hdw_quiescent_timeout(unsigned long data)
4545{
4546 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4547 hdw->state_decoder_quiescent = !0;
4548 trace_stbit("state_decoder_quiescent",hdw->state_decoder_quiescent);
4549 hdw->state_stale = !0;
4550 queue_work(hdw->workqueue,&hdw->workpoll);
4551}
4552
4553
Mike Isely6e931372010-02-06 02:10:38 -03004554/* Timeout function for decoder stabilization timer. */
4555static void pvr2_hdw_decoder_stabilization_timeout(unsigned long data)
4556{
4557 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4558 hdw->state_decoder_ready = !0;
4559 trace_stbit("state_decoder_ready", hdw->state_decoder_ready);
4560 hdw->state_stale = !0;
4561 queue_work(hdw->workqueue, &hdw->workpoll);
4562}
4563
4564
Mike Isely681c7392007-11-26 01:48:52 -03004565/* Timeout function for encoder wait timer. */
4566static void pvr2_hdw_encoder_wait_timeout(unsigned long data)
4567{
4568 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4569 hdw->state_encoder_waitok = !0;
4570 trace_stbit("state_encoder_waitok",hdw->state_encoder_waitok);
4571 hdw->state_stale = !0;
4572 queue_work(hdw->workqueue,&hdw->workpoll);
4573}
4574
4575
Mike Iselyd913d632008-04-06 04:04:35 -03004576/* Timeout function for encoder run timer. */
4577static void pvr2_hdw_encoder_run_timeout(unsigned long data)
4578{
4579 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4580 if (!hdw->state_encoder_runok) {
4581 hdw->state_encoder_runok = !0;
4582 trace_stbit("state_encoder_runok",hdw->state_encoder_runok);
4583 hdw->state_stale = !0;
4584 queue_work(hdw->workqueue,&hdw->workpoll);
4585 }
4586}
4587
4588
Mike Isely681c7392007-11-26 01:48:52 -03004589/* Evaluate whether or not state_decoder_run can change */
4590static int state_eval_decoder_run(struct pvr2_hdw *hdw)
4591{
4592 if (hdw->state_decoder_run) {
4593 if (hdw->state_encoder_ok) {
4594 if (hdw->state_pipeline_req &&
Mike Isely62433e32008-04-22 14:45:40 -03004595 !hdw->state_pipeline_pause &&
4596 hdw->state_pathway_ok) return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004597 }
4598 if (!hdw->flag_decoder_missed) {
4599 pvr2_decoder_enable(hdw,0);
4600 }
4601 hdw->state_decoder_quiescent = 0;
4602 hdw->state_decoder_run = 0;
Mike Isely6e931372010-02-06 02:10:38 -03004603 /* paranoia - solve race if timer(s) just completed */
Mike Isely681c7392007-11-26 01:48:52 -03004604 del_timer_sync(&hdw->quiescent_timer);
Mike Isely6e931372010-02-06 02:10:38 -03004605 /* Kill the stabilization timer, in case we're killing the
4606 encoder before the previous stabilization interval has
4607 been properly timed. */
4608 del_timer_sync(&hdw->decoder_stabilization_timer);
4609 hdw->state_decoder_ready = 0;
Mike Isely681c7392007-11-26 01:48:52 -03004610 } else {
4611 if (!hdw->state_decoder_quiescent) {
4612 if (!timer_pending(&hdw->quiescent_timer)) {
4613 /* We don't do something about the
4614 quiescent timer until right here because
4615 we also want to catch cases where the
4616 decoder was already not running (like
4617 after initialization) as opposed to
4618 knowing that we had just stopped it.
4619 The second flag check is here to cover a
4620 race - the timer could have run and set
4621 this flag just after the previous check
4622 but before we did the pending check. */
4623 if (!hdw->state_decoder_quiescent) {
4624 hdw->quiescent_timer.expires =
Mike Isely83ce57a2008-05-26 05:51:57 -03004625 jiffies +
4626 (HZ * TIME_MSEC_DECODER_WAIT
4627 / 1000);
Mike Isely681c7392007-11-26 01:48:52 -03004628 add_timer(&hdw->quiescent_timer);
4629 }
4630 }
4631 /* Don't allow decoder to start again until it has
4632 been quiesced first. This little detail should
4633 hopefully further stabilize the encoder. */
4634 return 0;
4635 }
Mike Isely62433e32008-04-22 14:45:40 -03004636 if (!hdw->state_pathway_ok ||
4637 (hdw->pathway_state != PVR2_PATHWAY_ANALOG) ||
4638 !hdw->state_pipeline_req ||
Mike Isely681c7392007-11-26 01:48:52 -03004639 hdw->state_pipeline_pause ||
4640 !hdw->state_pipeline_config ||
4641 !hdw->state_encoder_config ||
4642 !hdw->state_encoder_ok) return 0;
4643 del_timer_sync(&hdw->quiescent_timer);
4644 if (hdw->flag_decoder_missed) return 0;
4645 if (pvr2_decoder_enable(hdw,!0) < 0) return 0;
4646 hdw->state_decoder_quiescent = 0;
Mike Isely6e931372010-02-06 02:10:38 -03004647 hdw->state_decoder_ready = 0;
Mike Isely681c7392007-11-26 01:48:52 -03004648 hdw->state_decoder_run = !0;
Mike Iselyfb640222010-02-06 02:17:17 -03004649 if (hdw->decoder_client_id == PVR2_CLIENT_ID_SAA7115) {
4650 hdw->decoder_stabilization_timer.expires =
4651 jiffies +
4652 (HZ * TIME_MSEC_DECODER_STABILIZATION_WAIT /
4653 1000);
4654 add_timer(&hdw->decoder_stabilization_timer);
4655 } else {
4656 hdw->state_decoder_ready = !0;
4657 }
Mike Isely681c7392007-11-26 01:48:52 -03004658 }
4659 trace_stbit("state_decoder_quiescent",hdw->state_decoder_quiescent);
4660 trace_stbit("state_decoder_run",hdw->state_decoder_run);
Mike Isely6e931372010-02-06 02:10:38 -03004661 trace_stbit("state_decoder_ready", hdw->state_decoder_ready);
Mike Isely681c7392007-11-26 01:48:52 -03004662 return !0;
4663}
4664
4665
4666/* Evaluate whether or not state_usbstream_run can change */
4667static int state_eval_usbstream_run(struct pvr2_hdw *hdw)
4668{
4669 if (hdw->state_usbstream_run) {
Mike Isely72998b72008-04-03 04:51:19 -03004670 int fl = !0;
Mike Isely62433e32008-04-22 14:45:40 -03004671 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
Mike Isely72998b72008-04-03 04:51:19 -03004672 fl = (hdw->state_encoder_ok &&
4673 hdw->state_encoder_run);
4674 } else if ((hdw->pathway_state == PVR2_PATHWAY_DIGITAL) &&
4675 (hdw->hdw_desc->flag_digital_requires_cx23416)) {
4676 fl = hdw->state_encoder_ok;
4677 }
4678 if (fl &&
4679 hdw->state_pipeline_req &&
4680 !hdw->state_pipeline_pause &&
4681 hdw->state_pathway_ok) {
4682 return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004683 }
4684 pvr2_hdw_cmd_usbstream(hdw,0);
4685 hdw->state_usbstream_run = 0;
4686 } else {
Mike Isely62433e32008-04-22 14:45:40 -03004687 if (!hdw->state_pipeline_req ||
4688 hdw->state_pipeline_pause ||
4689 !hdw->state_pathway_ok) return 0;
4690 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
4691 if (!hdw->state_encoder_ok ||
4692 !hdw->state_encoder_run) return 0;
Mike Isely72998b72008-04-03 04:51:19 -03004693 } else if ((hdw->pathway_state == PVR2_PATHWAY_DIGITAL) &&
4694 (hdw->hdw_desc->flag_digital_requires_cx23416)) {
4695 if (!hdw->state_encoder_ok) return 0;
Mike Iselyd913d632008-04-06 04:04:35 -03004696 if (hdw->state_encoder_run) return 0;
4697 if (hdw->hdw_desc->digital_control_scheme ==
4698 PVR2_DIGITAL_SCHEME_ONAIR) {
4699 /* OnAir digital receivers won't stream
4700 unless the analog encoder has run first.
4701 Why? I have no idea. But don't even
4702 try until we know the analog side is
4703 known to have run. */
4704 if (!hdw->state_encoder_runok) return 0;
4705 }
Mike Isely62433e32008-04-22 14:45:40 -03004706 }
Mike Isely681c7392007-11-26 01:48:52 -03004707 if (pvr2_hdw_cmd_usbstream(hdw,!0) < 0) return 0;
4708 hdw->state_usbstream_run = !0;
4709 }
4710 trace_stbit("state_usbstream_run",hdw->state_usbstream_run);
4711 return !0;
4712}
4713
4714
4715/* Attempt to configure pipeline, if needed */
4716static int state_eval_pipeline_config(struct pvr2_hdw *hdw)
4717{
4718 if (hdw->state_pipeline_config ||
4719 hdw->state_pipeline_pause) return 0;
4720 pvr2_hdw_commit_execute(hdw);
4721 return !0;
4722}
4723
4724
4725/* Update pipeline idle and pipeline pause tracking states based on other
4726 inputs. This must be called whenever the other relevant inputs have
4727 changed. */
4728static int state_update_pipeline_state(struct pvr2_hdw *hdw)
4729{
4730 unsigned int st;
4731 int updatedFl = 0;
4732 /* Update pipeline state */
4733 st = !(hdw->state_encoder_run ||
4734 hdw->state_decoder_run ||
4735 hdw->state_usbstream_run ||
4736 (!hdw->state_decoder_quiescent));
4737 if (!st != !hdw->state_pipeline_idle) {
4738 hdw->state_pipeline_idle = st;
4739 updatedFl = !0;
4740 }
4741 if (hdw->state_pipeline_idle && hdw->state_pipeline_pause) {
4742 hdw->state_pipeline_pause = 0;
4743 updatedFl = !0;
4744 }
4745 return updatedFl;
4746}
4747
4748
4749typedef int (*state_eval_func)(struct pvr2_hdw *);
4750
4751/* Set of functions to be run to evaluate various states in the driver. */
Tobias Klauserebff0332008-04-22 14:45:45 -03004752static const state_eval_func eval_funcs[] = {
Mike Isely62433e32008-04-22 14:45:40 -03004753 state_eval_pathway_ok,
Mike Isely681c7392007-11-26 01:48:52 -03004754 state_eval_pipeline_config,
4755 state_eval_encoder_ok,
4756 state_eval_encoder_config,
4757 state_eval_decoder_run,
4758 state_eval_encoder_run,
4759 state_eval_usbstream_run,
4760};
4761
4762
4763/* Process various states and return true if we did anything interesting. */
4764static int pvr2_hdw_state_update(struct pvr2_hdw *hdw)
4765{
4766 unsigned int i;
4767 int state_updated = 0;
4768 int check_flag;
4769
4770 if (!hdw->state_stale) return 0;
4771 if ((hdw->fw1_state != FW1_STATE_OK) ||
4772 !hdw->flag_ok) {
4773 hdw->state_stale = 0;
4774 return !0;
4775 }
4776 /* This loop is the heart of the entire driver. It keeps trying to
4777 evaluate various bits of driver state until nothing changes for
4778 one full iteration. Each "bit of state" tracks some global
4779 aspect of the driver, e.g. whether decoder should run, if
4780 pipeline is configured, usb streaming is on, etc. We separately
4781 evaluate each of those questions based on other driver state to
4782 arrive at the correct running configuration. */
4783 do {
4784 check_flag = 0;
4785 state_update_pipeline_state(hdw);
4786 /* Iterate over each bit of state */
4787 for (i = 0; (i<ARRAY_SIZE(eval_funcs)) && hdw->flag_ok; i++) {
4788 if ((*eval_funcs[i])(hdw)) {
4789 check_flag = !0;
4790 state_updated = !0;
4791 state_update_pipeline_state(hdw);
4792 }
4793 }
4794 } while (check_flag && hdw->flag_ok);
4795 hdw->state_stale = 0;
4796 trace_stbit("state_stale",hdw->state_stale);
4797 return state_updated;
4798}
4799
4800
Mike Isely1cb03b72008-04-21 03:47:43 -03004801static unsigned int print_input_mask(unsigned int msk,
4802 char *buf,unsigned int acnt)
4803{
4804 unsigned int idx,ccnt;
4805 unsigned int tcnt = 0;
4806 for (idx = 0; idx < ARRAY_SIZE(control_values_input); idx++) {
4807 if (!((1 << idx) & msk)) continue;
4808 ccnt = scnprintf(buf+tcnt,
4809 acnt-tcnt,
4810 "%s%s",
4811 (tcnt ? ", " : ""),
4812 control_values_input[idx]);
4813 tcnt += ccnt;
4814 }
4815 return tcnt;
4816}
4817
4818
Mike Isely62433e32008-04-22 14:45:40 -03004819static const char *pvr2_pathway_state_name(int id)
4820{
4821 switch (id) {
4822 case PVR2_PATHWAY_ANALOG: return "analog";
4823 case PVR2_PATHWAY_DIGITAL: return "digital";
4824 default: return "unknown";
4825 }
4826}
4827
4828
Mike Isely681c7392007-11-26 01:48:52 -03004829static unsigned int pvr2_hdw_report_unlocked(struct pvr2_hdw *hdw,int which,
4830 char *buf,unsigned int acnt)
4831{
4832 switch (which) {
4833 case 0:
4834 return scnprintf(
4835 buf,acnt,
Mike Iselye9db1ff2008-04-22 14:45:41 -03004836 "driver:%s%s%s%s%s <mode=%s>",
Mike Isely681c7392007-11-26 01:48:52 -03004837 (hdw->flag_ok ? " <ok>" : " <fail>"),
4838 (hdw->flag_init_ok ? " <init>" : " <uninitialized>"),
4839 (hdw->flag_disconnected ? " <disconnected>" :
4840 " <connected>"),
4841 (hdw->flag_tripped ? " <tripped>" : ""),
Mike Isely62433e32008-04-22 14:45:40 -03004842 (hdw->flag_decoder_missed ? " <no decoder>" : ""),
4843 pvr2_pathway_state_name(hdw->pathway_state));
4844
Mike Isely681c7392007-11-26 01:48:52 -03004845 case 1:
4846 return scnprintf(
4847 buf,acnt,
4848 "pipeline:%s%s%s%s",
4849 (hdw->state_pipeline_idle ? " <idle>" : ""),
4850 (hdw->state_pipeline_config ?
4851 " <configok>" : " <stale>"),
4852 (hdw->state_pipeline_req ? " <req>" : ""),
4853 (hdw->state_pipeline_pause ? " <pause>" : ""));
4854 case 2:
4855 return scnprintf(
4856 buf,acnt,
Mike Isely62433e32008-04-22 14:45:40 -03004857 "worker:%s%s%s%s%s%s%s",
Mike Isely681c7392007-11-26 01:48:52 -03004858 (hdw->state_decoder_run ?
Mike Isely6e931372010-02-06 02:10:38 -03004859 (hdw->state_decoder_ready ?
4860 "<decode:run>" : " <decode:start>") :
Mike Isely681c7392007-11-26 01:48:52 -03004861 (hdw->state_decoder_quiescent ?
4862 "" : " <decode:stop>")),
4863 (hdw->state_decoder_quiescent ?
4864 " <decode:quiescent>" : ""),
4865 (hdw->state_encoder_ok ?
4866 "" : " <encode:init>"),
4867 (hdw->state_encoder_run ?
Mike Iselyd913d632008-04-06 04:04:35 -03004868 (hdw->state_encoder_runok ?
4869 " <encode:run>" :
4870 " <encode:firstrun>") :
4871 (hdw->state_encoder_runok ?
4872 " <encode:stop>" :
4873 " <encode:virgin>")),
Mike Isely681c7392007-11-26 01:48:52 -03004874 (hdw->state_encoder_config ?
4875 " <encode:configok>" :
4876 (hdw->state_encoder_waitok ?
Mike Iselyb9a37d92008-03-28 05:31:40 -03004877 "" : " <encode:waitok>")),
Mike Isely681c7392007-11-26 01:48:52 -03004878 (hdw->state_usbstream_run ?
Mike Isely62433e32008-04-22 14:45:40 -03004879 " <usb:run>" : " <usb:stop>"),
4880 (hdw->state_pathway_ok ?
Mike Iselye9db1ff2008-04-22 14:45:41 -03004881 " <pathway:ok>" : ""));
Mike Isely681c7392007-11-26 01:48:52 -03004882 case 3:
4883 return scnprintf(
4884 buf,acnt,
4885 "state: %s",
4886 pvr2_get_state_name(hdw->master_state));
Mike Iselyad0992e2008-03-28 05:34:45 -03004887 case 4: {
Mike Isely1cb03b72008-04-21 03:47:43 -03004888 unsigned int tcnt = 0;
4889 unsigned int ccnt;
4890
4891 ccnt = scnprintf(buf,
4892 acnt,
4893 "Hardware supported inputs: ");
4894 tcnt += ccnt;
4895 tcnt += print_input_mask(hdw->input_avail_mask,
4896 buf+tcnt,
4897 acnt-tcnt);
4898 if (hdw->input_avail_mask != hdw->input_allowed_mask) {
4899 ccnt = scnprintf(buf+tcnt,
4900 acnt-tcnt,
4901 "; allowed inputs: ");
4902 tcnt += ccnt;
4903 tcnt += print_input_mask(hdw->input_allowed_mask,
4904 buf+tcnt,
4905 acnt-tcnt);
4906 }
4907 return tcnt;
4908 }
4909 case 5: {
Mike Iselyad0992e2008-03-28 05:34:45 -03004910 struct pvr2_stream_stats stats;
4911 if (!hdw->vid_stream) break;
4912 pvr2_stream_get_stats(hdw->vid_stream,
4913 &stats,
4914 0);
4915 return scnprintf(
4916 buf,acnt,
4917 "Bytes streamed=%u"
4918 " URBs: queued=%u idle=%u ready=%u"
4919 " processed=%u failed=%u",
4920 stats.bytes_processed,
4921 stats.buffers_in_queue,
4922 stats.buffers_in_idle,
4923 stats.buffers_in_ready,
4924 stats.buffers_processed,
4925 stats.buffers_failed);
4926 }
Mike Isely27eab382009-04-06 01:51:38 -03004927 case 6: {
4928 unsigned int id = hdw->ir_scheme_active;
4929 return scnprintf(buf, acnt, "ir scheme: id=%d %s", id,
4930 (id >= ARRAY_SIZE(ir_scheme_names) ?
4931 "?" : ir_scheme_names[id]));
4932 }
Mike Isely681c7392007-11-26 01:48:52 -03004933 default: break;
4934 }
4935 return 0;
4936}
4937
4938
Mike Isely2eb563b2009-03-08 18:25:46 -03004939/* Generate report containing info about attached sub-devices and attached
4940 i2c clients, including an indication of which attached i2c clients are
4941 actually sub-devices. */
4942static unsigned int pvr2_hdw_report_clients(struct pvr2_hdw *hdw,
4943 char *buf, unsigned int acnt)
4944{
4945 struct v4l2_subdev *sd;
4946 unsigned int tcnt = 0;
4947 unsigned int ccnt;
4948 struct i2c_client *client;
Mike Isely2eb563b2009-03-08 18:25:46 -03004949 const char *p;
4950 unsigned int id;
4951
Jean Delvarefa7ce76422009-05-02 00:22:27 -03004952 ccnt = scnprintf(buf, acnt, "Associated v4l2-subdev drivers and I2C clients:\n");
Mike Isely2eb563b2009-03-08 18:25:46 -03004953 tcnt += ccnt;
4954 v4l2_device_for_each_subdev(sd, &hdw->v4l2_dev) {
4955 id = sd->grp_id;
4956 p = NULL;
4957 if (id < ARRAY_SIZE(module_names)) p = module_names[id];
4958 if (p) {
Jean Delvarefa7ce76422009-05-02 00:22:27 -03004959 ccnt = scnprintf(buf + tcnt, acnt - tcnt, " %s:", p);
Mike Isely2eb563b2009-03-08 18:25:46 -03004960 tcnt += ccnt;
4961 } else {
4962 ccnt = scnprintf(buf + tcnt, acnt - tcnt,
Jean Delvarefa7ce76422009-05-02 00:22:27 -03004963 " (unknown id=%u):", id);
4964 tcnt += ccnt;
4965 }
4966 client = v4l2_get_subdevdata(sd);
4967 if (client) {
4968 ccnt = scnprintf(buf + tcnt, acnt - tcnt,
4969 " %s @ %02x\n", client->name,
4970 client->addr);
4971 tcnt += ccnt;
4972 } else {
4973 ccnt = scnprintf(buf + tcnt, acnt - tcnt,
4974 " no i2c client\n");
Mike Isely2eb563b2009-03-08 18:25:46 -03004975 tcnt += ccnt;
4976 }
4977 }
Mike Isely2eb563b2009-03-08 18:25:46 -03004978 return tcnt;
4979}
4980
4981
Mike Isely681c7392007-11-26 01:48:52 -03004982unsigned int pvr2_hdw_state_report(struct pvr2_hdw *hdw,
4983 char *buf,unsigned int acnt)
4984{
4985 unsigned int bcnt,ccnt,idx;
4986 bcnt = 0;
4987 LOCK_TAKE(hdw->big_lock);
4988 for (idx = 0; ; idx++) {
4989 ccnt = pvr2_hdw_report_unlocked(hdw,idx,buf,acnt);
4990 if (!ccnt) break;
4991 bcnt += ccnt; acnt -= ccnt; buf += ccnt;
4992 if (!acnt) break;
4993 buf[0] = '\n'; ccnt = 1;
4994 bcnt += ccnt; acnt -= ccnt; buf += ccnt;
4995 }
Mike Isely2eb563b2009-03-08 18:25:46 -03004996 ccnt = pvr2_hdw_report_clients(hdw, buf, acnt);
4997 bcnt += ccnt; acnt -= ccnt; buf += ccnt;
Mike Isely681c7392007-11-26 01:48:52 -03004998 LOCK_GIVE(hdw->big_lock);
4999 return bcnt;
5000}
5001
5002
5003static void pvr2_hdw_state_log_state(struct pvr2_hdw *hdw)
5004{
Mike Isely2eb563b2009-03-08 18:25:46 -03005005 char buf[256];
5006 unsigned int idx, ccnt;
5007 unsigned int lcnt, ucnt;
Mike Isely681c7392007-11-26 01:48:52 -03005008
5009 for (idx = 0; ; idx++) {
5010 ccnt = pvr2_hdw_report_unlocked(hdw,idx,buf,sizeof(buf));
5011 if (!ccnt) break;
5012 printk(KERN_INFO "%s %.*s\n",hdw->name,ccnt,buf);
5013 }
Mike Isely2eb563b2009-03-08 18:25:46 -03005014 ccnt = pvr2_hdw_report_clients(hdw, buf, sizeof(buf));
5015 ucnt = 0;
5016 while (ucnt < ccnt) {
5017 lcnt = 0;
5018 while ((lcnt + ucnt < ccnt) && (buf[lcnt + ucnt] != '\n')) {
5019 lcnt++;
5020 }
5021 printk(KERN_INFO "%s %.*s\n", hdw->name, lcnt, buf + ucnt);
5022 ucnt += lcnt + 1;
5023 }
Mike Isely681c7392007-11-26 01:48:52 -03005024}
5025
5026
5027/* Evaluate and update the driver's current state, taking various actions
5028 as appropriate for the update. */
5029static int pvr2_hdw_state_eval(struct pvr2_hdw *hdw)
5030{
5031 unsigned int st;
5032 int state_updated = 0;
5033 int callback_flag = 0;
Mike Isely1b9c18c2008-04-22 14:45:41 -03005034 int analog_mode;
Mike Isely681c7392007-11-26 01:48:52 -03005035
5036 pvr2_trace(PVR2_TRACE_STBITS,
5037 "Drive state check START");
5038 if (pvrusb2_debug & PVR2_TRACE_STBITS) {
5039 pvr2_hdw_state_log_state(hdw);
5040 }
5041
5042 /* Process all state and get back over disposition */
5043 state_updated = pvr2_hdw_state_update(hdw);
5044
Mike Isely1b9c18c2008-04-22 14:45:41 -03005045 analog_mode = (hdw->pathway_state != PVR2_PATHWAY_DIGITAL);
5046
Mike Isely681c7392007-11-26 01:48:52 -03005047 /* Update master state based upon all other states. */
5048 if (!hdw->flag_ok) {
5049 st = PVR2_STATE_DEAD;
5050 } else if (hdw->fw1_state != FW1_STATE_OK) {
5051 st = PVR2_STATE_COLD;
Mike Isely72998b72008-04-03 04:51:19 -03005052 } else if ((analog_mode ||
5053 hdw->hdw_desc->flag_digital_requires_cx23416) &&
5054 !hdw->state_encoder_ok) {
Mike Isely681c7392007-11-26 01:48:52 -03005055 st = PVR2_STATE_WARM;
Mike Isely1b9c18c2008-04-22 14:45:41 -03005056 } else if (hdw->flag_tripped ||
5057 (analog_mode && hdw->flag_decoder_missed)) {
Mike Isely681c7392007-11-26 01:48:52 -03005058 st = PVR2_STATE_ERROR;
Mike Isely62433e32008-04-22 14:45:40 -03005059 } else if (hdw->state_usbstream_run &&
Mike Isely1b9c18c2008-04-22 14:45:41 -03005060 (!analog_mode ||
Mike Isely62433e32008-04-22 14:45:40 -03005061 (hdw->state_encoder_run && hdw->state_decoder_run))) {
Mike Isely681c7392007-11-26 01:48:52 -03005062 st = PVR2_STATE_RUN;
5063 } else {
5064 st = PVR2_STATE_READY;
5065 }
5066 if (hdw->master_state != st) {
5067 pvr2_trace(PVR2_TRACE_STATE,
5068 "Device state change from %s to %s",
5069 pvr2_get_state_name(hdw->master_state),
5070 pvr2_get_state_name(st));
Mike Isely40381cb2008-04-22 14:45:42 -03005071 pvr2_led_ctrl(hdw,st == PVR2_STATE_RUN);
Mike Isely681c7392007-11-26 01:48:52 -03005072 hdw->master_state = st;
5073 state_updated = !0;
5074 callback_flag = !0;
5075 }
5076 if (state_updated) {
5077 /* Trigger anyone waiting on any state changes here. */
5078 wake_up(&hdw->state_wait_data);
5079 }
5080
5081 if (pvrusb2_debug & PVR2_TRACE_STBITS) {
5082 pvr2_hdw_state_log_state(hdw);
5083 }
5084 pvr2_trace(PVR2_TRACE_STBITS,
5085 "Drive state check DONE callback=%d",callback_flag);
5086
5087 return callback_flag;
5088}
5089
5090
5091/* Cause kernel thread to check / update driver state */
5092static void pvr2_hdw_state_sched(struct pvr2_hdw *hdw)
5093{
5094 if (hdw->state_stale) return;
5095 hdw->state_stale = !0;
5096 trace_stbit("state_stale",hdw->state_stale);
5097 queue_work(hdw->workqueue,&hdw->workpoll);
5098}
5099
5100
Mike Iselyd8554972006-06-26 20:58:46 -03005101int pvr2_hdw_gpio_get_dir(struct pvr2_hdw *hdw,u32 *dp)
5102{
5103 return pvr2_read_register(hdw,PVR2_GPIO_DIR,dp);
5104}
5105
5106
5107int pvr2_hdw_gpio_get_out(struct pvr2_hdw *hdw,u32 *dp)
5108{
5109 return pvr2_read_register(hdw,PVR2_GPIO_OUT,dp);
5110}
5111
5112
5113int pvr2_hdw_gpio_get_in(struct pvr2_hdw *hdw,u32 *dp)
5114{
5115 return pvr2_read_register(hdw,PVR2_GPIO_IN,dp);
5116}
5117
5118
5119int pvr2_hdw_gpio_chg_dir(struct pvr2_hdw *hdw,u32 msk,u32 val)
5120{
5121 u32 cval,nval;
5122 int ret;
5123 if (~msk) {
5124 ret = pvr2_read_register(hdw,PVR2_GPIO_DIR,&cval);
5125 if (ret) return ret;
5126 nval = (cval & ~msk) | (val & msk);
5127 pvr2_trace(PVR2_TRACE_GPIO,
5128 "GPIO direction changing 0x%x:0x%x"
5129 " from 0x%x to 0x%x",
5130 msk,val,cval,nval);
5131 } else {
5132 nval = val;
5133 pvr2_trace(PVR2_TRACE_GPIO,
5134 "GPIO direction changing to 0x%x",nval);
5135 }
5136 return pvr2_write_register(hdw,PVR2_GPIO_DIR,nval);
5137}
5138
5139
5140int pvr2_hdw_gpio_chg_out(struct pvr2_hdw *hdw,u32 msk,u32 val)
5141{
5142 u32 cval,nval;
5143 int ret;
5144 if (~msk) {
5145 ret = pvr2_read_register(hdw,PVR2_GPIO_OUT,&cval);
5146 if (ret) return ret;
5147 nval = (cval & ~msk) | (val & msk);
5148 pvr2_trace(PVR2_TRACE_GPIO,
5149 "GPIO output changing 0x%x:0x%x from 0x%x to 0x%x",
5150 msk,val,cval,nval);
5151 } else {
5152 nval = val;
5153 pvr2_trace(PVR2_TRACE_GPIO,
5154 "GPIO output changing to 0x%x",nval);
5155 }
5156 return pvr2_write_register(hdw,PVR2_GPIO_OUT,nval);
5157}
5158
5159
Mike Iselya51f5002009-03-06 23:30:37 -03005160void pvr2_hdw_status_poll(struct pvr2_hdw *hdw)
5161{
Mike Isely40f07112009-03-07 00:08:17 -03005162 struct v4l2_tuner *vtp = &hdw->tuner_signal_info;
5163 memset(vtp, 0, sizeof(*vtp));
Mike Isely2641df32009-03-07 00:13:25 -03005164 hdw->tuner_signal_stale = 0;
Mike Isely40f07112009-03-07 00:08:17 -03005165 /* Note: There apparently is no replacement for VIDIOC_CROPCAP
5166 using v4l2-subdev - therefore we can't support that AT ALL right
5167 now. (Of course, no sub-drivers seem to implement it either.
5168 But now it's a a chicken and egg problem...) */
Mike Isely4cfe33192011-02-13 17:32:47 -03005169 v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner, g_tuner, vtp);
Mike Isely2641df32009-03-07 00:13:25 -03005170 pvr2_trace(PVR2_TRACE_CHIPS, "subdev status poll"
Mike Isely40f07112009-03-07 00:08:17 -03005171 " type=%u strength=%u audio=0x%x cap=0x%x"
5172 " low=%u hi=%u",
5173 vtp->type,
5174 vtp->signal, vtp->rxsubchans, vtp->capability,
5175 vtp->rangelow, vtp->rangehigh);
Mike Isely2641df32009-03-07 00:13:25 -03005176
5177 /* We have to do this to avoid getting into constant polling if
5178 there's nobody to answer a poll of cropcap info. */
5179 hdw->cropcap_stale = 0;
Mike Iselya51f5002009-03-06 23:30:37 -03005180}
5181
5182
Mike Isely7fb20fa2008-04-22 14:45:37 -03005183unsigned int pvr2_hdw_get_input_available(struct pvr2_hdw *hdw)
5184{
5185 return hdw->input_avail_mask;
5186}
5187
5188
Mike Isely1cb03b72008-04-21 03:47:43 -03005189unsigned int pvr2_hdw_get_input_allowed(struct pvr2_hdw *hdw)
5190{
5191 return hdw->input_allowed_mask;
5192}
5193
5194
5195static int pvr2_hdw_set_input(struct pvr2_hdw *hdw,int v)
5196{
5197 if (hdw->input_val != v) {
5198 hdw->input_val = v;
5199 hdw->input_dirty = !0;
5200 }
5201
5202 /* Handle side effects - if we switch to a mode that needs the RF
5203 tuner, then select the right frequency choice as well and mark
5204 it dirty. */
5205 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
5206 hdw->freqSelector = 0;
5207 hdw->freqDirty = !0;
5208 } else if ((hdw->input_val == PVR2_CVAL_INPUT_TV) ||
5209 (hdw->input_val == PVR2_CVAL_INPUT_DTV)) {
5210 hdw->freqSelector = 1;
5211 hdw->freqDirty = !0;
5212 }
5213 return 0;
5214}
5215
5216
5217int pvr2_hdw_set_input_allowed(struct pvr2_hdw *hdw,
5218 unsigned int change_mask,
5219 unsigned int change_val)
5220{
5221 int ret = 0;
5222 unsigned int nv,m,idx;
5223 LOCK_TAKE(hdw->big_lock);
5224 do {
5225 nv = hdw->input_allowed_mask & ~change_mask;
5226 nv |= (change_val & change_mask);
5227 nv &= hdw->input_avail_mask;
5228 if (!nv) {
5229 /* No legal modes left; return error instead. */
5230 ret = -EPERM;
5231 break;
5232 }
5233 hdw->input_allowed_mask = nv;
5234 if ((1 << hdw->input_val) & hdw->input_allowed_mask) {
5235 /* Current mode is still in the allowed mask, so
5236 we're done. */
5237 break;
5238 }
5239 /* Select and switch to a mode that is still in the allowed
5240 mask */
5241 if (!hdw->input_allowed_mask) {
5242 /* Nothing legal; give up */
5243 break;
5244 }
5245 m = hdw->input_allowed_mask;
5246 for (idx = 0; idx < (sizeof(m) << 3); idx++) {
5247 if (!((1 << idx) & m)) continue;
5248 pvr2_hdw_set_input(hdw,idx);
5249 break;
5250 }
5251 } while (0);
5252 LOCK_GIVE(hdw->big_lock);
5253 return ret;
5254}
5255
5256
Mike Iselye61b6fc2006-07-18 22:42:18 -03005257/* Find I2C address of eeprom */
Adrian Bunk07e337e2006-06-30 11:30:20 -03005258static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03005259{
5260 int result;
5261 LOCK_TAKE(hdw->ctl_lock); do {
Michael Krufky8d364362007-01-22 02:17:55 -03005262 hdw->cmd_buffer[0] = FX2CMD_GET_EEPROM_ADDR;
Mike Iselyd8554972006-06-26 20:58:46 -03005263 result = pvr2_send_request(hdw,
5264 hdw->cmd_buffer,1,
5265 hdw->cmd_buffer,1);
5266 if (result < 0) break;
5267 result = hdw->cmd_buffer[0];
5268 } while(0); LOCK_GIVE(hdw->ctl_lock);
5269 return result;
5270}
5271
5272
Mike Isely32ffa9a2006-09-23 22:26:52 -03005273int pvr2_hdw_register_access(struct pvr2_hdw *hdw,
Hans Verkuilaecde8b2008-12-30 07:14:19 -03005274 struct v4l2_dbg_match *match, u64 reg_id,
5275 int setFl, u64 *val_ptr)
Mike Isely32ffa9a2006-09-23 22:26:52 -03005276{
5277#ifdef CONFIG_VIDEO_ADV_DEBUG
Hans Verkuilaecde8b2008-12-30 07:14:19 -03005278 struct v4l2_dbg_register req;
Mike Isely6d988162006-09-28 17:53:49 -03005279 int stat = 0;
5280 int okFl = 0;
Mike Isely32ffa9a2006-09-23 22:26:52 -03005281
Mike Isely201f5c92007-01-28 16:08:36 -03005282 if (!capable(CAP_SYS_ADMIN)) return -EPERM;
5283
Hans Verkuilaecde8b2008-12-30 07:14:19 -03005284 req.match = *match;
Mike Isely32ffa9a2006-09-23 22:26:52 -03005285 req.reg = reg_id;
5286 if (setFl) req.val = *val_ptr;
Mike Iselyd8f5b9b2009-03-07 00:05:00 -03005287 /* It would be nice to know if a sub-device answered the request */
5288 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, g_register, &req);
5289 if (!setFl) *val_ptr = req.val;
Mike Isely6d988162006-09-28 17:53:49 -03005290 if (okFl) {
5291 return stat;
5292 }
Mike Isely32ffa9a2006-09-23 22:26:52 -03005293 return -EINVAL;
5294#else
5295 return -ENOSYS;
5296#endif
5297}
5298
5299
Mike Iselyd8554972006-06-26 20:58:46 -03005300/*
5301 Stuff for Emacs to see, in order to encourage consistent editing style:
5302 *** Local Variables: ***
5303 *** mode: c ***
5304 *** fill-column: 75 ***
5305 *** tab-width: 8 ***
5306 *** c-basic-offset: 8 ***
5307 *** End: ***
5308 */