blob: 55074a89966f9d68784e0414888ef796208f14f4 [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 Isely694dca22008-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 Isely694dca22008-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
502static int ctrl_cropw_max_get(struct pvr2_ctrl *cptr, int *val)
503{
504 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
505 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
506 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300507 return stat;
508 }
509 *val = 0;
510 if (cap->bounds.width > cptr->hdw->cropl_val) {
Mike Isely432907f2008-08-31 21:02:20 -0300511 *val = cap->bounds.width - cptr->hdw->cropl_val;
512 }
513 return 0;
514}
515
516static int ctrl_croph_max_get(struct pvr2_ctrl *cptr, int *val)
517{
518 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
519 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
520 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300521 return stat;
522 }
523 *val = 0;
524 if (cap->bounds.height > cptr->hdw->cropt_val) {
Mike Isely432907f2008-08-31 21:02:20 -0300525 *val = cap->bounds.height - cptr->hdw->cropt_val;
526 }
527 return 0;
528}
529
530static int ctrl_get_cropcapbl(struct pvr2_ctrl *cptr, int *val)
531{
532 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
533 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
534 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300535 return stat;
536 }
537 *val = cap->bounds.left;
538 return 0;
539}
540
541static int ctrl_get_cropcapbt(struct pvr2_ctrl *cptr, int *val)
542{
543 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
544 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
545 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300546 return stat;
547 }
548 *val = cap->bounds.top;
549 return 0;
550}
551
552static int ctrl_get_cropcapbw(struct pvr2_ctrl *cptr, int *val)
553{
554 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
555 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
556 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300557 return stat;
558 }
559 *val = cap->bounds.width;
560 return 0;
561}
562
563static int ctrl_get_cropcapbh(struct pvr2_ctrl *cptr, int *val)
564{
565 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
566 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
567 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300568 return stat;
569 }
570 *val = cap->bounds.height;
571 return 0;
572}
573
574static int ctrl_get_cropcapdl(struct pvr2_ctrl *cptr, int *val)
575{
576 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
577 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
578 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300579 return stat;
580 }
581 *val = cap->defrect.left;
582 return 0;
583}
584
585static int ctrl_get_cropcapdt(struct pvr2_ctrl *cptr, int *val)
586{
587 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
588 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
589 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300590 return stat;
591 }
592 *val = cap->defrect.top;
593 return 0;
594}
595
596static int ctrl_get_cropcapdw(struct pvr2_ctrl *cptr, int *val)
597{
598 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
599 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
600 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300601 return stat;
602 }
603 *val = cap->defrect.width;
604 return 0;
605}
606
607static int ctrl_get_cropcapdh(struct pvr2_ctrl *cptr, int *val)
608{
609 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
610 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
611 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300612 return stat;
613 }
614 *val = cap->defrect.height;
615 return 0;
616}
617
618static int ctrl_get_cropcappan(struct pvr2_ctrl *cptr, int *val)
619{
620 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
621 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
622 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300623 return stat;
624 }
625 *val = cap->pixelaspect.numerator;
626 return 0;
627}
628
629static int ctrl_get_cropcappad(struct pvr2_ctrl *cptr, int *val)
630{
631 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
632 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
633 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300634 return stat;
635 }
636 *val = cap->pixelaspect.denominator;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300637 return 0;
638}
639
Mike Isely3ad9fc32006-09-02 22:37:52 -0300640static int ctrl_vres_max_get(struct pvr2_ctrl *cptr,int *vp)
641{
642 /* Actual maximum depends on the video standard in effect. */
643 if (cptr->hdw->std_mask_cur & V4L2_STD_525_60) {
644 *vp = 480;
645 } else {
646 *vp = 576;
647 }
648 return 0;
649}
650
651static int ctrl_vres_min_get(struct pvr2_ctrl *cptr,int *vp)
652{
Mike Isely989eb152007-11-26 01:53:12 -0300653 /* Actual minimum depends on device digitizer type. */
654 if (cptr->hdw->hdw_desc->flag_has_cx25840) {
Mike Isely3ad9fc32006-09-02 22:37:52 -0300655 *vp = 75;
656 } else {
657 *vp = 17;
658 }
659 return 0;
660}
661
Mike Isely1bde0282006-12-27 23:30:13 -0300662static int ctrl_get_input(struct pvr2_ctrl *cptr,int *vp)
663{
664 *vp = cptr->hdw->input_val;
665 return 0;
666}
667
Mike Isely29bf5b12008-04-22 14:45:37 -0300668static int ctrl_check_input(struct pvr2_ctrl *cptr,int v)
669{
Mike Isely1cb03b72008-04-21 03:47:43 -0300670 return ((1 << v) & cptr->hdw->input_allowed_mask) != 0;
Mike Isely29bf5b12008-04-22 14:45:37 -0300671}
672
Mike Isely1bde0282006-12-27 23:30:13 -0300673static int ctrl_set_input(struct pvr2_ctrl *cptr,int m,int v)
674{
Mike Isely1cb03b72008-04-21 03:47:43 -0300675 return pvr2_hdw_set_input(cptr->hdw,v);
Mike Isely1bde0282006-12-27 23:30:13 -0300676}
677
678static int ctrl_isdirty_input(struct pvr2_ctrl *cptr)
679{
680 return cptr->hdw->input_dirty != 0;
681}
682
683static void ctrl_cleardirty_input(struct pvr2_ctrl *cptr)
684{
685 cptr->hdw->input_dirty = 0;
686}
687
Mike Isely5549f542006-12-27 23:28:54 -0300688
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300689static int ctrl_freq_max_get(struct pvr2_ctrl *cptr, int *vp)
690{
Mike Isely644afdb2007-01-20 00:19:23 -0300691 unsigned long fv;
692 struct pvr2_hdw *hdw = cptr->hdw;
693 if (hdw->tuner_signal_stale) {
Mike Iselya51f5002009-03-06 23:30:37 -0300694 pvr2_hdw_status_poll(hdw);
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300695 }
Mike Isely644afdb2007-01-20 00:19:23 -0300696 fv = hdw->tuner_signal_info.rangehigh;
697 if (!fv) {
698 /* Safety fallback */
699 *vp = TV_MAX_FREQ;
700 return 0;
701 }
702 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
703 fv = (fv * 125) / 2;
704 } else {
705 fv = fv * 62500;
706 }
707 *vp = fv;
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300708 return 0;
709}
710
711static int ctrl_freq_min_get(struct pvr2_ctrl *cptr, int *vp)
712{
Mike Isely644afdb2007-01-20 00:19:23 -0300713 unsigned long fv;
714 struct pvr2_hdw *hdw = cptr->hdw;
715 if (hdw->tuner_signal_stale) {
Mike Iselya51f5002009-03-06 23:30:37 -0300716 pvr2_hdw_status_poll(hdw);
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300717 }
Mike Isely644afdb2007-01-20 00:19:23 -0300718 fv = hdw->tuner_signal_info.rangelow;
719 if (!fv) {
720 /* Safety fallback */
721 *vp = TV_MIN_FREQ;
722 return 0;
723 }
724 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
725 fv = (fv * 125) / 2;
726 } else {
727 fv = fv * 62500;
728 }
729 *vp = fv;
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300730 return 0;
731}
732
Mike Iselyb30d2442006-06-25 20:05:01 -0300733static int ctrl_cx2341x_is_dirty(struct pvr2_ctrl *cptr)
734{
735 return cptr->hdw->enc_stale != 0;
736}
737
738static void ctrl_cx2341x_clear_dirty(struct pvr2_ctrl *cptr)
739{
740 cptr->hdw->enc_stale = 0;
Mike Isely681c7392007-11-26 01:48:52 -0300741 cptr->hdw->enc_unsafe_stale = 0;
Mike Iselyb30d2442006-06-25 20:05:01 -0300742}
743
744static int ctrl_cx2341x_get(struct pvr2_ctrl *cptr,int *vp)
745{
746 int ret;
747 struct v4l2_ext_controls cs;
748 struct v4l2_ext_control c1;
749 memset(&cs,0,sizeof(cs));
750 memset(&c1,0,sizeof(c1));
751 cs.controls = &c1;
752 cs.count = 1;
753 c1.id = cptr->info->v4l_id;
Hans Verkuil01f1e442007-08-21 18:32:42 -0300754 ret = cx2341x_ext_ctrls(&cptr->hdw->enc_ctl_state, 0, &cs,
Mike Iselyb30d2442006-06-25 20:05:01 -0300755 VIDIOC_G_EXT_CTRLS);
756 if (ret) return ret;
757 *vp = c1.value;
758 return 0;
759}
760
761static int ctrl_cx2341x_set(struct pvr2_ctrl *cptr,int m,int v)
762{
763 int ret;
Mike Isely681c7392007-11-26 01:48:52 -0300764 struct pvr2_hdw *hdw = cptr->hdw;
Mike Iselyb30d2442006-06-25 20:05:01 -0300765 struct v4l2_ext_controls cs;
766 struct v4l2_ext_control c1;
767 memset(&cs,0,sizeof(cs));
768 memset(&c1,0,sizeof(c1));
769 cs.controls = &c1;
770 cs.count = 1;
771 c1.id = cptr->info->v4l_id;
772 c1.value = v;
Mike Isely681c7392007-11-26 01:48:52 -0300773 ret = cx2341x_ext_ctrls(&hdw->enc_ctl_state,
774 hdw->state_encoder_run, &cs,
Mike Iselyb30d2442006-06-25 20:05:01 -0300775 VIDIOC_S_EXT_CTRLS);
Mike Isely681c7392007-11-26 01:48:52 -0300776 if (ret == -EBUSY) {
777 /* Oops. cx2341x is telling us it's not safe to change
778 this control while we're capturing. Make a note of this
779 fact so that the pipeline will be stopped the next time
780 controls are committed. Then go on ahead and store this
781 change anyway. */
782 ret = cx2341x_ext_ctrls(&hdw->enc_ctl_state,
783 0, &cs,
784 VIDIOC_S_EXT_CTRLS);
785 if (!ret) hdw->enc_unsafe_stale = !0;
786 }
Mike Iselyb30d2442006-06-25 20:05:01 -0300787 if (ret) return ret;
Mike Isely681c7392007-11-26 01:48:52 -0300788 hdw->enc_stale = !0;
Mike Iselyb30d2442006-06-25 20:05:01 -0300789 return 0;
790}
791
792static unsigned int ctrl_cx2341x_getv4lflags(struct pvr2_ctrl *cptr)
793{
794 struct v4l2_queryctrl qctrl;
795 struct pvr2_ctl_info *info;
796 qctrl.id = cptr->info->v4l_id;
797 cx2341x_ctrl_query(&cptr->hdw->enc_ctl_state,&qctrl);
798 /* Strip out the const so we can adjust a function pointer. It's
799 OK to do this here because we know this is a dynamically created
800 control, so the underlying storage for the info pointer is (a)
801 private to us, and (b) not in read-only storage. Either we do
802 this or we significantly complicate the underlying control
803 implementation. */
804 info = (struct pvr2_ctl_info *)(cptr->info);
805 if (qctrl.flags & V4L2_CTRL_FLAG_READ_ONLY) {
806 if (info->set_value) {
Mike Iselya0fd1cb2006-06-30 11:35:28 -0300807 info->set_value = NULL;
Mike Iselyb30d2442006-06-25 20:05:01 -0300808 }
809 } else {
810 if (!(info->set_value)) {
811 info->set_value = ctrl_cx2341x_set;
812 }
813 }
814 return qctrl.flags;
815}
816
Mike Iselyd8554972006-06-26 20:58:46 -0300817static int ctrl_streamingenabled_get(struct pvr2_ctrl *cptr,int *vp)
818{
Mike Isely681c7392007-11-26 01:48:52 -0300819 *vp = cptr->hdw->state_pipeline_req;
820 return 0;
821}
822
823static int ctrl_masterstate_get(struct pvr2_ctrl *cptr,int *vp)
824{
825 *vp = cptr->hdw->master_state;
Mike Iselyd8554972006-06-26 20:58:46 -0300826 return 0;
827}
828
829static int ctrl_hsm_get(struct pvr2_ctrl *cptr,int *vp)
830{
831 int result = pvr2_hdw_is_hsm(cptr->hdw);
832 *vp = PVR2_CVAL_HSM_FULL;
833 if (result < 0) *vp = PVR2_CVAL_HSM_FAIL;
834 if (result) *vp = PVR2_CVAL_HSM_HIGH;
835 return 0;
836}
837
838static int ctrl_stdavail_get(struct pvr2_ctrl *cptr,int *vp)
839{
840 *vp = cptr->hdw->std_mask_avail;
841 return 0;
842}
843
844static int ctrl_stdavail_set(struct pvr2_ctrl *cptr,int m,int v)
845{
846 struct pvr2_hdw *hdw = cptr->hdw;
847 v4l2_std_id ns;
848 ns = hdw->std_mask_avail;
849 ns = (ns & ~m) | (v & m);
850 if (ns == hdw->std_mask_avail) return 0;
851 hdw->std_mask_avail = ns;
852 pvr2_hdw_internal_set_std_avail(hdw);
853 pvr2_hdw_internal_find_stdenum(hdw);
854 return 0;
855}
856
857static int ctrl_std_val_to_sym(struct pvr2_ctrl *cptr,int msk,int val,
858 char *bufPtr,unsigned int bufSize,
859 unsigned int *len)
860{
861 *len = pvr2_std_id_to_str(bufPtr,bufSize,msk & val);
862 return 0;
863}
864
865static int ctrl_std_sym_to_val(struct pvr2_ctrl *cptr,
866 const char *bufPtr,unsigned int bufSize,
867 int *mskp,int *valp)
868{
869 int ret;
870 v4l2_std_id id;
871 ret = pvr2_std_str_to_id(&id,bufPtr,bufSize);
872 if (ret < 0) return ret;
873 if (mskp) *mskp = id;
874 if (valp) *valp = id;
875 return 0;
876}
877
878static int ctrl_stdcur_get(struct pvr2_ctrl *cptr,int *vp)
879{
880 *vp = cptr->hdw->std_mask_cur;
881 return 0;
882}
883
884static int ctrl_stdcur_set(struct pvr2_ctrl *cptr,int m,int v)
885{
886 struct pvr2_hdw *hdw = cptr->hdw;
887 v4l2_std_id ns;
888 ns = hdw->std_mask_cur;
889 ns = (ns & ~m) | (v & m);
890 if (ns == hdw->std_mask_cur) return 0;
891 hdw->std_mask_cur = ns;
892 hdw->std_dirty = !0;
893 pvr2_hdw_internal_find_stdenum(hdw);
894 return 0;
895}
896
897static int ctrl_stdcur_is_dirty(struct pvr2_ctrl *cptr)
898{
899 return cptr->hdw->std_dirty != 0;
900}
901
902static void ctrl_stdcur_clear_dirty(struct pvr2_ctrl *cptr)
903{
904 cptr->hdw->std_dirty = 0;
905}
906
907static int ctrl_signal_get(struct pvr2_ctrl *cptr,int *vp)
908{
Mike Isely18103c52007-01-20 00:09:47 -0300909 struct pvr2_hdw *hdw = cptr->hdw;
Mike Iselya51f5002009-03-06 23:30:37 -0300910 pvr2_hdw_status_poll(hdw);
Mike Isely18103c52007-01-20 00:09:47 -0300911 *vp = hdw->tuner_signal_info.signal;
912 return 0;
913}
914
915static int ctrl_audio_modes_present_get(struct pvr2_ctrl *cptr,int *vp)
916{
917 int val = 0;
918 unsigned int subchan;
919 struct pvr2_hdw *hdw = cptr->hdw;
Mike Iselya51f5002009-03-06 23:30:37 -0300920 pvr2_hdw_status_poll(hdw);
Mike Isely18103c52007-01-20 00:09:47 -0300921 subchan = hdw->tuner_signal_info.rxsubchans;
922 if (subchan & V4L2_TUNER_SUB_MONO) {
923 val |= (1 << V4L2_TUNER_MODE_MONO);
924 }
925 if (subchan & V4L2_TUNER_SUB_STEREO) {
926 val |= (1 << V4L2_TUNER_MODE_STEREO);
927 }
928 if (subchan & V4L2_TUNER_SUB_LANG1) {
929 val |= (1 << V4L2_TUNER_MODE_LANG1);
930 }
931 if (subchan & V4L2_TUNER_SUB_LANG2) {
932 val |= (1 << V4L2_TUNER_MODE_LANG2);
933 }
934 *vp = val;
Mike Iselyd8554972006-06-26 20:58:46 -0300935 return 0;
936}
937
Mike Iselyd8554972006-06-26 20:58:46 -0300938
939static int ctrl_stdenumcur_set(struct pvr2_ctrl *cptr,int m,int v)
940{
941 struct pvr2_hdw *hdw = cptr->hdw;
942 if (v < 0) return -EINVAL;
943 if (v > hdw->std_enum_cnt) return -EINVAL;
944 hdw->std_enum_cur = v;
945 if (!v) return 0;
946 v--;
947 if (hdw->std_mask_cur == hdw->std_defs[v].id) return 0;
948 hdw->std_mask_cur = hdw->std_defs[v].id;
949 hdw->std_dirty = !0;
950 return 0;
951}
952
953
954static int ctrl_stdenumcur_get(struct pvr2_ctrl *cptr,int *vp)
955{
956 *vp = cptr->hdw->std_enum_cur;
957 return 0;
958}
959
960
961static int ctrl_stdenumcur_is_dirty(struct pvr2_ctrl *cptr)
962{
963 return cptr->hdw->std_dirty != 0;
964}
965
966
967static void ctrl_stdenumcur_clear_dirty(struct pvr2_ctrl *cptr)
968{
969 cptr->hdw->std_dirty = 0;
970}
971
972
973#define DEFINT(vmin,vmax) \
974 .type = pvr2_ctl_int, \
975 .def.type_int.min_value = vmin, \
976 .def.type_int.max_value = vmax
977
978#define DEFENUM(tab) \
979 .type = pvr2_ctl_enum, \
Mike Isely27c7b712007-01-20 00:39:17 -0300980 .def.type_enum.count = ARRAY_SIZE(tab), \
Mike Iselyd8554972006-06-26 20:58:46 -0300981 .def.type_enum.value_names = tab
982
Mike Isely33213962006-06-25 20:04:40 -0300983#define DEFBOOL \
984 .type = pvr2_ctl_bool
985
Mike Iselyd8554972006-06-26 20:58:46 -0300986#define DEFMASK(msk,tab) \
987 .type = pvr2_ctl_bitmask, \
988 .def.type_bitmask.valid_bits = msk, \
989 .def.type_bitmask.bit_names = tab
990
991#define DEFREF(vname) \
992 .set_value = ctrl_set_##vname, \
993 .get_value = ctrl_get_##vname, \
994 .is_dirty = ctrl_isdirty_##vname, \
995 .clear_dirty = ctrl_cleardirty_##vname
996
997
998#define VCREATE_FUNCS(vname) \
999static int ctrl_get_##vname(struct pvr2_ctrl *cptr,int *vp) \
1000{*vp = cptr->hdw->vname##_val; return 0;} \
1001static int ctrl_set_##vname(struct pvr2_ctrl *cptr,int m,int v) \
1002{cptr->hdw->vname##_val = v; cptr->hdw->vname##_dirty = !0; return 0;} \
1003static int ctrl_isdirty_##vname(struct pvr2_ctrl *cptr) \
1004{return cptr->hdw->vname##_dirty != 0;} \
1005static void ctrl_cleardirty_##vname(struct pvr2_ctrl *cptr) \
1006{cptr->hdw->vname##_dirty = 0;}
1007
1008VCREATE_FUNCS(brightness)
1009VCREATE_FUNCS(contrast)
1010VCREATE_FUNCS(saturation)
1011VCREATE_FUNCS(hue)
1012VCREATE_FUNCS(volume)
1013VCREATE_FUNCS(balance)
1014VCREATE_FUNCS(bass)
1015VCREATE_FUNCS(treble)
1016VCREATE_FUNCS(mute)
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001017VCREATE_FUNCS(cropl)
1018VCREATE_FUNCS(cropt)
1019VCREATE_FUNCS(cropw)
1020VCREATE_FUNCS(croph)
Mike Iselyc05c0462006-06-25 20:04:25 -03001021VCREATE_FUNCS(audiomode)
1022VCREATE_FUNCS(res_hor)
1023VCREATE_FUNCS(res_ver)
Mike Iselyd8554972006-06-26 20:58:46 -03001024VCREATE_FUNCS(srate)
Mike Iselyd8554972006-06-26 20:58:46 -03001025
Mike Iselyd8554972006-06-26 20:58:46 -03001026/* Table definition of all controls which can be manipulated */
1027static const struct pvr2_ctl_info control_defs[] = {
1028 {
1029 .v4l_id = V4L2_CID_BRIGHTNESS,
1030 .desc = "Brightness",
1031 .name = "brightness",
1032 .default_value = 128,
1033 DEFREF(brightness),
1034 DEFINT(0,255),
1035 },{
1036 .v4l_id = V4L2_CID_CONTRAST,
1037 .desc = "Contrast",
1038 .name = "contrast",
1039 .default_value = 68,
1040 DEFREF(contrast),
1041 DEFINT(0,127),
1042 },{
1043 .v4l_id = V4L2_CID_SATURATION,
1044 .desc = "Saturation",
1045 .name = "saturation",
1046 .default_value = 64,
1047 DEFREF(saturation),
1048 DEFINT(0,127),
1049 },{
1050 .v4l_id = V4L2_CID_HUE,
1051 .desc = "Hue",
1052 .name = "hue",
1053 .default_value = 0,
1054 DEFREF(hue),
1055 DEFINT(-128,127),
1056 },{
1057 .v4l_id = V4L2_CID_AUDIO_VOLUME,
1058 .desc = "Volume",
1059 .name = "volume",
Mike Isely139eecf2006-12-27 23:36:33 -03001060 .default_value = 62000,
Mike Iselyd8554972006-06-26 20:58:46 -03001061 DEFREF(volume),
1062 DEFINT(0,65535),
1063 },{
1064 .v4l_id = V4L2_CID_AUDIO_BALANCE,
1065 .desc = "Balance",
1066 .name = "balance",
1067 .default_value = 0,
1068 DEFREF(balance),
1069 DEFINT(-32768,32767),
1070 },{
1071 .v4l_id = V4L2_CID_AUDIO_BASS,
1072 .desc = "Bass",
1073 .name = "bass",
1074 .default_value = 0,
1075 DEFREF(bass),
1076 DEFINT(-32768,32767),
1077 },{
1078 .v4l_id = V4L2_CID_AUDIO_TREBLE,
1079 .desc = "Treble",
1080 .name = "treble",
1081 .default_value = 0,
1082 DEFREF(treble),
1083 DEFINT(-32768,32767),
1084 },{
1085 .v4l_id = V4L2_CID_AUDIO_MUTE,
1086 .desc = "Mute",
1087 .name = "mute",
1088 .default_value = 0,
1089 DEFREF(mute),
Mike Isely33213962006-06-25 20:04:40 -03001090 DEFBOOL,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001091 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001092 .desc = "Capture crop left margin",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001093 .name = "crop_left",
1094 .internal_id = PVR2_CID_CROPL,
1095 .default_value = 0,
1096 DEFREF(cropl),
1097 DEFINT(-129, 340),
1098 .get_min_value = ctrl_cropl_min_get,
1099 .get_max_value = ctrl_cropl_max_get,
Mike Isely432907f2008-08-31 21:02:20 -03001100 .get_def_value = ctrl_get_cropcapdl,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001101 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001102 .desc = "Capture crop top margin",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001103 .name = "crop_top",
1104 .internal_id = PVR2_CID_CROPT,
1105 .default_value = 0,
1106 DEFREF(cropt),
1107 DEFINT(-35, 544),
1108 .get_min_value = ctrl_cropt_min_get,
1109 .get_max_value = ctrl_cropt_max_get,
Mike Isely432907f2008-08-31 21:02:20 -03001110 .get_def_value = ctrl_get_cropcapdt,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001111 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001112 .desc = "Capture crop width",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001113 .name = "crop_width",
1114 .internal_id = PVR2_CID_CROPW,
1115 .default_value = 720,
1116 DEFREF(cropw),
Mike Isely432907f2008-08-31 21:02:20 -03001117 .get_max_value = ctrl_cropw_max_get,
1118 .get_def_value = ctrl_get_cropcapdw,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001119 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001120 .desc = "Capture crop height",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001121 .name = "crop_height",
1122 .internal_id = PVR2_CID_CROPH,
1123 .default_value = 480,
1124 DEFREF(croph),
Mike Isely432907f2008-08-31 21:02:20 -03001125 .get_max_value = ctrl_croph_max_get,
1126 .get_def_value = ctrl_get_cropcapdh,
1127 }, {
1128 .desc = "Capture capability pixel aspect numerator",
1129 .name = "cropcap_pixel_numerator",
1130 .internal_id = PVR2_CID_CROPCAPPAN,
1131 .get_value = ctrl_get_cropcappan,
1132 }, {
1133 .desc = "Capture capability pixel aspect denominator",
1134 .name = "cropcap_pixel_denominator",
1135 .internal_id = PVR2_CID_CROPCAPPAD,
1136 .get_value = ctrl_get_cropcappad,
1137 }, {
1138 .desc = "Capture capability bounds top",
1139 .name = "cropcap_bounds_top",
1140 .internal_id = PVR2_CID_CROPCAPBT,
1141 .get_value = ctrl_get_cropcapbt,
1142 }, {
1143 .desc = "Capture capability bounds left",
1144 .name = "cropcap_bounds_left",
1145 .internal_id = PVR2_CID_CROPCAPBL,
1146 .get_value = ctrl_get_cropcapbl,
1147 }, {
1148 .desc = "Capture capability bounds width",
1149 .name = "cropcap_bounds_width",
1150 .internal_id = PVR2_CID_CROPCAPBW,
1151 .get_value = ctrl_get_cropcapbw,
1152 }, {
1153 .desc = "Capture capability bounds height",
1154 .name = "cropcap_bounds_height",
1155 .internal_id = PVR2_CID_CROPCAPBH,
1156 .get_value = ctrl_get_cropcapbh,
Mike Iselyd8554972006-06-26 20:58:46 -03001157 },{
Mike Iselyc05c0462006-06-25 20:04:25 -03001158 .desc = "Video Source",
1159 .name = "input",
1160 .internal_id = PVR2_CID_INPUT,
1161 .default_value = PVR2_CVAL_INPUT_TV,
Mike Isely29bf5b12008-04-22 14:45:37 -03001162 .check_value = ctrl_check_input,
Mike Iselyc05c0462006-06-25 20:04:25 -03001163 DEFREF(input),
1164 DEFENUM(control_values_input),
1165 },{
1166 .desc = "Audio Mode",
1167 .name = "audio_mode",
1168 .internal_id = PVR2_CID_AUDIOMODE,
1169 .default_value = V4L2_TUNER_MODE_STEREO,
1170 DEFREF(audiomode),
1171 DEFENUM(control_values_audiomode),
1172 },{
1173 .desc = "Horizontal capture resolution",
1174 .name = "resolution_hor",
1175 .internal_id = PVR2_CID_HRES,
1176 .default_value = 720,
1177 DEFREF(res_hor),
Mike Isely3ad9fc32006-09-02 22:37:52 -03001178 DEFINT(19,720),
Mike Iselyc05c0462006-06-25 20:04:25 -03001179 },{
1180 .desc = "Vertical capture resolution",
1181 .name = "resolution_ver",
1182 .internal_id = PVR2_CID_VRES,
1183 .default_value = 480,
1184 DEFREF(res_ver),
Mike Isely3ad9fc32006-09-02 22:37:52 -03001185 DEFINT(17,576),
1186 /* Hook in check for video standard and adjust maximum
1187 depending on the standard. */
1188 .get_max_value = ctrl_vres_max_get,
1189 .get_min_value = ctrl_vres_min_get,
Mike Iselyc05c0462006-06-25 20:04:25 -03001190 },{
Mike Iselyb30d2442006-06-25 20:05:01 -03001191 .v4l_id = V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
Mike Isely434449f2006-08-08 09:10:06 -03001192 .default_value = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000,
1193 .desc = "Audio Sampling Frequency",
Mike Iselyd8554972006-06-26 20:58:46 -03001194 .name = "srate",
Mike Iselyd8554972006-06-26 20:58:46 -03001195 DEFREF(srate),
1196 DEFENUM(control_values_srate),
1197 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001198 .desc = "Tuner Frequency (Hz)",
1199 .name = "frequency",
1200 .internal_id = PVR2_CID_FREQUENCY,
Mike Isely1bde0282006-12-27 23:30:13 -03001201 .default_value = 0,
Mike Iselyd8554972006-06-26 20:58:46 -03001202 .set_value = ctrl_freq_set,
1203 .get_value = ctrl_freq_get,
1204 .is_dirty = ctrl_freq_is_dirty,
1205 .clear_dirty = ctrl_freq_clear_dirty,
Mike Isely644afdb2007-01-20 00:19:23 -03001206 DEFINT(0,0),
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -03001207 /* Hook in check for input value (tv/radio) and adjust
1208 max/min values accordingly */
1209 .get_max_value = ctrl_freq_max_get,
1210 .get_min_value = ctrl_freq_min_get,
Mike Iselyd8554972006-06-26 20:58:46 -03001211 },{
1212 .desc = "Channel",
1213 .name = "channel",
1214 .set_value = ctrl_channel_set,
1215 .get_value = ctrl_channel_get,
1216 DEFINT(0,FREQTABLE_SIZE),
1217 },{
1218 .desc = "Channel Program Frequency",
1219 .name = "freq_table_value",
1220 .set_value = ctrl_channelfreq_set,
1221 .get_value = ctrl_channelfreq_get,
Mike Isely644afdb2007-01-20 00:19:23 -03001222 DEFINT(0,0),
Mike Isely1bde0282006-12-27 23:30:13 -03001223 /* Hook in check for input value (tv/radio) and adjust
1224 max/min values accordingly */
Mike Isely1bde0282006-12-27 23:30:13 -03001225 .get_max_value = ctrl_freq_max_get,
1226 .get_min_value = ctrl_freq_min_get,
Mike Iselyd8554972006-06-26 20:58:46 -03001227 },{
1228 .desc = "Channel Program ID",
1229 .name = "freq_table_channel",
1230 .set_value = ctrl_channelprog_set,
1231 .get_value = ctrl_channelprog_get,
1232 DEFINT(0,FREQTABLE_SIZE),
1233 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001234 .desc = "Streaming Enabled",
1235 .name = "streaming_enabled",
1236 .get_value = ctrl_streamingenabled_get,
Mike Isely33213962006-06-25 20:04:40 -03001237 DEFBOOL,
Mike Iselyd8554972006-06-26 20:58:46 -03001238 },{
1239 .desc = "USB Speed",
1240 .name = "usb_speed",
1241 .get_value = ctrl_hsm_get,
1242 DEFENUM(control_values_hsm),
1243 },{
Mike Isely681c7392007-11-26 01:48:52 -03001244 .desc = "Master State",
1245 .name = "master_state",
1246 .get_value = ctrl_masterstate_get,
1247 DEFENUM(pvr2_state_names),
1248 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001249 .desc = "Signal Present",
1250 .name = "signal_present",
1251 .get_value = ctrl_signal_get,
Mike Isely18103c52007-01-20 00:09:47 -03001252 DEFINT(0,65535),
1253 },{
1254 .desc = "Audio Modes Present",
1255 .name = "audio_modes_present",
1256 .get_value = ctrl_audio_modes_present_get,
1257 /* For this type we "borrow" the V4L2_TUNER_MODE enum from
1258 v4l. Nothing outside of this module cares about this,
1259 but I reuse it in order to also reuse the
1260 control_values_audiomode string table. */
1261 DEFMASK(((1 << V4L2_TUNER_MODE_MONO)|
1262 (1 << V4L2_TUNER_MODE_STEREO)|
1263 (1 << V4L2_TUNER_MODE_LANG1)|
1264 (1 << V4L2_TUNER_MODE_LANG2)),
1265 control_values_audiomode),
Mike Iselyd8554972006-06-26 20:58:46 -03001266 },{
1267 .desc = "Video Standards Available Mask",
1268 .name = "video_standard_mask_available",
1269 .internal_id = PVR2_CID_STDAVAIL,
1270 .skip_init = !0,
1271 .get_value = ctrl_stdavail_get,
1272 .set_value = ctrl_stdavail_set,
1273 .val_to_sym = ctrl_std_val_to_sym,
1274 .sym_to_val = ctrl_std_sym_to_val,
1275 .type = pvr2_ctl_bitmask,
1276 },{
1277 .desc = "Video Standards In Use Mask",
1278 .name = "video_standard_mask_active",
1279 .internal_id = PVR2_CID_STDCUR,
1280 .skip_init = !0,
1281 .get_value = ctrl_stdcur_get,
1282 .set_value = ctrl_stdcur_set,
1283 .is_dirty = ctrl_stdcur_is_dirty,
1284 .clear_dirty = ctrl_stdcur_clear_dirty,
1285 .val_to_sym = ctrl_std_val_to_sym,
1286 .sym_to_val = ctrl_std_sym_to_val,
1287 .type = pvr2_ctl_bitmask,
1288 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001289 .desc = "Video Standard Name",
1290 .name = "video_standard",
1291 .internal_id = PVR2_CID_STDENUM,
1292 .skip_init = !0,
1293 .get_value = ctrl_stdenumcur_get,
1294 .set_value = ctrl_stdenumcur_set,
1295 .is_dirty = ctrl_stdenumcur_is_dirty,
1296 .clear_dirty = ctrl_stdenumcur_clear_dirty,
1297 .type = pvr2_ctl_enum,
1298 }
1299};
1300
Ahmed S. Darwisheca8ebf2007-01-20 00:35:03 -03001301#define CTRLDEF_COUNT ARRAY_SIZE(control_defs)
Mike Iselyd8554972006-06-26 20:58:46 -03001302
1303
1304const char *pvr2_config_get_name(enum pvr2_config cfg)
1305{
1306 switch (cfg) {
1307 case pvr2_config_empty: return "empty";
1308 case pvr2_config_mpeg: return "mpeg";
1309 case pvr2_config_vbi: return "vbi";
Mike Isely16eb40d2006-12-30 18:27:32 -03001310 case pvr2_config_pcm: return "pcm";
1311 case pvr2_config_rawvideo: return "raw video";
Mike Iselyd8554972006-06-26 20:58:46 -03001312 }
1313 return "<unknown>";
1314}
1315
1316
1317struct usb_device *pvr2_hdw_get_dev(struct pvr2_hdw *hdw)
1318{
1319 return hdw->usb_dev;
1320}
1321
1322
1323unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw)
1324{
1325 return hdw->serial_number;
1326}
1327
Mike Isely31a18542007-04-08 01:11:47 -03001328
1329const char *pvr2_hdw_get_bus_info(struct pvr2_hdw *hdw)
1330{
1331 return hdw->bus_info;
1332}
1333
1334
Mike Isely13a88792009-01-14 04:22:56 -03001335const char *pvr2_hdw_get_device_identifier(struct pvr2_hdw *hdw)
1336{
1337 return hdw->identifier;
1338}
1339
1340
Mike Isely1bde0282006-12-27 23:30:13 -03001341unsigned long pvr2_hdw_get_cur_freq(struct pvr2_hdw *hdw)
1342{
1343 return hdw->freqSelector ? hdw->freqValTelevision : hdw->freqValRadio;
1344}
1345
1346/* Set the currently tuned frequency and account for all possible
1347 driver-core side effects of this action. */
Adrian Bunkf55a8712008-04-18 05:38:56 -03001348static void pvr2_hdw_set_cur_freq(struct pvr2_hdw *hdw,unsigned long val)
Mike Isely1bde0282006-12-27 23:30:13 -03001349{
Mike Isely7c74e572007-01-20 00:15:41 -03001350 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
Mike Isely1bde0282006-12-27 23:30:13 -03001351 if (hdw->freqSelector) {
1352 /* Swing over to radio frequency selection */
1353 hdw->freqSelector = 0;
1354 hdw->freqDirty = !0;
1355 }
Mike Isely1bde0282006-12-27 23:30:13 -03001356 if (hdw->freqValRadio != val) {
1357 hdw->freqValRadio = val;
1358 hdw->freqSlotRadio = 0;
Mike Isely7c74e572007-01-20 00:15:41 -03001359 hdw->freqDirty = !0;
Mike Isely1bde0282006-12-27 23:30:13 -03001360 }
Mike Isely7c74e572007-01-20 00:15:41 -03001361 } else {
Mike Isely1bde0282006-12-27 23:30:13 -03001362 if (!(hdw->freqSelector)) {
1363 /* Swing over to television frequency selection */
1364 hdw->freqSelector = 1;
1365 hdw->freqDirty = !0;
1366 }
Mike Isely1bde0282006-12-27 23:30:13 -03001367 if (hdw->freqValTelevision != val) {
1368 hdw->freqValTelevision = val;
1369 hdw->freqSlotTelevision = 0;
Mike Isely7c74e572007-01-20 00:15:41 -03001370 hdw->freqDirty = !0;
Mike Isely1bde0282006-12-27 23:30:13 -03001371 }
Mike Isely1bde0282006-12-27 23:30:13 -03001372 }
1373}
1374
Mike Iselyd8554972006-06-26 20:58:46 -03001375int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw)
1376{
1377 return hdw->unit_number;
1378}
1379
1380
1381/* Attempt to locate one of the given set of files. Messages are logged
1382 appropriate to what has been found. The return value will be 0 or
1383 greater on success (it will be the index of the file name found) and
1384 fw_entry will be filled in. Otherwise a negative error is returned on
1385 failure. If the return value is -ENOENT then no viable firmware file
1386 could be located. */
1387static int pvr2_locate_firmware(struct pvr2_hdw *hdw,
1388 const struct firmware **fw_entry,
1389 const char *fwtypename,
1390 unsigned int fwcount,
1391 const char *fwnames[])
1392{
1393 unsigned int idx;
1394 int ret = -EINVAL;
1395 for (idx = 0; idx < fwcount; idx++) {
1396 ret = request_firmware(fw_entry,
1397 fwnames[idx],
1398 &hdw->usb_dev->dev);
1399 if (!ret) {
1400 trace_firmware("Located %s firmware: %s;"
1401 " uploading...",
1402 fwtypename,
1403 fwnames[idx]);
1404 return idx;
1405 }
1406 if (ret == -ENOENT) continue;
1407 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1408 "request_firmware fatal error with code=%d",ret);
1409 return ret;
1410 }
1411 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1412 "***WARNING***"
1413 " Device %s firmware"
1414 " seems to be missing.",
1415 fwtypename);
1416 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1417 "Did you install the pvrusb2 firmware files"
1418 " in their proper location?");
1419 if (fwcount == 1) {
1420 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1421 "request_firmware unable to locate %s file %s",
1422 fwtypename,fwnames[0]);
1423 } else {
1424 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1425 "request_firmware unable to locate"
1426 " one of the following %s files:",
1427 fwtypename);
1428 for (idx = 0; idx < fwcount; idx++) {
1429 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1430 "request_firmware: Failed to find %s",
1431 fwnames[idx]);
1432 }
1433 }
1434 return ret;
1435}
1436
1437
1438/*
1439 * pvr2_upload_firmware1().
1440 *
1441 * Send the 8051 firmware to the device. After the upload, arrange for
1442 * device to re-enumerate.
1443 *
1444 * NOTE : the pointer to the firmware data given by request_firmware()
1445 * is not suitable for an usb transaction.
1446 *
1447 */
Adrian Bunk07e337e2006-06-30 11:30:20 -03001448static int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03001449{
Mike Iselya0fd1cb2006-06-30 11:35:28 -03001450 const struct firmware *fw_entry = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03001451 void *fw_ptr;
1452 unsigned int pipe;
Mike Isely9081d902009-11-25 02:59:34 -03001453 unsigned int fwsize;
Mike Iselyd8554972006-06-26 20:58:46 -03001454 int ret;
1455 u16 address;
Mike Isely1d643a32007-09-08 22:18:50 -03001456
Mike Isely989eb152007-11-26 01:53:12 -03001457 if (!hdw->hdw_desc->fx2_firmware.cnt) {
Mike Isely1d643a32007-09-08 22:18:50 -03001458 hdw->fw1_state = FW1_STATE_OK;
Mike Isely56dcbfa2007-11-26 02:00:51 -03001459 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1460 "Connected device type defines"
1461 " no firmware to upload; ignoring firmware");
1462 return -ENOTTY;
Mike Isely1d643a32007-09-08 22:18:50 -03001463 }
1464
Mike Iselyd8554972006-06-26 20:58:46 -03001465 hdw->fw1_state = FW1_STATE_FAILED; // default result
1466
1467 trace_firmware("pvr2_upload_firmware1");
1468
1469 ret = pvr2_locate_firmware(hdw,&fw_entry,"fx2 controller",
Mike Isely989eb152007-11-26 01:53:12 -03001470 hdw->hdw_desc->fx2_firmware.cnt,
1471 hdw->hdw_desc->fx2_firmware.lst);
Mike Iselyd8554972006-06-26 20:58:46 -03001472 if (ret < 0) {
1473 if (ret == -ENOENT) hdw->fw1_state = FW1_STATE_MISSING;
1474 return ret;
1475 }
1476
Mike Iselyd8554972006-06-26 20:58:46 -03001477 usb_clear_halt(hdw->usb_dev, usb_sndbulkpipe(hdw->usb_dev, 0 & 0x7f));
1478
1479 pipe = usb_sndctrlpipe(hdw->usb_dev, 0);
Mike Isely9081d902009-11-25 02:59:34 -03001480 fwsize = fw_entry->size;
Mike Iselyd8554972006-06-26 20:58:46 -03001481
Mike Isely9081d902009-11-25 02:59:34 -03001482 if ((fwsize != 0x2000) &&
1483 (!(hdw->hdw_desc->flag_fx2_16kb && (fwsize == 0x4000)))) {
Mike Iselyc21c2db2009-11-25 02:49:21 -03001484 if (hdw->hdw_desc->flag_fx2_16kb) {
1485 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1486 "Wrong fx2 firmware size"
1487 " (expected 8192 or 16384, got %u)",
Mike Isely9081d902009-11-25 02:59:34 -03001488 fwsize);
Mike Iselyc21c2db2009-11-25 02:49:21 -03001489 } else {
1490 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1491 "Wrong fx2 firmware size"
1492 " (expected 8192, got %u)",
Mike Isely9081d902009-11-25 02:59:34 -03001493 fwsize);
Mike Iselyc21c2db2009-11-25 02:49:21 -03001494 }
Mike Iselyd8554972006-06-26 20:58:46 -03001495 release_firmware(fw_entry);
1496 return -ENOMEM;
1497 }
1498
1499 fw_ptr = kmalloc(0x800, GFP_KERNEL);
1500 if (fw_ptr == NULL){
1501 release_firmware(fw_entry);
1502 return -ENOMEM;
1503 }
1504
1505 /* We have to hold the CPU during firmware upload. */
1506 pvr2_hdw_cpureset_assert(hdw,1);
1507
1508 /* upload the firmware to address 0000-1fff in 2048 (=0x800) bytes
1509 chunk. */
1510
1511 ret = 0;
Mike Isely9081d902009-11-25 02:59:34 -03001512 for (address = 0; address < fwsize; address += 0x800) {
Mike Iselyd8554972006-06-26 20:58:46 -03001513 memcpy(fw_ptr, fw_entry->data + address, 0x800);
1514 ret += usb_control_msg(hdw->usb_dev, pipe, 0xa0, 0x40, address,
1515 0, fw_ptr, 0x800, HZ);
1516 }
1517
1518 trace_firmware("Upload done, releasing device's CPU");
1519
1520 /* Now release the CPU. It will disconnect and reconnect later. */
1521 pvr2_hdw_cpureset_assert(hdw,0);
1522
1523 kfree(fw_ptr);
1524 release_firmware(fw_entry);
1525
1526 trace_firmware("Upload done (%d bytes sent)",ret);
1527
Gary Francis75727462009-11-25 03:03:31 -03001528 /* We should have written fwsize bytes */
1529 if (ret == fwsize) {
Mike Iselyd8554972006-06-26 20:58:46 -03001530 hdw->fw1_state = FW1_STATE_RELOAD;
1531 return 0;
1532 }
1533
1534 return -EIO;
1535}
1536
1537
1538/*
1539 * pvr2_upload_firmware2()
1540 *
1541 * This uploads encoder firmware on endpoint 2.
1542 *
1543 */
1544
1545int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
1546{
Mike Iselya0fd1cb2006-06-30 11:35:28 -03001547 const struct firmware *fw_entry = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03001548 void *fw_ptr;
Mike Isely90060d32007-02-08 02:02:53 -03001549 unsigned int pipe, fw_len, fw_done, bcnt, icnt;
Mike Iselyd8554972006-06-26 20:58:46 -03001550 int actual_length;
1551 int ret = 0;
1552 int fwidx;
1553 static const char *fw_files[] = {
1554 CX2341X_FIRM_ENC_FILENAME,
1555 };
1556
Mike Isely989eb152007-11-26 01:53:12 -03001557 if (hdw->hdw_desc->flag_skip_cx23416_firmware) {
Mike Isely1d643a32007-09-08 22:18:50 -03001558 return 0;
1559 }
1560
Mike Iselyd8554972006-06-26 20:58:46 -03001561 trace_firmware("pvr2_upload_firmware2");
1562
1563 ret = pvr2_locate_firmware(hdw,&fw_entry,"encoder",
Ahmed S. Darwisheca8ebf2007-01-20 00:35:03 -03001564 ARRAY_SIZE(fw_files), fw_files);
Mike Iselyd8554972006-06-26 20:58:46 -03001565 if (ret < 0) return ret;
1566 fwidx = ret;
1567 ret = 0;
Mike Iselyb30d2442006-06-25 20:05:01 -03001568 /* Since we're about to completely reinitialize the encoder,
1569 invalidate our cached copy of its configuration state. Next
1570 time we configure the encoder, then we'll fully configure it. */
1571 hdw->enc_cur_valid = 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001572
Mike Iselyd913d632008-04-06 04:04:35 -03001573 /* Encoder is about to be reset so note that as far as we're
1574 concerned now, the encoder has never been run. */
1575 del_timer_sync(&hdw->encoder_run_timer);
1576 if (hdw->state_encoder_runok) {
1577 hdw->state_encoder_runok = 0;
1578 trace_stbit("state_encoder_runok",hdw->state_encoder_runok);
1579 }
1580
Mike Iselyd8554972006-06-26 20:58:46 -03001581 /* First prepare firmware loading */
1582 ret |= pvr2_write_register(hdw, 0x0048, 0xffffffff); /*interrupt mask*/
1583 ret |= pvr2_hdw_gpio_chg_dir(hdw,0xffffffff,0x00000088); /*gpio dir*/
1584 ret |= pvr2_hdw_gpio_chg_out(hdw,0xffffffff,0x00000008); /*gpio output state*/
1585 ret |= pvr2_hdw_cmd_deep_reset(hdw);
1586 ret |= pvr2_write_register(hdw, 0xa064, 0x00000000); /*APU command*/
1587 ret |= pvr2_hdw_gpio_chg_dir(hdw,0xffffffff,0x00000408); /*gpio dir*/
1588 ret |= pvr2_hdw_gpio_chg_out(hdw,0xffffffff,0x00000008); /*gpio output state*/
1589 ret |= pvr2_write_register(hdw, 0x9058, 0xffffffed); /*VPU ctrl*/
1590 ret |= pvr2_write_register(hdw, 0x9054, 0xfffffffd); /*reset hw blocks*/
1591 ret |= pvr2_write_register(hdw, 0x07f8, 0x80000800); /*encoder SDRAM refresh*/
1592 ret |= pvr2_write_register(hdw, 0x07fc, 0x0000001a); /*encoder SDRAM pre-charge*/
1593 ret |= pvr2_write_register(hdw, 0x0700, 0x00000000); /*I2C clock*/
1594 ret |= pvr2_write_register(hdw, 0xaa00, 0x00000000); /*unknown*/
1595 ret |= pvr2_write_register(hdw, 0xaa04, 0x00057810); /*unknown*/
1596 ret |= pvr2_write_register(hdw, 0xaa10, 0x00148500); /*unknown*/
1597 ret |= pvr2_write_register(hdw, 0xaa18, 0x00840000); /*unknown*/
Mike Isely1c9d10d2008-03-28 05:38:54 -03001598 ret |= pvr2_issue_simple_cmd(hdw,FX2CMD_FWPOST1);
1599 ret |= pvr2_issue_simple_cmd(hdw,FX2CMD_MEMSEL | (1 << 8) | (0 << 16));
Mike Iselyd8554972006-06-26 20:58:46 -03001600
1601 if (ret) {
1602 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1603 "firmware2 upload prep failed, ret=%d",ret);
1604 release_firmware(fw_entry);
Mike Isely21684ba2008-04-21 03:49:33 -03001605 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001606 }
1607
1608 /* Now send firmware */
1609
1610 fw_len = fw_entry->size;
1611
Mike Isely90060d32007-02-08 02:02:53 -03001612 if (fw_len % sizeof(u32)) {
Mike Iselyd8554972006-06-26 20:58:46 -03001613 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1614 "size of %s firmware"
Mike Isely48dc30a2007-03-03 10:13:05 -02001615 " must be a multiple of %zu bytes",
Mike Isely90060d32007-02-08 02:02:53 -03001616 fw_files[fwidx],sizeof(u32));
Mike Iselyd8554972006-06-26 20:58:46 -03001617 release_firmware(fw_entry);
Mike Isely21684ba2008-04-21 03:49:33 -03001618 ret = -EINVAL;
1619 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001620 }
1621
1622 fw_ptr = kmalloc(FIRMWARE_CHUNK_SIZE, GFP_KERNEL);
1623 if (fw_ptr == NULL){
1624 release_firmware(fw_entry);
1625 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1626 "failed to allocate memory for firmware2 upload");
Mike Isely21684ba2008-04-21 03:49:33 -03001627 ret = -ENOMEM;
1628 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001629 }
1630
1631 pipe = usb_sndbulkpipe(hdw->usb_dev, PVR2_FIRMWARE_ENDPOINT);
1632
Mike Isely90060d32007-02-08 02:02:53 -03001633 fw_done = 0;
1634 for (fw_done = 0; fw_done < fw_len;) {
1635 bcnt = fw_len - fw_done;
1636 if (bcnt > FIRMWARE_CHUNK_SIZE) bcnt = FIRMWARE_CHUNK_SIZE;
1637 memcpy(fw_ptr, fw_entry->data + fw_done, bcnt);
1638 /* Usbsnoop log shows that we must swap bytes... */
Mike Isely5f33df12008-08-30 15:09:31 -03001639 /* Some background info: The data being swapped here is a
1640 firmware image destined for the mpeg encoder chip that
1641 lives at the other end of a USB endpoint. The encoder
1642 chip always talks in 32 bit chunks and its storage is
1643 organized into 32 bit words. However from the file
1644 system to the encoder chip everything is purely a byte
1645 stream. The firmware file's contents are always 32 bit
1646 swapped from what the encoder expects. Thus the need
1647 always exists to swap the bytes regardless of the endian
1648 type of the host processor and therefore swab32() makes
1649 the most sense. */
Mike Isely90060d32007-02-08 02:02:53 -03001650 for (icnt = 0; icnt < bcnt/4 ; icnt++)
Harvey Harrison513edce2008-08-18 17:38:01 -03001651 ((u32 *)fw_ptr)[icnt] = swab32(((u32 *)fw_ptr)[icnt]);
Mike Iselyd8554972006-06-26 20:58:46 -03001652
Mike Isely90060d32007-02-08 02:02:53 -03001653 ret |= usb_bulk_msg(hdw->usb_dev, pipe, fw_ptr,bcnt,
Mike Iselyd8554972006-06-26 20:58:46 -03001654 &actual_length, HZ);
Mike Isely90060d32007-02-08 02:02:53 -03001655 ret |= (actual_length != bcnt);
1656 if (ret) break;
1657 fw_done += bcnt;
Mike Iselyd8554972006-06-26 20:58:46 -03001658 }
1659
1660 trace_firmware("upload of %s : %i / %i ",
1661 fw_files[fwidx],fw_done,fw_len);
1662
1663 kfree(fw_ptr);
1664 release_firmware(fw_entry);
1665
1666 if (ret) {
1667 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1668 "firmware2 upload transfer failure");
Mike Isely21684ba2008-04-21 03:49:33 -03001669 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001670 }
1671
1672 /* Finish upload */
1673
1674 ret |= pvr2_write_register(hdw, 0x9054, 0xffffffff); /*reset hw blocks*/
1675 ret |= pvr2_write_register(hdw, 0x9058, 0xffffffe8); /*VPU ctrl*/
Mike Isely1c9d10d2008-03-28 05:38:54 -03001676 ret |= pvr2_issue_simple_cmd(hdw,FX2CMD_MEMSEL | (1 << 8) | (0 << 16));
Mike Iselyd8554972006-06-26 20:58:46 -03001677
1678 if (ret) {
1679 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1680 "firmware2 upload post-proc failure");
Mike Iselyd8554972006-06-26 20:58:46 -03001681 }
Mike Isely21684ba2008-04-21 03:49:33 -03001682
1683 done:
Mike Isely1df59f02008-04-21 03:50:39 -03001684 if (hdw->hdw_desc->signal_routing_scheme ==
1685 PVR2_ROUTING_SCHEME_GOTVIEW) {
1686 /* Ensure that GPIO 11 is set to output for GOTVIEW
1687 hardware. */
1688 pvr2_hdw_gpio_chg_dir(hdw,(1 << 11),~0);
1689 }
Mike Iselyd8554972006-06-26 20:58:46 -03001690 return ret;
1691}
1692
1693
Mike Isely681c7392007-11-26 01:48:52 -03001694static const char *pvr2_get_state_name(unsigned int st)
Mike Iselyd8554972006-06-26 20:58:46 -03001695{
Mike Isely681c7392007-11-26 01:48:52 -03001696 if (st < ARRAY_SIZE(pvr2_state_names)) {
1697 return pvr2_state_names[st];
Mike Iselyd8554972006-06-26 20:58:46 -03001698 }
Mike Isely681c7392007-11-26 01:48:52 -03001699 return "???";
Mike Iselyd8554972006-06-26 20:58:46 -03001700}
1701
Mike Isely681c7392007-11-26 01:48:52 -03001702static int pvr2_decoder_enable(struct pvr2_hdw *hdw,int enablefl)
Mike Iselyd8554972006-06-26 20:58:46 -03001703{
Mike Iselyaf78e162009-03-07 00:21:30 -03001704 /* Even though we really only care about the video decoder chip at
1705 this point, we'll broadcast stream on/off to all sub-devices
1706 anyway, just in case somebody else wants to hear the
1707 command... */
Mike Iselye2605082009-03-07 01:50:48 -03001708 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 stream=%s",
1709 (enablefl ? "on" : "off"));
Mike Iselyaf78e162009-03-07 00:21:30 -03001710 v4l2_device_call_all(&hdw->v4l2_dev, 0, video, s_stream, enablefl);
Andy Walls3ccc6462009-12-24 13:06:08 -03001711 v4l2_device_call_all(&hdw->v4l2_dev, 0, audio, s_stream, enablefl);
Mike Iselyaf78e162009-03-07 00:21:30 -03001712 if (hdw->decoder_client_id) {
1713 /* We get here if the encoder has been noticed. Otherwise
1714 we'll issue a warning to the user (which should
1715 normally never happen). */
1716 return 0;
1717 }
1718 if (!hdw->flag_decoder_missed) {
1719 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1720 "WARNING: No decoder present");
1721 hdw->flag_decoder_missed = !0;
1722 trace_stbit("flag_decoder_missed",
1723 hdw->flag_decoder_missed);
1724 }
1725 return -EIO;
Mike Iselyd8554972006-06-26 20:58:46 -03001726}
1727
1728
Mike Isely681c7392007-11-26 01:48:52 -03001729int pvr2_hdw_get_state(struct pvr2_hdw *hdw)
1730{
1731 return hdw->master_state;
1732}
1733
1734
1735static int pvr2_hdw_untrip_unlocked(struct pvr2_hdw *hdw)
1736{
1737 if (!hdw->flag_tripped) return 0;
1738 hdw->flag_tripped = 0;
1739 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1740 "Clearing driver error statuss");
1741 return !0;
1742}
1743
1744
1745int pvr2_hdw_untrip(struct pvr2_hdw *hdw)
1746{
1747 int fl;
1748 LOCK_TAKE(hdw->big_lock); do {
1749 fl = pvr2_hdw_untrip_unlocked(hdw);
1750 } while (0); LOCK_GIVE(hdw->big_lock);
1751 if (fl) pvr2_hdw_state_sched(hdw);
1752 return 0;
1753}
1754
1755
Mike Isely681c7392007-11-26 01:48:52 -03001756
1757
Mike Iselyd8554972006-06-26 20:58:46 -03001758int pvr2_hdw_get_streaming(struct pvr2_hdw *hdw)
1759{
Mike Isely681c7392007-11-26 01:48:52 -03001760 return hdw->state_pipeline_req != 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001761}
1762
1763
1764int pvr2_hdw_set_streaming(struct pvr2_hdw *hdw,int enable_flag)
1765{
Mike Isely681c7392007-11-26 01:48:52 -03001766 int ret,st;
Mike Iselyd8554972006-06-26 20:58:46 -03001767 LOCK_TAKE(hdw->big_lock); do {
Mike Isely681c7392007-11-26 01:48:52 -03001768 pvr2_hdw_untrip_unlocked(hdw);
1769 if ((!enable_flag) != !(hdw->state_pipeline_req)) {
1770 hdw->state_pipeline_req = enable_flag != 0;
1771 pvr2_trace(PVR2_TRACE_START_STOP,
1772 "/*--TRACE_STREAM--*/ %s",
1773 enable_flag ? "enable" : "disable");
1774 }
1775 pvr2_hdw_state_sched(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03001776 } while (0); LOCK_GIVE(hdw->big_lock);
Mike Isely681c7392007-11-26 01:48:52 -03001777 if ((ret = pvr2_hdw_wait(hdw,0)) < 0) return ret;
1778 if (enable_flag) {
1779 while ((st = hdw->master_state) != PVR2_STATE_RUN) {
1780 if (st != PVR2_STATE_READY) return -EIO;
1781 if ((ret = pvr2_hdw_wait(hdw,st)) < 0) return ret;
1782 }
1783 }
Mike Iselyd8554972006-06-26 20:58:46 -03001784 return 0;
1785}
1786
1787
1788int pvr2_hdw_set_stream_type(struct pvr2_hdw *hdw,enum pvr2_config config)
1789{
Mike Isely681c7392007-11-26 01:48:52 -03001790 int fl;
Mike Iselyd8554972006-06-26 20:58:46 -03001791 LOCK_TAKE(hdw->big_lock);
Mike Isely681c7392007-11-26 01:48:52 -03001792 if ((fl = (hdw->desired_stream_type != config)) != 0) {
1793 hdw->desired_stream_type = config;
1794 hdw->state_pipeline_config = 0;
1795 trace_stbit("state_pipeline_config",
1796 hdw->state_pipeline_config);
1797 pvr2_hdw_state_sched(hdw);
1798 }
Mike Iselyd8554972006-06-26 20:58:46 -03001799 LOCK_GIVE(hdw->big_lock);
Mike Isely681c7392007-11-26 01:48:52 -03001800 if (fl) return 0;
1801 return pvr2_hdw_wait(hdw,0);
Mike Iselyd8554972006-06-26 20:58:46 -03001802}
1803
1804
1805static int get_default_tuner_type(struct pvr2_hdw *hdw)
1806{
1807 int unit_number = hdw->unit_number;
1808 int tp = -1;
1809 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1810 tp = tuner[unit_number];
1811 }
1812 if (tp < 0) return -EINVAL;
1813 hdw->tuner_type = tp;
Mike Iselyaaf78842007-11-26 02:04:11 -03001814 hdw->tuner_updated = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03001815 return 0;
1816}
1817
1818
1819static v4l2_std_id get_default_standard(struct pvr2_hdw *hdw)
1820{
1821 int unit_number = hdw->unit_number;
1822 int tp = 0;
1823 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1824 tp = video_std[unit_number];
Mike Isely6a540252007-12-02 23:51:34 -03001825 if (tp) return tp;
Mike Iselyd8554972006-06-26 20:58:46 -03001826 }
Mike Isely6a540252007-12-02 23:51:34 -03001827 return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001828}
1829
1830
1831static unsigned int get_default_error_tolerance(struct pvr2_hdw *hdw)
1832{
1833 int unit_number = hdw->unit_number;
1834 int tp = 0;
1835 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1836 tp = tolerance[unit_number];
1837 }
1838 return tp;
1839}
1840
1841
1842static int pvr2_hdw_check_firmware(struct pvr2_hdw *hdw)
1843{
1844 /* Try a harmless request to fetch the eeprom's address over
1845 endpoint 1. See what happens. Only the full FX2 image can
1846 respond to this. If this probe fails then likely the FX2
1847 firmware needs be loaded. */
1848 int result;
1849 LOCK_TAKE(hdw->ctl_lock); do {
Michael Krufky8d364362007-01-22 02:17:55 -03001850 hdw->cmd_buffer[0] = FX2CMD_GET_EEPROM_ADDR;
Mike Iselyd8554972006-06-26 20:58:46 -03001851 result = pvr2_send_request_ex(hdw,HZ*1,!0,
1852 hdw->cmd_buffer,1,
1853 hdw->cmd_buffer,1);
1854 if (result < 0) break;
1855 } while(0); LOCK_GIVE(hdw->ctl_lock);
1856 if (result) {
1857 pvr2_trace(PVR2_TRACE_INIT,
1858 "Probe of device endpoint 1 result status %d",
1859 result);
1860 } else {
1861 pvr2_trace(PVR2_TRACE_INIT,
1862 "Probe of device endpoint 1 succeeded");
1863 }
1864 return result == 0;
1865}
1866
Mike Isely9f66d4e2007-09-08 22:28:51 -03001867struct pvr2_std_hack {
1868 v4l2_std_id pat; /* Pattern to match */
1869 v4l2_std_id msk; /* Which bits we care about */
1870 v4l2_std_id std; /* What additional standards or default to set */
1871};
1872
1873/* This data structure labels specific combinations of standards from
1874 tveeprom that we'll try to recognize. If we recognize one, then assume
1875 a specified default standard to use. This is here because tveeprom only
1876 tells us about available standards not the intended default standard (if
1877 any) for the device in question. We guess the default based on what has
1878 been reported as available. Note that this is only for guessing a
1879 default - which can always be overridden explicitly - and if the user
1880 has otherwise named a default then that default will always be used in
1881 place of this table. */
Tobias Klauserebff0332008-04-22 14:45:45 -03001882static const struct pvr2_std_hack std_eeprom_maps[] = {
Mike Isely9f66d4e2007-09-08 22:28:51 -03001883 { /* PAL(B/G) */
1884 .pat = V4L2_STD_B|V4L2_STD_GH,
1885 .std = V4L2_STD_PAL_B|V4L2_STD_PAL_B1|V4L2_STD_PAL_G,
1886 },
1887 { /* NTSC(M) */
1888 .pat = V4L2_STD_MN,
1889 .std = V4L2_STD_NTSC_M,
1890 },
1891 { /* PAL(I) */
1892 .pat = V4L2_STD_PAL_I,
1893 .std = V4L2_STD_PAL_I,
1894 },
1895 { /* SECAM(L/L') */
1896 .pat = V4L2_STD_SECAM_L|V4L2_STD_SECAM_LC,
1897 .std = V4L2_STD_SECAM_L|V4L2_STD_SECAM_LC,
1898 },
1899 { /* PAL(D/D1/K) */
1900 .pat = V4L2_STD_DK,
Roel Kluinea2562d2007-12-02 23:04:57 -03001901 .std = V4L2_STD_PAL_D|V4L2_STD_PAL_D1|V4L2_STD_PAL_K,
Mike Isely9f66d4e2007-09-08 22:28:51 -03001902 },
1903};
1904
Mike Iselyd8554972006-06-26 20:58:46 -03001905static void pvr2_hdw_setup_std(struct pvr2_hdw *hdw)
1906{
1907 char buf[40];
1908 unsigned int bcnt;
Mike Isely3d290bd2007-12-03 01:47:12 -03001909 v4l2_std_id std1,std2,std3;
Mike Iselyd8554972006-06-26 20:58:46 -03001910
1911 std1 = get_default_standard(hdw);
Mike Isely3d290bd2007-12-03 01:47:12 -03001912 std3 = std1 ? 0 : hdw->hdw_desc->default_std_mask;
Mike Iselyd8554972006-06-26 20:58:46 -03001913
1914 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),hdw->std_mask_eeprom);
Mike Isely56585382007-09-08 22:32:12 -03001915 pvr2_trace(PVR2_TRACE_STD,
Mike Isely56dcbfa2007-11-26 02:00:51 -03001916 "Supported video standard(s) reported available"
1917 " in hardware: %.*s",
Mike Iselyd8554972006-06-26 20:58:46 -03001918 bcnt,buf);
1919
1920 hdw->std_mask_avail = hdw->std_mask_eeprom;
1921
Mike Isely3d290bd2007-12-03 01:47:12 -03001922 std2 = (std1|std3) & ~hdw->std_mask_avail;
Mike Iselyd8554972006-06-26 20:58:46 -03001923 if (std2) {
1924 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std2);
Mike Isely56585382007-09-08 22:32:12 -03001925 pvr2_trace(PVR2_TRACE_STD,
Mike Iselyd8554972006-06-26 20:58:46 -03001926 "Expanding supported video standards"
1927 " to include: %.*s",
1928 bcnt,buf);
1929 hdw->std_mask_avail |= std2;
1930 }
1931
1932 pvr2_hdw_internal_set_std_avail(hdw);
1933
1934 if (std1) {
1935 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std1);
Mike Isely56585382007-09-08 22:32:12 -03001936 pvr2_trace(PVR2_TRACE_STD,
Mike Iselyd8554972006-06-26 20:58:46 -03001937 "Initial video standard forced to %.*s",
1938 bcnt,buf);
1939 hdw->std_mask_cur = std1;
1940 hdw->std_dirty = !0;
1941 pvr2_hdw_internal_find_stdenum(hdw);
1942 return;
1943 }
Mike Isely3d290bd2007-12-03 01:47:12 -03001944 if (std3) {
1945 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std3);
1946 pvr2_trace(PVR2_TRACE_STD,
1947 "Initial video standard"
1948 " (determined by device type): %.*s",bcnt,buf);
1949 hdw->std_mask_cur = std3;
1950 hdw->std_dirty = !0;
1951 pvr2_hdw_internal_find_stdenum(hdw);
1952 return;
1953 }
Mike Iselyd8554972006-06-26 20:58:46 -03001954
Mike Isely9f66d4e2007-09-08 22:28:51 -03001955 {
1956 unsigned int idx;
1957 for (idx = 0; idx < ARRAY_SIZE(std_eeprom_maps); idx++) {
1958 if (std_eeprom_maps[idx].msk ?
1959 ((std_eeprom_maps[idx].pat ^
1960 hdw->std_mask_eeprom) &
1961 std_eeprom_maps[idx].msk) :
1962 (std_eeprom_maps[idx].pat !=
1963 hdw->std_mask_eeprom)) continue;
1964 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),
1965 std_eeprom_maps[idx].std);
Mike Isely56585382007-09-08 22:32:12 -03001966 pvr2_trace(PVR2_TRACE_STD,
Mike Isely9f66d4e2007-09-08 22:28:51 -03001967 "Initial video standard guessed as %.*s",
1968 bcnt,buf);
1969 hdw->std_mask_cur = std_eeprom_maps[idx].std;
1970 hdw->std_dirty = !0;
1971 pvr2_hdw_internal_find_stdenum(hdw);
1972 return;
1973 }
1974 }
1975
Mike Iselyd8554972006-06-26 20:58:46 -03001976 if (hdw->std_enum_cnt > 1) {
1977 // Autoselect the first listed standard
1978 hdw->std_enum_cur = 1;
1979 hdw->std_mask_cur = hdw->std_defs[hdw->std_enum_cur-1].id;
1980 hdw->std_dirty = !0;
Mike Isely56585382007-09-08 22:32:12 -03001981 pvr2_trace(PVR2_TRACE_STD,
Mike Iselyd8554972006-06-26 20:58:46 -03001982 "Initial video standard auto-selected to %s",
1983 hdw->std_defs[hdw->std_enum_cur-1].name);
1984 return;
1985 }
1986
Mike Isely0885ba12006-06-25 21:30:47 -03001987 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Iselyd8554972006-06-26 20:58:46 -03001988 "Unable to select a viable initial video standard");
1989}
1990
1991
Mike Iselye9c64a72009-03-06 23:42:20 -03001992static unsigned int pvr2_copy_i2c_addr_list(
1993 unsigned short *dst, const unsigned char *src,
1994 unsigned int dst_max)
1995{
Mike Isely3ab8d292009-03-07 01:37:58 -03001996 unsigned int cnt = 0;
Mike Iselye9c64a72009-03-06 23:42:20 -03001997 if (!src) return 0;
1998 while (src[cnt] && (cnt + 1) < dst_max) {
1999 dst[cnt] = src[cnt];
2000 cnt++;
2001 }
2002 dst[cnt] = I2C_CLIENT_END;
2003 return cnt;
2004}
2005
2006
Mike Iselye17d7872009-06-20 14:45:52 -03002007static void pvr2_hdw_cx25840_vbi_hack(struct pvr2_hdw *hdw)
2008{
2009 /*
2010 Mike Isely <isely@pobox.com> 19-Nov-2006 - This bit of nuttiness
2011 for cx25840 causes that module to correctly set up its video
2012 scaling. This is really a problem in the cx25840 module itself,
2013 but we work around it here. The problem has not been seen in
2014 ivtv because there VBI is supported and set up. We don't do VBI
2015 here (at least not yet) and thus we never attempted to even set
2016 it up.
2017 */
2018 struct v4l2_format fmt;
2019 if (hdw->decoder_client_id != PVR2_CLIENT_ID_CX25840) {
2020 /* We're not using a cx25840 so don't enable the hack */
2021 return;
2022 }
2023
2024 pvr2_trace(PVR2_TRACE_INIT,
2025 "Module ID %u:"
2026 " Executing cx25840 VBI hack",
2027 hdw->decoder_client_id);
2028 memset(&fmt, 0, sizeof(fmt));
2029 fmt.type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
2030 v4l2_device_call_all(&hdw->v4l2_dev, hdw->decoder_client_id,
Hans Verkuil09419af32010-03-14 12:27:48 -03002031 vbi, s_sliced_fmt, &fmt.fmt.sliced);
Mike Iselye17d7872009-06-20 14:45:52 -03002032}
2033
2034
Mike Isely1ab5e742009-03-07 00:24:24 -03002035static int pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
2036 const struct pvr2_device_client_desc *cd)
Mike Iselye9c64a72009-03-06 23:42:20 -03002037{
2038 const char *fname;
2039 unsigned char mid;
2040 struct v4l2_subdev *sd;
2041 unsigned int i2ccnt;
2042 const unsigned char *p;
2043 /* Arbitrary count - max # i2c addresses we will probe */
2044 unsigned short i2caddr[25];
2045
2046 mid = cd->module_id;
2047 fname = (mid < ARRAY_SIZE(module_names)) ? module_names[mid] : NULL;
2048 if (!fname) {
2049 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Isely27108142009-10-12 00:21:20 -03002050 "Module ID %u for device %s has no name?"
2051 " The driver might have a configuration problem.",
Mike Iselye9c64a72009-03-06 23:42:20 -03002052 mid,
2053 hdw->hdw_desc->description);
Mike Isely1ab5e742009-03-07 00:24:24 -03002054 return -EINVAL;
Mike Iselye9c64a72009-03-06 23:42:20 -03002055 }
Mike Iselybd14d4f2009-03-07 00:56:52 -03002056 pvr2_trace(PVR2_TRACE_INIT,
2057 "Module ID %u (%s) for device %s being loaded...",
2058 mid, fname,
2059 hdw->hdw_desc->description);
Mike Iselye9c64a72009-03-06 23:42:20 -03002060
2061 i2ccnt = pvr2_copy_i2c_addr_list(i2caddr, cd->i2c_address_list,
2062 ARRAY_SIZE(i2caddr));
2063 if (!i2ccnt && ((p = (mid < ARRAY_SIZE(module_i2c_addresses)) ?
2064 module_i2c_addresses[mid] : NULL) != NULL)) {
2065 /* Second chance: Try default i2c address list */
2066 i2ccnt = pvr2_copy_i2c_addr_list(i2caddr, p,
2067 ARRAY_SIZE(i2caddr));
Mike Iselybd14d4f2009-03-07 00:56:52 -03002068 if (i2ccnt) {
2069 pvr2_trace(PVR2_TRACE_INIT,
2070 "Module ID %u:"
2071 " Using default i2c address list",
2072 mid);
2073 }
Mike Iselye9c64a72009-03-06 23:42:20 -03002074 }
2075
2076 if (!i2ccnt) {
2077 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Isely1ab5e742009-03-07 00:24:24 -03002078 "Module ID %u (%s) for device %s:"
Mike Isely27108142009-10-12 00:21:20 -03002079 " No i2c addresses."
2080 " The driver might have a configuration problem.",
Mike Isely1ab5e742009-03-07 00:24:24 -03002081 mid, fname, hdw->hdw_desc->description);
2082 return -EINVAL;
Mike Iselye9c64a72009-03-06 23:42:20 -03002083 }
2084
Mike Iselye9c64a72009-03-06 23:42:20 -03002085 if (i2ccnt == 1) {
Mike Iselybd14d4f2009-03-07 00:56:52 -03002086 pvr2_trace(PVR2_TRACE_INIT,
2087 "Module ID %u:"
2088 " Setting up with specified i2c address 0x%x",
2089 mid, i2caddr[0]);
Hans Verkuile6574f22009-04-01 03:57:53 -03002090 sd = v4l2_i2c_new_subdev(&hdw->v4l2_dev, &hdw->i2c_adap,
Laurent Pinchart9a1f8b32010-09-24 10:16:44 -03002091 fname, i2caddr[0], NULL);
Mike Iselye9c64a72009-03-06 23:42:20 -03002092 } else {
Mike Iselybd14d4f2009-03-07 00:56:52 -03002093 pvr2_trace(PVR2_TRACE_INIT,
2094 "Module ID %u:"
2095 " Setting up with address probe list",
2096 mid);
Hans Verkuil53dacb12009-08-10 02:49:08 -03002097 sd = v4l2_i2c_new_subdev(&hdw->v4l2_dev, &hdw->i2c_adap,
Laurent Pinchart9a1f8b32010-09-24 10:16:44 -03002098 fname, 0, i2caddr);
Mike Iselye9c64a72009-03-06 23:42:20 -03002099 }
2100
Mike Isely446dfdc2009-03-06 23:58:15 -03002101 if (!sd) {
2102 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Isely27108142009-10-12 00:21:20 -03002103 "Module ID %u (%s) for device %s failed to load."
2104 " Possible missing sub-device kernel module or"
2105 " initialization failure within module.",
Mike Isely1ab5e742009-03-07 00:24:24 -03002106 mid, fname, hdw->hdw_desc->description);
2107 return -EIO;
Mike Isely446dfdc2009-03-06 23:58:15 -03002108 }
2109
2110 /* Tag this sub-device instance with the module ID we know about.
2111 In other places we'll use that tag to determine if the instance
2112 requires special handling. */
2113 sd->grp_id = mid;
2114
Mike Iselybd14d4f2009-03-07 00:56:52 -03002115 pvr2_trace(PVR2_TRACE_INFO, "Attached sub-driver %s", fname);
Mike Iselya932f502009-03-06 23:47:10 -03002116
Mike Iselye9c64a72009-03-06 23:42:20 -03002117
Mike Isely00e5f732009-03-07 00:17:11 -03002118 /* client-specific setup... */
2119 switch (mid) {
2120 case PVR2_CLIENT_ID_CX25840:
Mike Isely00e5f732009-03-07 00:17:11 -03002121 case PVR2_CLIENT_ID_SAA7115:
2122 hdw->decoder_client_id = mid;
2123 break;
2124 default: break;
2125 }
Mike Isely1ab5e742009-03-07 00:24:24 -03002126
2127 return 0;
Mike Iselye9c64a72009-03-06 23:42:20 -03002128}
2129
2130
2131static void pvr2_hdw_load_modules(struct pvr2_hdw *hdw)
2132{
2133 unsigned int idx;
2134 const struct pvr2_string_table *cm;
2135 const struct pvr2_device_client_table *ct;
Mike Isely1ab5e742009-03-07 00:24:24 -03002136 int okFl = !0;
Mike Iselye9c64a72009-03-06 23:42:20 -03002137
2138 cm = &hdw->hdw_desc->client_modules;
2139 for (idx = 0; idx < cm->cnt; idx++) {
2140 request_module(cm->lst[idx]);
2141 }
2142
2143 ct = &hdw->hdw_desc->client_table;
2144 for (idx = 0; idx < ct->cnt; idx++) {
Mike Iselybd14d4f2009-03-07 00:56:52 -03002145 if (pvr2_hdw_load_subdev(hdw, &ct->lst[idx]) < 0) okFl = 0;
Mike Iselye9c64a72009-03-06 23:42:20 -03002146 }
Mike Isely27108142009-10-12 00:21:20 -03002147 if (!okFl) {
2148 hdw->flag_modulefail = !0;
2149 pvr2_hdw_render_useless(hdw);
2150 }
Mike Iselye9c64a72009-03-06 23:42:20 -03002151}
2152
2153
Mike Iselyd8554972006-06-26 20:58:46 -03002154static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
2155{
2156 int ret;
2157 unsigned int idx;
2158 struct pvr2_ctrl *cptr;
2159 int reloadFl = 0;
Mike Isely989eb152007-11-26 01:53:12 -03002160 if (hdw->hdw_desc->fx2_firmware.cnt) {
Mike Isely1d643a32007-09-08 22:18:50 -03002161 if (!reloadFl) {
2162 reloadFl =
2163 (hdw->usb_intf->cur_altsetting->desc.bNumEndpoints
2164 == 0);
2165 if (reloadFl) {
2166 pvr2_trace(PVR2_TRACE_INIT,
2167 "USB endpoint config looks strange"
2168 "; possibly firmware needs to be"
2169 " loaded");
2170 }
2171 }
2172 if (!reloadFl) {
2173 reloadFl = !pvr2_hdw_check_firmware(hdw);
2174 if (reloadFl) {
2175 pvr2_trace(PVR2_TRACE_INIT,
2176 "Check for FX2 firmware failed"
2177 "; possibly firmware needs to be"
2178 " loaded");
2179 }
2180 }
Mike Iselyd8554972006-06-26 20:58:46 -03002181 if (reloadFl) {
Mike Isely1d643a32007-09-08 22:18:50 -03002182 if (pvr2_upload_firmware1(hdw) != 0) {
2183 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2184 "Failure uploading firmware1");
2185 }
2186 return;
Mike Iselyd8554972006-06-26 20:58:46 -03002187 }
2188 }
Mike Iselyd8554972006-06-26 20:58:46 -03002189 hdw->fw1_state = FW1_STATE_OK;
2190
Mike Iselyd8554972006-06-26 20:58:46 -03002191 if (!pvr2_hdw_dev_ok(hdw)) return;
2192
Mike Isely27764722009-03-07 01:57:25 -03002193 hdw->force_dirty = !0;
2194
Mike Isely989eb152007-11-26 01:53:12 -03002195 if (!hdw->hdw_desc->flag_no_powerup) {
Mike Isely1d643a32007-09-08 22:18:50 -03002196 pvr2_hdw_cmd_powerup(hdw);
2197 if (!pvr2_hdw_dev_ok(hdw)) return;
Mike Iselyd8554972006-06-26 20:58:46 -03002198 }
2199
Mike Isely31335b12008-07-25 19:35:31 -03002200 /* Take the IR chip out of reset, if appropriate */
Mike Isely27eab382009-04-06 01:51:38 -03002201 if (hdw->ir_scheme_active == PVR2_IR_SCHEME_ZILOG) {
Mike Isely31335b12008-07-25 19:35:31 -03002202 pvr2_issue_simple_cmd(hdw,
2203 FX2CMD_HCW_ZILOG_RESET |
2204 (1 << 8) |
2205 ((0) << 16));
2206 }
2207
Mike Iselyd8554972006-06-26 20:58:46 -03002208 // This step MUST happen after the earlier powerup step.
2209 pvr2_i2c_core_init(hdw);
2210 if (!pvr2_hdw_dev_ok(hdw)) return;
2211
Mike Iselye9c64a72009-03-06 23:42:20 -03002212 pvr2_hdw_load_modules(hdw);
Mike Isely1ab5e742009-03-07 00:24:24 -03002213 if (!pvr2_hdw_dev_ok(hdw)) return;
Mike Iselye9c64a72009-03-06 23:42:20 -03002214
Hans Verkuilcc26b072009-03-29 19:20:26 -03002215 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, load_fw);
Mike Isely5c6cb4e2009-03-07 01:59:34 -03002216
Mike Iselyc05c0462006-06-25 20:04:25 -03002217 for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002218 cptr = hdw->controls + idx;
2219 if (cptr->info->skip_init) continue;
2220 if (!cptr->info->set_value) continue;
2221 cptr->info->set_value(cptr,~0,cptr->info->default_value);
2222 }
2223
Mike Iselye17d7872009-06-20 14:45:52 -03002224 pvr2_hdw_cx25840_vbi_hack(hdw);
2225
Mike Isely1bde0282006-12-27 23:30:13 -03002226 /* Set up special default values for the television and radio
2227 frequencies here. It's not really important what these defaults
2228 are, but I set them to something usable in the Chicago area just
2229 to make driver testing a little easier. */
2230
Michael Krufky5a4f5da62008-05-11 16:37:50 -03002231 hdw->freqValTelevision = default_tv_freq;
2232 hdw->freqValRadio = default_radio_freq;
Mike Isely1bde0282006-12-27 23:30:13 -03002233
Mike Iselyd8554972006-06-26 20:58:46 -03002234 // Do not use pvr2_reset_ctl_endpoints() here. It is not
2235 // thread-safe against the normal pvr2_send_request() mechanism.
2236 // (We should make it thread safe).
2237
Mike Iselyaaf78842007-11-26 02:04:11 -03002238 if (hdw->hdw_desc->flag_has_hauppauge_rom) {
2239 ret = pvr2_hdw_get_eeprom_addr(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002240 if (!pvr2_hdw_dev_ok(hdw)) return;
Mike Iselyaaf78842007-11-26 02:04:11 -03002241 if (ret < 0) {
2242 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2243 "Unable to determine location of eeprom,"
2244 " skipping");
2245 } else {
2246 hdw->eeprom_addr = ret;
2247 pvr2_eeprom_analyze(hdw);
2248 if (!pvr2_hdw_dev_ok(hdw)) return;
2249 }
2250 } else {
2251 hdw->tuner_type = hdw->hdw_desc->default_tuner_type;
2252 hdw->tuner_updated = !0;
2253 hdw->std_mask_eeprom = V4L2_STD_ALL;
Mike Iselyd8554972006-06-26 20:58:46 -03002254 }
2255
Mike Isely13a88792009-01-14 04:22:56 -03002256 if (hdw->serial_number) {
2257 idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
2258 "sn-%lu", hdw->serial_number);
2259 } else if (hdw->unit_number >= 0) {
2260 idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
2261 "unit-%c",
2262 hdw->unit_number + 'a');
2263 } else {
2264 idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
2265 "unit-??");
2266 }
2267 hdw->identifier[idx] = 0;
2268
Mike Iselyd8554972006-06-26 20:58:46 -03002269 pvr2_hdw_setup_std(hdw);
2270
2271 if (!get_default_tuner_type(hdw)) {
2272 pvr2_trace(PVR2_TRACE_INIT,
2273 "pvr2_hdw_setup: Tuner type overridden to %d",
2274 hdw->tuner_type);
2275 }
2276
Mike Iselyd8554972006-06-26 20:58:46 -03002277
2278 if (!pvr2_hdw_dev_ok(hdw)) return;
2279
Mike Isely1df59f02008-04-21 03:50:39 -03002280 if (hdw->hdw_desc->signal_routing_scheme ==
2281 PVR2_ROUTING_SCHEME_GOTVIEW) {
2282 /* Ensure that GPIO 11 is set to output for GOTVIEW
2283 hardware. */
2284 pvr2_hdw_gpio_chg_dir(hdw,(1 << 11),~0);
2285 }
2286
Mike Isely681c7392007-11-26 01:48:52 -03002287 pvr2_hdw_commit_setup(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002288
2289 hdw->vid_stream = pvr2_stream_create();
2290 if (!pvr2_hdw_dev_ok(hdw)) return;
2291 pvr2_trace(PVR2_TRACE_INIT,
2292 "pvr2_hdw_setup: video stream is %p",hdw->vid_stream);
2293 if (hdw->vid_stream) {
2294 idx = get_default_error_tolerance(hdw);
2295 if (idx) {
2296 pvr2_trace(PVR2_TRACE_INIT,
2297 "pvr2_hdw_setup: video stream %p"
2298 " setting tolerance %u",
2299 hdw->vid_stream,idx);
2300 }
2301 pvr2_stream_setup(hdw->vid_stream,hdw->usb_dev,
2302 PVR2_VID_ENDPOINT,idx);
2303 }
2304
2305 if (!pvr2_hdw_dev_ok(hdw)) return;
2306
Mike Iselyd8554972006-06-26 20:58:46 -03002307 hdw->flag_init_ok = !0;
Mike Isely681c7392007-11-26 01:48:52 -03002308
2309 pvr2_hdw_state_sched(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002310}
2311
2312
Mike Isely681c7392007-11-26 01:48:52 -03002313/* Set up the structure and attempt to put the device into a usable state.
2314 This can be a time-consuming operation, which is why it is not done
2315 internally as part of the create() step. */
2316static void pvr2_hdw_setup(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002317{
2318 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_setup(hdw=%p) begin",hdw);
Mike Isely681c7392007-11-26 01:48:52 -03002319 do {
Mike Iselyd8554972006-06-26 20:58:46 -03002320 pvr2_hdw_setup_low(hdw);
2321 pvr2_trace(PVR2_TRACE_INIT,
2322 "pvr2_hdw_setup(hdw=%p) done, ok=%d init_ok=%d",
Mike Isely681c7392007-11-26 01:48:52 -03002323 hdw,pvr2_hdw_dev_ok(hdw),hdw->flag_init_ok);
Mike Iselyd8554972006-06-26 20:58:46 -03002324 if (pvr2_hdw_dev_ok(hdw)) {
Mike Isely681c7392007-11-26 01:48:52 -03002325 if (hdw->flag_init_ok) {
Mike Iselyd8554972006-06-26 20:58:46 -03002326 pvr2_trace(
2327 PVR2_TRACE_INFO,
2328 "Device initialization"
2329 " completed successfully.");
2330 break;
2331 }
2332 if (hdw->fw1_state == FW1_STATE_RELOAD) {
2333 pvr2_trace(
2334 PVR2_TRACE_INFO,
2335 "Device microcontroller firmware"
2336 " (re)loaded; it should now reset"
2337 " and reconnect.");
2338 break;
2339 }
2340 pvr2_trace(
2341 PVR2_TRACE_ERROR_LEGS,
2342 "Device initialization was not successful.");
2343 if (hdw->fw1_state == FW1_STATE_MISSING) {
2344 pvr2_trace(
2345 PVR2_TRACE_ERROR_LEGS,
2346 "Giving up since device"
2347 " microcontroller firmware"
2348 " appears to be missing.");
2349 break;
2350 }
2351 }
Mike Isely27108142009-10-12 00:21:20 -03002352 if (hdw->flag_modulefail) {
2353 pvr2_trace(
2354 PVR2_TRACE_ERROR_LEGS,
2355 "***WARNING*** pvrusb2 driver initialization"
2356 " failed due to the failure of one or more"
2357 " sub-device kernel modules.");
2358 pvr2_trace(
2359 PVR2_TRACE_ERROR_LEGS,
2360 "You need to resolve the failing condition"
2361 " before this driver can function. There"
2362 " should be some earlier messages giving more"
2363 " information about the problem.");
Mike Isely515ebf72009-10-12 00:27:38 -03002364 break;
Mike Isely27108142009-10-12 00:21:20 -03002365 }
Mike Iselyd8554972006-06-26 20:58:46 -03002366 if (procreload) {
2367 pvr2_trace(
2368 PVR2_TRACE_ERROR_LEGS,
2369 "Attempting pvrusb2 recovery by reloading"
2370 " primary firmware.");
2371 pvr2_trace(
2372 PVR2_TRACE_ERROR_LEGS,
2373 "If this works, device should disconnect"
2374 " and reconnect in a sane state.");
2375 hdw->fw1_state = FW1_STATE_UNKNOWN;
2376 pvr2_upload_firmware1(hdw);
2377 } else {
2378 pvr2_trace(
2379 PVR2_TRACE_ERROR_LEGS,
2380 "***WARNING*** pvrusb2 device hardware"
2381 " appears to be jammed"
2382 " and I can't clear it.");
2383 pvr2_trace(
2384 PVR2_TRACE_ERROR_LEGS,
2385 "You might need to power cycle"
2386 " the pvrusb2 device"
2387 " in order to recover.");
2388 }
Mike Isely681c7392007-11-26 01:48:52 -03002389 } while (0);
Mike Iselyd8554972006-06-26 20:58:46 -03002390 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_setup(hdw=%p) end",hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002391}
2392
2393
Mike Iselyc4a88282008-04-22 14:45:44 -03002394/* Perform second stage initialization. Set callback pointer first so that
2395 we can avoid a possible initialization race (if the kernel thread runs
2396 before the callback has been set). */
Mike Isely794b1602008-04-22 14:45:45 -03002397int pvr2_hdw_initialize(struct pvr2_hdw *hdw,
2398 void (*callback_func)(void *),
2399 void *callback_data)
Mike Iselyc4a88282008-04-22 14:45:44 -03002400{
2401 LOCK_TAKE(hdw->big_lock); do {
Mike Isely97f26ff2008-04-07 02:22:43 -03002402 if (hdw->flag_disconnected) {
2403 /* Handle a race here: If we're already
2404 disconnected by this point, then give up. If we
2405 get past this then we'll remain connected for
2406 the duration of initialization since the entire
2407 initialization sequence is now protected by the
2408 big_lock. */
2409 break;
2410 }
Mike Iselyc4a88282008-04-22 14:45:44 -03002411 hdw->state_data = callback_data;
2412 hdw->state_func = callback_func;
Mike Isely97f26ff2008-04-07 02:22:43 -03002413 pvr2_hdw_setup(hdw);
Mike Iselyc4a88282008-04-22 14:45:44 -03002414 } while (0); LOCK_GIVE(hdw->big_lock);
Mike Isely794b1602008-04-22 14:45:45 -03002415 return hdw->flag_init_ok;
Mike Iselyc4a88282008-04-22 14:45:44 -03002416}
2417
2418
2419/* Create, set up, and return a structure for interacting with the
2420 underlying hardware. */
Mike Iselyd8554972006-06-26 20:58:46 -03002421struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
2422 const struct usb_device_id *devid)
2423{
Mike Isely7fb20fa2008-04-22 14:45:37 -03002424 unsigned int idx,cnt1,cnt2,m;
Mike Iselyfe15f132008-08-30 18:11:40 -03002425 struct pvr2_hdw *hdw = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002426 int valid_std_mask;
2427 struct pvr2_ctrl *cptr;
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002428 struct usb_device *usb_dev;
Mike Isely989eb152007-11-26 01:53:12 -03002429 const struct pvr2_device_desc *hdw_desc;
Mike Iselyd8554972006-06-26 20:58:46 -03002430 __u8 ifnum;
Mike Iselyb30d2442006-06-25 20:05:01 -03002431 struct v4l2_queryctrl qctrl;
2432 struct pvr2_ctl_info *ciptr;
Mike Iselyd8554972006-06-26 20:58:46 -03002433
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002434 usb_dev = interface_to_usbdev(intf);
2435
Mike Iselyd130fa82007-12-08 17:20:06 -03002436 hdw_desc = (const struct pvr2_device_desc *)(devid->driver_info);
Mike Iselyd8554972006-06-26 20:58:46 -03002437
Mike Iselyfe15f132008-08-30 18:11:40 -03002438 if (hdw_desc == NULL) {
2439 pvr2_trace(PVR2_TRACE_INIT, "pvr2_hdw_create:"
2440 " No device description pointer,"
2441 " unable to continue.");
2442 pvr2_trace(PVR2_TRACE_INIT, "If you have a new device type,"
2443 " please contact Mike Isely <isely@pobox.com>"
2444 " to get it included in the driver\n");
2445 goto fail;
2446 }
2447
Mike Iselyca545f72007-01-20 00:37:11 -03002448 hdw = kzalloc(sizeof(*hdw),GFP_KERNEL);
Mike Iselyd8554972006-06-26 20:58:46 -03002449 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_create: hdw=%p, type \"%s\"",
Mike Isely989eb152007-11-26 01:53:12 -03002450 hdw,hdw_desc->description);
Mike Iselye67e3762009-10-12 00:28:19 -03002451 pvr2_trace(PVR2_TRACE_INFO, "Hardware description: %s",
Mike Isely00970be2009-10-12 00:23:37 -03002452 hdw_desc->description);
Mike Isely8fd04442010-05-15 00:13:35 -03002453 if (hdw_desc->flag_is_experimental) {
2454 pvr2_trace(PVR2_TRACE_INFO, "**********");
2455 pvr2_trace(PVR2_TRACE_INFO,
2456 "WARNING: Support for this device (%s) is"
2457 " experimental.", hdw_desc->description);
2458 pvr2_trace(PVR2_TRACE_INFO,
2459 "Important functionality might not be"
2460 " entirely working.");
2461 pvr2_trace(PVR2_TRACE_INFO,
2462 "Please consider contacting the driver author to"
2463 " help with further stabilization of the driver.");
2464 pvr2_trace(PVR2_TRACE_INFO, "**********");
2465 }
Mike Iselyd8554972006-06-26 20:58:46 -03002466 if (!hdw) goto fail;
Mike Isely681c7392007-11-26 01:48:52 -03002467
2468 init_timer(&hdw->quiescent_timer);
2469 hdw->quiescent_timer.data = (unsigned long)hdw;
2470 hdw->quiescent_timer.function = pvr2_hdw_quiescent_timeout;
2471
Mike Isely6e931372010-02-06 02:10:38 -03002472 init_timer(&hdw->decoder_stabilization_timer);
2473 hdw->decoder_stabilization_timer.data = (unsigned long)hdw;
2474 hdw->decoder_stabilization_timer.function =
2475 pvr2_hdw_decoder_stabilization_timeout;
2476
Mike Isely681c7392007-11-26 01:48:52 -03002477 init_timer(&hdw->encoder_wait_timer);
2478 hdw->encoder_wait_timer.data = (unsigned long)hdw;
2479 hdw->encoder_wait_timer.function = pvr2_hdw_encoder_wait_timeout;
2480
Mike Iselyd913d632008-04-06 04:04:35 -03002481 init_timer(&hdw->encoder_run_timer);
2482 hdw->encoder_run_timer.data = (unsigned long)hdw;
2483 hdw->encoder_run_timer.function = pvr2_hdw_encoder_run_timeout;
2484
Mike Isely681c7392007-11-26 01:48:52 -03002485 hdw->master_state = PVR2_STATE_DEAD;
2486
2487 init_waitqueue_head(&hdw->state_wait_data);
2488
Mike Isely18103c52007-01-20 00:09:47 -03002489 hdw->tuner_signal_stale = !0;
Mike Iselyb30d2442006-06-25 20:05:01 -03002490 cx2341x_fill_defaults(&hdw->enc_ctl_state);
Mike Iselyd8554972006-06-26 20:58:46 -03002491
Mike Isely7fb20fa2008-04-22 14:45:37 -03002492 /* Calculate which inputs are OK */
2493 m = 0;
2494 if (hdw_desc->flag_has_analogtuner) m |= 1 << PVR2_CVAL_INPUT_TV;
Mike Iselye8f5bac2008-04-22 14:45:40 -03002495 if (hdw_desc->digital_control_scheme != PVR2_DIGITAL_SCHEME_NONE) {
2496 m |= 1 << PVR2_CVAL_INPUT_DTV;
2497 }
Mike Isely7fb20fa2008-04-22 14:45:37 -03002498 if (hdw_desc->flag_has_svideo) m |= 1 << PVR2_CVAL_INPUT_SVIDEO;
2499 if (hdw_desc->flag_has_composite) m |= 1 << PVR2_CVAL_INPUT_COMPOSITE;
2500 if (hdw_desc->flag_has_fmradio) m |= 1 << PVR2_CVAL_INPUT_RADIO;
2501 hdw->input_avail_mask = m;
Mike Isely1cb03b72008-04-21 03:47:43 -03002502 hdw->input_allowed_mask = hdw->input_avail_mask;
Mike Isely7fb20fa2008-04-22 14:45:37 -03002503
Mike Isely62433e32008-04-22 14:45:40 -03002504 /* If not a hybrid device, pathway_state never changes. So
2505 initialize it here to what it should forever be. */
2506 if (!(hdw->input_avail_mask & (1 << PVR2_CVAL_INPUT_DTV))) {
2507 hdw->pathway_state = PVR2_PATHWAY_ANALOG;
2508 } else if (!(hdw->input_avail_mask & (1 << PVR2_CVAL_INPUT_TV))) {
2509 hdw->pathway_state = PVR2_PATHWAY_DIGITAL;
2510 }
2511
Mike Iselyc05c0462006-06-25 20:04:25 -03002512 hdw->control_cnt = CTRLDEF_COUNT;
Mike Iselyb30d2442006-06-25 20:05:01 -03002513 hdw->control_cnt += MPEGDEF_COUNT;
Mike Iselyca545f72007-01-20 00:37:11 -03002514 hdw->controls = kzalloc(sizeof(struct pvr2_ctrl) * hdw->control_cnt,
Mike Iselyd8554972006-06-26 20:58:46 -03002515 GFP_KERNEL);
2516 if (!hdw->controls) goto fail;
Mike Isely989eb152007-11-26 01:53:12 -03002517 hdw->hdw_desc = hdw_desc;
Mike Isely27eab382009-04-06 01:51:38 -03002518 hdw->ir_scheme_active = hdw->hdw_desc->ir_scheme;
Mike Iselyc05c0462006-06-25 20:04:25 -03002519 for (idx = 0; idx < hdw->control_cnt; idx++) {
2520 cptr = hdw->controls + idx;
2521 cptr->hdw = hdw;
2522 }
Mike Iselyd8554972006-06-26 20:58:46 -03002523 for (idx = 0; idx < 32; idx++) {
2524 hdw->std_mask_ptrs[idx] = hdw->std_mask_names[idx];
2525 }
Mike Iselyc05c0462006-06-25 20:04:25 -03002526 for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002527 cptr = hdw->controls + idx;
Mike Iselyd8554972006-06-26 20:58:46 -03002528 cptr->info = control_defs+idx;
2529 }
Mike Iselydbc40a02008-04-22 14:45:39 -03002530
2531 /* Ensure that default input choice is a valid one. */
2532 m = hdw->input_avail_mask;
2533 if (m) for (idx = 0; idx < (sizeof(m) << 3); idx++) {
2534 if (!((1 << idx) & m)) continue;
2535 hdw->input_val = idx;
2536 break;
2537 }
2538
Mike Iselyb30d2442006-06-25 20:05:01 -03002539 /* Define and configure additional controls from cx2341x module. */
Mike Iselyca545f72007-01-20 00:37:11 -03002540 hdw->mpeg_ctrl_info = kzalloc(
Mike Iselyb30d2442006-06-25 20:05:01 -03002541 sizeof(*(hdw->mpeg_ctrl_info)) * MPEGDEF_COUNT, GFP_KERNEL);
2542 if (!hdw->mpeg_ctrl_info) goto fail;
Mike Iselyb30d2442006-06-25 20:05:01 -03002543 for (idx = 0; idx < MPEGDEF_COUNT; idx++) {
2544 cptr = hdw->controls + idx + CTRLDEF_COUNT;
2545 ciptr = &(hdw->mpeg_ctrl_info[idx].info);
2546 ciptr->desc = hdw->mpeg_ctrl_info[idx].desc;
2547 ciptr->name = mpeg_ids[idx].strid;
2548 ciptr->v4l_id = mpeg_ids[idx].id;
2549 ciptr->skip_init = !0;
2550 ciptr->get_value = ctrl_cx2341x_get;
2551 ciptr->get_v4lflags = ctrl_cx2341x_getv4lflags;
2552 ciptr->is_dirty = ctrl_cx2341x_is_dirty;
2553 if (!idx) ciptr->clear_dirty = ctrl_cx2341x_clear_dirty;
2554 qctrl.id = ciptr->v4l_id;
2555 cx2341x_ctrl_query(&hdw->enc_ctl_state,&qctrl);
2556 if (!(qctrl.flags & V4L2_CTRL_FLAG_READ_ONLY)) {
2557 ciptr->set_value = ctrl_cx2341x_set;
2558 }
2559 strncpy(hdw->mpeg_ctrl_info[idx].desc,qctrl.name,
2560 PVR2_CTLD_INFO_DESC_SIZE);
2561 hdw->mpeg_ctrl_info[idx].desc[PVR2_CTLD_INFO_DESC_SIZE-1] = 0;
2562 ciptr->default_value = qctrl.default_value;
2563 switch (qctrl.type) {
2564 default:
2565 case V4L2_CTRL_TYPE_INTEGER:
2566 ciptr->type = pvr2_ctl_int;
2567 ciptr->def.type_int.min_value = qctrl.minimum;
2568 ciptr->def.type_int.max_value = qctrl.maximum;
2569 break;
2570 case V4L2_CTRL_TYPE_BOOLEAN:
2571 ciptr->type = pvr2_ctl_bool;
2572 break;
2573 case V4L2_CTRL_TYPE_MENU:
2574 ciptr->type = pvr2_ctl_enum;
2575 ciptr->def.type_enum.value_names =
Hans Verkuile0e31cd2008-06-22 12:03:28 -03002576 cx2341x_ctrl_get_menu(&hdw->enc_ctl_state,
2577 ciptr->v4l_id);
Mike Iselyb30d2442006-06-25 20:05:01 -03002578 for (cnt1 = 0;
2579 ciptr->def.type_enum.value_names[cnt1] != NULL;
2580 cnt1++) { }
2581 ciptr->def.type_enum.count = cnt1;
2582 break;
2583 }
2584 cptr->info = ciptr;
2585 }
Mike Iselyd8554972006-06-26 20:58:46 -03002586
2587 // Initialize video standard enum dynamic control
2588 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDENUM);
2589 if (cptr) {
2590 memcpy(&hdw->std_info_enum,cptr->info,
2591 sizeof(hdw->std_info_enum));
2592 cptr->info = &hdw->std_info_enum;
2593
2594 }
2595 // Initialize control data regarding video standard masks
2596 valid_std_mask = pvr2_std_get_usable();
2597 for (idx = 0; idx < 32; idx++) {
2598 if (!(valid_std_mask & (1 << idx))) continue;
2599 cnt1 = pvr2_std_id_to_str(
2600 hdw->std_mask_names[idx],
2601 sizeof(hdw->std_mask_names[idx])-1,
2602 1 << idx);
2603 hdw->std_mask_names[idx][cnt1] = 0;
2604 }
2605 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDAVAIL);
2606 if (cptr) {
2607 memcpy(&hdw->std_info_avail,cptr->info,
2608 sizeof(hdw->std_info_avail));
2609 cptr->info = &hdw->std_info_avail;
2610 hdw->std_info_avail.def.type_bitmask.bit_names =
2611 hdw->std_mask_ptrs;
2612 hdw->std_info_avail.def.type_bitmask.valid_bits =
2613 valid_std_mask;
2614 }
2615 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDCUR);
2616 if (cptr) {
2617 memcpy(&hdw->std_info_cur,cptr->info,
2618 sizeof(hdw->std_info_cur));
2619 cptr->info = &hdw->std_info_cur;
2620 hdw->std_info_cur.def.type_bitmask.bit_names =
2621 hdw->std_mask_ptrs;
2622 hdw->std_info_avail.def.type_bitmask.valid_bits =
2623 valid_std_mask;
2624 }
2625
Mike Isely432907f2008-08-31 21:02:20 -03002626 hdw->cropcap_stale = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03002627 hdw->eeprom_addr = -1;
2628 hdw->unit_number = -1;
Mike Isely80793842006-12-27 23:12:28 -03002629 hdw->v4l_minor_number_video = -1;
2630 hdw->v4l_minor_number_vbi = -1;
Mike Iselyfd5a75f2006-12-27 23:11:22 -03002631 hdw->v4l_minor_number_radio = -1;
Mike Iselyd8554972006-06-26 20:58:46 -03002632 hdw->ctl_write_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL);
2633 if (!hdw->ctl_write_buffer) goto fail;
2634 hdw->ctl_read_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL);
2635 if (!hdw->ctl_read_buffer) goto fail;
2636 hdw->ctl_write_urb = usb_alloc_urb(0,GFP_KERNEL);
2637 if (!hdw->ctl_write_urb) goto fail;
2638 hdw->ctl_read_urb = usb_alloc_urb(0,GFP_KERNEL);
2639 if (!hdw->ctl_read_urb) goto fail;
2640
Janne Grunau70ad6382009-04-01 08:46:50 -03002641 if (v4l2_device_register(&intf->dev, &hdw->v4l2_dev) != 0) {
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002642 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2643 "Error registering with v4l core, giving up");
2644 goto fail;
2645 }
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002646 mutex_lock(&pvr2_unit_mtx); do {
Mike Iselyd8554972006-06-26 20:58:46 -03002647 for (idx = 0; idx < PVR_NUM; idx++) {
2648 if (unit_pointers[idx]) continue;
2649 hdw->unit_number = idx;
2650 unit_pointers[idx] = hdw;
2651 break;
2652 }
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002653 } while (0); mutex_unlock(&pvr2_unit_mtx);
Mike Iselyd8554972006-06-26 20:58:46 -03002654
2655 cnt1 = 0;
2656 cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"pvrusb2");
2657 cnt1 += cnt2;
2658 if (hdw->unit_number >= 0) {
2659 cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"_%c",
2660 ('a' + hdw->unit_number));
2661 cnt1 += cnt2;
2662 }
2663 if (cnt1 >= sizeof(hdw->name)) cnt1 = sizeof(hdw->name)-1;
2664 hdw->name[cnt1] = 0;
2665
Mike Isely681c7392007-11-26 01:48:52 -03002666 hdw->workqueue = create_singlethread_workqueue(hdw->name);
2667 INIT_WORK(&hdw->workpoll,pvr2_hdw_worker_poll);
Mike Isely681c7392007-11-26 01:48:52 -03002668
Mike Iselyd8554972006-06-26 20:58:46 -03002669 pvr2_trace(PVR2_TRACE_INIT,"Driver unit number is %d, name is %s",
2670 hdw->unit_number,hdw->name);
2671
2672 hdw->tuner_type = -1;
2673 hdw->flag_ok = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03002674
2675 hdw->usb_intf = intf;
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002676 hdw->usb_dev = usb_dev;
Mike Iselyd8554972006-06-26 20:58:46 -03002677
Mike Isely87e34952009-01-23 01:20:24 -03002678 usb_make_path(hdw->usb_dev, hdw->bus_info, sizeof(hdw->bus_info));
Mike Isely31a18542007-04-08 01:11:47 -03002679
Mike Iselyd8554972006-06-26 20:58:46 -03002680 ifnum = hdw->usb_intf->cur_altsetting->desc.bInterfaceNumber;
2681 usb_set_interface(hdw->usb_dev,ifnum,0);
2682
2683 mutex_init(&hdw->ctl_lock_mutex);
2684 mutex_init(&hdw->big_lock_mutex);
2685
2686 return hdw;
2687 fail:
2688 if (hdw) {
Mike Isely681c7392007-11-26 01:48:52 -03002689 del_timer_sync(&hdw->quiescent_timer);
Mike Isely6e931372010-02-06 02:10:38 -03002690 del_timer_sync(&hdw->decoder_stabilization_timer);
Mike Iselyd913d632008-04-06 04:04:35 -03002691 del_timer_sync(&hdw->encoder_run_timer);
Mike Isely681c7392007-11-26 01:48:52 -03002692 del_timer_sync(&hdw->encoder_wait_timer);
2693 if (hdw->workqueue) {
2694 flush_workqueue(hdw->workqueue);
2695 destroy_workqueue(hdw->workqueue);
2696 hdw->workqueue = NULL;
2697 }
Mariusz Kozlowski5e55d2c2006-11-08 15:34:31 +01002698 usb_free_urb(hdw->ctl_read_urb);
2699 usb_free_urb(hdw->ctl_write_urb);
Mariusz Kozlowski22071a42007-01-07 10:33:39 -03002700 kfree(hdw->ctl_read_buffer);
2701 kfree(hdw->ctl_write_buffer);
2702 kfree(hdw->controls);
2703 kfree(hdw->mpeg_ctrl_info);
Mike Isely681c7392007-11-26 01:48:52 -03002704 kfree(hdw->std_defs);
2705 kfree(hdw->std_enum_names);
Mike Iselyd8554972006-06-26 20:58:46 -03002706 kfree(hdw);
2707 }
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002708 return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002709}
2710
2711
2712/* Remove _all_ associations between this driver and the underlying USB
2713 layer. */
Adrian Bunk07e337e2006-06-30 11:30:20 -03002714static void pvr2_hdw_remove_usb_stuff(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002715{
2716 if (hdw->flag_disconnected) return;
2717 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_remove_usb_stuff: hdw=%p",hdw);
2718 if (hdw->ctl_read_urb) {
2719 usb_kill_urb(hdw->ctl_read_urb);
2720 usb_free_urb(hdw->ctl_read_urb);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002721 hdw->ctl_read_urb = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002722 }
2723 if (hdw->ctl_write_urb) {
2724 usb_kill_urb(hdw->ctl_write_urb);
2725 usb_free_urb(hdw->ctl_write_urb);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002726 hdw->ctl_write_urb = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002727 }
2728 if (hdw->ctl_read_buffer) {
2729 kfree(hdw->ctl_read_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002730 hdw->ctl_read_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002731 }
2732 if (hdw->ctl_write_buffer) {
2733 kfree(hdw->ctl_write_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002734 hdw->ctl_write_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002735 }
Mike Iselyd8554972006-06-26 20:58:46 -03002736 hdw->flag_disconnected = !0;
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002737 /* If we don't do this, then there will be a dangling struct device
2738 reference to our disappearing device persisting inside the V4L
2739 core... */
Mike Iselydc070bc2009-03-25 00:30:45 -03002740 v4l2_device_disconnect(&hdw->v4l2_dev);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002741 hdw->usb_dev = NULL;
2742 hdw->usb_intf = NULL;
Mike Isely681c7392007-11-26 01:48:52 -03002743 pvr2_hdw_render_useless(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002744}
2745
2746
2747/* Destroy hardware interaction structure */
2748void pvr2_hdw_destroy(struct pvr2_hdw *hdw)
2749{
Mike Isely401c27c2007-09-08 22:11:46 -03002750 if (!hdw) return;
Mike Iselyd8554972006-06-26 20:58:46 -03002751 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_destroy: hdw=%p",hdw);
Mike Isely681c7392007-11-26 01:48:52 -03002752 if (hdw->workqueue) {
2753 flush_workqueue(hdw->workqueue);
2754 destroy_workqueue(hdw->workqueue);
2755 hdw->workqueue = NULL;
2756 }
Mike Isely8f591002008-04-22 14:45:45 -03002757 del_timer_sync(&hdw->quiescent_timer);
Mike Isely6e931372010-02-06 02:10:38 -03002758 del_timer_sync(&hdw->decoder_stabilization_timer);
Mike Iselyd913d632008-04-06 04:04:35 -03002759 del_timer_sync(&hdw->encoder_run_timer);
Mike Isely8f591002008-04-22 14:45:45 -03002760 del_timer_sync(&hdw->encoder_wait_timer);
Mike Iselyd8554972006-06-26 20:58:46 -03002761 if (hdw->fw_buffer) {
2762 kfree(hdw->fw_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002763 hdw->fw_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002764 }
2765 if (hdw->vid_stream) {
2766 pvr2_stream_destroy(hdw->vid_stream);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002767 hdw->vid_stream = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002768 }
Mike Iselyd8554972006-06-26 20:58:46 -03002769 pvr2_i2c_core_done(hdw);
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002770 v4l2_device_unregister(&hdw->v4l2_dev);
Mike Iselyd8554972006-06-26 20:58:46 -03002771 pvr2_hdw_remove_usb_stuff(hdw);
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002772 mutex_lock(&pvr2_unit_mtx); do {
Mike Iselyd8554972006-06-26 20:58:46 -03002773 if ((hdw->unit_number >= 0) &&
2774 (hdw->unit_number < PVR_NUM) &&
2775 (unit_pointers[hdw->unit_number] == hdw)) {
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002776 unit_pointers[hdw->unit_number] = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002777 }
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002778 } while (0); mutex_unlock(&pvr2_unit_mtx);
Mariusz Kozlowski22071a42007-01-07 10:33:39 -03002779 kfree(hdw->controls);
2780 kfree(hdw->mpeg_ctrl_info);
2781 kfree(hdw->std_defs);
2782 kfree(hdw->std_enum_names);
Mike Iselyd8554972006-06-26 20:58:46 -03002783 kfree(hdw);
2784}
2785
2786
Mike Iselyd8554972006-06-26 20:58:46 -03002787int pvr2_hdw_dev_ok(struct pvr2_hdw *hdw)
2788{
2789 return (hdw && hdw->flag_ok);
2790}
2791
2792
2793/* Called when hardware has been unplugged */
2794void pvr2_hdw_disconnect(struct pvr2_hdw *hdw)
2795{
2796 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_disconnect(hdw=%p)",hdw);
2797 LOCK_TAKE(hdw->big_lock);
2798 LOCK_TAKE(hdw->ctl_lock);
2799 pvr2_hdw_remove_usb_stuff(hdw);
2800 LOCK_GIVE(hdw->ctl_lock);
2801 LOCK_GIVE(hdw->big_lock);
2802}
2803
2804
2805// Attempt to autoselect an appropriate value for std_enum_cur given
2806// whatever is currently in std_mask_cur
Adrian Bunk07e337e2006-06-30 11:30:20 -03002807static void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002808{
2809 unsigned int idx;
2810 for (idx = 1; idx < hdw->std_enum_cnt; idx++) {
2811 if (hdw->std_defs[idx-1].id == hdw->std_mask_cur) {
2812 hdw->std_enum_cur = idx;
2813 return;
2814 }
2815 }
2816 hdw->std_enum_cur = 0;
2817}
2818
2819
2820// Calculate correct set of enumerated standards based on currently known
2821// set of available standards bits.
Adrian Bunk07e337e2006-06-30 11:30:20 -03002822static void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002823{
2824 struct v4l2_standard *newstd;
2825 unsigned int std_cnt;
2826 unsigned int idx;
2827
2828 newstd = pvr2_std_create_enum(&std_cnt,hdw->std_mask_avail);
2829
2830 if (hdw->std_defs) {
2831 kfree(hdw->std_defs);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002832 hdw->std_defs = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002833 }
2834 hdw->std_enum_cnt = 0;
2835 if (hdw->std_enum_names) {
2836 kfree(hdw->std_enum_names);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002837 hdw->std_enum_names = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002838 }
2839
2840 if (!std_cnt) {
2841 pvr2_trace(
2842 PVR2_TRACE_ERROR_LEGS,
2843 "WARNING: Failed to identify any viable standards");
2844 }
2845 hdw->std_enum_names = kmalloc(sizeof(char *)*(std_cnt+1),GFP_KERNEL);
2846 hdw->std_enum_names[0] = "none";
2847 for (idx = 0; idx < std_cnt; idx++) {
2848 hdw->std_enum_names[idx+1] =
2849 newstd[idx].name;
2850 }
2851 // Set up the dynamic control for this standard
2852 hdw->std_info_enum.def.type_enum.value_names = hdw->std_enum_names;
2853 hdw->std_info_enum.def.type_enum.count = std_cnt+1;
2854 hdw->std_defs = newstd;
2855 hdw->std_enum_cnt = std_cnt+1;
2856 hdw->std_enum_cur = 0;
2857 hdw->std_info_cur.def.type_bitmask.valid_bits = hdw->std_mask_avail;
2858}
2859
2860
2861int pvr2_hdw_get_stdenum_value(struct pvr2_hdw *hdw,
2862 struct v4l2_standard *std,
2863 unsigned int idx)
2864{
2865 int ret = -EINVAL;
2866 if (!idx) return ret;
2867 LOCK_TAKE(hdw->big_lock); do {
2868 if (idx >= hdw->std_enum_cnt) break;
2869 idx--;
2870 memcpy(std,hdw->std_defs+idx,sizeof(*std));
2871 ret = 0;
2872 } while (0); LOCK_GIVE(hdw->big_lock);
2873 return ret;
2874}
2875
2876
2877/* Get the number of defined controls */
2878unsigned int pvr2_hdw_get_ctrl_count(struct pvr2_hdw *hdw)
2879{
Mike Iselyc05c0462006-06-25 20:04:25 -03002880 return hdw->control_cnt;
Mike Iselyd8554972006-06-26 20:58:46 -03002881}
2882
2883
2884/* Retrieve a control handle given its index (0..count-1) */
2885struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_index(struct pvr2_hdw *hdw,
2886 unsigned int idx)
2887{
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002888 if (idx >= hdw->control_cnt) return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002889 return hdw->controls + idx;
2890}
2891
2892
2893/* Retrieve a control handle given its index (0..count-1) */
2894struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_id(struct pvr2_hdw *hdw,
2895 unsigned int ctl_id)
2896{
2897 struct pvr2_ctrl *cptr;
2898 unsigned int idx;
2899 int i;
2900
2901 /* This could be made a lot more efficient, but for now... */
Mike Iselyc05c0462006-06-25 20:04:25 -03002902 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002903 cptr = hdw->controls + idx;
2904 i = cptr->info->internal_id;
2905 if (i && (i == ctl_id)) return cptr;
2906 }
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002907 return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002908}
2909
2910
Mike Iselya761f432006-06-25 20:04:44 -03002911/* Given a V4L ID, retrieve the control structure associated with it. */
Mike Iselyd8554972006-06-26 20:58:46 -03002912struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *hdw,unsigned int ctl_id)
2913{
2914 struct pvr2_ctrl *cptr;
2915 unsigned int idx;
2916 int i;
2917
2918 /* This could be made a lot more efficient, but for now... */
Mike Iselyc05c0462006-06-25 20:04:25 -03002919 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002920 cptr = hdw->controls + idx;
2921 i = cptr->info->v4l_id;
2922 if (i && (i == ctl_id)) return cptr;
2923 }
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002924 return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002925}
2926
2927
Mike Iselya761f432006-06-25 20:04:44 -03002928/* Given a V4L ID for its immediate predecessor, retrieve the control
2929 structure associated with it. */
2930struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *hdw,
2931 unsigned int ctl_id)
2932{
2933 struct pvr2_ctrl *cptr,*cp2;
2934 unsigned int idx;
2935 int i;
2936
2937 /* This could be made a lot more efficient, but for now... */
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002938 cp2 = NULL;
Mike Iselya761f432006-06-25 20:04:44 -03002939 for (idx = 0; idx < hdw->control_cnt; idx++) {
2940 cptr = hdw->controls + idx;
2941 i = cptr->info->v4l_id;
2942 if (!i) continue;
2943 if (i <= ctl_id) continue;
2944 if (cp2 && (cp2->info->v4l_id < i)) continue;
2945 cp2 = cptr;
2946 }
2947 return cp2;
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002948 return NULL;
Mike Iselya761f432006-06-25 20:04:44 -03002949}
2950
2951
Mike Iselyd8554972006-06-26 20:58:46 -03002952static const char *get_ctrl_typename(enum pvr2_ctl_type tp)
2953{
2954 switch (tp) {
2955 case pvr2_ctl_int: return "integer";
2956 case pvr2_ctl_enum: return "enum";
Mike Isely33213962006-06-25 20:04:40 -03002957 case pvr2_ctl_bool: return "boolean";
Mike Iselyd8554972006-06-26 20:58:46 -03002958 case pvr2_ctl_bitmask: return "bitmask";
2959 }
2960 return "";
2961}
2962
2963
Mike Isely2641df32009-03-07 00:13:25 -03002964static void pvr2_subdev_set_control(struct pvr2_hdw *hdw, int id,
2965 const char *name, int val)
2966{
2967 struct v4l2_control ctrl;
2968 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 %s=%d", name, val);
2969 memset(&ctrl, 0, sizeof(ctrl));
2970 ctrl.id = id;
2971 ctrl.value = val;
2972 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, s_ctrl, &ctrl);
2973}
2974
2975#define PVR2_SUBDEV_SET_CONTROL(hdw, id, lab) \
Mike Isely27764722009-03-07 01:57:25 -03002976 if ((hdw)->lab##_dirty || (hdw)->force_dirty) { \
Mike Isely2641df32009-03-07 00:13:25 -03002977 pvr2_subdev_set_control(hdw, id, #lab, (hdw)->lab##_val); \
2978 }
2979
Mike Isely5ceaad12009-03-07 00:01:20 -03002980/* Execute whatever commands are required to update the state of all the
Mike Isely2641df32009-03-07 00:13:25 -03002981 sub-devices so that they match our current control values. */
Mike Isely5ceaad12009-03-07 00:01:20 -03002982static void pvr2_subdev_update(struct pvr2_hdw *hdw)
2983{
Mike Iselyedb9dcb2009-03-07 00:37:10 -03002984 struct v4l2_subdev *sd;
2985 unsigned int id;
2986 pvr2_subdev_update_func fp;
2987
Mike Isely75212a02009-03-07 01:48:42 -03002988 pvr2_trace(PVR2_TRACE_CHIPS, "subdev update...");
2989
Mike Isely27764722009-03-07 01:57:25 -03002990 if (hdw->tuner_updated || hdw->force_dirty) {
Mike Isely75212a02009-03-07 01:48:42 -03002991 struct tuner_setup setup;
2992 pvr2_trace(PVR2_TRACE_CHIPS, "subdev tuner set_type(%d)",
2993 hdw->tuner_type);
2994 if (((int)(hdw->tuner_type)) >= 0) {
Mike Iselyfcd62cf2009-04-01 01:55:26 -03002995 memset(&setup, 0, sizeof(setup));
Mike Isely75212a02009-03-07 01:48:42 -03002996 setup.addr = ADDR_UNSET;
2997 setup.type = hdw->tuner_type;
2998 setup.mode_mask = T_RADIO | T_ANALOG_TV;
2999 v4l2_device_call_all(&hdw->v4l2_dev, 0,
3000 tuner, s_type_addr, &setup);
3001 }
3002 }
3003
Mike Isely27764722009-03-07 01:57:25 -03003004 if (hdw->input_dirty || hdw->std_dirty || hdw->force_dirty) {
Mike Iselyb4818802009-03-07 01:46:17 -03003005 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_standard");
Mike Isely2641df32009-03-07 00:13:25 -03003006 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
3007 v4l2_device_call_all(&hdw->v4l2_dev, 0,
3008 tuner, s_radio);
3009 } else {
3010 v4l2_std_id vs;
3011 vs = hdw->std_mask_cur;
3012 v4l2_device_call_all(&hdw->v4l2_dev, 0,
Hans Verkuilf41737e2009-04-01 03:52:39 -03003013 core, s_std, vs);
Mike Iselya6862da2009-06-20 14:50:14 -03003014 pvr2_hdw_cx25840_vbi_hack(hdw);
Mike Isely2641df32009-03-07 00:13:25 -03003015 }
3016 hdw->tuner_signal_stale = !0;
3017 hdw->cropcap_stale = !0;
3018 }
3019
3020 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_BRIGHTNESS, brightness);
3021 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_CONTRAST, contrast);
3022 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_SATURATION, saturation);
3023 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_HUE, hue);
3024 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_MUTE, mute);
3025 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_VOLUME, volume);
3026 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_BALANCE, balance);
3027 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_BASS, bass);
3028 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_TREBLE, treble);
3029
Mike Isely27764722009-03-07 01:57:25 -03003030 if (hdw->input_dirty || hdw->audiomode_dirty || hdw->force_dirty) {
Mike Isely2641df32009-03-07 00:13:25 -03003031 struct v4l2_tuner vt;
3032 memset(&vt, 0, sizeof(vt));
3033 vt.audmode = hdw->audiomode_val;
3034 v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner, s_tuner, &vt);
3035 }
3036
Mike Isely27764722009-03-07 01:57:25 -03003037 if (hdw->freqDirty || hdw->force_dirty) {
Mike Isely2641df32009-03-07 00:13:25 -03003038 unsigned long fv;
3039 struct v4l2_frequency freq;
3040 fv = pvr2_hdw_get_cur_freq(hdw);
3041 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_freq(%lu)", fv);
3042 if (hdw->tuner_signal_stale) pvr2_hdw_status_poll(hdw);
3043 memset(&freq, 0, sizeof(freq));
3044 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
3045 /* ((fv * 1000) / 62500) */
3046 freq.frequency = (fv * 2) / 125;
3047 } else {
3048 freq.frequency = fv / 62500;
3049 }
3050 /* tuner-core currently doesn't seem to care about this, but
3051 let's set it anyway for completeness. */
3052 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
3053 freq.type = V4L2_TUNER_RADIO;
3054 } else {
3055 freq.type = V4L2_TUNER_ANALOG_TV;
3056 }
3057 freq.tuner = 0;
3058 v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner,
3059 s_frequency, &freq);
3060 }
3061
Mike Isely27764722009-03-07 01:57:25 -03003062 if (hdw->res_hor_dirty || hdw->res_ver_dirty || hdw->force_dirty) {
Hans Verkuilfa190ee2010-05-08 17:16:18 -03003063 struct v4l2_mbus_framefmt fmt;
Mike Isely2641df32009-03-07 00:13:25 -03003064 memset(&fmt, 0, sizeof(fmt));
Hans Verkuilfa190ee2010-05-08 17:16:18 -03003065 fmt.width = hdw->res_hor_val;
3066 fmt.height = hdw->res_ver_val;
3067 fmt.code = V4L2_MBUS_FMT_FIXED;
Mike Isely7dfdf1e2009-03-07 02:11:12 -03003068 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_size(%dx%d)",
Hans Verkuilfa190ee2010-05-08 17:16:18 -03003069 fmt.width, fmt.height);
3070 v4l2_device_call_all(&hdw->v4l2_dev, 0, video, s_mbus_fmt, &fmt);
Mike Isely2641df32009-03-07 00:13:25 -03003071 }
3072
Mike Isely27764722009-03-07 01:57:25 -03003073 if (hdw->srate_dirty || hdw->force_dirty) {
Mike Isely01c59df2009-03-07 00:48:09 -03003074 u32 val;
3075 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_audio %d",
3076 hdw->srate_val);
3077 switch (hdw->srate_val) {
3078 default:
3079 case V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000:
3080 val = 48000;
3081 break;
3082 case V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100:
3083 val = 44100;
3084 break;
3085 case V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000:
3086 val = 32000;
3087 break;
3088 }
3089 v4l2_device_call_all(&hdw->v4l2_dev, 0,
3090 audio, s_clock_freq, val);
3091 }
3092
Mike Isely2641df32009-03-07 00:13:25 -03003093 /* Unable to set crop parameters; there is apparently no equivalent
3094 for VIDIOC_S_CROP */
3095
Mike Iselyedb9dcb2009-03-07 00:37:10 -03003096 v4l2_device_for_each_subdev(sd, &hdw->v4l2_dev) {
3097 id = sd->grp_id;
3098 if (id >= ARRAY_SIZE(pvr2_module_update_functions)) continue;
3099 fp = pvr2_module_update_functions[id];
3100 if (!fp) continue;
3101 (*fp)(hdw, sd);
3102 }
Mike Isely2641df32009-03-07 00:13:25 -03003103
Mike Isely27764722009-03-07 01:57:25 -03003104 if (hdw->tuner_signal_stale || hdw->cropcap_stale) {
Mike Isely2641df32009-03-07 00:13:25 -03003105 pvr2_hdw_status_poll(hdw);
3106 }
Mike Isely5ceaad12009-03-07 00:01:20 -03003107}
3108
3109
Mike Isely681c7392007-11-26 01:48:52 -03003110/* Figure out if we need to commit control changes. If so, mark internal
3111 state flags to indicate this fact and return true. Otherwise do nothing
3112 else and return false. */
3113static int pvr2_hdw_commit_setup(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03003114{
Mike Iselyd8554972006-06-26 20:58:46 -03003115 unsigned int idx;
3116 struct pvr2_ctrl *cptr;
3117 int value;
Mike Isely27764722009-03-07 01:57:25 -03003118 int commit_flag = hdw->force_dirty;
Mike Iselyd8554972006-06-26 20:58:46 -03003119 char buf[100];
3120 unsigned int bcnt,ccnt;
3121
Mike Iselyc05c0462006-06-25 20:04:25 -03003122 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03003123 cptr = hdw->controls + idx;
Al Viro5fa12472008-03-29 03:07:38 +00003124 if (!cptr->info->is_dirty) continue;
Mike Iselyd8554972006-06-26 20:58:46 -03003125 if (!cptr->info->is_dirty(cptr)) continue;
Mike Iselyfe23a282007-01-20 00:10:55 -03003126 commit_flag = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03003127
Mike Iselyfe23a282007-01-20 00:10:55 -03003128 if (!(pvrusb2_debug & PVR2_TRACE_CTL)) continue;
Mike Iselyd8554972006-06-26 20:58:46 -03003129 bcnt = scnprintf(buf,sizeof(buf),"\"%s\" <-- ",
3130 cptr->info->name);
3131 value = 0;
3132 cptr->info->get_value(cptr,&value);
3133 pvr2_ctrl_value_to_sym_internal(cptr,~0,value,
3134 buf+bcnt,
3135 sizeof(buf)-bcnt,&ccnt);
3136 bcnt += ccnt;
3137 bcnt += scnprintf(buf+bcnt,sizeof(buf)-bcnt," <%s>",
3138 get_ctrl_typename(cptr->info->type));
3139 pvr2_trace(PVR2_TRACE_CTL,
3140 "/*--TRACE_COMMIT--*/ %.*s",
3141 bcnt,buf);
3142 }
3143
3144 if (!commit_flag) {
3145 /* Nothing has changed */
3146 return 0;
3147 }
3148
Mike Isely681c7392007-11-26 01:48:52 -03003149 hdw->state_pipeline_config = 0;
3150 trace_stbit("state_pipeline_config",hdw->state_pipeline_config);
3151 pvr2_hdw_state_sched(hdw);
3152
3153 return !0;
3154}
3155
3156
3157/* Perform all operations needed to commit all control changes. This must
3158 be performed in synchronization with the pipeline state and is thus
3159 expected to be called as part of the driver's worker thread. Return
3160 true if commit successful, otherwise return false to indicate that
3161 commit isn't possible at this time. */
3162static int pvr2_hdw_commit_execute(struct pvr2_hdw *hdw)
3163{
3164 unsigned int idx;
3165 struct pvr2_ctrl *cptr;
3166 int disruptive_change;
3167
Mike Isely9bf98322011-02-13 17:31:55 -03003168 if (hdw->input_dirty && hdw->state_pathway_ok &&
3169 (((hdw->input_val == PVR2_CVAL_INPUT_DTV) ?
3170 PVR2_PATHWAY_DIGITAL : PVR2_PATHWAY_ANALOG) !=
3171 hdw->pathway_state)) {
3172 /* Change of mode being asked for... */
3173 hdw->state_pathway_ok = 0;
3174 trace_stbit("state_pathway_ok", hdw->state_pathway_ok);
3175 }
3176 if (!hdw->state_pathway_ok) {
3177 /* Can't commit anything until pathway is ok. */
3178 return 0;
3179 }
3180
Mike Iselyab062fe2008-06-30 03:32:35 -03003181 /* Handle some required side effects when the video standard is
3182 changed.... */
Mike Iselyd8554972006-06-26 20:58:46 -03003183 if (hdw->std_dirty) {
Mike Iselyd8554972006-06-26 20:58:46 -03003184 int nvres;
Mike Isely00528d92008-06-30 03:35:52 -03003185 int gop_size;
Mike Iselyd8554972006-06-26 20:58:46 -03003186 if (hdw->std_mask_cur & V4L2_STD_525_60) {
3187 nvres = 480;
Mike Isely00528d92008-06-30 03:35:52 -03003188 gop_size = 15;
Mike Iselyd8554972006-06-26 20:58:46 -03003189 } else {
3190 nvres = 576;
Mike Isely00528d92008-06-30 03:35:52 -03003191 gop_size = 12;
Mike Iselyd8554972006-06-26 20:58:46 -03003192 }
Mike Isely00528d92008-06-30 03:35:52 -03003193 /* Rewrite the vertical resolution to be appropriate to the
3194 video standard that has been selected. */
Mike Iselyd8554972006-06-26 20:58:46 -03003195 if (nvres != hdw->res_ver_val) {
3196 hdw->res_ver_val = nvres;
3197 hdw->res_ver_dirty = !0;
3198 }
Mike Isely00528d92008-06-30 03:35:52 -03003199 /* Rewrite the GOP size to be appropriate to the video
3200 standard that has been selected. */
3201 if (gop_size != hdw->enc_ctl_state.video_gop_size) {
3202 struct v4l2_ext_controls cs;
3203 struct v4l2_ext_control c1;
3204 memset(&cs, 0, sizeof(cs));
3205 memset(&c1, 0, sizeof(c1));
3206 cs.controls = &c1;
3207 cs.count = 1;
3208 c1.id = V4L2_CID_MPEG_VIDEO_GOP_SIZE;
3209 c1.value = gop_size;
3210 cx2341x_ext_ctrls(&hdw->enc_ctl_state, 0, &cs,
3211 VIDIOC_S_EXT_CTRLS);
3212 }
Mike Iselyd8554972006-06-26 20:58:46 -03003213 }
3214
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03003215 /* The broadcast decoder can only scale down, so if
3216 * res_*_dirty && crop window < output format ==> enlarge crop.
3217 *
3218 * The mpeg encoder receives fields of res_hor_val dots and
3219 * res_ver_val halflines. Limits: hor<=720, ver<=576.
3220 */
3221 if (hdw->res_hor_dirty && hdw->cropw_val < hdw->res_hor_val) {
3222 hdw->cropw_val = hdw->res_hor_val;
3223 hdw->cropw_dirty = !0;
3224 } else if (hdw->cropw_dirty) {
3225 hdw->res_hor_dirty = !0; /* must rescale */
3226 hdw->res_hor_val = min(720, hdw->cropw_val);
3227 }
3228 if (hdw->res_ver_dirty && hdw->croph_val < hdw->res_ver_val) {
3229 hdw->croph_val = hdw->res_ver_val;
3230 hdw->croph_dirty = !0;
3231 } else if (hdw->croph_dirty) {
3232 int nvres = hdw->std_mask_cur & V4L2_STD_525_60 ? 480 : 576;
3233 hdw->res_ver_dirty = !0;
3234 hdw->res_ver_val = min(nvres, hdw->croph_val);
3235 }
3236
Mike Isely681c7392007-11-26 01:48:52 -03003237 /* If any of the below has changed, then we can't do the update
3238 while the pipeline is running. Pipeline must be paused first
3239 and decoder -> encoder connection be made quiescent before we
3240 can proceed. */
3241 disruptive_change =
3242 (hdw->std_dirty ||
3243 hdw->enc_unsafe_stale ||
3244 hdw->srate_dirty ||
3245 hdw->res_ver_dirty ||
3246 hdw->res_hor_dirty ||
Mike Isely755879c2008-08-31 20:50:59 -03003247 hdw->cropw_dirty ||
3248 hdw->croph_dirty ||
Mike Isely681c7392007-11-26 01:48:52 -03003249 hdw->input_dirty ||
3250 (hdw->active_stream_type != hdw->desired_stream_type));
3251 if (disruptive_change && !hdw->state_pipeline_idle) {
3252 /* Pipeline is not idle; we can't proceed. Arrange to
3253 cause pipeline to stop so that we can try this again
3254 later.... */
3255 hdw->state_pipeline_pause = !0;
3256 return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03003257 }
3258
Mike Iselyb30d2442006-06-25 20:05:01 -03003259 if (hdw->srate_dirty) {
3260 /* Write new sample rate into control structure since
3261 * the master copy is stale. We must track srate
3262 * separate from the mpeg control structure because
3263 * other logic also uses this value. */
3264 struct v4l2_ext_controls cs;
3265 struct v4l2_ext_control c1;
3266 memset(&cs,0,sizeof(cs));
3267 memset(&c1,0,sizeof(c1));
3268 cs.controls = &c1;
3269 cs.count = 1;
3270 c1.id = V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ;
3271 c1.value = hdw->srate_val;
Hans Verkuil01f1e442007-08-21 18:32:42 -03003272 cx2341x_ext_ctrls(&hdw->enc_ctl_state, 0, &cs,VIDIOC_S_EXT_CTRLS);
Mike Iselyb30d2442006-06-25 20:05:01 -03003273 }
Mike Iselyc05c0462006-06-25 20:04:25 -03003274
Mike Isely681c7392007-11-26 01:48:52 -03003275 if (hdw->active_stream_type != hdw->desired_stream_type) {
3276 /* Handle any side effects of stream config here */
3277 hdw->active_stream_type = hdw->desired_stream_type;
3278 }
3279
Mike Isely1df59f02008-04-21 03:50:39 -03003280 if (hdw->hdw_desc->signal_routing_scheme ==
3281 PVR2_ROUTING_SCHEME_GOTVIEW) {
3282 u32 b;
3283 /* Handle GOTVIEW audio switching */
3284 pvr2_hdw_gpio_get_out(hdw,&b);
3285 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
3286 /* Set GPIO 11 */
3287 pvr2_hdw_gpio_chg_out(hdw,(1 << 11),~0);
3288 } else {
3289 /* Clear GPIO 11 */
3290 pvr2_hdw_gpio_chg_out(hdw,(1 << 11),0);
3291 }
3292 }
3293
Mike Iselye68a6192009-03-07 01:45:10 -03003294 /* Check and update state for all sub-devices. */
3295 pvr2_subdev_update(hdw);
3296
Mike Isely75212a02009-03-07 01:48:42 -03003297 hdw->tuner_updated = 0;
Mike Isely27764722009-03-07 01:57:25 -03003298 hdw->force_dirty = 0;
Mike Isely5ceaad12009-03-07 00:01:20 -03003299 for (idx = 0; idx < hdw->control_cnt; idx++) {
3300 cptr = hdw->controls + idx;
3301 if (!cptr->info->clear_dirty) continue;
3302 cptr->info->clear_dirty(cptr);
3303 }
3304
Mike Isely62433e32008-04-22 14:45:40 -03003305 if ((hdw->pathway_state == PVR2_PATHWAY_ANALOG) &&
3306 hdw->state_encoder_run) {
3307 /* If encoder isn't running or it can't be touched, then
3308 this will get worked out later when we start the
3309 encoder. */
Mike Isely681c7392007-11-26 01:48:52 -03003310 if (pvr2_encoder_adjust(hdw) < 0) return !0;
3311 }
Mike Iselyd8554972006-06-26 20:58:46 -03003312
Mike Isely681c7392007-11-26 01:48:52 -03003313 hdw->state_pipeline_config = !0;
Mike Isely432907f2008-08-31 21:02:20 -03003314 /* Hardware state may have changed in a way to cause the cropping
3315 capabilities to have changed. So mark it stale, which will
3316 cause a later re-fetch. */
Mike Isely681c7392007-11-26 01:48:52 -03003317 trace_stbit("state_pipeline_config",hdw->state_pipeline_config);
3318 return !0;
Mike Iselyd8554972006-06-26 20:58:46 -03003319}
3320
3321
3322int pvr2_hdw_commit_ctl(struct pvr2_hdw *hdw)
3323{
Mike Isely681c7392007-11-26 01:48:52 -03003324 int fl;
3325 LOCK_TAKE(hdw->big_lock);
3326 fl = pvr2_hdw_commit_setup(hdw);
3327 LOCK_GIVE(hdw->big_lock);
3328 if (!fl) return 0;
3329 return pvr2_hdw_wait(hdw,0);
Mike Iselyd8554972006-06-26 20:58:46 -03003330}
3331
3332
Mike Isely681c7392007-11-26 01:48:52 -03003333static void pvr2_hdw_worker_poll(struct work_struct *work)
Mike Iselyd8554972006-06-26 20:58:46 -03003334{
Mike Isely681c7392007-11-26 01:48:52 -03003335 int fl = 0;
3336 struct pvr2_hdw *hdw = container_of(work,struct pvr2_hdw,workpoll);
Mike Iselyd8554972006-06-26 20:58:46 -03003337 LOCK_TAKE(hdw->big_lock); do {
Mike Isely681c7392007-11-26 01:48:52 -03003338 fl = pvr2_hdw_state_eval(hdw);
3339 } while (0); LOCK_GIVE(hdw->big_lock);
3340 if (fl && hdw->state_func) {
3341 hdw->state_func(hdw->state_data);
3342 }
3343}
3344
3345
Mike Isely681c7392007-11-26 01:48:52 -03003346static int pvr2_hdw_wait(struct pvr2_hdw *hdw,int state)
Mike Iselyd8554972006-06-26 20:58:46 -03003347{
Mike Isely681c7392007-11-26 01:48:52 -03003348 return wait_event_interruptible(
3349 hdw->state_wait_data,
3350 (hdw->state_stale == 0) &&
3351 (!state || (hdw->master_state != state)));
Mike Iselyd8554972006-06-26 20:58:46 -03003352}
3353
Mike Isely681c7392007-11-26 01:48:52 -03003354
Mike Iselyd8554972006-06-26 20:58:46 -03003355/* Return name for this driver instance */
3356const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw)
3357{
3358 return hdw->name;
3359}
3360
3361
Mike Isely78a47102007-11-26 01:58:20 -03003362const char *pvr2_hdw_get_desc(struct pvr2_hdw *hdw)
3363{
3364 return hdw->hdw_desc->description;
3365}
3366
3367
3368const char *pvr2_hdw_get_type(struct pvr2_hdw *hdw)
3369{
3370 return hdw->hdw_desc->shortname;
3371}
3372
3373
Mike Iselyd8554972006-06-26 20:58:46 -03003374int pvr2_hdw_is_hsm(struct pvr2_hdw *hdw)
3375{
3376 int result;
3377 LOCK_TAKE(hdw->ctl_lock); do {
Michael Krufky8d364362007-01-22 02:17:55 -03003378 hdw->cmd_buffer[0] = FX2CMD_GET_USB_SPEED;
Mike Iselyd8554972006-06-26 20:58:46 -03003379 result = pvr2_send_request(hdw,
3380 hdw->cmd_buffer,1,
3381 hdw->cmd_buffer,1);
3382 if (result < 0) break;
3383 result = (hdw->cmd_buffer[0] != 0);
3384 } while(0); LOCK_GIVE(hdw->ctl_lock);
3385 return result;
3386}
3387
3388
Mike Isely18103c52007-01-20 00:09:47 -03003389/* Execute poll of tuner status */
3390void pvr2_hdw_execute_tuner_poll(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03003391{
Mike Iselyd8554972006-06-26 20:58:46 -03003392 LOCK_TAKE(hdw->big_lock); do {
Mike Iselya51f5002009-03-06 23:30:37 -03003393 pvr2_hdw_status_poll(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003394 } while (0); LOCK_GIVE(hdw->big_lock);
Mike Isely18103c52007-01-20 00:09:47 -03003395}
3396
3397
Mike Isely432907f2008-08-31 21:02:20 -03003398static int pvr2_hdw_check_cropcap(struct pvr2_hdw *hdw)
3399{
3400 if (!hdw->cropcap_stale) {
Mike Isely432907f2008-08-31 21:02:20 -03003401 return 0;
3402 }
Mike Iselya51f5002009-03-06 23:30:37 -03003403 pvr2_hdw_status_poll(hdw);
Mike Isely432907f2008-08-31 21:02:20 -03003404 if (hdw->cropcap_stale) {
Mike Isely432907f2008-08-31 21:02:20 -03003405 return -EIO;
3406 }
3407 return 0;
3408}
3409
3410
3411/* Return information about cropping capabilities */
3412int pvr2_hdw_get_cropcap(struct pvr2_hdw *hdw, struct v4l2_cropcap *pp)
3413{
3414 int stat = 0;
3415 LOCK_TAKE(hdw->big_lock);
3416 stat = pvr2_hdw_check_cropcap(hdw);
3417 if (!stat) {
Mike Isely432907f2008-08-31 21:02:20 -03003418 memcpy(pp, &hdw->cropcap_info, sizeof(hdw->cropcap_info));
3419 }
3420 LOCK_GIVE(hdw->big_lock);
3421 return stat;
3422}
3423
3424
Mike Isely18103c52007-01-20 00:09:47 -03003425/* Return information about the tuner */
3426int pvr2_hdw_get_tuner_status(struct pvr2_hdw *hdw,struct v4l2_tuner *vtp)
3427{
3428 LOCK_TAKE(hdw->big_lock); do {
3429 if (hdw->tuner_signal_stale) {
Mike Iselya51f5002009-03-06 23:30:37 -03003430 pvr2_hdw_status_poll(hdw);
Mike Isely18103c52007-01-20 00:09:47 -03003431 }
3432 memcpy(vtp,&hdw->tuner_signal_info,sizeof(struct v4l2_tuner));
3433 } while (0); LOCK_GIVE(hdw->big_lock);
3434 return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03003435}
3436
3437
3438/* Get handle to video output stream */
3439struct pvr2_stream *pvr2_hdw_get_video_stream(struct pvr2_hdw *hp)
3440{
3441 return hp->vid_stream;
3442}
3443
3444
3445void pvr2_hdw_trigger_module_log(struct pvr2_hdw *hdw)
3446{
Mike Isely4f1a3e52006-06-25 20:04:31 -03003447 int nr = pvr2_hdw_get_unit_number(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003448 LOCK_TAKE(hdw->big_lock); do {
Mike Isely4f1a3e52006-06-25 20:04:31 -03003449 printk(KERN_INFO "pvrusb2: ================= START STATUS CARD #%d =================\n", nr);
Mike Iselyed3261a2009-03-07 00:02:33 -03003450 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, log_status);
Mike Iselyb30d2442006-06-25 20:05:01 -03003451 pvr2_trace(PVR2_TRACE_INFO,"cx2341x config:");
Hans Verkuil99eb44f2006-06-26 18:24:05 -03003452 cx2341x_log_status(&hdw->enc_ctl_state, "pvrusb2");
Mike Isely681c7392007-11-26 01:48:52 -03003453 pvr2_hdw_state_log_state(hdw);
Mike Isely4f1a3e52006-06-25 20:04:31 -03003454 printk(KERN_INFO "pvrusb2: ================== END STATUS CARD #%d ==================\n", nr);
Mike Iselyd8554972006-06-26 20:58:46 -03003455 } while (0); LOCK_GIVE(hdw->big_lock);
3456}
3457
Mike Isely4db666c2007-09-08 22:16:27 -03003458
3459/* Grab EEPROM contents, needed for direct method. */
3460#define EEPROM_SIZE 8192
3461#define trace_eeprom(...) pvr2_trace(PVR2_TRACE_EEPROM,__VA_ARGS__)
3462static u8 *pvr2_full_eeprom_fetch(struct pvr2_hdw *hdw)
3463{
3464 struct i2c_msg msg[2];
3465 u8 *eeprom;
3466 u8 iadd[2];
3467 u8 addr;
3468 u16 eepromSize;
3469 unsigned int offs;
3470 int ret;
3471 int mode16 = 0;
3472 unsigned pcnt,tcnt;
3473 eeprom = kmalloc(EEPROM_SIZE,GFP_KERNEL);
3474 if (!eeprom) {
3475 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3476 "Failed to allocate memory"
3477 " required to read eeprom");
3478 return NULL;
3479 }
3480
3481 trace_eeprom("Value for eeprom addr from controller was 0x%x",
3482 hdw->eeprom_addr);
3483 addr = hdw->eeprom_addr;
3484 /* Seems that if the high bit is set, then the *real* eeprom
3485 address is shifted right now bit position (noticed this in
3486 newer PVR USB2 hardware) */
3487 if (addr & 0x80) addr >>= 1;
3488
3489 /* FX2 documentation states that a 16bit-addressed eeprom is
3490 expected if the I2C address is an odd number (yeah, this is
3491 strange but it's what they do) */
3492 mode16 = (addr & 1);
3493 eepromSize = (mode16 ? EEPROM_SIZE : 256);
3494 trace_eeprom("Examining %d byte eeprom at location 0x%x"
3495 " using %d bit addressing",eepromSize,addr,
3496 mode16 ? 16 : 8);
3497
3498 msg[0].addr = addr;
3499 msg[0].flags = 0;
3500 msg[0].len = mode16 ? 2 : 1;
3501 msg[0].buf = iadd;
3502 msg[1].addr = addr;
3503 msg[1].flags = I2C_M_RD;
3504
3505 /* We have to do the actual eeprom data fetch ourselves, because
3506 (1) we're only fetching part of the eeprom, and (2) if we were
3507 getting the whole thing our I2C driver can't grab it in one
3508 pass - which is what tveeprom is otherwise going to attempt */
3509 memset(eeprom,0,EEPROM_SIZE);
3510 for (tcnt = 0; tcnt < EEPROM_SIZE; tcnt += pcnt) {
3511 pcnt = 16;
3512 if (pcnt + tcnt > EEPROM_SIZE) pcnt = EEPROM_SIZE-tcnt;
3513 offs = tcnt + (eepromSize - EEPROM_SIZE);
3514 if (mode16) {
3515 iadd[0] = offs >> 8;
3516 iadd[1] = offs;
3517 } else {
3518 iadd[0] = offs;
3519 }
3520 msg[1].len = pcnt;
3521 msg[1].buf = eeprom+tcnt;
3522 if ((ret = i2c_transfer(&hdw->i2c_adap,
3523 msg,ARRAY_SIZE(msg))) != 2) {
3524 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3525 "eeprom fetch set offs err=%d",ret);
3526 kfree(eeprom);
3527 return NULL;
3528 }
3529 }
3530 return eeprom;
3531}
3532
3533
3534void pvr2_hdw_cpufw_set_enabled(struct pvr2_hdw *hdw,
Mike Isely568efaa2009-11-25 02:52:06 -03003535 int mode,
Mike Isely4db666c2007-09-08 22:16:27 -03003536 int enable_flag)
Mike Iselyd8554972006-06-26 20:58:46 -03003537{
3538 int ret;
3539 u16 address;
3540 unsigned int pipe;
3541 LOCK_TAKE(hdw->big_lock); do {
Al Viro5fa12472008-03-29 03:07:38 +00003542 if ((hdw->fw_buffer == NULL) == !enable_flag) break;
Mike Iselyd8554972006-06-26 20:58:46 -03003543
3544 if (!enable_flag) {
3545 pvr2_trace(PVR2_TRACE_FIRMWARE,
3546 "Cleaning up after CPU firmware fetch");
3547 kfree(hdw->fw_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03003548 hdw->fw_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03003549 hdw->fw_size = 0;
Mike Isely4db666c2007-09-08 22:16:27 -03003550 if (hdw->fw_cpu_flag) {
3551 /* Now release the CPU. It will disconnect
3552 and reconnect later. */
3553 pvr2_hdw_cpureset_assert(hdw,0);
3554 }
Mike Iselyd8554972006-06-26 20:58:46 -03003555 break;
3556 }
3557
Mike Isely568efaa2009-11-25 02:52:06 -03003558 hdw->fw_cpu_flag = (mode != 2);
Mike Isely4db666c2007-09-08 22:16:27 -03003559 if (hdw->fw_cpu_flag) {
Mike Isely568efaa2009-11-25 02:52:06 -03003560 hdw->fw_size = (mode == 1) ? 0x4000 : 0x2000;
Mike Isely4db666c2007-09-08 22:16:27 -03003561 pvr2_trace(PVR2_TRACE_FIRMWARE,
Mike Isely568efaa2009-11-25 02:52:06 -03003562 "Preparing to suck out CPU firmware"
3563 " (size=%u)", hdw->fw_size);
Mike Isely4db666c2007-09-08 22:16:27 -03003564 hdw->fw_buffer = kzalloc(hdw->fw_size,GFP_KERNEL);
3565 if (!hdw->fw_buffer) {
3566 hdw->fw_size = 0;
3567 break;
3568 }
3569
3570 /* We have to hold the CPU during firmware upload. */
3571 pvr2_hdw_cpureset_assert(hdw,1);
3572
3573 /* download the firmware from address 0000-1fff in 2048
3574 (=0x800) bytes chunk. */
3575
3576 pvr2_trace(PVR2_TRACE_FIRMWARE,
3577 "Grabbing CPU firmware");
3578 pipe = usb_rcvctrlpipe(hdw->usb_dev, 0);
3579 for(address = 0; address < hdw->fw_size;
3580 address += 0x800) {
3581 ret = usb_control_msg(hdw->usb_dev,pipe,
3582 0xa0,0xc0,
3583 address,0,
3584 hdw->fw_buffer+address,
3585 0x800,HZ);
3586 if (ret < 0) break;
3587 }
3588
3589 pvr2_trace(PVR2_TRACE_FIRMWARE,
3590 "Done grabbing CPU firmware");
3591 } else {
3592 pvr2_trace(PVR2_TRACE_FIRMWARE,
3593 "Sucking down EEPROM contents");
3594 hdw->fw_buffer = pvr2_full_eeprom_fetch(hdw);
3595 if (!hdw->fw_buffer) {
3596 pvr2_trace(PVR2_TRACE_FIRMWARE,
3597 "EEPROM content suck failed.");
3598 break;
3599 }
3600 hdw->fw_size = EEPROM_SIZE;
3601 pvr2_trace(PVR2_TRACE_FIRMWARE,
3602 "Done sucking down EEPROM contents");
Mike Iselyd8554972006-06-26 20:58:46 -03003603 }
3604
Mike Iselyd8554972006-06-26 20:58:46 -03003605 } while (0); LOCK_GIVE(hdw->big_lock);
3606}
3607
3608
3609/* Return true if we're in a mode for retrieval CPU firmware */
3610int pvr2_hdw_cpufw_get_enabled(struct pvr2_hdw *hdw)
3611{
Al Viro5fa12472008-03-29 03:07:38 +00003612 return hdw->fw_buffer != NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03003613}
3614
3615
3616int pvr2_hdw_cpufw_get(struct pvr2_hdw *hdw,unsigned int offs,
3617 char *buf,unsigned int cnt)
3618{
3619 int ret = -EINVAL;
3620 LOCK_TAKE(hdw->big_lock); do {
3621 if (!buf) break;
3622 if (!cnt) break;
3623
3624 if (!hdw->fw_buffer) {
3625 ret = -EIO;
3626 break;
3627 }
3628
3629 if (offs >= hdw->fw_size) {
3630 pvr2_trace(PVR2_TRACE_FIRMWARE,
3631 "Read firmware data offs=%d EOF",
3632 offs);
3633 ret = 0;
3634 break;
3635 }
3636
3637 if (offs + cnt > hdw->fw_size) cnt = hdw->fw_size - offs;
3638
3639 memcpy(buf,hdw->fw_buffer+offs,cnt);
3640
3641 pvr2_trace(PVR2_TRACE_FIRMWARE,
3642 "Read firmware data offs=%d cnt=%d",
3643 offs,cnt);
3644 ret = cnt;
3645 } while (0); LOCK_GIVE(hdw->big_lock);
3646
3647 return ret;
3648}
3649
3650
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003651int pvr2_hdw_v4l_get_minor_number(struct pvr2_hdw *hdw,
Mike Isely80793842006-12-27 23:12:28 -03003652 enum pvr2_v4l_type index)
Mike Iselyd8554972006-06-26 20:58:46 -03003653{
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003654 switch (index) {
Mike Isely80793842006-12-27 23:12:28 -03003655 case pvr2_v4l_type_video: return hdw->v4l_minor_number_video;
3656 case pvr2_v4l_type_vbi: return hdw->v4l_minor_number_vbi;
3657 case pvr2_v4l_type_radio: return hdw->v4l_minor_number_radio;
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003658 default: return -1;
3659 }
Mike Iselyd8554972006-06-26 20:58:46 -03003660}
3661
3662
Pantelis Koukousoulas2fdf3d92006-12-27 23:07:58 -03003663/* Store a v4l minor device number */
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003664void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *hdw,
Mike Isely80793842006-12-27 23:12:28 -03003665 enum pvr2_v4l_type index,int v)
Mike Iselyd8554972006-06-26 20:58:46 -03003666{
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003667 switch (index) {
Mike Isely80793842006-12-27 23:12:28 -03003668 case pvr2_v4l_type_video: hdw->v4l_minor_number_video = v;
3669 case pvr2_v4l_type_vbi: hdw->v4l_minor_number_vbi = v;
3670 case pvr2_v4l_type_radio: hdw->v4l_minor_number_radio = v;
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003671 default: break;
3672 }
Mike Iselyd8554972006-06-26 20:58:46 -03003673}
3674
3675
David Howells7d12e782006-10-05 14:55:46 +01003676static void pvr2_ctl_write_complete(struct urb *urb)
Mike Iselyd8554972006-06-26 20:58:46 -03003677{
3678 struct pvr2_hdw *hdw = urb->context;
3679 hdw->ctl_write_pend_flag = 0;
3680 if (hdw->ctl_read_pend_flag) return;
3681 complete(&hdw->ctl_done);
3682}
3683
3684
David Howells7d12e782006-10-05 14:55:46 +01003685static void pvr2_ctl_read_complete(struct urb *urb)
Mike Iselyd8554972006-06-26 20:58:46 -03003686{
3687 struct pvr2_hdw *hdw = urb->context;
3688 hdw->ctl_read_pend_flag = 0;
3689 if (hdw->ctl_write_pend_flag) return;
3690 complete(&hdw->ctl_done);
3691}
3692
3693
3694static void pvr2_ctl_timeout(unsigned long data)
3695{
3696 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
3697 if (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
3698 hdw->ctl_timeout_flag = !0;
Mariusz Kozlowski5e55d2c2006-11-08 15:34:31 +01003699 if (hdw->ctl_write_pend_flag)
Mike Iselyd8554972006-06-26 20:58:46 -03003700 usb_unlink_urb(hdw->ctl_write_urb);
Mariusz Kozlowski5e55d2c2006-11-08 15:34:31 +01003701 if (hdw->ctl_read_pend_flag)
Mike Iselyd8554972006-06-26 20:58:46 -03003702 usb_unlink_urb(hdw->ctl_read_urb);
Mike Iselyd8554972006-06-26 20:58:46 -03003703 }
3704}
3705
3706
Mike Iselye61b6fc2006-07-18 22:42:18 -03003707/* Issue a command and get a response from the device. This extended
3708 version includes a probe flag (which if set means that device errors
3709 should not be logged or treated as fatal) and a timeout in jiffies.
3710 This can be used to non-lethally probe the health of endpoint 1. */
Adrian Bunk07e337e2006-06-30 11:30:20 -03003711static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
3712 unsigned int timeout,int probe_fl,
3713 void *write_data,unsigned int write_len,
3714 void *read_data,unsigned int read_len)
Mike Iselyd8554972006-06-26 20:58:46 -03003715{
3716 unsigned int idx;
3717 int status = 0;
3718 struct timer_list timer;
3719 if (!hdw->ctl_lock_held) {
3720 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3721 "Attempted to execute control transfer"
3722 " without lock!!");
3723 return -EDEADLK;
3724 }
Mike Isely681c7392007-11-26 01:48:52 -03003725 if (!hdw->flag_ok && !probe_fl) {
Mike Iselyd8554972006-06-26 20:58:46 -03003726 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3727 "Attempted to execute control transfer"
3728 " when device not ok");
3729 return -EIO;
3730 }
3731 if (!(hdw->ctl_read_urb && hdw->ctl_write_urb)) {
3732 if (!probe_fl) {
3733 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3734 "Attempted to execute control transfer"
3735 " when USB is disconnected");
3736 }
3737 return -ENOTTY;
3738 }
3739
3740 /* Ensure that we have sane parameters */
3741 if (!write_data) write_len = 0;
3742 if (!read_data) read_len = 0;
3743 if (write_len > PVR2_CTL_BUFFSIZE) {
3744 pvr2_trace(
3745 PVR2_TRACE_ERROR_LEGS,
3746 "Attempted to execute %d byte"
3747 " control-write transfer (limit=%d)",
3748 write_len,PVR2_CTL_BUFFSIZE);
3749 return -EINVAL;
3750 }
3751 if (read_len > PVR2_CTL_BUFFSIZE) {
3752 pvr2_trace(
3753 PVR2_TRACE_ERROR_LEGS,
3754 "Attempted to execute %d byte"
3755 " control-read transfer (limit=%d)",
3756 write_len,PVR2_CTL_BUFFSIZE);
3757 return -EINVAL;
3758 }
3759 if ((!write_len) && (!read_len)) {
3760 pvr2_trace(
3761 PVR2_TRACE_ERROR_LEGS,
3762 "Attempted to execute null control transfer?");
3763 return -EINVAL;
3764 }
3765
3766
3767 hdw->cmd_debug_state = 1;
3768 if (write_len) {
3769 hdw->cmd_debug_code = ((unsigned char *)write_data)[0];
3770 } else {
3771 hdw->cmd_debug_code = 0;
3772 }
3773 hdw->cmd_debug_write_len = write_len;
3774 hdw->cmd_debug_read_len = read_len;
3775
3776 /* Initialize common stuff */
3777 init_completion(&hdw->ctl_done);
3778 hdw->ctl_timeout_flag = 0;
3779 hdw->ctl_write_pend_flag = 0;
3780 hdw->ctl_read_pend_flag = 0;
3781 init_timer(&timer);
3782 timer.expires = jiffies + timeout;
3783 timer.data = (unsigned long)hdw;
3784 timer.function = pvr2_ctl_timeout;
3785
3786 if (write_len) {
3787 hdw->cmd_debug_state = 2;
3788 /* Transfer write data to internal buffer */
3789 for (idx = 0; idx < write_len; idx++) {
3790 hdw->ctl_write_buffer[idx] =
3791 ((unsigned char *)write_data)[idx];
3792 }
3793 /* Initiate a write request */
3794 usb_fill_bulk_urb(hdw->ctl_write_urb,
3795 hdw->usb_dev,
3796 usb_sndbulkpipe(hdw->usb_dev,
3797 PVR2_CTL_WRITE_ENDPOINT),
3798 hdw->ctl_write_buffer,
3799 write_len,
3800 pvr2_ctl_write_complete,
3801 hdw);
3802 hdw->ctl_write_urb->actual_length = 0;
3803 hdw->ctl_write_pend_flag = !0;
3804 status = usb_submit_urb(hdw->ctl_write_urb,GFP_KERNEL);
3805 if (status < 0) {
3806 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3807 "Failed to submit write-control"
3808 " URB status=%d",status);
3809 hdw->ctl_write_pend_flag = 0;
3810 goto done;
3811 }
3812 }
3813
3814 if (read_len) {
3815 hdw->cmd_debug_state = 3;
3816 memset(hdw->ctl_read_buffer,0x43,read_len);
3817 /* Initiate a read request */
3818 usb_fill_bulk_urb(hdw->ctl_read_urb,
3819 hdw->usb_dev,
3820 usb_rcvbulkpipe(hdw->usb_dev,
3821 PVR2_CTL_READ_ENDPOINT),
3822 hdw->ctl_read_buffer,
3823 read_len,
3824 pvr2_ctl_read_complete,
3825 hdw);
3826 hdw->ctl_read_urb->actual_length = 0;
3827 hdw->ctl_read_pend_flag = !0;
3828 status = usb_submit_urb(hdw->ctl_read_urb,GFP_KERNEL);
3829 if (status < 0) {
3830 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3831 "Failed to submit read-control"
3832 " URB status=%d",status);
3833 hdw->ctl_read_pend_flag = 0;
3834 goto done;
3835 }
3836 }
3837
3838 /* Start timer */
3839 add_timer(&timer);
3840
3841 /* Now wait for all I/O to complete */
3842 hdw->cmd_debug_state = 4;
3843 while (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
3844 wait_for_completion(&hdw->ctl_done);
3845 }
3846 hdw->cmd_debug_state = 5;
3847
3848 /* Stop timer */
3849 del_timer_sync(&timer);
3850
3851 hdw->cmd_debug_state = 6;
3852 status = 0;
3853
3854 if (hdw->ctl_timeout_flag) {
3855 status = -ETIMEDOUT;
3856 if (!probe_fl) {
3857 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3858 "Timed out control-write");
3859 }
3860 goto done;
3861 }
3862
3863 if (write_len) {
3864 /* Validate results of write request */
3865 if ((hdw->ctl_write_urb->status != 0) &&
3866 (hdw->ctl_write_urb->status != -ENOENT) &&
3867 (hdw->ctl_write_urb->status != -ESHUTDOWN) &&
3868 (hdw->ctl_write_urb->status != -ECONNRESET)) {
3869 /* USB subsystem is reporting some kind of failure
3870 on the write */
3871 status = hdw->ctl_write_urb->status;
3872 if (!probe_fl) {
3873 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3874 "control-write URB failure,"
3875 " status=%d",
3876 status);
3877 }
3878 goto done;
3879 }
3880 if (hdw->ctl_write_urb->actual_length < write_len) {
3881 /* Failed to write enough data */
3882 status = -EIO;
3883 if (!probe_fl) {
3884 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3885 "control-write URB short,"
3886 " expected=%d got=%d",
3887 write_len,
3888 hdw->ctl_write_urb->actual_length);
3889 }
3890 goto done;
3891 }
3892 }
3893 if (read_len) {
3894 /* Validate results of read request */
3895 if ((hdw->ctl_read_urb->status != 0) &&
3896 (hdw->ctl_read_urb->status != -ENOENT) &&
3897 (hdw->ctl_read_urb->status != -ESHUTDOWN) &&
3898 (hdw->ctl_read_urb->status != -ECONNRESET)) {
3899 /* USB subsystem is reporting some kind of failure
3900 on the read */
3901 status = hdw->ctl_read_urb->status;
3902 if (!probe_fl) {
3903 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3904 "control-read URB failure,"
3905 " status=%d",
3906 status);
3907 }
3908 goto done;
3909 }
3910 if (hdw->ctl_read_urb->actual_length < read_len) {
3911 /* Failed to read enough data */
3912 status = -EIO;
3913 if (!probe_fl) {
3914 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3915 "control-read URB short,"
3916 " expected=%d got=%d",
3917 read_len,
3918 hdw->ctl_read_urb->actual_length);
3919 }
3920 goto done;
3921 }
3922 /* Transfer retrieved data out from internal buffer */
3923 for (idx = 0; idx < read_len; idx++) {
3924 ((unsigned char *)read_data)[idx] =
3925 hdw->ctl_read_buffer[idx];
3926 }
3927 }
3928
3929 done:
3930
3931 hdw->cmd_debug_state = 0;
3932 if ((status < 0) && (!probe_fl)) {
Mike Isely681c7392007-11-26 01:48:52 -03003933 pvr2_hdw_render_useless(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003934 }
3935 return status;
3936}
3937
3938
3939int pvr2_send_request(struct pvr2_hdw *hdw,
3940 void *write_data,unsigned int write_len,
3941 void *read_data,unsigned int read_len)
3942{
3943 return pvr2_send_request_ex(hdw,HZ*4,0,
3944 write_data,write_len,
3945 read_data,read_len);
3946}
3947
Mike Isely1c9d10d2008-03-28 05:38:54 -03003948
3949static int pvr2_issue_simple_cmd(struct pvr2_hdw *hdw,u32 cmdcode)
3950{
3951 int ret;
3952 unsigned int cnt = 1;
3953 unsigned int args = 0;
3954 LOCK_TAKE(hdw->ctl_lock);
3955 hdw->cmd_buffer[0] = cmdcode & 0xffu;
3956 args = (cmdcode >> 8) & 0xffu;
3957 args = (args > 2) ? 2 : args;
3958 if (args) {
3959 cnt += args;
3960 hdw->cmd_buffer[1] = (cmdcode >> 16) & 0xffu;
3961 if (args > 1) {
3962 hdw->cmd_buffer[2] = (cmdcode >> 24) & 0xffu;
3963 }
3964 }
3965 if (pvrusb2_debug & PVR2_TRACE_INIT) {
3966 unsigned int idx;
3967 unsigned int ccnt,bcnt;
3968 char tbuf[50];
3969 cmdcode &= 0xffu;
3970 bcnt = 0;
3971 ccnt = scnprintf(tbuf+bcnt,
3972 sizeof(tbuf)-bcnt,
3973 "Sending FX2 command 0x%x",cmdcode);
3974 bcnt += ccnt;
3975 for (idx = 0; idx < ARRAY_SIZE(pvr2_fx2cmd_desc); idx++) {
3976 if (pvr2_fx2cmd_desc[idx].id == cmdcode) {
3977 ccnt = scnprintf(tbuf+bcnt,
3978 sizeof(tbuf)-bcnt,
3979 " \"%s\"",
3980 pvr2_fx2cmd_desc[idx].desc);
3981 bcnt += ccnt;
3982 break;
3983 }
3984 }
3985 if (args) {
3986 ccnt = scnprintf(tbuf+bcnt,
3987 sizeof(tbuf)-bcnt,
3988 " (%u",hdw->cmd_buffer[1]);
3989 bcnt += ccnt;
3990 if (args > 1) {
3991 ccnt = scnprintf(tbuf+bcnt,
3992 sizeof(tbuf)-bcnt,
3993 ",%u",hdw->cmd_buffer[2]);
3994 bcnt += ccnt;
3995 }
3996 ccnt = scnprintf(tbuf+bcnt,
3997 sizeof(tbuf)-bcnt,
3998 ")");
3999 bcnt += ccnt;
4000 }
4001 pvr2_trace(PVR2_TRACE_INIT,"%.*s",bcnt,tbuf);
4002 }
4003 ret = pvr2_send_request(hdw,hdw->cmd_buffer,cnt,NULL,0);
4004 LOCK_GIVE(hdw->ctl_lock);
4005 return ret;
4006}
4007
4008
Mike Iselyd8554972006-06-26 20:58:46 -03004009int pvr2_write_register(struct pvr2_hdw *hdw, u16 reg, u32 data)
4010{
4011 int ret;
4012
4013 LOCK_TAKE(hdw->ctl_lock);
4014
Michael Krufky8d364362007-01-22 02:17:55 -03004015 hdw->cmd_buffer[0] = FX2CMD_REG_WRITE; /* write register prefix */
Mike Iselyd8554972006-06-26 20:58:46 -03004016 PVR2_DECOMPOSE_LE(hdw->cmd_buffer,1,data);
4017 hdw->cmd_buffer[5] = 0;
4018 hdw->cmd_buffer[6] = (reg >> 8) & 0xff;
4019 hdw->cmd_buffer[7] = reg & 0xff;
4020
4021
4022 ret = pvr2_send_request(hdw, hdw->cmd_buffer, 8, hdw->cmd_buffer, 0);
4023
4024 LOCK_GIVE(hdw->ctl_lock);
4025
4026 return ret;
4027}
4028
4029
Adrian Bunk07e337e2006-06-30 11:30:20 -03004030static int pvr2_read_register(struct pvr2_hdw *hdw, u16 reg, u32 *data)
Mike Iselyd8554972006-06-26 20:58:46 -03004031{
4032 int ret = 0;
4033
4034 LOCK_TAKE(hdw->ctl_lock);
4035
Michael Krufky8d364362007-01-22 02:17:55 -03004036 hdw->cmd_buffer[0] = FX2CMD_REG_READ; /* read register prefix */
Mike Iselyd8554972006-06-26 20:58:46 -03004037 hdw->cmd_buffer[1] = 0;
4038 hdw->cmd_buffer[2] = 0;
4039 hdw->cmd_buffer[3] = 0;
4040 hdw->cmd_buffer[4] = 0;
4041 hdw->cmd_buffer[5] = 0;
4042 hdw->cmd_buffer[6] = (reg >> 8) & 0xff;
4043 hdw->cmd_buffer[7] = reg & 0xff;
4044
4045 ret |= pvr2_send_request(hdw, hdw->cmd_buffer, 8, hdw->cmd_buffer, 4);
4046 *data = PVR2_COMPOSE_LE(hdw->cmd_buffer,0);
4047
4048 LOCK_GIVE(hdw->ctl_lock);
4049
4050 return ret;
4051}
4052
4053
Mike Isely681c7392007-11-26 01:48:52 -03004054void pvr2_hdw_render_useless(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03004055{
4056 if (!hdw->flag_ok) return;
Mike Isely681c7392007-11-26 01:48:52 -03004057 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
4058 "Device being rendered inoperable");
Mike Iselyd8554972006-06-26 20:58:46 -03004059 if (hdw->vid_stream) {
Mike Iselya0fd1cb2006-06-30 11:35:28 -03004060 pvr2_stream_setup(hdw->vid_stream,NULL,0,0);
Mike Iselyd8554972006-06-26 20:58:46 -03004061 }
Mike Isely681c7392007-11-26 01:48:52 -03004062 hdw->flag_ok = 0;
4063 trace_stbit("flag_ok",hdw->flag_ok);
4064 pvr2_hdw_state_sched(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03004065}
4066
4067
4068void pvr2_hdw_device_reset(struct pvr2_hdw *hdw)
4069{
4070 int ret;
4071 pvr2_trace(PVR2_TRACE_INIT,"Performing a device reset...");
Mike Iselya0fd1cb2006-06-30 11:35:28 -03004072 ret = usb_lock_device_for_reset(hdw->usb_dev,NULL);
Alan Stern011b15d2008-11-04 11:29:27 -05004073 if (ret == 0) {
Mike Iselyd8554972006-06-26 20:58:46 -03004074 ret = usb_reset_device(hdw->usb_dev);
4075 usb_unlock_device(hdw->usb_dev);
4076 } else {
4077 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
4078 "Failed to lock USB device ret=%d",ret);
4079 }
4080 if (init_pause_msec) {
4081 pvr2_trace(PVR2_TRACE_INFO,
4082 "Waiting %u msec for hardware to settle",
4083 init_pause_msec);
4084 msleep(init_pause_msec);
4085 }
4086
4087}
4088
4089
4090void pvr2_hdw_cpureset_assert(struct pvr2_hdw *hdw,int val)
4091{
Mike Isely68618002010-05-15 00:09:47 -03004092 char *da;
Mike Iselyd8554972006-06-26 20:58:46 -03004093 unsigned int pipe;
4094 int ret;
4095
4096 if (!hdw->usb_dev) return;
4097
Mike Isely68618002010-05-15 00:09:47 -03004098 da = kmalloc(16, GFP_KERNEL);
4099
4100 if (da == NULL) {
4101 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
4102 "Unable to allocate memory to control CPU reset");
4103 return;
4104 }
4105
Mike Iselyd8554972006-06-26 20:58:46 -03004106 pvr2_trace(PVR2_TRACE_INIT,"cpureset_assert(%d)",val);
4107
4108 da[0] = val ? 0x01 : 0x00;
4109
4110 /* Write the CPUCS register on the 8051. The lsb of the register
4111 is the reset bit; a 1 asserts reset while a 0 clears it. */
4112 pipe = usb_sndctrlpipe(hdw->usb_dev, 0);
4113 ret = usb_control_msg(hdw->usb_dev,pipe,0xa0,0x40,0xe600,0,da,1,HZ);
4114 if (ret < 0) {
4115 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
4116 "cpureset_assert(%d) error=%d",val,ret);
4117 pvr2_hdw_render_useless(hdw);
4118 }
Mike Isely68618002010-05-15 00:09:47 -03004119
4120 kfree(da);
Mike Iselyd8554972006-06-26 20:58:46 -03004121}
4122
4123
4124int pvr2_hdw_cmd_deep_reset(struct pvr2_hdw *hdw)
4125{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004126 return pvr2_issue_simple_cmd(hdw,FX2CMD_DEEP_RESET);
Mike Iselyd8554972006-06-26 20:58:46 -03004127}
4128
4129
Michael Krufkye1edb192008-04-22 14:45:39 -03004130int pvr2_hdw_cmd_powerup(struct pvr2_hdw *hdw)
4131{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004132 return pvr2_issue_simple_cmd(hdw,FX2CMD_POWER_ON);
Michael Krufkye1edb192008-04-22 14:45:39 -03004133}
4134
Mike Isely1c9d10d2008-03-28 05:38:54 -03004135
Michael Krufkye1edb192008-04-22 14:45:39 -03004136int pvr2_hdw_cmd_powerdown(struct pvr2_hdw *hdw)
4137{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004138 return pvr2_issue_simple_cmd(hdw,FX2CMD_POWER_OFF);
Michael Krufkye1edb192008-04-22 14:45:39 -03004139}
4140
Mike Iselyd8554972006-06-26 20:58:46 -03004141
4142int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw)
4143{
Mike Iselyd8554972006-06-26 20:58:46 -03004144 pvr2_trace(PVR2_TRACE_INIT,
4145 "Requesting decoder reset");
Mike Iselyaf78e162009-03-07 00:21:30 -03004146 if (hdw->decoder_client_id) {
4147 v4l2_device_call_all(&hdw->v4l2_dev, hdw->decoder_client_id,
4148 core, reset, 0);
Mike Iselye17d7872009-06-20 14:45:52 -03004149 pvr2_hdw_cx25840_vbi_hack(hdw);
Mike Iselyaf78e162009-03-07 00:21:30 -03004150 return 0;
4151 }
4152 pvr2_trace(PVR2_TRACE_INIT,
4153 "Unable to reset decoder: nothing attached");
4154 return -ENOTTY;
Mike Iselyd8554972006-06-26 20:58:46 -03004155}
4156
4157
Mike Isely62433e32008-04-22 14:45:40 -03004158static int pvr2_hdw_cmd_hcw_demod_reset(struct pvr2_hdw *hdw, int onoff)
Mike Isely84147f32008-04-22 14:45:40 -03004159{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004160 hdw->flag_ok = !0;
4161 return pvr2_issue_simple_cmd(hdw,
4162 FX2CMD_HCW_DEMOD_RESETIN |
4163 (1 << 8) |
4164 ((onoff ? 1 : 0) << 16));
Mike Isely84147f32008-04-22 14:45:40 -03004165}
4166
Mike Isely84147f32008-04-22 14:45:40 -03004167
Mike Isely62433e32008-04-22 14:45:40 -03004168static int pvr2_hdw_cmd_onair_fe_power_ctrl(struct pvr2_hdw *hdw, int onoff)
Mike Isely84147f32008-04-22 14:45:40 -03004169{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004170 hdw->flag_ok = !0;
4171 return pvr2_issue_simple_cmd(hdw,(onoff ?
4172 FX2CMD_ONAIR_DTV_POWER_ON :
4173 FX2CMD_ONAIR_DTV_POWER_OFF));
Mike Isely84147f32008-04-22 14:45:40 -03004174}
4175
Mike Isely62433e32008-04-22 14:45:40 -03004176
4177static int pvr2_hdw_cmd_onair_digital_path_ctrl(struct pvr2_hdw *hdw,
4178 int onoff)
Mike Isely84147f32008-04-22 14:45:40 -03004179{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004180 return pvr2_issue_simple_cmd(hdw,(onoff ?
4181 FX2CMD_ONAIR_DTV_STREAMING_ON :
4182 FX2CMD_ONAIR_DTV_STREAMING_OFF));
Mike Isely84147f32008-04-22 14:45:40 -03004183}
4184
Mike Isely62433e32008-04-22 14:45:40 -03004185
4186static void pvr2_hdw_cmd_modeswitch(struct pvr2_hdw *hdw,int digitalFl)
4187{
4188 int cmode;
4189 /* Compare digital/analog desired setting with current setting. If
4190 they don't match, fix it... */
4191 cmode = (digitalFl ? PVR2_PATHWAY_DIGITAL : PVR2_PATHWAY_ANALOG);
4192 if (cmode == hdw->pathway_state) {
4193 /* They match; nothing to do */
4194 return;
4195 }
4196
4197 switch (hdw->hdw_desc->digital_control_scheme) {
4198 case PVR2_DIGITAL_SCHEME_HAUPPAUGE:
4199 pvr2_hdw_cmd_hcw_demod_reset(hdw,digitalFl);
4200 if (cmode == PVR2_PATHWAY_ANALOG) {
4201 /* If moving to analog mode, also force the decoder
4202 to reset. If no decoder is attached, then it's
4203 ok to ignore this because if/when the decoder
4204 attaches, it will reset itself at that time. */
4205 pvr2_hdw_cmd_decoder_reset(hdw);
4206 }
4207 break;
4208 case PVR2_DIGITAL_SCHEME_ONAIR:
4209 /* Supposedly we should always have the power on whether in
4210 digital or analog mode. But for now do what appears to
4211 work... */
Mike Iselybb0c2fe2008-03-28 05:41:19 -03004212 pvr2_hdw_cmd_onair_fe_power_ctrl(hdw,digitalFl);
Mike Isely62433e32008-04-22 14:45:40 -03004213 break;
4214 default: break;
4215 }
4216
Mike Isely1b9c18c2008-04-22 14:45:41 -03004217 pvr2_hdw_untrip_unlocked(hdw);
Mike Isely62433e32008-04-22 14:45:40 -03004218 hdw->pathway_state = cmode;
4219}
4220
4221
Adrian Bunke9b59f62008-05-10 04:35:24 -03004222static void pvr2_led_ctrl_hauppauge(struct pvr2_hdw *hdw, int onoff)
Mike Iselyc55a97d2008-04-22 14:45:41 -03004223{
4224 /* change some GPIO data
4225 *
4226 * note: bit d7 of dir appears to control the LED,
4227 * so we shut it off here.
4228 *
Mike Iselyc55a97d2008-04-22 14:45:41 -03004229 */
Mike Isely40381cb2008-04-22 14:45:42 -03004230 if (onoff) {
Mike Iselyc55a97d2008-04-22 14:45:41 -03004231 pvr2_hdw_gpio_chg_dir(hdw, 0xffffffff, 0x00000481);
Mike Isely40381cb2008-04-22 14:45:42 -03004232 } else {
Mike Iselyc55a97d2008-04-22 14:45:41 -03004233 pvr2_hdw_gpio_chg_dir(hdw, 0xffffffff, 0x00000401);
Mike Isely40381cb2008-04-22 14:45:42 -03004234 }
Mike Iselyc55a97d2008-04-22 14:45:41 -03004235 pvr2_hdw_gpio_chg_out(hdw, 0xffffffff, 0x00000000);
Mike Isely40381cb2008-04-22 14:45:42 -03004236}
Mike Iselyc55a97d2008-04-22 14:45:41 -03004237
Mike Isely40381cb2008-04-22 14:45:42 -03004238
4239typedef void (*led_method_func)(struct pvr2_hdw *,int);
4240
4241static led_method_func led_methods[] = {
4242 [PVR2_LED_SCHEME_HAUPPAUGE] = pvr2_led_ctrl_hauppauge,
4243};
4244
4245
4246/* Toggle LED */
4247static void pvr2_led_ctrl(struct pvr2_hdw *hdw,int onoff)
4248{
4249 unsigned int scheme_id;
4250 led_method_func fp;
4251
4252 if ((!onoff) == (!hdw->led_on)) return;
4253
4254 hdw->led_on = onoff != 0;
4255
4256 scheme_id = hdw->hdw_desc->led_scheme;
4257 if (scheme_id < ARRAY_SIZE(led_methods)) {
4258 fp = led_methods[scheme_id];
4259 } else {
4260 fp = NULL;
4261 }
4262
4263 if (fp) (*fp)(hdw,onoff);
Mike Iselyc55a97d2008-04-22 14:45:41 -03004264}
4265
4266
Mike Iselye61b6fc2006-07-18 22:42:18 -03004267/* Stop / start video stream transport */
Adrian Bunk07e337e2006-06-30 11:30:20 -03004268static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl)
Mike Iselyd8554972006-06-26 20:58:46 -03004269{
Mike Iselybb0c2fe2008-03-28 05:41:19 -03004270 int ret;
4271
4272 /* If we're in analog mode, then just issue the usual analog
4273 command. */
4274 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
4275 return pvr2_issue_simple_cmd(hdw,
4276 (runFl ?
4277 FX2CMD_STREAMING_ON :
4278 FX2CMD_STREAMING_OFF));
4279 /*Note: Not reached */
Mike Isely62433e32008-04-22 14:45:40 -03004280 }
Mike Iselybb0c2fe2008-03-28 05:41:19 -03004281
4282 if (hdw->pathway_state != PVR2_PATHWAY_DIGITAL) {
4283 /* Whoops, we don't know what mode we're in... */
4284 return -EINVAL;
4285 }
4286
4287 /* To get here we have to be in digital mode. The mechanism here
4288 is unfortunately different for different vendors. So we switch
4289 on the device's digital scheme attribute in order to figure out
4290 what to do. */
4291 switch (hdw->hdw_desc->digital_control_scheme) {
4292 case PVR2_DIGITAL_SCHEME_HAUPPAUGE:
4293 return pvr2_issue_simple_cmd(hdw,
4294 (runFl ?
4295 FX2CMD_HCW_DTV_STREAMING_ON :
4296 FX2CMD_HCW_DTV_STREAMING_OFF));
4297 case PVR2_DIGITAL_SCHEME_ONAIR:
4298 ret = pvr2_issue_simple_cmd(hdw,
4299 (runFl ?
4300 FX2CMD_STREAMING_ON :
4301 FX2CMD_STREAMING_OFF));
4302 if (ret) return ret;
4303 return pvr2_hdw_cmd_onair_digital_path_ctrl(hdw,runFl);
4304 default:
4305 return -EINVAL;
4306 }
Mike Iselyd8554972006-06-26 20:58:46 -03004307}
4308
4309
Mike Isely62433e32008-04-22 14:45:40 -03004310/* Evaluate whether or not state_pathway_ok can change */
4311static int state_eval_pathway_ok(struct pvr2_hdw *hdw)
4312{
4313 if (hdw->state_pathway_ok) {
4314 /* Nothing to do if pathway is already ok */
4315 return 0;
4316 }
4317 if (!hdw->state_pipeline_idle) {
4318 /* Not allowed to change anything if pipeline is not idle */
4319 return 0;
4320 }
4321 pvr2_hdw_cmd_modeswitch(hdw,hdw->input_val == PVR2_CVAL_INPUT_DTV);
4322 hdw->state_pathway_ok = !0;
Mike Iselye9db1ff2008-04-22 14:45:41 -03004323 trace_stbit("state_pathway_ok",hdw->state_pathway_ok);
Mike Isely62433e32008-04-22 14:45:40 -03004324 return !0;
4325}
4326
4327
Mike Isely681c7392007-11-26 01:48:52 -03004328/* Evaluate whether or not state_encoder_ok can change */
4329static int state_eval_encoder_ok(struct pvr2_hdw *hdw)
4330{
4331 if (hdw->state_encoder_ok) return 0;
4332 if (hdw->flag_tripped) return 0;
4333 if (hdw->state_encoder_run) return 0;
4334 if (hdw->state_encoder_config) return 0;
4335 if (hdw->state_decoder_run) return 0;
4336 if (hdw->state_usbstream_run) return 0;
Mike Isely72998b72008-04-03 04:51:19 -03004337 if (hdw->pathway_state == PVR2_PATHWAY_DIGITAL) {
4338 if (!hdw->hdw_desc->flag_digital_requires_cx23416) return 0;
4339 } else if (hdw->pathway_state != PVR2_PATHWAY_ANALOG) {
4340 return 0;
4341 }
4342
Mike Isely681c7392007-11-26 01:48:52 -03004343 if (pvr2_upload_firmware2(hdw) < 0) {
4344 hdw->flag_tripped = !0;
4345 trace_stbit("flag_tripped",hdw->flag_tripped);
4346 return !0;
4347 }
4348 hdw->state_encoder_ok = !0;
4349 trace_stbit("state_encoder_ok",hdw->state_encoder_ok);
4350 return !0;
4351}
4352
4353
4354/* Evaluate whether or not state_encoder_config can change */
4355static int state_eval_encoder_config(struct pvr2_hdw *hdw)
4356{
4357 if (hdw->state_encoder_config) {
4358 if (hdw->state_encoder_ok) {
4359 if (hdw->state_pipeline_req &&
4360 !hdw->state_pipeline_pause) return 0;
4361 }
4362 hdw->state_encoder_config = 0;
4363 hdw->state_encoder_waitok = 0;
4364 trace_stbit("state_encoder_waitok",hdw->state_encoder_waitok);
4365 /* paranoia - solve race if timer just completed */
4366 del_timer_sync(&hdw->encoder_wait_timer);
4367 } else {
Mike Isely62433e32008-04-22 14:45:40 -03004368 if (!hdw->state_pathway_ok ||
4369 (hdw->pathway_state != PVR2_PATHWAY_ANALOG) ||
4370 !hdw->state_encoder_ok ||
Mike Isely681c7392007-11-26 01:48:52 -03004371 !hdw->state_pipeline_idle ||
4372 hdw->state_pipeline_pause ||
4373 !hdw->state_pipeline_req ||
4374 !hdw->state_pipeline_config) {
4375 /* We must reset the enforced wait interval if
4376 anything has happened that might have disturbed
4377 the encoder. This should be a rare case. */
4378 if (timer_pending(&hdw->encoder_wait_timer)) {
4379 del_timer_sync(&hdw->encoder_wait_timer);
4380 }
4381 if (hdw->state_encoder_waitok) {
4382 /* Must clear the state - therefore we did
4383 something to a state bit and must also
4384 return true. */
4385 hdw->state_encoder_waitok = 0;
4386 trace_stbit("state_encoder_waitok",
4387 hdw->state_encoder_waitok);
4388 return !0;
4389 }
4390 return 0;
4391 }
4392 if (!hdw->state_encoder_waitok) {
4393 if (!timer_pending(&hdw->encoder_wait_timer)) {
4394 /* waitok flag wasn't set and timer isn't
4395 running. Check flag once more to avoid
4396 a race then start the timer. This is
4397 the point when we measure out a minimal
4398 quiet interval before doing something to
4399 the encoder. */
4400 if (!hdw->state_encoder_waitok) {
4401 hdw->encoder_wait_timer.expires =
Mike Isely83ce57a2008-05-26 05:51:57 -03004402 jiffies +
4403 (HZ * TIME_MSEC_ENCODER_WAIT
4404 / 1000);
Mike Isely681c7392007-11-26 01:48:52 -03004405 add_timer(&hdw->encoder_wait_timer);
4406 }
4407 }
4408 /* We can't continue until we know we have been
4409 quiet for the interval measured by this
4410 timer. */
4411 return 0;
4412 }
4413 pvr2_encoder_configure(hdw);
4414 if (hdw->state_encoder_ok) hdw->state_encoder_config = !0;
4415 }
4416 trace_stbit("state_encoder_config",hdw->state_encoder_config);
4417 return !0;
4418}
4419
4420
Mike Iselyd913d632008-04-06 04:04:35 -03004421/* Return true if the encoder should not be running. */
4422static int state_check_disable_encoder_run(struct pvr2_hdw *hdw)
4423{
4424 if (!hdw->state_encoder_ok) {
4425 /* Encoder isn't healthy at the moment, so stop it. */
4426 return !0;
4427 }
4428 if (!hdw->state_pathway_ok) {
4429 /* Mode is not understood at the moment (i.e. it wants to
4430 change), so encoder must be stopped. */
4431 return !0;
4432 }
4433
4434 switch (hdw->pathway_state) {
4435 case PVR2_PATHWAY_ANALOG:
4436 if (!hdw->state_decoder_run) {
4437 /* We're in analog mode and the decoder is not
4438 running; thus the encoder should be stopped as
4439 well. */
4440 return !0;
4441 }
4442 break;
4443 case PVR2_PATHWAY_DIGITAL:
4444 if (hdw->state_encoder_runok) {
4445 /* This is a funny case. We're in digital mode so
4446 really the encoder should be stopped. However
4447 if it really is running, only kill it after
4448 runok has been set. This gives a chance for the
4449 onair quirk to function (encoder must run
4450 briefly first, at least once, before onair
4451 digital streaming can work). */
4452 return !0;
4453 }
4454 break;
4455 default:
4456 /* Unknown mode; so encoder should be stopped. */
4457 return !0;
4458 }
4459
4460 /* If we get here, we haven't found a reason to stop the
4461 encoder. */
4462 return 0;
4463}
4464
4465
4466/* Return true if the encoder should be running. */
4467static int state_check_enable_encoder_run(struct pvr2_hdw *hdw)
4468{
4469 if (!hdw->state_encoder_ok) {
4470 /* Don't run the encoder if it isn't healthy... */
4471 return 0;
4472 }
4473 if (!hdw->state_pathway_ok) {
4474 /* Don't run the encoder if we don't (yet) know what mode
4475 we need to be in... */
4476 return 0;
4477 }
4478
4479 switch (hdw->pathway_state) {
4480 case PVR2_PATHWAY_ANALOG:
Mike Isely6e931372010-02-06 02:10:38 -03004481 if (hdw->state_decoder_run && hdw->state_decoder_ready) {
Mike Iselyd913d632008-04-06 04:04:35 -03004482 /* In analog mode, if the decoder is running, then
4483 run the encoder. */
4484 return !0;
4485 }
4486 break;
4487 case PVR2_PATHWAY_DIGITAL:
4488 if ((hdw->hdw_desc->digital_control_scheme ==
4489 PVR2_DIGITAL_SCHEME_ONAIR) &&
4490 !hdw->state_encoder_runok) {
4491 /* This is a quirk. OnAir hardware won't stream
4492 digital until the encoder has been run at least
4493 once, for a minimal period of time (empiricially
4494 measured to be 1/4 second). So if we're on
4495 OnAir hardware and the encoder has never been
4496 run at all, then start the encoder. Normal
4497 state machine logic in the driver will
4498 automatically handle the remaining bits. */
4499 return !0;
4500 }
4501 break;
4502 default:
4503 /* For completeness (unknown mode; encoder won't run ever) */
4504 break;
4505 }
4506 /* If we get here, then we haven't found any reason to run the
4507 encoder, so don't run it. */
4508 return 0;
4509}
4510
4511
Mike Isely681c7392007-11-26 01:48:52 -03004512/* Evaluate whether or not state_encoder_run can change */
4513static int state_eval_encoder_run(struct pvr2_hdw *hdw)
4514{
4515 if (hdw->state_encoder_run) {
Mike Iselyd913d632008-04-06 04:04:35 -03004516 if (!state_check_disable_encoder_run(hdw)) return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004517 if (hdw->state_encoder_ok) {
Mike Iselyd913d632008-04-06 04:04:35 -03004518 del_timer_sync(&hdw->encoder_run_timer);
Mike Isely681c7392007-11-26 01:48:52 -03004519 if (pvr2_encoder_stop(hdw) < 0) return !0;
4520 }
4521 hdw->state_encoder_run = 0;
4522 } else {
Mike Iselyd913d632008-04-06 04:04:35 -03004523 if (!state_check_enable_encoder_run(hdw)) return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004524 if (pvr2_encoder_start(hdw) < 0) return !0;
4525 hdw->state_encoder_run = !0;
Mike Iselyd913d632008-04-06 04:04:35 -03004526 if (!hdw->state_encoder_runok) {
4527 hdw->encoder_run_timer.expires =
Mike Isely83ce57a2008-05-26 05:51:57 -03004528 jiffies + (HZ * TIME_MSEC_ENCODER_OK / 1000);
Mike Iselyd913d632008-04-06 04:04:35 -03004529 add_timer(&hdw->encoder_run_timer);
4530 }
Mike Isely681c7392007-11-26 01:48:52 -03004531 }
4532 trace_stbit("state_encoder_run",hdw->state_encoder_run);
4533 return !0;
4534}
4535
4536
4537/* Timeout function for quiescent timer. */
4538static void pvr2_hdw_quiescent_timeout(unsigned long data)
4539{
4540 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4541 hdw->state_decoder_quiescent = !0;
4542 trace_stbit("state_decoder_quiescent",hdw->state_decoder_quiescent);
4543 hdw->state_stale = !0;
4544 queue_work(hdw->workqueue,&hdw->workpoll);
4545}
4546
4547
Mike Isely6e931372010-02-06 02:10:38 -03004548/* Timeout function for decoder stabilization timer. */
4549static void pvr2_hdw_decoder_stabilization_timeout(unsigned long data)
4550{
4551 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4552 hdw->state_decoder_ready = !0;
4553 trace_stbit("state_decoder_ready", hdw->state_decoder_ready);
4554 hdw->state_stale = !0;
4555 queue_work(hdw->workqueue, &hdw->workpoll);
4556}
4557
4558
Mike Isely681c7392007-11-26 01:48:52 -03004559/* Timeout function for encoder wait timer. */
4560static void pvr2_hdw_encoder_wait_timeout(unsigned long data)
4561{
4562 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4563 hdw->state_encoder_waitok = !0;
4564 trace_stbit("state_encoder_waitok",hdw->state_encoder_waitok);
4565 hdw->state_stale = !0;
4566 queue_work(hdw->workqueue,&hdw->workpoll);
4567}
4568
4569
Mike Iselyd913d632008-04-06 04:04:35 -03004570/* Timeout function for encoder run timer. */
4571static void pvr2_hdw_encoder_run_timeout(unsigned long data)
4572{
4573 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4574 if (!hdw->state_encoder_runok) {
4575 hdw->state_encoder_runok = !0;
4576 trace_stbit("state_encoder_runok",hdw->state_encoder_runok);
4577 hdw->state_stale = !0;
4578 queue_work(hdw->workqueue,&hdw->workpoll);
4579 }
4580}
4581
4582
Mike Isely681c7392007-11-26 01:48:52 -03004583/* Evaluate whether or not state_decoder_run can change */
4584static int state_eval_decoder_run(struct pvr2_hdw *hdw)
4585{
4586 if (hdw->state_decoder_run) {
4587 if (hdw->state_encoder_ok) {
4588 if (hdw->state_pipeline_req &&
Mike Isely62433e32008-04-22 14:45:40 -03004589 !hdw->state_pipeline_pause &&
4590 hdw->state_pathway_ok) return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004591 }
4592 if (!hdw->flag_decoder_missed) {
4593 pvr2_decoder_enable(hdw,0);
4594 }
4595 hdw->state_decoder_quiescent = 0;
4596 hdw->state_decoder_run = 0;
Mike Isely6e931372010-02-06 02:10:38 -03004597 /* paranoia - solve race if timer(s) just completed */
Mike Isely681c7392007-11-26 01:48:52 -03004598 del_timer_sync(&hdw->quiescent_timer);
Mike Isely6e931372010-02-06 02:10:38 -03004599 /* Kill the stabilization timer, in case we're killing the
4600 encoder before the previous stabilization interval has
4601 been properly timed. */
4602 del_timer_sync(&hdw->decoder_stabilization_timer);
4603 hdw->state_decoder_ready = 0;
Mike Isely681c7392007-11-26 01:48:52 -03004604 } else {
4605 if (!hdw->state_decoder_quiescent) {
4606 if (!timer_pending(&hdw->quiescent_timer)) {
4607 /* We don't do something about the
4608 quiescent timer until right here because
4609 we also want to catch cases where the
4610 decoder was already not running (like
4611 after initialization) as opposed to
4612 knowing that we had just stopped it.
4613 The second flag check is here to cover a
4614 race - the timer could have run and set
4615 this flag just after the previous check
4616 but before we did the pending check. */
4617 if (!hdw->state_decoder_quiescent) {
4618 hdw->quiescent_timer.expires =
Mike Isely83ce57a2008-05-26 05:51:57 -03004619 jiffies +
4620 (HZ * TIME_MSEC_DECODER_WAIT
4621 / 1000);
Mike Isely681c7392007-11-26 01:48:52 -03004622 add_timer(&hdw->quiescent_timer);
4623 }
4624 }
4625 /* Don't allow decoder to start again until it has
4626 been quiesced first. This little detail should
4627 hopefully further stabilize the encoder. */
4628 return 0;
4629 }
Mike Isely62433e32008-04-22 14:45:40 -03004630 if (!hdw->state_pathway_ok ||
4631 (hdw->pathway_state != PVR2_PATHWAY_ANALOG) ||
4632 !hdw->state_pipeline_req ||
Mike Isely681c7392007-11-26 01:48:52 -03004633 hdw->state_pipeline_pause ||
4634 !hdw->state_pipeline_config ||
4635 !hdw->state_encoder_config ||
4636 !hdw->state_encoder_ok) return 0;
4637 del_timer_sync(&hdw->quiescent_timer);
4638 if (hdw->flag_decoder_missed) return 0;
4639 if (pvr2_decoder_enable(hdw,!0) < 0) return 0;
4640 hdw->state_decoder_quiescent = 0;
Mike Isely6e931372010-02-06 02:10:38 -03004641 hdw->state_decoder_ready = 0;
Mike Isely681c7392007-11-26 01:48:52 -03004642 hdw->state_decoder_run = !0;
Mike Iselyfb640222010-02-06 02:17:17 -03004643 if (hdw->decoder_client_id == PVR2_CLIENT_ID_SAA7115) {
4644 hdw->decoder_stabilization_timer.expires =
4645 jiffies +
4646 (HZ * TIME_MSEC_DECODER_STABILIZATION_WAIT /
4647 1000);
4648 add_timer(&hdw->decoder_stabilization_timer);
4649 } else {
4650 hdw->state_decoder_ready = !0;
4651 }
Mike Isely681c7392007-11-26 01:48:52 -03004652 }
4653 trace_stbit("state_decoder_quiescent",hdw->state_decoder_quiescent);
4654 trace_stbit("state_decoder_run",hdw->state_decoder_run);
Mike Isely6e931372010-02-06 02:10:38 -03004655 trace_stbit("state_decoder_ready", hdw->state_decoder_ready);
Mike Isely681c7392007-11-26 01:48:52 -03004656 return !0;
4657}
4658
4659
4660/* Evaluate whether or not state_usbstream_run can change */
4661static int state_eval_usbstream_run(struct pvr2_hdw *hdw)
4662{
4663 if (hdw->state_usbstream_run) {
Mike Isely72998b72008-04-03 04:51:19 -03004664 int fl = !0;
Mike Isely62433e32008-04-22 14:45:40 -03004665 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
Mike Isely72998b72008-04-03 04:51:19 -03004666 fl = (hdw->state_encoder_ok &&
4667 hdw->state_encoder_run);
4668 } else if ((hdw->pathway_state == PVR2_PATHWAY_DIGITAL) &&
4669 (hdw->hdw_desc->flag_digital_requires_cx23416)) {
4670 fl = hdw->state_encoder_ok;
4671 }
4672 if (fl &&
4673 hdw->state_pipeline_req &&
4674 !hdw->state_pipeline_pause &&
4675 hdw->state_pathway_ok) {
4676 return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004677 }
4678 pvr2_hdw_cmd_usbstream(hdw,0);
4679 hdw->state_usbstream_run = 0;
4680 } else {
Mike Isely62433e32008-04-22 14:45:40 -03004681 if (!hdw->state_pipeline_req ||
4682 hdw->state_pipeline_pause ||
4683 !hdw->state_pathway_ok) return 0;
4684 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
4685 if (!hdw->state_encoder_ok ||
4686 !hdw->state_encoder_run) return 0;
Mike Isely72998b72008-04-03 04:51:19 -03004687 } else if ((hdw->pathway_state == PVR2_PATHWAY_DIGITAL) &&
4688 (hdw->hdw_desc->flag_digital_requires_cx23416)) {
4689 if (!hdw->state_encoder_ok) return 0;
Mike Iselyd913d632008-04-06 04:04:35 -03004690 if (hdw->state_encoder_run) return 0;
4691 if (hdw->hdw_desc->digital_control_scheme ==
4692 PVR2_DIGITAL_SCHEME_ONAIR) {
4693 /* OnAir digital receivers won't stream
4694 unless the analog encoder has run first.
4695 Why? I have no idea. But don't even
4696 try until we know the analog side is
4697 known to have run. */
4698 if (!hdw->state_encoder_runok) return 0;
4699 }
Mike Isely62433e32008-04-22 14:45:40 -03004700 }
Mike Isely681c7392007-11-26 01:48:52 -03004701 if (pvr2_hdw_cmd_usbstream(hdw,!0) < 0) return 0;
4702 hdw->state_usbstream_run = !0;
4703 }
4704 trace_stbit("state_usbstream_run",hdw->state_usbstream_run);
4705 return !0;
4706}
4707
4708
4709/* Attempt to configure pipeline, if needed */
4710static int state_eval_pipeline_config(struct pvr2_hdw *hdw)
4711{
4712 if (hdw->state_pipeline_config ||
4713 hdw->state_pipeline_pause) return 0;
4714 pvr2_hdw_commit_execute(hdw);
4715 return !0;
4716}
4717
4718
4719/* Update pipeline idle and pipeline pause tracking states based on other
4720 inputs. This must be called whenever the other relevant inputs have
4721 changed. */
4722static int state_update_pipeline_state(struct pvr2_hdw *hdw)
4723{
4724 unsigned int st;
4725 int updatedFl = 0;
4726 /* Update pipeline state */
4727 st = !(hdw->state_encoder_run ||
4728 hdw->state_decoder_run ||
4729 hdw->state_usbstream_run ||
4730 (!hdw->state_decoder_quiescent));
4731 if (!st != !hdw->state_pipeline_idle) {
4732 hdw->state_pipeline_idle = st;
4733 updatedFl = !0;
4734 }
4735 if (hdw->state_pipeline_idle && hdw->state_pipeline_pause) {
4736 hdw->state_pipeline_pause = 0;
4737 updatedFl = !0;
4738 }
4739 return updatedFl;
4740}
4741
4742
4743typedef int (*state_eval_func)(struct pvr2_hdw *);
4744
4745/* Set of functions to be run to evaluate various states in the driver. */
Tobias Klauserebff0332008-04-22 14:45:45 -03004746static const state_eval_func eval_funcs[] = {
Mike Isely62433e32008-04-22 14:45:40 -03004747 state_eval_pathway_ok,
Mike Isely681c7392007-11-26 01:48:52 -03004748 state_eval_pipeline_config,
4749 state_eval_encoder_ok,
4750 state_eval_encoder_config,
4751 state_eval_decoder_run,
4752 state_eval_encoder_run,
4753 state_eval_usbstream_run,
4754};
4755
4756
4757/* Process various states and return true if we did anything interesting. */
4758static int pvr2_hdw_state_update(struct pvr2_hdw *hdw)
4759{
4760 unsigned int i;
4761 int state_updated = 0;
4762 int check_flag;
4763
4764 if (!hdw->state_stale) return 0;
4765 if ((hdw->fw1_state != FW1_STATE_OK) ||
4766 !hdw->flag_ok) {
4767 hdw->state_stale = 0;
4768 return !0;
4769 }
4770 /* This loop is the heart of the entire driver. It keeps trying to
4771 evaluate various bits of driver state until nothing changes for
4772 one full iteration. Each "bit of state" tracks some global
4773 aspect of the driver, e.g. whether decoder should run, if
4774 pipeline is configured, usb streaming is on, etc. We separately
4775 evaluate each of those questions based on other driver state to
4776 arrive at the correct running configuration. */
4777 do {
4778 check_flag = 0;
4779 state_update_pipeline_state(hdw);
4780 /* Iterate over each bit of state */
4781 for (i = 0; (i<ARRAY_SIZE(eval_funcs)) && hdw->flag_ok; i++) {
4782 if ((*eval_funcs[i])(hdw)) {
4783 check_flag = !0;
4784 state_updated = !0;
4785 state_update_pipeline_state(hdw);
4786 }
4787 }
4788 } while (check_flag && hdw->flag_ok);
4789 hdw->state_stale = 0;
4790 trace_stbit("state_stale",hdw->state_stale);
4791 return state_updated;
4792}
4793
4794
Mike Isely1cb03b72008-04-21 03:47:43 -03004795static unsigned int print_input_mask(unsigned int msk,
4796 char *buf,unsigned int acnt)
4797{
4798 unsigned int idx,ccnt;
4799 unsigned int tcnt = 0;
4800 for (idx = 0; idx < ARRAY_SIZE(control_values_input); idx++) {
4801 if (!((1 << idx) & msk)) continue;
4802 ccnt = scnprintf(buf+tcnt,
4803 acnt-tcnt,
4804 "%s%s",
4805 (tcnt ? ", " : ""),
4806 control_values_input[idx]);
4807 tcnt += ccnt;
4808 }
4809 return tcnt;
4810}
4811
4812
Mike Isely62433e32008-04-22 14:45:40 -03004813static const char *pvr2_pathway_state_name(int id)
4814{
4815 switch (id) {
4816 case PVR2_PATHWAY_ANALOG: return "analog";
4817 case PVR2_PATHWAY_DIGITAL: return "digital";
4818 default: return "unknown";
4819 }
4820}
4821
4822
Mike Isely681c7392007-11-26 01:48:52 -03004823static unsigned int pvr2_hdw_report_unlocked(struct pvr2_hdw *hdw,int which,
4824 char *buf,unsigned int acnt)
4825{
4826 switch (which) {
4827 case 0:
4828 return scnprintf(
4829 buf,acnt,
Mike Iselye9db1ff2008-04-22 14:45:41 -03004830 "driver:%s%s%s%s%s <mode=%s>",
Mike Isely681c7392007-11-26 01:48:52 -03004831 (hdw->flag_ok ? " <ok>" : " <fail>"),
4832 (hdw->flag_init_ok ? " <init>" : " <uninitialized>"),
4833 (hdw->flag_disconnected ? " <disconnected>" :
4834 " <connected>"),
4835 (hdw->flag_tripped ? " <tripped>" : ""),
Mike Isely62433e32008-04-22 14:45:40 -03004836 (hdw->flag_decoder_missed ? " <no decoder>" : ""),
4837 pvr2_pathway_state_name(hdw->pathway_state));
4838
Mike Isely681c7392007-11-26 01:48:52 -03004839 case 1:
4840 return scnprintf(
4841 buf,acnt,
4842 "pipeline:%s%s%s%s",
4843 (hdw->state_pipeline_idle ? " <idle>" : ""),
4844 (hdw->state_pipeline_config ?
4845 " <configok>" : " <stale>"),
4846 (hdw->state_pipeline_req ? " <req>" : ""),
4847 (hdw->state_pipeline_pause ? " <pause>" : ""));
4848 case 2:
4849 return scnprintf(
4850 buf,acnt,
Mike Isely62433e32008-04-22 14:45:40 -03004851 "worker:%s%s%s%s%s%s%s",
Mike Isely681c7392007-11-26 01:48:52 -03004852 (hdw->state_decoder_run ?
Mike Isely6e931372010-02-06 02:10:38 -03004853 (hdw->state_decoder_ready ?
4854 "<decode:run>" : " <decode:start>") :
Mike Isely681c7392007-11-26 01:48:52 -03004855 (hdw->state_decoder_quiescent ?
4856 "" : " <decode:stop>")),
4857 (hdw->state_decoder_quiescent ?
4858 " <decode:quiescent>" : ""),
4859 (hdw->state_encoder_ok ?
4860 "" : " <encode:init>"),
4861 (hdw->state_encoder_run ?
Mike Iselyd913d632008-04-06 04:04:35 -03004862 (hdw->state_encoder_runok ?
4863 " <encode:run>" :
4864 " <encode:firstrun>") :
4865 (hdw->state_encoder_runok ?
4866 " <encode:stop>" :
4867 " <encode:virgin>")),
Mike Isely681c7392007-11-26 01:48:52 -03004868 (hdw->state_encoder_config ?
4869 " <encode:configok>" :
4870 (hdw->state_encoder_waitok ?
Mike Iselyb9a37d92008-03-28 05:31:40 -03004871 "" : " <encode:waitok>")),
Mike Isely681c7392007-11-26 01:48:52 -03004872 (hdw->state_usbstream_run ?
Mike Isely62433e32008-04-22 14:45:40 -03004873 " <usb:run>" : " <usb:stop>"),
4874 (hdw->state_pathway_ok ?
Mike Iselye9db1ff2008-04-22 14:45:41 -03004875 " <pathway:ok>" : ""));
Mike Isely681c7392007-11-26 01:48:52 -03004876 case 3:
4877 return scnprintf(
4878 buf,acnt,
4879 "state: %s",
4880 pvr2_get_state_name(hdw->master_state));
Mike Iselyad0992e2008-03-28 05:34:45 -03004881 case 4: {
Mike Isely1cb03b72008-04-21 03:47:43 -03004882 unsigned int tcnt = 0;
4883 unsigned int ccnt;
4884
4885 ccnt = scnprintf(buf,
4886 acnt,
4887 "Hardware supported inputs: ");
4888 tcnt += ccnt;
4889 tcnt += print_input_mask(hdw->input_avail_mask,
4890 buf+tcnt,
4891 acnt-tcnt);
4892 if (hdw->input_avail_mask != hdw->input_allowed_mask) {
4893 ccnt = scnprintf(buf+tcnt,
4894 acnt-tcnt,
4895 "; allowed inputs: ");
4896 tcnt += ccnt;
4897 tcnt += print_input_mask(hdw->input_allowed_mask,
4898 buf+tcnt,
4899 acnt-tcnt);
4900 }
4901 return tcnt;
4902 }
4903 case 5: {
Mike Iselyad0992e2008-03-28 05:34:45 -03004904 struct pvr2_stream_stats stats;
4905 if (!hdw->vid_stream) break;
4906 pvr2_stream_get_stats(hdw->vid_stream,
4907 &stats,
4908 0);
4909 return scnprintf(
4910 buf,acnt,
4911 "Bytes streamed=%u"
4912 " URBs: queued=%u idle=%u ready=%u"
4913 " processed=%u failed=%u",
4914 stats.bytes_processed,
4915 stats.buffers_in_queue,
4916 stats.buffers_in_idle,
4917 stats.buffers_in_ready,
4918 stats.buffers_processed,
4919 stats.buffers_failed);
4920 }
Mike Isely27eab382009-04-06 01:51:38 -03004921 case 6: {
4922 unsigned int id = hdw->ir_scheme_active;
4923 return scnprintf(buf, acnt, "ir scheme: id=%d %s", id,
4924 (id >= ARRAY_SIZE(ir_scheme_names) ?
4925 "?" : ir_scheme_names[id]));
4926 }
Mike Isely681c7392007-11-26 01:48:52 -03004927 default: break;
4928 }
4929 return 0;
4930}
4931
4932
Mike Isely2eb563b2009-03-08 18:25:46 -03004933/* Generate report containing info about attached sub-devices and attached
4934 i2c clients, including an indication of which attached i2c clients are
4935 actually sub-devices. */
4936static unsigned int pvr2_hdw_report_clients(struct pvr2_hdw *hdw,
4937 char *buf, unsigned int acnt)
4938{
4939 struct v4l2_subdev *sd;
4940 unsigned int tcnt = 0;
4941 unsigned int ccnt;
4942 struct i2c_client *client;
Mike Isely2eb563b2009-03-08 18:25:46 -03004943 const char *p;
4944 unsigned int id;
4945
Jean Delvarefa7ce762009-05-02 00:22:27 -03004946 ccnt = scnprintf(buf, acnt, "Associated v4l2-subdev drivers and I2C clients:\n");
Mike Isely2eb563b2009-03-08 18:25:46 -03004947 tcnt += ccnt;
4948 v4l2_device_for_each_subdev(sd, &hdw->v4l2_dev) {
4949 id = sd->grp_id;
4950 p = NULL;
4951 if (id < ARRAY_SIZE(module_names)) p = module_names[id];
4952 if (p) {
Jean Delvarefa7ce762009-05-02 00:22:27 -03004953 ccnt = scnprintf(buf + tcnt, acnt - tcnt, " %s:", p);
Mike Isely2eb563b2009-03-08 18:25:46 -03004954 tcnt += ccnt;
4955 } else {
4956 ccnt = scnprintf(buf + tcnt, acnt - tcnt,
Jean Delvarefa7ce762009-05-02 00:22:27 -03004957 " (unknown id=%u):", id);
4958 tcnt += ccnt;
4959 }
4960 client = v4l2_get_subdevdata(sd);
4961 if (client) {
4962 ccnt = scnprintf(buf + tcnt, acnt - tcnt,
4963 " %s @ %02x\n", client->name,
4964 client->addr);
4965 tcnt += ccnt;
4966 } else {
4967 ccnt = scnprintf(buf + tcnt, acnt - tcnt,
4968 " no i2c client\n");
Mike Isely2eb563b2009-03-08 18:25:46 -03004969 tcnt += ccnt;
4970 }
4971 }
Mike Isely2eb563b2009-03-08 18:25:46 -03004972 return tcnt;
4973}
4974
4975
Mike Isely681c7392007-11-26 01:48:52 -03004976unsigned int pvr2_hdw_state_report(struct pvr2_hdw *hdw,
4977 char *buf,unsigned int acnt)
4978{
4979 unsigned int bcnt,ccnt,idx;
4980 bcnt = 0;
4981 LOCK_TAKE(hdw->big_lock);
4982 for (idx = 0; ; idx++) {
4983 ccnt = pvr2_hdw_report_unlocked(hdw,idx,buf,acnt);
4984 if (!ccnt) break;
4985 bcnt += ccnt; acnt -= ccnt; buf += ccnt;
4986 if (!acnt) break;
4987 buf[0] = '\n'; ccnt = 1;
4988 bcnt += ccnt; acnt -= ccnt; buf += ccnt;
4989 }
Mike Isely2eb563b2009-03-08 18:25:46 -03004990 ccnt = pvr2_hdw_report_clients(hdw, buf, acnt);
4991 bcnt += ccnt; acnt -= ccnt; buf += ccnt;
Mike Isely681c7392007-11-26 01:48:52 -03004992 LOCK_GIVE(hdw->big_lock);
4993 return bcnt;
4994}
4995
4996
4997static void pvr2_hdw_state_log_state(struct pvr2_hdw *hdw)
4998{
Mike Isely2eb563b2009-03-08 18:25:46 -03004999 char buf[256];
5000 unsigned int idx, ccnt;
5001 unsigned int lcnt, ucnt;
Mike Isely681c7392007-11-26 01:48:52 -03005002
5003 for (idx = 0; ; idx++) {
5004 ccnt = pvr2_hdw_report_unlocked(hdw,idx,buf,sizeof(buf));
5005 if (!ccnt) break;
5006 printk(KERN_INFO "%s %.*s\n",hdw->name,ccnt,buf);
5007 }
Mike Isely2eb563b2009-03-08 18:25:46 -03005008 ccnt = pvr2_hdw_report_clients(hdw, buf, sizeof(buf));
5009 ucnt = 0;
5010 while (ucnt < ccnt) {
5011 lcnt = 0;
5012 while ((lcnt + ucnt < ccnt) && (buf[lcnt + ucnt] != '\n')) {
5013 lcnt++;
5014 }
5015 printk(KERN_INFO "%s %.*s\n", hdw->name, lcnt, buf + ucnt);
5016 ucnt += lcnt + 1;
5017 }
Mike Isely681c7392007-11-26 01:48:52 -03005018}
5019
5020
5021/* Evaluate and update the driver's current state, taking various actions
5022 as appropriate for the update. */
5023static int pvr2_hdw_state_eval(struct pvr2_hdw *hdw)
5024{
5025 unsigned int st;
5026 int state_updated = 0;
5027 int callback_flag = 0;
Mike Isely1b9c18c2008-04-22 14:45:41 -03005028 int analog_mode;
Mike Isely681c7392007-11-26 01:48:52 -03005029
5030 pvr2_trace(PVR2_TRACE_STBITS,
5031 "Drive state check START");
5032 if (pvrusb2_debug & PVR2_TRACE_STBITS) {
5033 pvr2_hdw_state_log_state(hdw);
5034 }
5035
5036 /* Process all state and get back over disposition */
5037 state_updated = pvr2_hdw_state_update(hdw);
5038
Mike Isely1b9c18c2008-04-22 14:45:41 -03005039 analog_mode = (hdw->pathway_state != PVR2_PATHWAY_DIGITAL);
5040
Mike Isely681c7392007-11-26 01:48:52 -03005041 /* Update master state based upon all other states. */
5042 if (!hdw->flag_ok) {
5043 st = PVR2_STATE_DEAD;
5044 } else if (hdw->fw1_state != FW1_STATE_OK) {
5045 st = PVR2_STATE_COLD;
Mike Isely72998b72008-04-03 04:51:19 -03005046 } else if ((analog_mode ||
5047 hdw->hdw_desc->flag_digital_requires_cx23416) &&
5048 !hdw->state_encoder_ok) {
Mike Isely681c7392007-11-26 01:48:52 -03005049 st = PVR2_STATE_WARM;
Mike Isely1b9c18c2008-04-22 14:45:41 -03005050 } else if (hdw->flag_tripped ||
5051 (analog_mode && hdw->flag_decoder_missed)) {
Mike Isely681c7392007-11-26 01:48:52 -03005052 st = PVR2_STATE_ERROR;
Mike Isely62433e32008-04-22 14:45:40 -03005053 } else if (hdw->state_usbstream_run &&
Mike Isely1b9c18c2008-04-22 14:45:41 -03005054 (!analog_mode ||
Mike Isely62433e32008-04-22 14:45:40 -03005055 (hdw->state_encoder_run && hdw->state_decoder_run))) {
Mike Isely681c7392007-11-26 01:48:52 -03005056 st = PVR2_STATE_RUN;
5057 } else {
5058 st = PVR2_STATE_READY;
5059 }
5060 if (hdw->master_state != st) {
5061 pvr2_trace(PVR2_TRACE_STATE,
5062 "Device state change from %s to %s",
5063 pvr2_get_state_name(hdw->master_state),
5064 pvr2_get_state_name(st));
Mike Isely40381cb2008-04-22 14:45:42 -03005065 pvr2_led_ctrl(hdw,st == PVR2_STATE_RUN);
Mike Isely681c7392007-11-26 01:48:52 -03005066 hdw->master_state = st;
5067 state_updated = !0;
5068 callback_flag = !0;
5069 }
5070 if (state_updated) {
5071 /* Trigger anyone waiting on any state changes here. */
5072 wake_up(&hdw->state_wait_data);
5073 }
5074
5075 if (pvrusb2_debug & PVR2_TRACE_STBITS) {
5076 pvr2_hdw_state_log_state(hdw);
5077 }
5078 pvr2_trace(PVR2_TRACE_STBITS,
5079 "Drive state check DONE callback=%d",callback_flag);
5080
5081 return callback_flag;
5082}
5083
5084
5085/* Cause kernel thread to check / update driver state */
5086static void pvr2_hdw_state_sched(struct pvr2_hdw *hdw)
5087{
5088 if (hdw->state_stale) return;
5089 hdw->state_stale = !0;
5090 trace_stbit("state_stale",hdw->state_stale);
5091 queue_work(hdw->workqueue,&hdw->workpoll);
5092}
5093
5094
Mike Iselyd8554972006-06-26 20:58:46 -03005095int pvr2_hdw_gpio_get_dir(struct pvr2_hdw *hdw,u32 *dp)
5096{
5097 return pvr2_read_register(hdw,PVR2_GPIO_DIR,dp);
5098}
5099
5100
5101int pvr2_hdw_gpio_get_out(struct pvr2_hdw *hdw,u32 *dp)
5102{
5103 return pvr2_read_register(hdw,PVR2_GPIO_OUT,dp);
5104}
5105
5106
5107int pvr2_hdw_gpio_get_in(struct pvr2_hdw *hdw,u32 *dp)
5108{
5109 return pvr2_read_register(hdw,PVR2_GPIO_IN,dp);
5110}
5111
5112
5113int pvr2_hdw_gpio_chg_dir(struct pvr2_hdw *hdw,u32 msk,u32 val)
5114{
5115 u32 cval,nval;
5116 int ret;
5117 if (~msk) {
5118 ret = pvr2_read_register(hdw,PVR2_GPIO_DIR,&cval);
5119 if (ret) return ret;
5120 nval = (cval & ~msk) | (val & msk);
5121 pvr2_trace(PVR2_TRACE_GPIO,
5122 "GPIO direction changing 0x%x:0x%x"
5123 " from 0x%x to 0x%x",
5124 msk,val,cval,nval);
5125 } else {
5126 nval = val;
5127 pvr2_trace(PVR2_TRACE_GPIO,
5128 "GPIO direction changing to 0x%x",nval);
5129 }
5130 return pvr2_write_register(hdw,PVR2_GPIO_DIR,nval);
5131}
5132
5133
5134int pvr2_hdw_gpio_chg_out(struct pvr2_hdw *hdw,u32 msk,u32 val)
5135{
5136 u32 cval,nval;
5137 int ret;
5138 if (~msk) {
5139 ret = pvr2_read_register(hdw,PVR2_GPIO_OUT,&cval);
5140 if (ret) return ret;
5141 nval = (cval & ~msk) | (val & msk);
5142 pvr2_trace(PVR2_TRACE_GPIO,
5143 "GPIO output changing 0x%x:0x%x from 0x%x to 0x%x",
5144 msk,val,cval,nval);
5145 } else {
5146 nval = val;
5147 pvr2_trace(PVR2_TRACE_GPIO,
5148 "GPIO output changing to 0x%x",nval);
5149 }
5150 return pvr2_write_register(hdw,PVR2_GPIO_OUT,nval);
5151}
5152
5153
Mike Iselya51f5002009-03-06 23:30:37 -03005154void pvr2_hdw_status_poll(struct pvr2_hdw *hdw)
5155{
Mike Isely40f07112009-03-07 00:08:17 -03005156 struct v4l2_tuner *vtp = &hdw->tuner_signal_info;
5157 memset(vtp, 0, sizeof(*vtp));
Mike Isely2641df32009-03-07 00:13:25 -03005158 hdw->tuner_signal_stale = 0;
Mike Isely40f07112009-03-07 00:08:17 -03005159 /* Note: There apparently is no replacement for VIDIOC_CROPCAP
5160 using v4l2-subdev - therefore we can't support that AT ALL right
5161 now. (Of course, no sub-drivers seem to implement it either.
5162 But now it's a a chicken and egg problem...) */
5163 v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner, g_tuner,
5164 &hdw->tuner_signal_info);
Mike Isely2641df32009-03-07 00:13:25 -03005165 pvr2_trace(PVR2_TRACE_CHIPS, "subdev status poll"
Mike Isely40f07112009-03-07 00:08:17 -03005166 " type=%u strength=%u audio=0x%x cap=0x%x"
5167 " low=%u hi=%u",
5168 vtp->type,
5169 vtp->signal, vtp->rxsubchans, vtp->capability,
5170 vtp->rangelow, vtp->rangehigh);
Mike Isely2641df32009-03-07 00:13:25 -03005171
5172 /* We have to do this to avoid getting into constant polling if
5173 there's nobody to answer a poll of cropcap info. */
5174 hdw->cropcap_stale = 0;
Mike Iselya51f5002009-03-06 23:30:37 -03005175}
5176
5177
Mike Isely7fb20fa2008-04-22 14:45:37 -03005178unsigned int pvr2_hdw_get_input_available(struct pvr2_hdw *hdw)
5179{
5180 return hdw->input_avail_mask;
5181}
5182
5183
Mike Isely1cb03b72008-04-21 03:47:43 -03005184unsigned int pvr2_hdw_get_input_allowed(struct pvr2_hdw *hdw)
5185{
5186 return hdw->input_allowed_mask;
5187}
5188
5189
5190static int pvr2_hdw_set_input(struct pvr2_hdw *hdw,int v)
5191{
5192 if (hdw->input_val != v) {
5193 hdw->input_val = v;
5194 hdw->input_dirty = !0;
5195 }
5196
5197 /* Handle side effects - if we switch to a mode that needs the RF
5198 tuner, then select the right frequency choice as well and mark
5199 it dirty. */
5200 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
5201 hdw->freqSelector = 0;
5202 hdw->freqDirty = !0;
5203 } else if ((hdw->input_val == PVR2_CVAL_INPUT_TV) ||
5204 (hdw->input_val == PVR2_CVAL_INPUT_DTV)) {
5205 hdw->freqSelector = 1;
5206 hdw->freqDirty = !0;
5207 }
5208 return 0;
5209}
5210
5211
5212int pvr2_hdw_set_input_allowed(struct pvr2_hdw *hdw,
5213 unsigned int change_mask,
5214 unsigned int change_val)
5215{
5216 int ret = 0;
5217 unsigned int nv,m,idx;
5218 LOCK_TAKE(hdw->big_lock);
5219 do {
5220 nv = hdw->input_allowed_mask & ~change_mask;
5221 nv |= (change_val & change_mask);
5222 nv &= hdw->input_avail_mask;
5223 if (!nv) {
5224 /* No legal modes left; return error instead. */
5225 ret = -EPERM;
5226 break;
5227 }
5228 hdw->input_allowed_mask = nv;
5229 if ((1 << hdw->input_val) & hdw->input_allowed_mask) {
5230 /* Current mode is still in the allowed mask, so
5231 we're done. */
5232 break;
5233 }
5234 /* Select and switch to a mode that is still in the allowed
5235 mask */
5236 if (!hdw->input_allowed_mask) {
5237 /* Nothing legal; give up */
5238 break;
5239 }
5240 m = hdw->input_allowed_mask;
5241 for (idx = 0; idx < (sizeof(m) << 3); idx++) {
5242 if (!((1 << idx) & m)) continue;
5243 pvr2_hdw_set_input(hdw,idx);
5244 break;
5245 }
5246 } while (0);
5247 LOCK_GIVE(hdw->big_lock);
5248 return ret;
5249}
5250
5251
Mike Iselye61b6fc2006-07-18 22:42:18 -03005252/* Find I2C address of eeprom */
Adrian Bunk07e337e2006-06-30 11:30:20 -03005253static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03005254{
5255 int result;
5256 LOCK_TAKE(hdw->ctl_lock); do {
Michael Krufky8d364362007-01-22 02:17:55 -03005257 hdw->cmd_buffer[0] = FX2CMD_GET_EEPROM_ADDR;
Mike Iselyd8554972006-06-26 20:58:46 -03005258 result = pvr2_send_request(hdw,
5259 hdw->cmd_buffer,1,
5260 hdw->cmd_buffer,1);
5261 if (result < 0) break;
5262 result = hdw->cmd_buffer[0];
5263 } while(0); LOCK_GIVE(hdw->ctl_lock);
5264 return result;
5265}
5266
5267
Mike Isely32ffa9a2006-09-23 22:26:52 -03005268int pvr2_hdw_register_access(struct pvr2_hdw *hdw,
Hans Verkuilaecde8b2008-12-30 07:14:19 -03005269 struct v4l2_dbg_match *match, u64 reg_id,
5270 int setFl, u64 *val_ptr)
Mike Isely32ffa9a2006-09-23 22:26:52 -03005271{
5272#ifdef CONFIG_VIDEO_ADV_DEBUG
Hans Verkuilaecde8b2008-12-30 07:14:19 -03005273 struct v4l2_dbg_register req;
Mike Isely6d988162006-09-28 17:53:49 -03005274 int stat = 0;
5275 int okFl = 0;
Mike Isely32ffa9a2006-09-23 22:26:52 -03005276
Mike Isely201f5c92007-01-28 16:08:36 -03005277 if (!capable(CAP_SYS_ADMIN)) return -EPERM;
5278
Hans Verkuilaecde8b2008-12-30 07:14:19 -03005279 req.match = *match;
Mike Isely32ffa9a2006-09-23 22:26:52 -03005280 req.reg = reg_id;
5281 if (setFl) req.val = *val_ptr;
Mike Iselyd8f5b9b2009-03-07 00:05:00 -03005282 /* It would be nice to know if a sub-device answered the request */
5283 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, g_register, &req);
5284 if (!setFl) *val_ptr = req.val;
Mike Isely6d988162006-09-28 17:53:49 -03005285 if (okFl) {
5286 return stat;
5287 }
Mike Isely32ffa9a2006-09-23 22:26:52 -03005288 return -EINVAL;
5289#else
5290 return -ENOSYS;
5291#endif
5292}
5293
5294
Mike Iselyd8554972006-06-26 20:58:46 -03005295/*
5296 Stuff for Emacs to see, in order to encourage consistent editing style:
5297 *** Local Variables: ***
5298 *** mode: c ***
5299 *** fill-column: 75 ***
5300 *** tab-width: 8 ***
5301 *** c-basic-offset: 8 ***
5302 *** End: ***
5303 */