blob: 5a6f24d1246d459edbd69cefde0a690048ff8e16 [file] [log] [blame]
Mike Iselyd8554972006-06-26 20:58:46 -03001/*
2 *
Mike Iselyd8554972006-06-26 20:58:46 -03003 *
4 * Copyright (C) 2005 Mike Isely <isely@pobox.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *
19 */
20
21#include <linux/errno.h>
22#include <linux/string.h>
23#include <linux/slab.h>
24#include <linux/firmware.h>
Mike Iselyd8554972006-06-26 20:58:46 -030025#include <linux/videodev2.h>
Mike Isely32ffa9a2006-09-23 22:26:52 -030026#include <media/v4l2-common.h>
Mike Isely75212a02009-03-07 01:48:42 -030027#include <media/tuner.h>
Mike Iselyd8554972006-06-26 20:58:46 -030028#include "pvrusb2.h"
29#include "pvrusb2-std.h"
30#include "pvrusb2-util.h"
31#include "pvrusb2-hdw.h"
32#include "pvrusb2-i2c-core.h"
Mike Iselyd8554972006-06-26 20:58:46 -030033#include "pvrusb2-eeprom.h"
34#include "pvrusb2-hdw-internal.h"
35#include "pvrusb2-encoder.h"
36#include "pvrusb2-debug.h"
Michael Krufky8d364362007-01-22 02:17:55 -030037#include "pvrusb2-fx2-cmd.h"
Mike Isely5f6dae82009-03-07 00:39:34 -030038#include "pvrusb2-wm8775.h"
Mike Isely6f956512009-03-07 00:43:26 -030039#include "pvrusb2-video-v4l.h"
Mike Isely634ba262009-03-07 00:54:02 -030040#include "pvrusb2-cx2584x-v4l.h"
Mike Isely2a6b6272009-03-15 17:53:29 -030041#include "pvrusb2-cs53l32a.h"
Mike Isely76891d62009-03-07 00:52:06 -030042#include "pvrusb2-audio.h"
Mike Iselyd8554972006-06-26 20:58:46 -030043
Mike Isely1bde0282006-12-27 23:30:13 -030044#define TV_MIN_FREQ 55250000L
45#define TV_MAX_FREQ 850000000L
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -030046
Mike Isely83ce57a2008-05-26 05:51:57 -030047/* This defines a minimum interval that the decoder must remain quiet
48 before we are allowed to start it running. */
49#define TIME_MSEC_DECODER_WAIT 50
50
Mike Isely6e931372010-02-06 02:10:38 -030051/* This defines a minimum interval that the decoder must be allowed to run
52 before we can safely begin using its streaming output. */
53#define TIME_MSEC_DECODER_STABILIZATION_WAIT 300
54
Mike Isely83ce57a2008-05-26 05:51:57 -030055/* This defines a minimum interval that the encoder must remain quiet
Mike Isely91b5b482010-02-06 02:12:33 -030056 before we are allowed to configure it. */
57#define TIME_MSEC_ENCODER_WAIT 50
Mike Isely83ce57a2008-05-26 05:51:57 -030058
59/* This defines the minimum interval that the encoder must successfully run
60 before we consider that the encoder has run at least once since its
61 firmware has been loaded. This measurement is in important for cases
62 where we can't do something until we know that the encoder has been run
63 at least once. */
64#define TIME_MSEC_ENCODER_OK 250
65
Mike Iselya0fd1cb2006-06-30 11:35:28 -030066static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = NULL};
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -030067static DEFINE_MUTEX(pvr2_unit_mtx);
Mike Iselyd8554972006-06-26 20:58:46 -030068
Douglas Schilling Landgrafff699e62008-04-22 14:41:48 -030069static int ctlchg;
Douglas Schilling Landgrafff699e62008-04-22 14:41:48 -030070static int procreload;
Mike Iselyd8554972006-06-26 20:58:46 -030071static int tuner[PVR_NUM] = { [0 ... PVR_NUM-1] = -1 };
72static int tolerance[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
73static int video_std[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
Douglas Schilling Landgrafff699e62008-04-22 14:41:48 -030074static int init_pause_msec;
Mike Iselyd8554972006-06-26 20:58:46 -030075
76module_param(ctlchg, int, S_IRUGO|S_IWUSR);
77MODULE_PARM_DESC(ctlchg, "0=optimize ctl change 1=always accept new ctl value");
78module_param(init_pause_msec, int, S_IRUGO|S_IWUSR);
79MODULE_PARM_DESC(init_pause_msec, "hardware initialization settling delay");
Mike Iselyd8554972006-06-26 20:58:46 -030080module_param(procreload, int, S_IRUGO|S_IWUSR);
81MODULE_PARM_DESC(procreload,
82 "Attempt init failure recovery with firmware reload");
83module_param_array(tuner, int, NULL, 0444);
84MODULE_PARM_DESC(tuner,"specify installed tuner type");
85module_param_array(video_std, int, NULL, 0444);
86MODULE_PARM_DESC(video_std,"specify initial video standard");
87module_param_array(tolerance, int, NULL, 0444);
88MODULE_PARM_DESC(tolerance,"specify stream error tolerance");
89
Mike Isely6f441ed2009-06-20 14:51:29 -030090/* US Broadcast channel 3 (61.25 MHz), to help with testing */
91static int default_tv_freq = 61250000L;
Michael Krufky5a4f5da62008-05-11 16:37:50 -030092/* 104.3 MHz, a usable FM station for my area */
93static int default_radio_freq = 104300000L;
94
95module_param_named(tv_freq, default_tv_freq, int, 0444);
96MODULE_PARM_DESC(tv_freq, "specify initial television frequency");
97module_param_named(radio_freq, default_radio_freq, int, 0444);
98MODULE_PARM_DESC(radio_freq, "specify initial radio frequency");
99
Mike Iselyd8554972006-06-26 20:58:46 -0300100#define PVR2_CTL_WRITE_ENDPOINT 0x01
101#define PVR2_CTL_READ_ENDPOINT 0x81
102
103#define PVR2_GPIO_IN 0x9008
104#define PVR2_GPIO_OUT 0x900c
105#define PVR2_GPIO_DIR 0x9020
106
107#define trace_firmware(...) pvr2_trace(PVR2_TRACE_FIRMWARE,__VA_ARGS__)
108
109#define PVR2_FIRMWARE_ENDPOINT 0x02
110
111/* size of a firmware chunk */
112#define FIRMWARE_CHUNK_SIZE 0x2000
113
Mike Iselyedb9dcb2009-03-07 00:37:10 -0300114typedef void (*pvr2_subdev_update_func)(struct pvr2_hdw *,
115 struct v4l2_subdev *);
116
117static const pvr2_subdev_update_func pvr2_module_update_functions[] = {
Mike Isely4ecbc282009-03-07 00:49:19 -0300118 [PVR2_CLIENT_ID_WM8775] = pvr2_wm8775_subdev_update,
Mike Isely6f956512009-03-07 00:43:26 -0300119 [PVR2_CLIENT_ID_SAA7115] = pvr2_saa7115_subdev_update,
Mike Isely76891d62009-03-07 00:52:06 -0300120 [PVR2_CLIENT_ID_MSP3400] = pvr2_msp3400_subdev_update,
Mike Isely634ba262009-03-07 00:54:02 -0300121 [PVR2_CLIENT_ID_CX25840] = pvr2_cx25840_subdev_update,
Mike Isely2a6b6272009-03-15 17:53:29 -0300122 [PVR2_CLIENT_ID_CS53L32A] = pvr2_cs53l32a_subdev_update,
Mike Iselyedb9dcb2009-03-07 00:37:10 -0300123};
124
Mike Iselye9c64a72009-03-06 23:42:20 -0300125static const char *module_names[] = {
126 [PVR2_CLIENT_ID_MSP3400] = "msp3400",
127 [PVR2_CLIENT_ID_CX25840] = "cx25840",
128 [PVR2_CLIENT_ID_SAA7115] = "saa7115",
129 [PVR2_CLIENT_ID_TUNER] = "tuner",
Mike Iselybb652422009-03-14 14:09:04 -0300130 [PVR2_CLIENT_ID_DEMOD] = "tuner",
Mike Isely851981a2009-03-07 02:02:32 -0300131 [PVR2_CLIENT_ID_CS53L32A] = "cs53l32a",
Mike Isely5f6dae82009-03-07 00:39:34 -0300132 [PVR2_CLIENT_ID_WM8775] = "wm8775",
Mike Iselye9c64a72009-03-06 23:42:20 -0300133};
134
135
136static const unsigned char *module_i2c_addresses[] = {
137 [PVR2_CLIENT_ID_TUNER] = "\x60\x61\x62\x63",
Mike Iselybb652422009-03-14 14:09:04 -0300138 [PVR2_CLIENT_ID_DEMOD] = "\x43",
Mike Isely1dfe6c72009-03-07 02:00:21 -0300139 [PVR2_CLIENT_ID_MSP3400] = "\x40",
140 [PVR2_CLIENT_ID_SAA7115] = "\x21",
Mike Iselyae111f72009-03-07 00:57:42 -0300141 [PVR2_CLIENT_ID_WM8775] = "\x1b",
Mike Isely0b467012009-03-07 01:49:37 -0300142 [PVR2_CLIENT_ID_CX25840] = "\x44",
Mike Isely23334a22009-03-07 02:03:28 -0300143 [PVR2_CLIENT_ID_CS53L32A] = "\x11",
Mike Iselye9c64a72009-03-06 23:42:20 -0300144};
145
146
Mike Isely27eab382009-04-06 01:51:38 -0300147static const char *ir_scheme_names[] = {
148 [PVR2_IR_SCHEME_NONE] = "none",
149 [PVR2_IR_SCHEME_29XXX] = "29xxx",
150 [PVR2_IR_SCHEME_24XXX] = "24xxx (29xxx emulation)",
151 [PVR2_IR_SCHEME_24XXX_MCE] = "24xxx (MCE device)",
152 [PVR2_IR_SCHEME_ZILOG] = "Zilog",
153};
154
155
Mike Iselyb30d2442006-06-25 20:05:01 -0300156/* Define the list of additional controls we'll dynamically construct based
157 on query of the cx2341x module. */
158struct pvr2_mpeg_ids {
159 const char *strid;
160 int id;
161};
162static const struct pvr2_mpeg_ids mpeg_ids[] = {
163 {
164 .strid = "audio_layer",
165 .id = V4L2_CID_MPEG_AUDIO_ENCODING,
166 },{
167 .strid = "audio_bitrate",
168 .id = V4L2_CID_MPEG_AUDIO_L2_BITRATE,
169 },{
170 /* Already using audio_mode elsewhere :-( */
171 .strid = "mpeg_audio_mode",
172 .id = V4L2_CID_MPEG_AUDIO_MODE,
173 },{
174 .strid = "mpeg_audio_mode_extension",
175 .id = V4L2_CID_MPEG_AUDIO_MODE_EXTENSION,
176 },{
177 .strid = "audio_emphasis",
178 .id = V4L2_CID_MPEG_AUDIO_EMPHASIS,
179 },{
180 .strid = "audio_crc",
181 .id = V4L2_CID_MPEG_AUDIO_CRC,
182 },{
183 .strid = "video_aspect",
184 .id = V4L2_CID_MPEG_VIDEO_ASPECT,
185 },{
186 .strid = "video_b_frames",
187 .id = V4L2_CID_MPEG_VIDEO_B_FRAMES,
188 },{
189 .strid = "video_gop_size",
190 .id = V4L2_CID_MPEG_VIDEO_GOP_SIZE,
191 },{
192 .strid = "video_gop_closure",
193 .id = V4L2_CID_MPEG_VIDEO_GOP_CLOSURE,
194 },{
Mike Iselyb30d2442006-06-25 20:05:01 -0300195 .strid = "video_bitrate_mode",
196 .id = V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
197 },{
198 .strid = "video_bitrate",
199 .id = V4L2_CID_MPEG_VIDEO_BITRATE,
200 },{
201 .strid = "video_bitrate_peak",
202 .id = V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
203 },{
204 .strid = "video_temporal_decimation",
205 .id = V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION,
206 },{
207 .strid = "stream_type",
208 .id = V4L2_CID_MPEG_STREAM_TYPE,
209 },{
210 .strid = "video_spatial_filter_mode",
211 .id = V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE,
212 },{
213 .strid = "video_spatial_filter",
214 .id = V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER,
215 },{
216 .strid = "video_luma_spatial_filter_type",
217 .id = V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE,
218 },{
219 .strid = "video_chroma_spatial_filter_type",
220 .id = V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE,
221 },{
222 .strid = "video_temporal_filter_mode",
223 .id = V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE,
224 },{
225 .strid = "video_temporal_filter",
226 .id = V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER,
227 },{
228 .strid = "video_median_filter_type",
229 .id = V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE,
230 },{
231 .strid = "video_luma_median_filter_top",
232 .id = V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP,
233 },{
234 .strid = "video_luma_median_filter_bottom",
235 .id = V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM,
236 },{
237 .strid = "video_chroma_median_filter_top",
238 .id = V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP,
239 },{
240 .strid = "video_chroma_median_filter_bottom",
241 .id = V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM,
242 }
243};
Ahmed S. Darwisheca8ebf2007-01-20 00:35:03 -0300244#define MPEGDEF_COUNT ARRAY_SIZE(mpeg_ids)
Mike Iselyc05c0462006-06-25 20:04:25 -0300245
Mike Iselyd8554972006-06-26 20:58:46 -0300246
Mike Isely434449f2006-08-08 09:10:06 -0300247static const char *control_values_srate[] = {
248 [V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100] = "44.1 kHz",
249 [V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000] = "48 kHz",
250 [V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000] = "32 kHz",
251};
Mike Iselyd8554972006-06-26 20:58:46 -0300252
Mike Iselyd8554972006-06-26 20:58:46 -0300253
254
255static const char *control_values_input[] = {
256 [PVR2_CVAL_INPUT_TV] = "television", /*xawtv needs this name*/
Mike Isely29bf5b12008-04-22 14:45:37 -0300257 [PVR2_CVAL_INPUT_DTV] = "dtv",
Mike Iselyd8554972006-06-26 20:58:46 -0300258 [PVR2_CVAL_INPUT_RADIO] = "radio",
259 [PVR2_CVAL_INPUT_SVIDEO] = "s-video",
260 [PVR2_CVAL_INPUT_COMPOSITE] = "composite",
261};
262
263
264static const char *control_values_audiomode[] = {
265 [V4L2_TUNER_MODE_MONO] = "Mono",
266 [V4L2_TUNER_MODE_STEREO] = "Stereo",
267 [V4L2_TUNER_MODE_LANG1] = "Lang1",
268 [V4L2_TUNER_MODE_LANG2] = "Lang2",
269 [V4L2_TUNER_MODE_LANG1_LANG2] = "Lang1+Lang2",
270};
271
272
273static const char *control_values_hsm[] = {
274 [PVR2_CVAL_HSM_FAIL] = "Fail",
275 [PVR2_CVAL_HSM_HIGH] = "High",
276 [PVR2_CVAL_HSM_FULL] = "Full",
277};
278
279
Mike Isely681c7392007-11-26 01:48:52 -0300280static const char *pvr2_state_names[] = {
281 [PVR2_STATE_NONE] = "none",
282 [PVR2_STATE_DEAD] = "dead",
283 [PVR2_STATE_COLD] = "cold",
284 [PVR2_STATE_WARM] = "warm",
285 [PVR2_STATE_ERROR] = "error",
286 [PVR2_STATE_READY] = "ready",
287 [PVR2_STATE_RUN] = "run",
Mike Iselyd8554972006-06-26 20:58:46 -0300288};
289
Mike Isely681c7392007-11-26 01:48:52 -0300290
Mike Isely694dca2b2008-03-28 05:42:10 -0300291struct pvr2_fx2cmd_descdef {
Mike Isely1c9d10d2008-03-28 05:38:54 -0300292 unsigned char id;
293 unsigned char *desc;
294};
295
Mike Isely694dca2b2008-03-28 05:42:10 -0300296static const struct pvr2_fx2cmd_descdef pvr2_fx2cmd_desc[] = {
Mike Isely1c9d10d2008-03-28 05:38:54 -0300297 {FX2CMD_MEM_WRITE_DWORD, "write encoder dword"},
298 {FX2CMD_MEM_READ_DWORD, "read encoder dword"},
Mike Isely31335b12008-07-25 19:35:31 -0300299 {FX2CMD_HCW_ZILOG_RESET, "zilog IR reset control"},
Mike Isely1c9d10d2008-03-28 05:38:54 -0300300 {FX2CMD_MEM_READ_64BYTES, "read encoder 64bytes"},
301 {FX2CMD_REG_WRITE, "write encoder register"},
302 {FX2CMD_REG_READ, "read encoder register"},
303 {FX2CMD_MEMSEL, "encoder memsel"},
304 {FX2CMD_I2C_WRITE, "i2c write"},
305 {FX2CMD_I2C_READ, "i2c read"},
306 {FX2CMD_GET_USB_SPEED, "get USB speed"},
307 {FX2CMD_STREAMING_ON, "stream on"},
308 {FX2CMD_STREAMING_OFF, "stream off"},
309 {FX2CMD_FWPOST1, "fwpost1"},
310 {FX2CMD_POWER_OFF, "power off"},
311 {FX2CMD_POWER_ON, "power on"},
312 {FX2CMD_DEEP_RESET, "deep reset"},
313 {FX2CMD_GET_EEPROM_ADDR, "get rom addr"},
314 {FX2CMD_GET_IR_CODE, "get IR code"},
315 {FX2CMD_HCW_DEMOD_RESETIN, "hcw demod resetin"},
316 {FX2CMD_HCW_DTV_STREAMING_ON, "hcw dtv stream on"},
317 {FX2CMD_HCW_DTV_STREAMING_OFF, "hcw dtv stream off"},
318 {FX2CMD_ONAIR_DTV_STREAMING_ON, "onair dtv stream on"},
319 {FX2CMD_ONAIR_DTV_STREAMING_OFF, "onair dtv stream off"},
320 {FX2CMD_ONAIR_DTV_POWER_ON, "onair dtv power on"},
321 {FX2CMD_ONAIR_DTV_POWER_OFF, "onair dtv power off"},
322};
323
324
Mike Isely1cb03b72008-04-21 03:47:43 -0300325static int pvr2_hdw_set_input(struct pvr2_hdw *hdw,int v);
Mike Isely681c7392007-11-26 01:48:52 -0300326static void pvr2_hdw_state_sched(struct pvr2_hdw *);
327static int pvr2_hdw_state_eval(struct pvr2_hdw *);
Mike Isely1bde0282006-12-27 23:30:13 -0300328static void pvr2_hdw_set_cur_freq(struct pvr2_hdw *,unsigned long);
Mike Isely681c7392007-11-26 01:48:52 -0300329static void pvr2_hdw_worker_poll(struct work_struct *work);
Mike Isely681c7392007-11-26 01:48:52 -0300330static int pvr2_hdw_wait(struct pvr2_hdw *,int state);
331static int pvr2_hdw_untrip_unlocked(struct pvr2_hdw *);
332static void pvr2_hdw_state_log_state(struct pvr2_hdw *);
Adrian Bunk07e337e2006-06-30 11:30:20 -0300333static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl);
Mike Isely681c7392007-11-26 01:48:52 -0300334static int pvr2_hdw_commit_setup(struct pvr2_hdw *hdw);
Adrian Bunk07e337e2006-06-30 11:30:20 -0300335static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw);
Adrian Bunk07e337e2006-06-30 11:30:20 -0300336static void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw);
337static void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw);
Mike Isely681c7392007-11-26 01:48:52 -0300338static void pvr2_hdw_quiescent_timeout(unsigned long);
Mike Isely6e931372010-02-06 02:10:38 -0300339static void pvr2_hdw_decoder_stabilization_timeout(unsigned long);
Mike Isely681c7392007-11-26 01:48:52 -0300340static void pvr2_hdw_encoder_wait_timeout(unsigned long);
Mike Iselyd913d632008-04-06 04:04:35 -0300341static void pvr2_hdw_encoder_run_timeout(unsigned long);
Mike Isely1c9d10d2008-03-28 05:38:54 -0300342static int pvr2_issue_simple_cmd(struct pvr2_hdw *,u32);
Adrian Bunk07e337e2006-06-30 11:30:20 -0300343static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
344 unsigned int timeout,int probe_fl,
345 void *write_data,unsigned int write_len,
346 void *read_data,unsigned int read_len);
Mike Isely432907f2008-08-31 21:02:20 -0300347static int pvr2_hdw_check_cropcap(struct pvr2_hdw *hdw);
Mike Iselyd8554972006-06-26 20:58:46 -0300348
Mike Isely681c7392007-11-26 01:48:52 -0300349
350static void trace_stbit(const char *name,int val)
351{
352 pvr2_trace(PVR2_TRACE_STBITS,
353 "State bit %s <-- %s",
354 name,(val ? "true" : "false"));
355}
356
Mike Iselyd8554972006-06-26 20:58:46 -0300357static int ctrl_channelfreq_get(struct pvr2_ctrl *cptr,int *vp)
358{
359 struct pvr2_hdw *hdw = cptr->hdw;
360 if ((hdw->freqProgSlot > 0) && (hdw->freqProgSlot <= FREQTABLE_SIZE)) {
361 *vp = hdw->freqTable[hdw->freqProgSlot-1];
362 } else {
363 *vp = 0;
364 }
365 return 0;
366}
367
368static int ctrl_channelfreq_set(struct pvr2_ctrl *cptr,int m,int v)
369{
370 struct pvr2_hdw *hdw = cptr->hdw;
Mike Isely1bde0282006-12-27 23:30:13 -0300371 unsigned int slotId = hdw->freqProgSlot;
372 if ((slotId > 0) && (slotId <= FREQTABLE_SIZE)) {
373 hdw->freqTable[slotId-1] = v;
374 /* Handle side effects correctly - if we're tuned to this
375 slot, then forgot the slot id relation since the stored
376 frequency has been changed. */
377 if (hdw->freqSelector) {
378 if (hdw->freqSlotRadio == slotId) {
379 hdw->freqSlotRadio = 0;
380 }
381 } else {
382 if (hdw->freqSlotTelevision == slotId) {
383 hdw->freqSlotTelevision = 0;
384 }
385 }
Mike Iselyd8554972006-06-26 20:58:46 -0300386 }
387 return 0;
388}
389
390static int ctrl_channelprog_get(struct pvr2_ctrl *cptr,int *vp)
391{
392 *vp = cptr->hdw->freqProgSlot;
393 return 0;
394}
395
396static int ctrl_channelprog_set(struct pvr2_ctrl *cptr,int m,int v)
397{
398 struct pvr2_hdw *hdw = cptr->hdw;
399 if ((v >= 0) && (v <= FREQTABLE_SIZE)) {
400 hdw->freqProgSlot = v;
401 }
402 return 0;
403}
404
405static int ctrl_channel_get(struct pvr2_ctrl *cptr,int *vp)
406{
Mike Isely1bde0282006-12-27 23:30:13 -0300407 struct pvr2_hdw *hdw = cptr->hdw;
408 *vp = hdw->freqSelector ? hdw->freqSlotRadio : hdw->freqSlotTelevision;
Mike Iselyd8554972006-06-26 20:58:46 -0300409 return 0;
410}
411
Mike Isely1bde0282006-12-27 23:30:13 -0300412static int ctrl_channel_set(struct pvr2_ctrl *cptr,int m,int slotId)
Mike Iselyd8554972006-06-26 20:58:46 -0300413{
414 unsigned freq = 0;
415 struct pvr2_hdw *hdw = cptr->hdw;
Mike Isely1bde0282006-12-27 23:30:13 -0300416 if ((slotId < 0) || (slotId > FREQTABLE_SIZE)) return 0;
417 if (slotId > 0) {
418 freq = hdw->freqTable[slotId-1];
419 if (!freq) return 0;
420 pvr2_hdw_set_cur_freq(hdw,freq);
Mike Iselyd8554972006-06-26 20:58:46 -0300421 }
Mike Isely1bde0282006-12-27 23:30:13 -0300422 if (hdw->freqSelector) {
423 hdw->freqSlotRadio = slotId;
424 } else {
425 hdw->freqSlotTelevision = slotId;
Mike Iselyd8554972006-06-26 20:58:46 -0300426 }
427 return 0;
428}
429
430static int ctrl_freq_get(struct pvr2_ctrl *cptr,int *vp)
431{
Mike Isely1bde0282006-12-27 23:30:13 -0300432 *vp = pvr2_hdw_get_cur_freq(cptr->hdw);
Mike Iselyd8554972006-06-26 20:58:46 -0300433 return 0;
434}
435
436static int ctrl_freq_is_dirty(struct pvr2_ctrl *cptr)
437{
438 return cptr->hdw->freqDirty != 0;
439}
440
441static void ctrl_freq_clear_dirty(struct pvr2_ctrl *cptr)
442{
443 cptr->hdw->freqDirty = 0;
444}
445
446static int ctrl_freq_set(struct pvr2_ctrl *cptr,int m,int v)
447{
Mike Isely1bde0282006-12-27 23:30:13 -0300448 pvr2_hdw_set_cur_freq(cptr->hdw,v);
Mike Iselyd8554972006-06-26 20:58:46 -0300449 return 0;
450}
451
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300452static int ctrl_cropl_min_get(struct pvr2_ctrl *cptr, int *left)
453{
Mike Isely432907f2008-08-31 21:02:20 -0300454 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
455 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
456 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300457 return stat;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300458 }
Mike Isely432907f2008-08-31 21:02:20 -0300459 *left = cap->bounds.left;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300460 return 0;
461}
462
463static int ctrl_cropl_max_get(struct pvr2_ctrl *cptr, int *left)
464{
Mike Isely432907f2008-08-31 21:02:20 -0300465 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
466 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
467 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300468 return stat;
469 }
470 *left = cap->bounds.left;
471 if (cap->bounds.width > cptr->hdw->cropw_val) {
Mike Isely432907f2008-08-31 21:02:20 -0300472 *left += cap->bounds.width - cptr->hdw->cropw_val;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300473 }
474 return 0;
475}
476
477static int ctrl_cropt_min_get(struct pvr2_ctrl *cptr, int *top)
478{
Mike Isely432907f2008-08-31 21:02:20 -0300479 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
480 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
481 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300482 return stat;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300483 }
Mike Isely432907f2008-08-31 21:02:20 -0300484 *top = cap->bounds.top;
485 return 0;
486}
487
488static int ctrl_cropt_max_get(struct pvr2_ctrl *cptr, int *top)
489{
490 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
491 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
492 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300493 return stat;
494 }
495 *top = cap->bounds.top;
496 if (cap->bounds.height > cptr->hdw->croph_val) {
Mike Isely432907f2008-08-31 21:02:20 -0300497 *top += cap->bounds.height - cptr->hdw->croph_val;
498 }
499 return 0;
500}
501
Servaas Vandenberghe6188a0f2011-02-13 17:51:09 -0300502static int ctrl_cropw_max_get(struct pvr2_ctrl *cptr, int *width)
Mike Isely432907f2008-08-31 21:02:20 -0300503{
504 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
Servaas Vandenberghe6188a0f2011-02-13 17:51:09 -0300505 int stat, bleftend, cleft;
506
507 stat = pvr2_hdw_check_cropcap(cptr->hdw);
Mike Isely432907f2008-08-31 21:02:20 -0300508 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300509 return stat;
510 }
Servaas Vandenberghe6188a0f2011-02-13 17:51:09 -0300511 bleftend = cap->bounds.left+cap->bounds.width;
512 cleft = cptr->hdw->cropl_val;
513
514 *width = cleft < bleftend ? bleftend-cleft : 0;
Mike Isely432907f2008-08-31 21:02:20 -0300515 return 0;
516}
517
Servaas Vandenberghe6188a0f2011-02-13 17:51:09 -0300518static int ctrl_croph_max_get(struct pvr2_ctrl *cptr, int *height)
Mike Isely432907f2008-08-31 21:02:20 -0300519{
520 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
Servaas Vandenberghe6188a0f2011-02-13 17:51:09 -0300521 int stat, btopend, ctop;
522
523 stat = pvr2_hdw_check_cropcap(cptr->hdw);
Mike Isely432907f2008-08-31 21:02:20 -0300524 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300525 return stat;
526 }
Servaas Vandenberghe6188a0f2011-02-13 17:51:09 -0300527 btopend = cap->bounds.top+cap->bounds.height;
528 ctop = cptr->hdw->cropt_val;
529
530 *height = ctop < btopend ? btopend-ctop : 0;
Mike Isely432907f2008-08-31 21:02:20 -0300531 return 0;
532}
533
534static int ctrl_get_cropcapbl(struct pvr2_ctrl *cptr, int *val)
535{
536 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
537 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
538 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300539 return stat;
540 }
541 *val = cap->bounds.left;
542 return 0;
543}
544
545static int ctrl_get_cropcapbt(struct pvr2_ctrl *cptr, int *val)
546{
547 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
548 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
549 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300550 return stat;
551 }
552 *val = cap->bounds.top;
553 return 0;
554}
555
556static int ctrl_get_cropcapbw(struct pvr2_ctrl *cptr, int *val)
557{
558 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
559 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
560 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300561 return stat;
562 }
563 *val = cap->bounds.width;
564 return 0;
565}
566
567static int ctrl_get_cropcapbh(struct pvr2_ctrl *cptr, int *val)
568{
569 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
570 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
571 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300572 return stat;
573 }
574 *val = cap->bounds.height;
575 return 0;
576}
577
578static int ctrl_get_cropcapdl(struct pvr2_ctrl *cptr, int *val)
579{
580 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
581 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
582 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300583 return stat;
584 }
585 *val = cap->defrect.left;
586 return 0;
587}
588
589static int ctrl_get_cropcapdt(struct pvr2_ctrl *cptr, int *val)
590{
591 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
592 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
593 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300594 return stat;
595 }
596 *val = cap->defrect.top;
597 return 0;
598}
599
600static int ctrl_get_cropcapdw(struct pvr2_ctrl *cptr, int *val)
601{
602 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
603 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
604 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300605 return stat;
606 }
607 *val = cap->defrect.width;
608 return 0;
609}
610
611static int ctrl_get_cropcapdh(struct pvr2_ctrl *cptr, int *val)
612{
613 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
614 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
615 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300616 return stat;
617 }
618 *val = cap->defrect.height;
619 return 0;
620}
621
622static int ctrl_get_cropcappan(struct pvr2_ctrl *cptr, int *val)
623{
624 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
625 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
626 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300627 return stat;
628 }
629 *val = cap->pixelaspect.numerator;
630 return 0;
631}
632
633static int ctrl_get_cropcappad(struct pvr2_ctrl *cptr, int *val)
634{
635 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
636 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
637 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300638 return stat;
639 }
640 *val = cap->pixelaspect.denominator;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300641 return 0;
642}
643
Mike Isely3ad9fc32006-09-02 22:37:52 -0300644static int ctrl_vres_max_get(struct pvr2_ctrl *cptr,int *vp)
645{
646 /* Actual maximum depends on the video standard in effect. */
647 if (cptr->hdw->std_mask_cur & V4L2_STD_525_60) {
648 *vp = 480;
649 } else {
650 *vp = 576;
651 }
652 return 0;
653}
654
655static int ctrl_vres_min_get(struct pvr2_ctrl *cptr,int *vp)
656{
Mike Isely989eb152007-11-26 01:53:12 -0300657 /* Actual minimum depends on device digitizer type. */
658 if (cptr->hdw->hdw_desc->flag_has_cx25840) {
Mike Isely3ad9fc32006-09-02 22:37:52 -0300659 *vp = 75;
660 } else {
661 *vp = 17;
662 }
663 return 0;
664}
665
Mike Isely1bde0282006-12-27 23:30:13 -0300666static int ctrl_get_input(struct pvr2_ctrl *cptr,int *vp)
667{
668 *vp = cptr->hdw->input_val;
669 return 0;
670}
671
Mike Isely29bf5b12008-04-22 14:45:37 -0300672static int ctrl_check_input(struct pvr2_ctrl *cptr,int v)
673{
Mike Isely1cb03b72008-04-21 03:47:43 -0300674 return ((1 << v) & cptr->hdw->input_allowed_mask) != 0;
Mike Isely29bf5b12008-04-22 14:45:37 -0300675}
676
Mike Isely1bde0282006-12-27 23:30:13 -0300677static int ctrl_set_input(struct pvr2_ctrl *cptr,int m,int v)
678{
Mike Isely1cb03b72008-04-21 03:47:43 -0300679 return pvr2_hdw_set_input(cptr->hdw,v);
Mike Isely1bde0282006-12-27 23:30:13 -0300680}
681
682static int ctrl_isdirty_input(struct pvr2_ctrl *cptr)
683{
684 return cptr->hdw->input_dirty != 0;
685}
686
687static void ctrl_cleardirty_input(struct pvr2_ctrl *cptr)
688{
689 cptr->hdw->input_dirty = 0;
690}
691
Mike Isely5549f542006-12-27 23:28:54 -0300692
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300693static int ctrl_freq_max_get(struct pvr2_ctrl *cptr, int *vp)
694{
Mike Isely644afdb2007-01-20 00:19:23 -0300695 unsigned long fv;
696 struct pvr2_hdw *hdw = cptr->hdw;
697 if (hdw->tuner_signal_stale) {
Mike Iselya51f5002009-03-06 23:30:37 -0300698 pvr2_hdw_status_poll(hdw);
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300699 }
Mike Isely644afdb2007-01-20 00:19:23 -0300700 fv = hdw->tuner_signal_info.rangehigh;
701 if (!fv) {
702 /* Safety fallback */
703 *vp = TV_MAX_FREQ;
704 return 0;
705 }
706 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
707 fv = (fv * 125) / 2;
708 } else {
709 fv = fv * 62500;
710 }
711 *vp = fv;
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300712 return 0;
713}
714
715static int ctrl_freq_min_get(struct pvr2_ctrl *cptr, int *vp)
716{
Mike Isely644afdb2007-01-20 00:19:23 -0300717 unsigned long fv;
718 struct pvr2_hdw *hdw = cptr->hdw;
719 if (hdw->tuner_signal_stale) {
Mike Iselya51f5002009-03-06 23:30:37 -0300720 pvr2_hdw_status_poll(hdw);
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300721 }
Mike Isely644afdb2007-01-20 00:19:23 -0300722 fv = hdw->tuner_signal_info.rangelow;
723 if (!fv) {
724 /* Safety fallback */
725 *vp = TV_MIN_FREQ;
726 return 0;
727 }
728 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
729 fv = (fv * 125) / 2;
730 } else {
731 fv = fv * 62500;
732 }
733 *vp = fv;
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300734 return 0;
735}
736
Mike Iselyb30d2442006-06-25 20:05:01 -0300737static int ctrl_cx2341x_is_dirty(struct pvr2_ctrl *cptr)
738{
739 return cptr->hdw->enc_stale != 0;
740}
741
742static void ctrl_cx2341x_clear_dirty(struct pvr2_ctrl *cptr)
743{
744 cptr->hdw->enc_stale = 0;
Mike Isely681c7392007-11-26 01:48:52 -0300745 cptr->hdw->enc_unsafe_stale = 0;
Mike Iselyb30d2442006-06-25 20:05:01 -0300746}
747
748static int ctrl_cx2341x_get(struct pvr2_ctrl *cptr,int *vp)
749{
750 int ret;
751 struct v4l2_ext_controls cs;
752 struct v4l2_ext_control c1;
753 memset(&cs,0,sizeof(cs));
754 memset(&c1,0,sizeof(c1));
755 cs.controls = &c1;
756 cs.count = 1;
757 c1.id = cptr->info->v4l_id;
Hans Verkuil01f1e442007-08-21 18:32:42 -0300758 ret = cx2341x_ext_ctrls(&cptr->hdw->enc_ctl_state, 0, &cs,
Mike Iselyb30d2442006-06-25 20:05:01 -0300759 VIDIOC_G_EXT_CTRLS);
760 if (ret) return ret;
761 *vp = c1.value;
762 return 0;
763}
764
765static int ctrl_cx2341x_set(struct pvr2_ctrl *cptr,int m,int v)
766{
767 int ret;
Mike Isely681c7392007-11-26 01:48:52 -0300768 struct pvr2_hdw *hdw = cptr->hdw;
Mike Iselyb30d2442006-06-25 20:05:01 -0300769 struct v4l2_ext_controls cs;
770 struct v4l2_ext_control c1;
771 memset(&cs,0,sizeof(cs));
772 memset(&c1,0,sizeof(c1));
773 cs.controls = &c1;
774 cs.count = 1;
775 c1.id = cptr->info->v4l_id;
776 c1.value = v;
Mike Isely681c7392007-11-26 01:48:52 -0300777 ret = cx2341x_ext_ctrls(&hdw->enc_ctl_state,
778 hdw->state_encoder_run, &cs,
Mike Iselyb30d2442006-06-25 20:05:01 -0300779 VIDIOC_S_EXT_CTRLS);
Mike Isely681c7392007-11-26 01:48:52 -0300780 if (ret == -EBUSY) {
781 /* Oops. cx2341x is telling us it's not safe to change
782 this control while we're capturing. Make a note of this
783 fact so that the pipeline will be stopped the next time
784 controls are committed. Then go on ahead and store this
785 change anyway. */
786 ret = cx2341x_ext_ctrls(&hdw->enc_ctl_state,
787 0, &cs,
788 VIDIOC_S_EXT_CTRLS);
789 if (!ret) hdw->enc_unsafe_stale = !0;
790 }
Mike Iselyb30d2442006-06-25 20:05:01 -0300791 if (ret) return ret;
Mike Isely681c7392007-11-26 01:48:52 -0300792 hdw->enc_stale = !0;
Mike Iselyb30d2442006-06-25 20:05:01 -0300793 return 0;
794}
795
796static unsigned int ctrl_cx2341x_getv4lflags(struct pvr2_ctrl *cptr)
797{
798 struct v4l2_queryctrl qctrl;
799 struct pvr2_ctl_info *info;
800 qctrl.id = cptr->info->v4l_id;
801 cx2341x_ctrl_query(&cptr->hdw->enc_ctl_state,&qctrl);
802 /* Strip out the const so we can adjust a function pointer. It's
803 OK to do this here because we know this is a dynamically created
804 control, so the underlying storage for the info pointer is (a)
805 private to us, and (b) not in read-only storage. Either we do
806 this or we significantly complicate the underlying control
807 implementation. */
808 info = (struct pvr2_ctl_info *)(cptr->info);
809 if (qctrl.flags & V4L2_CTRL_FLAG_READ_ONLY) {
810 if (info->set_value) {
Mike Iselya0fd1cb2006-06-30 11:35:28 -0300811 info->set_value = NULL;
Mike Iselyb30d2442006-06-25 20:05:01 -0300812 }
813 } else {
814 if (!(info->set_value)) {
815 info->set_value = ctrl_cx2341x_set;
816 }
817 }
818 return qctrl.flags;
819}
820
Mike Iselyd8554972006-06-26 20:58:46 -0300821static int ctrl_streamingenabled_get(struct pvr2_ctrl *cptr,int *vp)
822{
Mike Isely681c7392007-11-26 01:48:52 -0300823 *vp = cptr->hdw->state_pipeline_req;
824 return 0;
825}
826
827static int ctrl_masterstate_get(struct pvr2_ctrl *cptr,int *vp)
828{
829 *vp = cptr->hdw->master_state;
Mike Iselyd8554972006-06-26 20:58:46 -0300830 return 0;
831}
832
833static int ctrl_hsm_get(struct pvr2_ctrl *cptr,int *vp)
834{
835 int result = pvr2_hdw_is_hsm(cptr->hdw);
836 *vp = PVR2_CVAL_HSM_FULL;
837 if (result < 0) *vp = PVR2_CVAL_HSM_FAIL;
838 if (result) *vp = PVR2_CVAL_HSM_HIGH;
839 return 0;
840}
841
842static int ctrl_stdavail_get(struct pvr2_ctrl *cptr,int *vp)
843{
844 *vp = cptr->hdw->std_mask_avail;
845 return 0;
846}
847
848static int ctrl_stdavail_set(struct pvr2_ctrl *cptr,int m,int v)
849{
850 struct pvr2_hdw *hdw = cptr->hdw;
851 v4l2_std_id ns;
852 ns = hdw->std_mask_avail;
853 ns = (ns & ~m) | (v & m);
854 if (ns == hdw->std_mask_avail) return 0;
855 hdw->std_mask_avail = ns;
856 pvr2_hdw_internal_set_std_avail(hdw);
857 pvr2_hdw_internal_find_stdenum(hdw);
858 return 0;
859}
860
861static int ctrl_std_val_to_sym(struct pvr2_ctrl *cptr,int msk,int val,
862 char *bufPtr,unsigned int bufSize,
863 unsigned int *len)
864{
865 *len = pvr2_std_id_to_str(bufPtr,bufSize,msk & val);
866 return 0;
867}
868
869static int ctrl_std_sym_to_val(struct pvr2_ctrl *cptr,
870 const char *bufPtr,unsigned int bufSize,
871 int *mskp,int *valp)
872{
873 int ret;
874 v4l2_std_id id;
875 ret = pvr2_std_str_to_id(&id,bufPtr,bufSize);
876 if (ret < 0) return ret;
877 if (mskp) *mskp = id;
878 if (valp) *valp = id;
879 return 0;
880}
881
882static int ctrl_stdcur_get(struct pvr2_ctrl *cptr,int *vp)
883{
884 *vp = cptr->hdw->std_mask_cur;
885 return 0;
886}
887
888static int ctrl_stdcur_set(struct pvr2_ctrl *cptr,int m,int v)
889{
890 struct pvr2_hdw *hdw = cptr->hdw;
891 v4l2_std_id ns;
892 ns = hdw->std_mask_cur;
893 ns = (ns & ~m) | (v & m);
894 if (ns == hdw->std_mask_cur) return 0;
895 hdw->std_mask_cur = ns;
896 hdw->std_dirty = !0;
897 pvr2_hdw_internal_find_stdenum(hdw);
898 return 0;
899}
900
901static int ctrl_stdcur_is_dirty(struct pvr2_ctrl *cptr)
902{
903 return cptr->hdw->std_dirty != 0;
904}
905
906static void ctrl_stdcur_clear_dirty(struct pvr2_ctrl *cptr)
907{
908 cptr->hdw->std_dirty = 0;
909}
910
911static int ctrl_signal_get(struct pvr2_ctrl *cptr,int *vp)
912{
Mike Isely18103c572007-01-20 00:09:47 -0300913 struct pvr2_hdw *hdw = cptr->hdw;
Mike Iselya51f5002009-03-06 23:30:37 -0300914 pvr2_hdw_status_poll(hdw);
Mike Isely18103c572007-01-20 00:09:47 -0300915 *vp = hdw->tuner_signal_info.signal;
916 return 0;
917}
918
919static int ctrl_audio_modes_present_get(struct pvr2_ctrl *cptr,int *vp)
920{
921 int val = 0;
922 unsigned int subchan;
923 struct pvr2_hdw *hdw = cptr->hdw;
Mike Iselya51f5002009-03-06 23:30:37 -0300924 pvr2_hdw_status_poll(hdw);
Mike Isely18103c572007-01-20 00:09:47 -0300925 subchan = hdw->tuner_signal_info.rxsubchans;
926 if (subchan & V4L2_TUNER_SUB_MONO) {
927 val |= (1 << V4L2_TUNER_MODE_MONO);
928 }
929 if (subchan & V4L2_TUNER_SUB_STEREO) {
930 val |= (1 << V4L2_TUNER_MODE_STEREO);
931 }
932 if (subchan & V4L2_TUNER_SUB_LANG1) {
933 val |= (1 << V4L2_TUNER_MODE_LANG1);
934 }
935 if (subchan & V4L2_TUNER_SUB_LANG2) {
936 val |= (1 << V4L2_TUNER_MODE_LANG2);
937 }
938 *vp = val;
Mike Iselyd8554972006-06-26 20:58:46 -0300939 return 0;
940}
941
Mike Iselyd8554972006-06-26 20:58:46 -0300942
943static int ctrl_stdenumcur_set(struct pvr2_ctrl *cptr,int m,int v)
944{
945 struct pvr2_hdw *hdw = cptr->hdw;
946 if (v < 0) return -EINVAL;
947 if (v > hdw->std_enum_cnt) return -EINVAL;
948 hdw->std_enum_cur = v;
949 if (!v) return 0;
950 v--;
951 if (hdw->std_mask_cur == hdw->std_defs[v].id) return 0;
952 hdw->std_mask_cur = hdw->std_defs[v].id;
953 hdw->std_dirty = !0;
954 return 0;
955}
956
957
958static int ctrl_stdenumcur_get(struct pvr2_ctrl *cptr,int *vp)
959{
960 *vp = cptr->hdw->std_enum_cur;
961 return 0;
962}
963
964
965static int ctrl_stdenumcur_is_dirty(struct pvr2_ctrl *cptr)
966{
967 return cptr->hdw->std_dirty != 0;
968}
969
970
971static void ctrl_stdenumcur_clear_dirty(struct pvr2_ctrl *cptr)
972{
973 cptr->hdw->std_dirty = 0;
974}
975
976
977#define DEFINT(vmin,vmax) \
978 .type = pvr2_ctl_int, \
979 .def.type_int.min_value = vmin, \
980 .def.type_int.max_value = vmax
981
982#define DEFENUM(tab) \
983 .type = pvr2_ctl_enum, \
Mike Isely27c7b712007-01-20 00:39:17 -0300984 .def.type_enum.count = ARRAY_SIZE(tab), \
Mike Iselyd8554972006-06-26 20:58:46 -0300985 .def.type_enum.value_names = tab
986
Mike Isely33213962006-06-25 20:04:40 -0300987#define DEFBOOL \
988 .type = pvr2_ctl_bool
989
Mike Iselyd8554972006-06-26 20:58:46 -0300990#define DEFMASK(msk,tab) \
991 .type = pvr2_ctl_bitmask, \
992 .def.type_bitmask.valid_bits = msk, \
993 .def.type_bitmask.bit_names = tab
994
995#define DEFREF(vname) \
996 .set_value = ctrl_set_##vname, \
997 .get_value = ctrl_get_##vname, \
998 .is_dirty = ctrl_isdirty_##vname, \
999 .clear_dirty = ctrl_cleardirty_##vname
1000
1001
1002#define VCREATE_FUNCS(vname) \
1003static int ctrl_get_##vname(struct pvr2_ctrl *cptr,int *vp) \
1004{*vp = cptr->hdw->vname##_val; return 0;} \
1005static int ctrl_set_##vname(struct pvr2_ctrl *cptr,int m,int v) \
1006{cptr->hdw->vname##_val = v; cptr->hdw->vname##_dirty = !0; return 0;} \
1007static int ctrl_isdirty_##vname(struct pvr2_ctrl *cptr) \
1008{return cptr->hdw->vname##_dirty != 0;} \
1009static void ctrl_cleardirty_##vname(struct pvr2_ctrl *cptr) \
1010{cptr->hdw->vname##_dirty = 0;}
1011
1012VCREATE_FUNCS(brightness)
1013VCREATE_FUNCS(contrast)
1014VCREATE_FUNCS(saturation)
1015VCREATE_FUNCS(hue)
1016VCREATE_FUNCS(volume)
1017VCREATE_FUNCS(balance)
1018VCREATE_FUNCS(bass)
1019VCREATE_FUNCS(treble)
1020VCREATE_FUNCS(mute)
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001021VCREATE_FUNCS(cropl)
1022VCREATE_FUNCS(cropt)
1023VCREATE_FUNCS(cropw)
1024VCREATE_FUNCS(croph)
Mike Iselyc05c0462006-06-25 20:04:25 -03001025VCREATE_FUNCS(audiomode)
1026VCREATE_FUNCS(res_hor)
1027VCREATE_FUNCS(res_ver)
Mike Iselyd8554972006-06-26 20:58:46 -03001028VCREATE_FUNCS(srate)
Mike Iselyd8554972006-06-26 20:58:46 -03001029
Mike Iselyd8554972006-06-26 20:58:46 -03001030/* Table definition of all controls which can be manipulated */
1031static const struct pvr2_ctl_info control_defs[] = {
1032 {
1033 .v4l_id = V4L2_CID_BRIGHTNESS,
1034 .desc = "Brightness",
1035 .name = "brightness",
1036 .default_value = 128,
1037 DEFREF(brightness),
1038 DEFINT(0,255),
1039 },{
1040 .v4l_id = V4L2_CID_CONTRAST,
1041 .desc = "Contrast",
1042 .name = "contrast",
1043 .default_value = 68,
1044 DEFREF(contrast),
1045 DEFINT(0,127),
1046 },{
1047 .v4l_id = V4L2_CID_SATURATION,
1048 .desc = "Saturation",
1049 .name = "saturation",
1050 .default_value = 64,
1051 DEFREF(saturation),
1052 DEFINT(0,127),
1053 },{
1054 .v4l_id = V4L2_CID_HUE,
1055 .desc = "Hue",
1056 .name = "hue",
1057 .default_value = 0,
1058 DEFREF(hue),
1059 DEFINT(-128,127),
1060 },{
1061 .v4l_id = V4L2_CID_AUDIO_VOLUME,
1062 .desc = "Volume",
1063 .name = "volume",
Mike Isely139eecf2006-12-27 23:36:33 -03001064 .default_value = 62000,
Mike Iselyd8554972006-06-26 20:58:46 -03001065 DEFREF(volume),
1066 DEFINT(0,65535),
1067 },{
1068 .v4l_id = V4L2_CID_AUDIO_BALANCE,
1069 .desc = "Balance",
1070 .name = "balance",
1071 .default_value = 0,
1072 DEFREF(balance),
1073 DEFINT(-32768,32767),
1074 },{
1075 .v4l_id = V4L2_CID_AUDIO_BASS,
1076 .desc = "Bass",
1077 .name = "bass",
1078 .default_value = 0,
1079 DEFREF(bass),
1080 DEFINT(-32768,32767),
1081 },{
1082 .v4l_id = V4L2_CID_AUDIO_TREBLE,
1083 .desc = "Treble",
1084 .name = "treble",
1085 .default_value = 0,
1086 DEFREF(treble),
1087 DEFINT(-32768,32767),
1088 },{
1089 .v4l_id = V4L2_CID_AUDIO_MUTE,
1090 .desc = "Mute",
1091 .name = "mute",
1092 .default_value = 0,
1093 DEFREF(mute),
Mike Isely33213962006-06-25 20:04:40 -03001094 DEFBOOL,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001095 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001096 .desc = "Capture crop left margin",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001097 .name = "crop_left",
1098 .internal_id = PVR2_CID_CROPL,
1099 .default_value = 0,
1100 DEFREF(cropl),
1101 DEFINT(-129, 340),
1102 .get_min_value = ctrl_cropl_min_get,
1103 .get_max_value = ctrl_cropl_max_get,
Mike Isely432907f2008-08-31 21:02:20 -03001104 .get_def_value = ctrl_get_cropcapdl,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001105 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001106 .desc = "Capture crop top margin",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001107 .name = "crop_top",
1108 .internal_id = PVR2_CID_CROPT,
1109 .default_value = 0,
1110 DEFREF(cropt),
1111 DEFINT(-35, 544),
1112 .get_min_value = ctrl_cropt_min_get,
1113 .get_max_value = ctrl_cropt_max_get,
Mike Isely432907f2008-08-31 21:02:20 -03001114 .get_def_value = ctrl_get_cropcapdt,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001115 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001116 .desc = "Capture crop width",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001117 .name = "crop_width",
1118 .internal_id = PVR2_CID_CROPW,
1119 .default_value = 720,
1120 DEFREF(cropw),
Mike Isely35fa5d42011-02-13 17:34:33 -03001121 DEFINT(0, 864),
Mike Isely432907f2008-08-31 21:02:20 -03001122 .get_max_value = ctrl_cropw_max_get,
1123 .get_def_value = ctrl_get_cropcapdw,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001124 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001125 .desc = "Capture crop height",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001126 .name = "crop_height",
1127 .internal_id = PVR2_CID_CROPH,
1128 .default_value = 480,
1129 DEFREF(croph),
Mike Isely35fa5d42011-02-13 17:34:33 -03001130 DEFINT(0, 576),
Mike Isely432907f2008-08-31 21:02:20 -03001131 .get_max_value = ctrl_croph_max_get,
1132 .get_def_value = ctrl_get_cropcapdh,
1133 }, {
1134 .desc = "Capture capability pixel aspect numerator",
1135 .name = "cropcap_pixel_numerator",
1136 .internal_id = PVR2_CID_CROPCAPPAN,
1137 .get_value = ctrl_get_cropcappan,
1138 }, {
1139 .desc = "Capture capability pixel aspect denominator",
1140 .name = "cropcap_pixel_denominator",
1141 .internal_id = PVR2_CID_CROPCAPPAD,
1142 .get_value = ctrl_get_cropcappad,
1143 }, {
1144 .desc = "Capture capability bounds top",
1145 .name = "cropcap_bounds_top",
1146 .internal_id = PVR2_CID_CROPCAPBT,
1147 .get_value = ctrl_get_cropcapbt,
1148 }, {
1149 .desc = "Capture capability bounds left",
1150 .name = "cropcap_bounds_left",
1151 .internal_id = PVR2_CID_CROPCAPBL,
1152 .get_value = ctrl_get_cropcapbl,
1153 }, {
1154 .desc = "Capture capability bounds width",
1155 .name = "cropcap_bounds_width",
1156 .internal_id = PVR2_CID_CROPCAPBW,
1157 .get_value = ctrl_get_cropcapbw,
1158 }, {
1159 .desc = "Capture capability bounds height",
1160 .name = "cropcap_bounds_height",
1161 .internal_id = PVR2_CID_CROPCAPBH,
1162 .get_value = ctrl_get_cropcapbh,
Mike Iselyd8554972006-06-26 20:58:46 -03001163 },{
Mike Iselyc05c0462006-06-25 20:04:25 -03001164 .desc = "Video Source",
1165 .name = "input",
1166 .internal_id = PVR2_CID_INPUT,
1167 .default_value = PVR2_CVAL_INPUT_TV,
Mike Isely29bf5b12008-04-22 14:45:37 -03001168 .check_value = ctrl_check_input,
Mike Iselyc05c0462006-06-25 20:04:25 -03001169 DEFREF(input),
1170 DEFENUM(control_values_input),
1171 },{
1172 .desc = "Audio Mode",
1173 .name = "audio_mode",
1174 .internal_id = PVR2_CID_AUDIOMODE,
1175 .default_value = V4L2_TUNER_MODE_STEREO,
1176 DEFREF(audiomode),
1177 DEFENUM(control_values_audiomode),
1178 },{
1179 .desc = "Horizontal capture resolution",
1180 .name = "resolution_hor",
1181 .internal_id = PVR2_CID_HRES,
1182 .default_value = 720,
1183 DEFREF(res_hor),
Mike Isely3ad9fc32006-09-02 22:37:52 -03001184 DEFINT(19,720),
Mike Iselyc05c0462006-06-25 20:04:25 -03001185 },{
1186 .desc = "Vertical capture resolution",
1187 .name = "resolution_ver",
1188 .internal_id = PVR2_CID_VRES,
1189 .default_value = 480,
1190 DEFREF(res_ver),
Mike Isely3ad9fc32006-09-02 22:37:52 -03001191 DEFINT(17,576),
1192 /* Hook in check for video standard and adjust maximum
1193 depending on the standard. */
1194 .get_max_value = ctrl_vres_max_get,
1195 .get_min_value = ctrl_vres_min_get,
Mike Iselyc05c0462006-06-25 20:04:25 -03001196 },{
Mike Iselyb30d2442006-06-25 20:05:01 -03001197 .v4l_id = V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
Mike Isely434449f2006-08-08 09:10:06 -03001198 .default_value = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000,
1199 .desc = "Audio Sampling Frequency",
Mike Iselyd8554972006-06-26 20:58:46 -03001200 .name = "srate",
Mike Iselyd8554972006-06-26 20:58:46 -03001201 DEFREF(srate),
1202 DEFENUM(control_values_srate),
1203 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001204 .desc = "Tuner Frequency (Hz)",
1205 .name = "frequency",
1206 .internal_id = PVR2_CID_FREQUENCY,
Mike Isely1bde0282006-12-27 23:30:13 -03001207 .default_value = 0,
Mike Iselyd8554972006-06-26 20:58:46 -03001208 .set_value = ctrl_freq_set,
1209 .get_value = ctrl_freq_get,
1210 .is_dirty = ctrl_freq_is_dirty,
1211 .clear_dirty = ctrl_freq_clear_dirty,
Mike Isely644afdb2007-01-20 00:19:23 -03001212 DEFINT(0,0),
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -03001213 /* Hook in check for input value (tv/radio) and adjust
1214 max/min values accordingly */
1215 .get_max_value = ctrl_freq_max_get,
1216 .get_min_value = ctrl_freq_min_get,
Mike Iselyd8554972006-06-26 20:58:46 -03001217 },{
1218 .desc = "Channel",
1219 .name = "channel",
1220 .set_value = ctrl_channel_set,
1221 .get_value = ctrl_channel_get,
1222 DEFINT(0,FREQTABLE_SIZE),
1223 },{
1224 .desc = "Channel Program Frequency",
1225 .name = "freq_table_value",
1226 .set_value = ctrl_channelfreq_set,
1227 .get_value = ctrl_channelfreq_get,
Mike Isely644afdb2007-01-20 00:19:23 -03001228 DEFINT(0,0),
Mike Isely1bde0282006-12-27 23:30:13 -03001229 /* Hook in check for input value (tv/radio) and adjust
1230 max/min values accordingly */
Mike Isely1bde0282006-12-27 23:30:13 -03001231 .get_max_value = ctrl_freq_max_get,
1232 .get_min_value = ctrl_freq_min_get,
Mike Iselyd8554972006-06-26 20:58:46 -03001233 },{
1234 .desc = "Channel Program ID",
1235 .name = "freq_table_channel",
1236 .set_value = ctrl_channelprog_set,
1237 .get_value = ctrl_channelprog_get,
1238 DEFINT(0,FREQTABLE_SIZE),
1239 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001240 .desc = "Streaming Enabled",
1241 .name = "streaming_enabled",
1242 .get_value = ctrl_streamingenabled_get,
Mike Isely33213962006-06-25 20:04:40 -03001243 DEFBOOL,
Mike Iselyd8554972006-06-26 20:58:46 -03001244 },{
1245 .desc = "USB Speed",
1246 .name = "usb_speed",
1247 .get_value = ctrl_hsm_get,
1248 DEFENUM(control_values_hsm),
1249 },{
Mike Isely681c7392007-11-26 01:48:52 -03001250 .desc = "Master State",
1251 .name = "master_state",
1252 .get_value = ctrl_masterstate_get,
1253 DEFENUM(pvr2_state_names),
1254 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001255 .desc = "Signal Present",
1256 .name = "signal_present",
1257 .get_value = ctrl_signal_get,
Mike Isely18103c572007-01-20 00:09:47 -03001258 DEFINT(0,65535),
1259 },{
1260 .desc = "Audio Modes Present",
1261 .name = "audio_modes_present",
1262 .get_value = ctrl_audio_modes_present_get,
1263 /* For this type we "borrow" the V4L2_TUNER_MODE enum from
1264 v4l. Nothing outside of this module cares about this,
1265 but I reuse it in order to also reuse the
1266 control_values_audiomode string table. */
1267 DEFMASK(((1 << V4L2_TUNER_MODE_MONO)|
1268 (1 << V4L2_TUNER_MODE_STEREO)|
1269 (1 << V4L2_TUNER_MODE_LANG1)|
1270 (1 << V4L2_TUNER_MODE_LANG2)),
1271 control_values_audiomode),
Mike Iselyd8554972006-06-26 20:58:46 -03001272 },{
1273 .desc = "Video Standards Available Mask",
1274 .name = "video_standard_mask_available",
1275 .internal_id = PVR2_CID_STDAVAIL,
1276 .skip_init = !0,
1277 .get_value = ctrl_stdavail_get,
1278 .set_value = ctrl_stdavail_set,
1279 .val_to_sym = ctrl_std_val_to_sym,
1280 .sym_to_val = ctrl_std_sym_to_val,
1281 .type = pvr2_ctl_bitmask,
1282 },{
1283 .desc = "Video Standards In Use Mask",
1284 .name = "video_standard_mask_active",
1285 .internal_id = PVR2_CID_STDCUR,
1286 .skip_init = !0,
1287 .get_value = ctrl_stdcur_get,
1288 .set_value = ctrl_stdcur_set,
1289 .is_dirty = ctrl_stdcur_is_dirty,
1290 .clear_dirty = ctrl_stdcur_clear_dirty,
1291 .val_to_sym = ctrl_std_val_to_sym,
1292 .sym_to_val = ctrl_std_sym_to_val,
1293 .type = pvr2_ctl_bitmask,
1294 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001295 .desc = "Video Standard Name",
1296 .name = "video_standard",
1297 .internal_id = PVR2_CID_STDENUM,
1298 .skip_init = !0,
1299 .get_value = ctrl_stdenumcur_get,
1300 .set_value = ctrl_stdenumcur_set,
1301 .is_dirty = ctrl_stdenumcur_is_dirty,
1302 .clear_dirty = ctrl_stdenumcur_clear_dirty,
1303 .type = pvr2_ctl_enum,
1304 }
1305};
1306
Ahmed S. Darwisheca8ebf2007-01-20 00:35:03 -03001307#define CTRLDEF_COUNT ARRAY_SIZE(control_defs)
Mike Iselyd8554972006-06-26 20:58:46 -03001308
1309
1310const char *pvr2_config_get_name(enum pvr2_config cfg)
1311{
1312 switch (cfg) {
1313 case pvr2_config_empty: return "empty";
1314 case pvr2_config_mpeg: return "mpeg";
1315 case pvr2_config_vbi: return "vbi";
Mike Isely16eb40d2006-12-30 18:27:32 -03001316 case pvr2_config_pcm: return "pcm";
1317 case pvr2_config_rawvideo: return "raw video";
Mike Iselyd8554972006-06-26 20:58:46 -03001318 }
1319 return "<unknown>";
1320}
1321
1322
1323struct usb_device *pvr2_hdw_get_dev(struct pvr2_hdw *hdw)
1324{
1325 return hdw->usb_dev;
1326}
1327
1328
1329unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw)
1330{
1331 return hdw->serial_number;
1332}
1333
Mike Isely31a18542007-04-08 01:11:47 -03001334
1335const char *pvr2_hdw_get_bus_info(struct pvr2_hdw *hdw)
1336{
1337 return hdw->bus_info;
1338}
1339
1340
Mike Isely13a88792009-01-14 04:22:56 -03001341const char *pvr2_hdw_get_device_identifier(struct pvr2_hdw *hdw)
1342{
1343 return hdw->identifier;
1344}
1345
1346
Mike Isely1bde0282006-12-27 23:30:13 -03001347unsigned long pvr2_hdw_get_cur_freq(struct pvr2_hdw *hdw)
1348{
1349 return hdw->freqSelector ? hdw->freqValTelevision : hdw->freqValRadio;
1350}
1351
1352/* Set the currently tuned frequency and account for all possible
1353 driver-core side effects of this action. */
Adrian Bunkf55a8712008-04-18 05:38:56 -03001354static void pvr2_hdw_set_cur_freq(struct pvr2_hdw *hdw,unsigned long val)
Mike Isely1bde0282006-12-27 23:30:13 -03001355{
Mike Isely7c74e572007-01-20 00:15:41 -03001356 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
Mike Isely1bde0282006-12-27 23:30:13 -03001357 if (hdw->freqSelector) {
1358 /* Swing over to radio frequency selection */
1359 hdw->freqSelector = 0;
1360 hdw->freqDirty = !0;
1361 }
Mike Isely1bde0282006-12-27 23:30:13 -03001362 if (hdw->freqValRadio != val) {
1363 hdw->freqValRadio = val;
1364 hdw->freqSlotRadio = 0;
Mike Isely7c74e572007-01-20 00:15:41 -03001365 hdw->freqDirty = !0;
Mike Isely1bde0282006-12-27 23:30:13 -03001366 }
Mike Isely7c74e572007-01-20 00:15:41 -03001367 } else {
Mike Isely1bde0282006-12-27 23:30:13 -03001368 if (!(hdw->freqSelector)) {
1369 /* Swing over to television frequency selection */
1370 hdw->freqSelector = 1;
1371 hdw->freqDirty = !0;
1372 }
Mike Isely1bde0282006-12-27 23:30:13 -03001373 if (hdw->freqValTelevision != val) {
1374 hdw->freqValTelevision = val;
1375 hdw->freqSlotTelevision = 0;
Mike Isely7c74e572007-01-20 00:15:41 -03001376 hdw->freqDirty = !0;
Mike Isely1bde0282006-12-27 23:30:13 -03001377 }
Mike Isely1bde0282006-12-27 23:30:13 -03001378 }
1379}
1380
Mike Iselyd8554972006-06-26 20:58:46 -03001381int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw)
1382{
1383 return hdw->unit_number;
1384}
1385
1386
1387/* Attempt to locate one of the given set of files. Messages are logged
1388 appropriate to what has been found. The return value will be 0 or
1389 greater on success (it will be the index of the file name found) and
1390 fw_entry will be filled in. Otherwise a negative error is returned on
1391 failure. If the return value is -ENOENT then no viable firmware file
1392 could be located. */
1393static int pvr2_locate_firmware(struct pvr2_hdw *hdw,
1394 const struct firmware **fw_entry,
1395 const char *fwtypename,
1396 unsigned int fwcount,
1397 const char *fwnames[])
1398{
1399 unsigned int idx;
1400 int ret = -EINVAL;
1401 for (idx = 0; idx < fwcount; idx++) {
1402 ret = request_firmware(fw_entry,
1403 fwnames[idx],
1404 &hdw->usb_dev->dev);
1405 if (!ret) {
1406 trace_firmware("Located %s firmware: %s;"
1407 " uploading...",
1408 fwtypename,
1409 fwnames[idx]);
1410 return idx;
1411 }
1412 if (ret == -ENOENT) continue;
1413 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1414 "request_firmware fatal error with code=%d",ret);
1415 return ret;
1416 }
1417 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1418 "***WARNING***"
1419 " Device %s firmware"
1420 " seems to be missing.",
1421 fwtypename);
1422 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1423 "Did you install the pvrusb2 firmware files"
1424 " in their proper location?");
1425 if (fwcount == 1) {
1426 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1427 "request_firmware unable to locate %s file %s",
1428 fwtypename,fwnames[0]);
1429 } else {
1430 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1431 "request_firmware unable to locate"
1432 " one of the following %s files:",
1433 fwtypename);
1434 for (idx = 0; idx < fwcount; idx++) {
1435 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1436 "request_firmware: Failed to find %s",
1437 fwnames[idx]);
1438 }
1439 }
1440 return ret;
1441}
1442
1443
1444/*
1445 * pvr2_upload_firmware1().
1446 *
1447 * Send the 8051 firmware to the device. After the upload, arrange for
1448 * device to re-enumerate.
1449 *
1450 * NOTE : the pointer to the firmware data given by request_firmware()
1451 * is not suitable for an usb transaction.
1452 *
1453 */
Adrian Bunk07e337e2006-06-30 11:30:20 -03001454static int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03001455{
Mike Iselya0fd1cb2006-06-30 11:35:28 -03001456 const struct firmware *fw_entry = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03001457 void *fw_ptr;
1458 unsigned int pipe;
Mike Isely9081d902009-11-25 02:59:34 -03001459 unsigned int fwsize;
Mike Iselyd8554972006-06-26 20:58:46 -03001460 int ret;
1461 u16 address;
Mike Isely1d643a32007-09-08 22:18:50 -03001462
Mike Isely989eb152007-11-26 01:53:12 -03001463 if (!hdw->hdw_desc->fx2_firmware.cnt) {
Mike Isely1d643a32007-09-08 22:18:50 -03001464 hdw->fw1_state = FW1_STATE_OK;
Mike Isely56dcbfa2007-11-26 02:00:51 -03001465 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1466 "Connected device type defines"
1467 " no firmware to upload; ignoring firmware");
1468 return -ENOTTY;
Mike Isely1d643a32007-09-08 22:18:50 -03001469 }
1470
Mike Iselyd8554972006-06-26 20:58:46 -03001471 hdw->fw1_state = FW1_STATE_FAILED; // default result
1472
1473 trace_firmware("pvr2_upload_firmware1");
1474
1475 ret = pvr2_locate_firmware(hdw,&fw_entry,"fx2 controller",
Mike Isely989eb152007-11-26 01:53:12 -03001476 hdw->hdw_desc->fx2_firmware.cnt,
1477 hdw->hdw_desc->fx2_firmware.lst);
Mike Iselyd8554972006-06-26 20:58:46 -03001478 if (ret < 0) {
1479 if (ret == -ENOENT) hdw->fw1_state = FW1_STATE_MISSING;
1480 return ret;
1481 }
1482
Mike Iselyd8554972006-06-26 20:58:46 -03001483 usb_clear_halt(hdw->usb_dev, usb_sndbulkpipe(hdw->usb_dev, 0 & 0x7f));
1484
1485 pipe = usb_sndctrlpipe(hdw->usb_dev, 0);
Mike Isely9081d902009-11-25 02:59:34 -03001486 fwsize = fw_entry->size;
Mike Iselyd8554972006-06-26 20:58:46 -03001487
Mike Isely9081d902009-11-25 02:59:34 -03001488 if ((fwsize != 0x2000) &&
1489 (!(hdw->hdw_desc->flag_fx2_16kb && (fwsize == 0x4000)))) {
Mike Iselyc21c2db2009-11-25 02:49:21 -03001490 if (hdw->hdw_desc->flag_fx2_16kb) {
1491 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1492 "Wrong fx2 firmware size"
1493 " (expected 8192 or 16384, got %u)",
Mike Isely9081d902009-11-25 02:59:34 -03001494 fwsize);
Mike Iselyc21c2db2009-11-25 02:49:21 -03001495 } else {
1496 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1497 "Wrong fx2 firmware size"
1498 " (expected 8192, got %u)",
Mike Isely9081d902009-11-25 02:59:34 -03001499 fwsize);
Mike Iselyc21c2db2009-11-25 02:49:21 -03001500 }
Mike Iselyd8554972006-06-26 20:58:46 -03001501 release_firmware(fw_entry);
1502 return -ENOMEM;
1503 }
1504
1505 fw_ptr = kmalloc(0x800, GFP_KERNEL);
1506 if (fw_ptr == NULL){
1507 release_firmware(fw_entry);
1508 return -ENOMEM;
1509 }
1510
1511 /* We have to hold the CPU during firmware upload. */
1512 pvr2_hdw_cpureset_assert(hdw,1);
1513
1514 /* upload the firmware to address 0000-1fff in 2048 (=0x800) bytes
1515 chunk. */
1516
1517 ret = 0;
Mike Isely9081d902009-11-25 02:59:34 -03001518 for (address = 0; address < fwsize; address += 0x800) {
Mike Iselyd8554972006-06-26 20:58:46 -03001519 memcpy(fw_ptr, fw_entry->data + address, 0x800);
1520 ret += usb_control_msg(hdw->usb_dev, pipe, 0xa0, 0x40, address,
1521 0, fw_ptr, 0x800, HZ);
1522 }
1523
1524 trace_firmware("Upload done, releasing device's CPU");
1525
1526 /* Now release the CPU. It will disconnect and reconnect later. */
1527 pvr2_hdw_cpureset_assert(hdw,0);
1528
1529 kfree(fw_ptr);
1530 release_firmware(fw_entry);
1531
1532 trace_firmware("Upload done (%d bytes sent)",ret);
1533
Gary Francis75727462009-11-25 03:03:31 -03001534 /* We should have written fwsize bytes */
1535 if (ret == fwsize) {
Mike Iselyd8554972006-06-26 20:58:46 -03001536 hdw->fw1_state = FW1_STATE_RELOAD;
1537 return 0;
1538 }
1539
1540 return -EIO;
1541}
1542
1543
1544/*
1545 * pvr2_upload_firmware2()
1546 *
1547 * This uploads encoder firmware on endpoint 2.
1548 *
1549 */
1550
1551int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
1552{
Mike Iselya0fd1cb2006-06-30 11:35:28 -03001553 const struct firmware *fw_entry = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03001554 void *fw_ptr;
Mike Isely90060d32007-02-08 02:02:53 -03001555 unsigned int pipe, fw_len, fw_done, bcnt, icnt;
Mike Iselyd8554972006-06-26 20:58:46 -03001556 int actual_length;
1557 int ret = 0;
1558 int fwidx;
1559 static const char *fw_files[] = {
1560 CX2341X_FIRM_ENC_FILENAME,
1561 };
1562
Mike Isely989eb152007-11-26 01:53:12 -03001563 if (hdw->hdw_desc->flag_skip_cx23416_firmware) {
Mike Isely1d643a32007-09-08 22:18:50 -03001564 return 0;
1565 }
1566
Mike Iselyd8554972006-06-26 20:58:46 -03001567 trace_firmware("pvr2_upload_firmware2");
1568
1569 ret = pvr2_locate_firmware(hdw,&fw_entry,"encoder",
Ahmed S. Darwisheca8ebf2007-01-20 00:35:03 -03001570 ARRAY_SIZE(fw_files), fw_files);
Mike Iselyd8554972006-06-26 20:58:46 -03001571 if (ret < 0) return ret;
1572 fwidx = ret;
1573 ret = 0;
Mike Iselyb30d2442006-06-25 20:05:01 -03001574 /* Since we're about to completely reinitialize the encoder,
1575 invalidate our cached copy of its configuration state. Next
1576 time we configure the encoder, then we'll fully configure it. */
1577 hdw->enc_cur_valid = 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001578
Mike Iselyd913d632008-04-06 04:04:35 -03001579 /* Encoder is about to be reset so note that as far as we're
1580 concerned now, the encoder has never been run. */
1581 del_timer_sync(&hdw->encoder_run_timer);
1582 if (hdw->state_encoder_runok) {
1583 hdw->state_encoder_runok = 0;
1584 trace_stbit("state_encoder_runok",hdw->state_encoder_runok);
1585 }
1586
Mike Iselyd8554972006-06-26 20:58:46 -03001587 /* First prepare firmware loading */
1588 ret |= pvr2_write_register(hdw, 0x0048, 0xffffffff); /*interrupt mask*/
1589 ret |= pvr2_hdw_gpio_chg_dir(hdw,0xffffffff,0x00000088); /*gpio dir*/
1590 ret |= pvr2_hdw_gpio_chg_out(hdw,0xffffffff,0x00000008); /*gpio output state*/
1591 ret |= pvr2_hdw_cmd_deep_reset(hdw);
1592 ret |= pvr2_write_register(hdw, 0xa064, 0x00000000); /*APU command*/
1593 ret |= pvr2_hdw_gpio_chg_dir(hdw,0xffffffff,0x00000408); /*gpio dir*/
1594 ret |= pvr2_hdw_gpio_chg_out(hdw,0xffffffff,0x00000008); /*gpio output state*/
1595 ret |= pvr2_write_register(hdw, 0x9058, 0xffffffed); /*VPU ctrl*/
1596 ret |= pvr2_write_register(hdw, 0x9054, 0xfffffffd); /*reset hw blocks*/
1597 ret |= pvr2_write_register(hdw, 0x07f8, 0x80000800); /*encoder SDRAM refresh*/
1598 ret |= pvr2_write_register(hdw, 0x07fc, 0x0000001a); /*encoder SDRAM pre-charge*/
1599 ret |= pvr2_write_register(hdw, 0x0700, 0x00000000); /*I2C clock*/
1600 ret |= pvr2_write_register(hdw, 0xaa00, 0x00000000); /*unknown*/
1601 ret |= pvr2_write_register(hdw, 0xaa04, 0x00057810); /*unknown*/
1602 ret |= pvr2_write_register(hdw, 0xaa10, 0x00148500); /*unknown*/
1603 ret |= pvr2_write_register(hdw, 0xaa18, 0x00840000); /*unknown*/
Mike Isely1c9d10d2008-03-28 05:38:54 -03001604 ret |= pvr2_issue_simple_cmd(hdw,FX2CMD_FWPOST1);
1605 ret |= pvr2_issue_simple_cmd(hdw,FX2CMD_MEMSEL | (1 << 8) | (0 << 16));
Mike Iselyd8554972006-06-26 20:58:46 -03001606
1607 if (ret) {
1608 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1609 "firmware2 upload prep failed, ret=%d",ret);
1610 release_firmware(fw_entry);
Mike Isely21684ba2008-04-21 03:49:33 -03001611 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001612 }
1613
1614 /* Now send firmware */
1615
1616 fw_len = fw_entry->size;
1617
Mike Isely90060d32007-02-08 02:02:53 -03001618 if (fw_len % sizeof(u32)) {
Mike Iselyd8554972006-06-26 20:58:46 -03001619 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1620 "size of %s firmware"
Mike Isely48dc30a2007-03-03 10:13:05 -02001621 " must be a multiple of %zu bytes",
Mike Isely90060d32007-02-08 02:02:53 -03001622 fw_files[fwidx],sizeof(u32));
Mike Iselyd8554972006-06-26 20:58:46 -03001623 release_firmware(fw_entry);
Mike Isely21684ba2008-04-21 03:49:33 -03001624 ret = -EINVAL;
1625 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001626 }
1627
1628 fw_ptr = kmalloc(FIRMWARE_CHUNK_SIZE, GFP_KERNEL);
1629 if (fw_ptr == NULL){
1630 release_firmware(fw_entry);
1631 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1632 "failed to allocate memory for firmware2 upload");
Mike Isely21684ba2008-04-21 03:49:33 -03001633 ret = -ENOMEM;
1634 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001635 }
1636
1637 pipe = usb_sndbulkpipe(hdw->usb_dev, PVR2_FIRMWARE_ENDPOINT);
1638
Mike Isely90060d32007-02-08 02:02:53 -03001639 fw_done = 0;
1640 for (fw_done = 0; fw_done < fw_len;) {
1641 bcnt = fw_len - fw_done;
1642 if (bcnt > FIRMWARE_CHUNK_SIZE) bcnt = FIRMWARE_CHUNK_SIZE;
1643 memcpy(fw_ptr, fw_entry->data + fw_done, bcnt);
1644 /* Usbsnoop log shows that we must swap bytes... */
Mike Isely5f33df12008-08-30 15:09:31 -03001645 /* Some background info: The data being swapped here is a
1646 firmware image destined for the mpeg encoder chip that
1647 lives at the other end of a USB endpoint. The encoder
1648 chip always talks in 32 bit chunks and its storage is
1649 organized into 32 bit words. However from the file
1650 system to the encoder chip everything is purely a byte
1651 stream. The firmware file's contents are always 32 bit
1652 swapped from what the encoder expects. Thus the need
1653 always exists to swap the bytes regardless of the endian
1654 type of the host processor and therefore swab32() makes
1655 the most sense. */
Mike Isely90060d32007-02-08 02:02:53 -03001656 for (icnt = 0; icnt < bcnt/4 ; icnt++)
Harvey Harrison513edce2008-08-18 17:38:01 -03001657 ((u32 *)fw_ptr)[icnt] = swab32(((u32 *)fw_ptr)[icnt]);
Mike Iselyd8554972006-06-26 20:58:46 -03001658
Mike Isely90060d32007-02-08 02:02:53 -03001659 ret |= usb_bulk_msg(hdw->usb_dev, pipe, fw_ptr,bcnt,
Mike Iselyd8554972006-06-26 20:58:46 -03001660 &actual_length, HZ);
Mike Isely90060d32007-02-08 02:02:53 -03001661 ret |= (actual_length != bcnt);
1662 if (ret) break;
1663 fw_done += bcnt;
Mike Iselyd8554972006-06-26 20:58:46 -03001664 }
1665
1666 trace_firmware("upload of %s : %i / %i ",
1667 fw_files[fwidx],fw_done,fw_len);
1668
1669 kfree(fw_ptr);
1670 release_firmware(fw_entry);
1671
1672 if (ret) {
1673 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1674 "firmware2 upload transfer failure");
Mike Isely21684ba2008-04-21 03:49:33 -03001675 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001676 }
1677
1678 /* Finish upload */
1679
1680 ret |= pvr2_write_register(hdw, 0x9054, 0xffffffff); /*reset hw blocks*/
1681 ret |= pvr2_write_register(hdw, 0x9058, 0xffffffe8); /*VPU ctrl*/
Mike Isely1c9d10d2008-03-28 05:38:54 -03001682 ret |= pvr2_issue_simple_cmd(hdw,FX2CMD_MEMSEL | (1 << 8) | (0 << 16));
Mike Iselyd8554972006-06-26 20:58:46 -03001683
1684 if (ret) {
1685 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1686 "firmware2 upload post-proc failure");
Mike Iselyd8554972006-06-26 20:58:46 -03001687 }
Mike Isely21684ba2008-04-21 03:49:33 -03001688
1689 done:
Mike Isely1df59f02008-04-21 03:50:39 -03001690 if (hdw->hdw_desc->signal_routing_scheme ==
1691 PVR2_ROUTING_SCHEME_GOTVIEW) {
1692 /* Ensure that GPIO 11 is set to output for GOTVIEW
1693 hardware. */
1694 pvr2_hdw_gpio_chg_dir(hdw,(1 << 11),~0);
1695 }
Mike Iselyd8554972006-06-26 20:58:46 -03001696 return ret;
1697}
1698
1699
Mike Isely681c7392007-11-26 01:48:52 -03001700static const char *pvr2_get_state_name(unsigned int st)
Mike Iselyd8554972006-06-26 20:58:46 -03001701{
Mike Isely681c7392007-11-26 01:48:52 -03001702 if (st < ARRAY_SIZE(pvr2_state_names)) {
1703 return pvr2_state_names[st];
Mike Iselyd8554972006-06-26 20:58:46 -03001704 }
Mike Isely681c7392007-11-26 01:48:52 -03001705 return "???";
Mike Iselyd8554972006-06-26 20:58:46 -03001706}
1707
Mike Isely681c7392007-11-26 01:48:52 -03001708static int pvr2_decoder_enable(struct pvr2_hdw *hdw,int enablefl)
Mike Iselyd8554972006-06-26 20:58:46 -03001709{
Mike Iselyaf78e162009-03-07 00:21:30 -03001710 /* Even though we really only care about the video decoder chip at
1711 this point, we'll broadcast stream on/off to all sub-devices
1712 anyway, just in case somebody else wants to hear the
1713 command... */
Mike Iselye2605082009-03-07 01:50:48 -03001714 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 stream=%s",
1715 (enablefl ? "on" : "off"));
Mike Iselyaf78e162009-03-07 00:21:30 -03001716 v4l2_device_call_all(&hdw->v4l2_dev, 0, video, s_stream, enablefl);
Andy Walls3ccc6462009-12-24 13:06:08 -03001717 v4l2_device_call_all(&hdw->v4l2_dev, 0, audio, s_stream, enablefl);
Mike Iselyaf78e162009-03-07 00:21:30 -03001718 if (hdw->decoder_client_id) {
1719 /* We get here if the encoder has been noticed. Otherwise
1720 we'll issue a warning to the user (which should
1721 normally never happen). */
1722 return 0;
1723 }
1724 if (!hdw->flag_decoder_missed) {
1725 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1726 "WARNING: No decoder present");
1727 hdw->flag_decoder_missed = !0;
1728 trace_stbit("flag_decoder_missed",
1729 hdw->flag_decoder_missed);
1730 }
1731 return -EIO;
Mike Iselyd8554972006-06-26 20:58:46 -03001732}
1733
1734
Mike Isely681c7392007-11-26 01:48:52 -03001735int pvr2_hdw_get_state(struct pvr2_hdw *hdw)
1736{
1737 return hdw->master_state;
1738}
1739
1740
1741static int pvr2_hdw_untrip_unlocked(struct pvr2_hdw *hdw)
1742{
1743 if (!hdw->flag_tripped) return 0;
1744 hdw->flag_tripped = 0;
1745 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1746 "Clearing driver error statuss");
1747 return !0;
1748}
1749
1750
1751int pvr2_hdw_untrip(struct pvr2_hdw *hdw)
1752{
1753 int fl;
1754 LOCK_TAKE(hdw->big_lock); do {
1755 fl = pvr2_hdw_untrip_unlocked(hdw);
1756 } while (0); LOCK_GIVE(hdw->big_lock);
1757 if (fl) pvr2_hdw_state_sched(hdw);
1758 return 0;
1759}
1760
1761
Mike Isely681c7392007-11-26 01:48:52 -03001762
1763
Mike Iselyd8554972006-06-26 20:58:46 -03001764int pvr2_hdw_get_streaming(struct pvr2_hdw *hdw)
1765{
Mike Isely681c7392007-11-26 01:48:52 -03001766 return hdw->state_pipeline_req != 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001767}
1768
1769
1770int pvr2_hdw_set_streaming(struct pvr2_hdw *hdw,int enable_flag)
1771{
Mike Isely681c7392007-11-26 01:48:52 -03001772 int ret,st;
Mike Iselyd8554972006-06-26 20:58:46 -03001773 LOCK_TAKE(hdw->big_lock); do {
Mike Isely681c7392007-11-26 01:48:52 -03001774 pvr2_hdw_untrip_unlocked(hdw);
1775 if ((!enable_flag) != !(hdw->state_pipeline_req)) {
1776 hdw->state_pipeline_req = enable_flag != 0;
1777 pvr2_trace(PVR2_TRACE_START_STOP,
1778 "/*--TRACE_STREAM--*/ %s",
1779 enable_flag ? "enable" : "disable");
1780 }
1781 pvr2_hdw_state_sched(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03001782 } while (0); LOCK_GIVE(hdw->big_lock);
Mike Isely681c7392007-11-26 01:48:52 -03001783 if ((ret = pvr2_hdw_wait(hdw,0)) < 0) return ret;
1784 if (enable_flag) {
1785 while ((st = hdw->master_state) != PVR2_STATE_RUN) {
1786 if (st != PVR2_STATE_READY) return -EIO;
1787 if ((ret = pvr2_hdw_wait(hdw,st)) < 0) return ret;
1788 }
1789 }
Mike Iselyd8554972006-06-26 20:58:46 -03001790 return 0;
1791}
1792
1793
1794int pvr2_hdw_set_stream_type(struct pvr2_hdw *hdw,enum pvr2_config config)
1795{
Mike Isely681c7392007-11-26 01:48:52 -03001796 int fl;
Mike Iselyd8554972006-06-26 20:58:46 -03001797 LOCK_TAKE(hdw->big_lock);
Mike Isely681c7392007-11-26 01:48:52 -03001798 if ((fl = (hdw->desired_stream_type != config)) != 0) {
1799 hdw->desired_stream_type = config;
1800 hdw->state_pipeline_config = 0;
1801 trace_stbit("state_pipeline_config",
1802 hdw->state_pipeline_config);
1803 pvr2_hdw_state_sched(hdw);
1804 }
Mike Iselyd8554972006-06-26 20:58:46 -03001805 LOCK_GIVE(hdw->big_lock);
Mike Isely681c7392007-11-26 01:48:52 -03001806 if (fl) return 0;
1807 return pvr2_hdw_wait(hdw,0);
Mike Iselyd8554972006-06-26 20:58:46 -03001808}
1809
1810
1811static int get_default_tuner_type(struct pvr2_hdw *hdw)
1812{
1813 int unit_number = hdw->unit_number;
1814 int tp = -1;
1815 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1816 tp = tuner[unit_number];
1817 }
1818 if (tp < 0) return -EINVAL;
1819 hdw->tuner_type = tp;
Mike Iselyaaf78842007-11-26 02:04:11 -03001820 hdw->tuner_updated = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03001821 return 0;
1822}
1823
1824
1825static v4l2_std_id get_default_standard(struct pvr2_hdw *hdw)
1826{
1827 int unit_number = hdw->unit_number;
1828 int tp = 0;
1829 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1830 tp = video_std[unit_number];
Mike Isely6a540252007-12-02 23:51:34 -03001831 if (tp) return tp;
Mike Iselyd8554972006-06-26 20:58:46 -03001832 }
Mike Isely6a540252007-12-02 23:51:34 -03001833 return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001834}
1835
1836
1837static unsigned int get_default_error_tolerance(struct pvr2_hdw *hdw)
1838{
1839 int unit_number = hdw->unit_number;
1840 int tp = 0;
1841 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1842 tp = tolerance[unit_number];
1843 }
1844 return tp;
1845}
1846
1847
1848static int pvr2_hdw_check_firmware(struct pvr2_hdw *hdw)
1849{
1850 /* Try a harmless request to fetch the eeprom's address over
1851 endpoint 1. See what happens. Only the full FX2 image can
1852 respond to this. If this probe fails then likely the FX2
1853 firmware needs be loaded. */
1854 int result;
1855 LOCK_TAKE(hdw->ctl_lock); do {
Michael Krufky8d364362007-01-22 02:17:55 -03001856 hdw->cmd_buffer[0] = FX2CMD_GET_EEPROM_ADDR;
Mike Iselyd8554972006-06-26 20:58:46 -03001857 result = pvr2_send_request_ex(hdw,HZ*1,!0,
1858 hdw->cmd_buffer,1,
1859 hdw->cmd_buffer,1);
1860 if (result < 0) break;
1861 } while(0); LOCK_GIVE(hdw->ctl_lock);
1862 if (result) {
1863 pvr2_trace(PVR2_TRACE_INIT,
1864 "Probe of device endpoint 1 result status %d",
1865 result);
1866 } else {
1867 pvr2_trace(PVR2_TRACE_INIT,
1868 "Probe of device endpoint 1 succeeded");
1869 }
1870 return result == 0;
1871}
1872
Mike Isely9f66d4e2007-09-08 22:28:51 -03001873struct pvr2_std_hack {
1874 v4l2_std_id pat; /* Pattern to match */
1875 v4l2_std_id msk; /* Which bits we care about */
1876 v4l2_std_id std; /* What additional standards or default to set */
1877};
1878
1879/* This data structure labels specific combinations of standards from
1880 tveeprom that we'll try to recognize. If we recognize one, then assume
1881 a specified default standard to use. This is here because tveeprom only
1882 tells us about available standards not the intended default standard (if
1883 any) for the device in question. We guess the default based on what has
1884 been reported as available. Note that this is only for guessing a
1885 default - which can always be overridden explicitly - and if the user
1886 has otherwise named a default then that default will always be used in
1887 place of this table. */
Tobias Klauserebff0332008-04-22 14:45:45 -03001888static const struct pvr2_std_hack std_eeprom_maps[] = {
Mike Isely9f66d4e2007-09-08 22:28:51 -03001889 { /* PAL(B/G) */
1890 .pat = V4L2_STD_B|V4L2_STD_GH,
1891 .std = V4L2_STD_PAL_B|V4L2_STD_PAL_B1|V4L2_STD_PAL_G,
1892 },
1893 { /* NTSC(M) */
1894 .pat = V4L2_STD_MN,
1895 .std = V4L2_STD_NTSC_M,
1896 },
1897 { /* PAL(I) */
1898 .pat = V4L2_STD_PAL_I,
1899 .std = V4L2_STD_PAL_I,
1900 },
1901 { /* SECAM(L/L') */
1902 .pat = V4L2_STD_SECAM_L|V4L2_STD_SECAM_LC,
1903 .std = V4L2_STD_SECAM_L|V4L2_STD_SECAM_LC,
1904 },
1905 { /* PAL(D/D1/K) */
1906 .pat = V4L2_STD_DK,
Roel Kluinea2562d2007-12-02 23:04:57 -03001907 .std = V4L2_STD_PAL_D|V4L2_STD_PAL_D1|V4L2_STD_PAL_K,
Mike Isely9f66d4e2007-09-08 22:28:51 -03001908 },
1909};
1910
Mike Iselyd8554972006-06-26 20:58:46 -03001911static void pvr2_hdw_setup_std(struct pvr2_hdw *hdw)
1912{
1913 char buf[40];
1914 unsigned int bcnt;
Mike Isely3d290bd2007-12-03 01:47:12 -03001915 v4l2_std_id std1,std2,std3;
Mike Iselyd8554972006-06-26 20:58:46 -03001916
1917 std1 = get_default_standard(hdw);
Mike Isely3d290bd2007-12-03 01:47:12 -03001918 std3 = std1 ? 0 : hdw->hdw_desc->default_std_mask;
Mike Iselyd8554972006-06-26 20:58:46 -03001919
1920 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),hdw->std_mask_eeprom);
Mike Isely56585382007-09-08 22:32:12 -03001921 pvr2_trace(PVR2_TRACE_STD,
Mike Isely56dcbfa2007-11-26 02:00:51 -03001922 "Supported video standard(s) reported available"
1923 " in hardware: %.*s",
Mike Iselyd8554972006-06-26 20:58:46 -03001924 bcnt,buf);
1925
1926 hdw->std_mask_avail = hdw->std_mask_eeprom;
1927
Mike Isely3d290bd2007-12-03 01:47:12 -03001928 std2 = (std1|std3) & ~hdw->std_mask_avail;
Mike Iselyd8554972006-06-26 20:58:46 -03001929 if (std2) {
1930 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std2);
Mike Isely56585382007-09-08 22:32:12 -03001931 pvr2_trace(PVR2_TRACE_STD,
Mike Iselyd8554972006-06-26 20:58:46 -03001932 "Expanding supported video standards"
1933 " to include: %.*s",
1934 bcnt,buf);
1935 hdw->std_mask_avail |= std2;
1936 }
1937
1938 pvr2_hdw_internal_set_std_avail(hdw);
1939
1940 if (std1) {
1941 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std1);
Mike Isely56585382007-09-08 22:32:12 -03001942 pvr2_trace(PVR2_TRACE_STD,
Mike Iselyd8554972006-06-26 20:58:46 -03001943 "Initial video standard forced to %.*s",
1944 bcnt,buf);
1945 hdw->std_mask_cur = std1;
1946 hdw->std_dirty = !0;
1947 pvr2_hdw_internal_find_stdenum(hdw);
1948 return;
1949 }
Mike Isely3d290bd2007-12-03 01:47:12 -03001950 if (std3) {
1951 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std3);
1952 pvr2_trace(PVR2_TRACE_STD,
1953 "Initial video standard"
1954 " (determined by device type): %.*s",bcnt,buf);
1955 hdw->std_mask_cur = std3;
1956 hdw->std_dirty = !0;
1957 pvr2_hdw_internal_find_stdenum(hdw);
1958 return;
1959 }
Mike Iselyd8554972006-06-26 20:58:46 -03001960
Mike Isely9f66d4e2007-09-08 22:28:51 -03001961 {
1962 unsigned int idx;
1963 for (idx = 0; idx < ARRAY_SIZE(std_eeprom_maps); idx++) {
1964 if (std_eeprom_maps[idx].msk ?
1965 ((std_eeprom_maps[idx].pat ^
1966 hdw->std_mask_eeprom) &
1967 std_eeprom_maps[idx].msk) :
1968 (std_eeprom_maps[idx].pat !=
1969 hdw->std_mask_eeprom)) continue;
1970 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),
1971 std_eeprom_maps[idx].std);
Mike Isely56585382007-09-08 22:32:12 -03001972 pvr2_trace(PVR2_TRACE_STD,
Mike Isely9f66d4e2007-09-08 22:28:51 -03001973 "Initial video standard guessed as %.*s",
1974 bcnt,buf);
1975 hdw->std_mask_cur = std_eeprom_maps[idx].std;
1976 hdw->std_dirty = !0;
1977 pvr2_hdw_internal_find_stdenum(hdw);
1978 return;
1979 }
1980 }
1981
Mike Iselyd8554972006-06-26 20:58:46 -03001982 if (hdw->std_enum_cnt > 1) {
1983 // Autoselect the first listed standard
1984 hdw->std_enum_cur = 1;
1985 hdw->std_mask_cur = hdw->std_defs[hdw->std_enum_cur-1].id;
1986 hdw->std_dirty = !0;
Mike Isely56585382007-09-08 22:32:12 -03001987 pvr2_trace(PVR2_TRACE_STD,
Mike Iselyd8554972006-06-26 20:58:46 -03001988 "Initial video standard auto-selected to %s",
1989 hdw->std_defs[hdw->std_enum_cur-1].name);
1990 return;
1991 }
1992
Mike Isely0885ba12006-06-25 21:30:47 -03001993 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Iselyd8554972006-06-26 20:58:46 -03001994 "Unable to select a viable initial video standard");
1995}
1996
1997
Mike Iselye9c64a72009-03-06 23:42:20 -03001998static unsigned int pvr2_copy_i2c_addr_list(
1999 unsigned short *dst, const unsigned char *src,
2000 unsigned int dst_max)
2001{
Mike Isely3ab8d292009-03-07 01:37:58 -03002002 unsigned int cnt = 0;
Mike Iselye9c64a72009-03-06 23:42:20 -03002003 if (!src) return 0;
2004 while (src[cnt] && (cnt + 1) < dst_max) {
2005 dst[cnt] = src[cnt];
2006 cnt++;
2007 }
2008 dst[cnt] = I2C_CLIENT_END;
2009 return cnt;
2010}
2011
2012
Mike Iselye17d7872009-06-20 14:45:52 -03002013static void pvr2_hdw_cx25840_vbi_hack(struct pvr2_hdw *hdw)
2014{
2015 /*
2016 Mike Isely <isely@pobox.com> 19-Nov-2006 - This bit of nuttiness
2017 for cx25840 causes that module to correctly set up its video
2018 scaling. This is really a problem in the cx25840 module itself,
2019 but we work around it here. The problem has not been seen in
2020 ivtv because there VBI is supported and set up. We don't do VBI
2021 here (at least not yet) and thus we never attempted to even set
2022 it up.
2023 */
2024 struct v4l2_format fmt;
2025 if (hdw->decoder_client_id != PVR2_CLIENT_ID_CX25840) {
2026 /* We're not using a cx25840 so don't enable the hack */
2027 return;
2028 }
2029
2030 pvr2_trace(PVR2_TRACE_INIT,
2031 "Module ID %u:"
2032 " Executing cx25840 VBI hack",
2033 hdw->decoder_client_id);
2034 memset(&fmt, 0, sizeof(fmt));
2035 fmt.type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
Mike Isely058caa82011-02-13 17:53:07 -03002036 fmt.fmt.sliced.service_lines[0][21] = V4L2_SLICED_CAPTION_525;
2037 fmt.fmt.sliced.service_lines[1][21] = V4L2_SLICED_CAPTION_525;
Mike Iselye17d7872009-06-20 14:45:52 -03002038 v4l2_device_call_all(&hdw->v4l2_dev, hdw->decoder_client_id,
Hans Verkuil09419af2010-03-14 12:27:48 -03002039 vbi, s_sliced_fmt, &fmt.fmt.sliced);
Mike Iselye17d7872009-06-20 14:45:52 -03002040}
2041
2042
Mike Isely1ab5e742009-03-07 00:24:24 -03002043static int pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
2044 const struct pvr2_device_client_desc *cd)
Mike Iselye9c64a72009-03-06 23:42:20 -03002045{
2046 const char *fname;
2047 unsigned char mid;
2048 struct v4l2_subdev *sd;
2049 unsigned int i2ccnt;
2050 const unsigned char *p;
2051 /* Arbitrary count - max # i2c addresses we will probe */
2052 unsigned short i2caddr[25];
2053
2054 mid = cd->module_id;
2055 fname = (mid < ARRAY_SIZE(module_names)) ? module_names[mid] : NULL;
2056 if (!fname) {
2057 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Isely27108142009-10-12 00:21:20 -03002058 "Module ID %u for device %s has no name?"
2059 " The driver might have a configuration problem.",
Mike Iselye9c64a72009-03-06 23:42:20 -03002060 mid,
2061 hdw->hdw_desc->description);
Mike Isely1ab5e742009-03-07 00:24:24 -03002062 return -EINVAL;
Mike Iselye9c64a72009-03-06 23:42:20 -03002063 }
Mike Iselybd14d4f2009-03-07 00:56:52 -03002064 pvr2_trace(PVR2_TRACE_INIT,
2065 "Module ID %u (%s) for device %s being loaded...",
2066 mid, fname,
2067 hdw->hdw_desc->description);
Mike Iselye9c64a72009-03-06 23:42:20 -03002068
2069 i2ccnt = pvr2_copy_i2c_addr_list(i2caddr, cd->i2c_address_list,
2070 ARRAY_SIZE(i2caddr));
2071 if (!i2ccnt && ((p = (mid < ARRAY_SIZE(module_i2c_addresses)) ?
2072 module_i2c_addresses[mid] : NULL) != NULL)) {
2073 /* Second chance: Try default i2c address list */
2074 i2ccnt = pvr2_copy_i2c_addr_list(i2caddr, p,
2075 ARRAY_SIZE(i2caddr));
Mike Iselybd14d4f2009-03-07 00:56:52 -03002076 if (i2ccnt) {
2077 pvr2_trace(PVR2_TRACE_INIT,
2078 "Module ID %u:"
2079 " Using default i2c address list",
2080 mid);
2081 }
Mike Iselye9c64a72009-03-06 23:42:20 -03002082 }
2083
2084 if (!i2ccnt) {
2085 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Isely1ab5e742009-03-07 00:24:24 -03002086 "Module ID %u (%s) for device %s:"
Mike Isely27108142009-10-12 00:21:20 -03002087 " No i2c addresses."
2088 " The driver might have a configuration problem.",
Mike Isely1ab5e742009-03-07 00:24:24 -03002089 mid, fname, hdw->hdw_desc->description);
2090 return -EINVAL;
Mike Iselye9c64a72009-03-06 23:42:20 -03002091 }
2092
Mike Iselye9c64a72009-03-06 23:42:20 -03002093 if (i2ccnt == 1) {
Mike Iselybd14d4f2009-03-07 00:56:52 -03002094 pvr2_trace(PVR2_TRACE_INIT,
2095 "Module ID %u:"
2096 " Setting up with specified i2c address 0x%x",
2097 mid, i2caddr[0]);
Hans Verkuile6574f22009-04-01 03:57:53 -03002098 sd = v4l2_i2c_new_subdev(&hdw->v4l2_dev, &hdw->i2c_adap,
Laurent Pinchart9a1f8b32010-09-24 10:16:44 -03002099 fname, i2caddr[0], NULL);
Mike Iselye9c64a72009-03-06 23:42:20 -03002100 } else {
Mike Iselybd14d4f2009-03-07 00:56:52 -03002101 pvr2_trace(PVR2_TRACE_INIT,
2102 "Module ID %u:"
2103 " Setting up with address probe list",
2104 mid);
Hans Verkuil53dacb12009-08-10 02:49:08 -03002105 sd = v4l2_i2c_new_subdev(&hdw->v4l2_dev, &hdw->i2c_adap,
Laurent Pinchart9a1f8b32010-09-24 10:16:44 -03002106 fname, 0, i2caddr);
Mike Iselye9c64a72009-03-06 23:42:20 -03002107 }
2108
Mike Isely446dfdc2009-03-06 23:58:15 -03002109 if (!sd) {
2110 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Isely27108142009-10-12 00:21:20 -03002111 "Module ID %u (%s) for device %s failed to load."
2112 " Possible missing sub-device kernel module or"
2113 " initialization failure within module.",
Mike Isely1ab5e742009-03-07 00:24:24 -03002114 mid, fname, hdw->hdw_desc->description);
2115 return -EIO;
Mike Isely446dfdc2009-03-06 23:58:15 -03002116 }
2117
2118 /* Tag this sub-device instance with the module ID we know about.
2119 In other places we'll use that tag to determine if the instance
2120 requires special handling. */
2121 sd->grp_id = mid;
2122
Mike Iselybd14d4f2009-03-07 00:56:52 -03002123 pvr2_trace(PVR2_TRACE_INFO, "Attached sub-driver %s", fname);
Mike Iselya932f502009-03-06 23:47:10 -03002124
Mike Iselye9c64a72009-03-06 23:42:20 -03002125
Mike Isely00e5f732009-03-07 00:17:11 -03002126 /* client-specific setup... */
2127 switch (mid) {
2128 case PVR2_CLIENT_ID_CX25840:
Mike Isely00e5f732009-03-07 00:17:11 -03002129 case PVR2_CLIENT_ID_SAA7115:
2130 hdw->decoder_client_id = mid;
2131 break;
2132 default: break;
2133 }
Mike Isely1ab5e742009-03-07 00:24:24 -03002134
2135 return 0;
Mike Iselye9c64a72009-03-06 23:42:20 -03002136}
2137
2138
2139static void pvr2_hdw_load_modules(struct pvr2_hdw *hdw)
2140{
2141 unsigned int idx;
2142 const struct pvr2_string_table *cm;
2143 const struct pvr2_device_client_table *ct;
Mike Isely1ab5e742009-03-07 00:24:24 -03002144 int okFl = !0;
Mike Iselye9c64a72009-03-06 23:42:20 -03002145
2146 cm = &hdw->hdw_desc->client_modules;
2147 for (idx = 0; idx < cm->cnt; idx++) {
2148 request_module(cm->lst[idx]);
2149 }
2150
2151 ct = &hdw->hdw_desc->client_table;
2152 for (idx = 0; idx < ct->cnt; idx++) {
Mike Iselybd14d4f2009-03-07 00:56:52 -03002153 if (pvr2_hdw_load_subdev(hdw, &ct->lst[idx]) < 0) okFl = 0;
Mike Iselye9c64a72009-03-06 23:42:20 -03002154 }
Mike Isely27108142009-10-12 00:21:20 -03002155 if (!okFl) {
2156 hdw->flag_modulefail = !0;
2157 pvr2_hdw_render_useless(hdw);
2158 }
Mike Iselye9c64a72009-03-06 23:42:20 -03002159}
2160
2161
Mike Iselyd8554972006-06-26 20:58:46 -03002162static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
2163{
2164 int ret;
2165 unsigned int idx;
2166 struct pvr2_ctrl *cptr;
2167 int reloadFl = 0;
Mike Isely989eb152007-11-26 01:53:12 -03002168 if (hdw->hdw_desc->fx2_firmware.cnt) {
Mike Isely1d643a32007-09-08 22:18:50 -03002169 if (!reloadFl) {
2170 reloadFl =
2171 (hdw->usb_intf->cur_altsetting->desc.bNumEndpoints
2172 == 0);
2173 if (reloadFl) {
2174 pvr2_trace(PVR2_TRACE_INIT,
2175 "USB endpoint config looks strange"
2176 "; possibly firmware needs to be"
2177 " loaded");
2178 }
2179 }
2180 if (!reloadFl) {
2181 reloadFl = !pvr2_hdw_check_firmware(hdw);
2182 if (reloadFl) {
2183 pvr2_trace(PVR2_TRACE_INIT,
2184 "Check for FX2 firmware failed"
2185 "; possibly firmware needs to be"
2186 " loaded");
2187 }
2188 }
Mike Iselyd8554972006-06-26 20:58:46 -03002189 if (reloadFl) {
Mike Isely1d643a32007-09-08 22:18:50 -03002190 if (pvr2_upload_firmware1(hdw) != 0) {
2191 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2192 "Failure uploading firmware1");
2193 }
2194 return;
Mike Iselyd8554972006-06-26 20:58:46 -03002195 }
2196 }
Mike Iselyd8554972006-06-26 20:58:46 -03002197 hdw->fw1_state = FW1_STATE_OK;
2198
Mike Iselyd8554972006-06-26 20:58:46 -03002199 if (!pvr2_hdw_dev_ok(hdw)) return;
2200
Mike Isely27764722009-03-07 01:57:25 -03002201 hdw->force_dirty = !0;
2202
Mike Isely989eb152007-11-26 01:53:12 -03002203 if (!hdw->hdw_desc->flag_no_powerup) {
Mike Isely1d643a32007-09-08 22:18:50 -03002204 pvr2_hdw_cmd_powerup(hdw);
2205 if (!pvr2_hdw_dev_ok(hdw)) return;
Mike Iselyd8554972006-06-26 20:58:46 -03002206 }
2207
Mike Isely31335b12008-07-25 19:35:31 -03002208 /* Take the IR chip out of reset, if appropriate */
Mike Isely27eab382009-04-06 01:51:38 -03002209 if (hdw->ir_scheme_active == PVR2_IR_SCHEME_ZILOG) {
Mike Isely31335b12008-07-25 19:35:31 -03002210 pvr2_issue_simple_cmd(hdw,
2211 FX2CMD_HCW_ZILOG_RESET |
2212 (1 << 8) |
2213 ((0) << 16));
2214 }
2215
Mike Iselyd8554972006-06-26 20:58:46 -03002216 // This step MUST happen after the earlier powerup step.
2217 pvr2_i2c_core_init(hdw);
2218 if (!pvr2_hdw_dev_ok(hdw)) return;
2219
Mike Iselye9c64a72009-03-06 23:42:20 -03002220 pvr2_hdw_load_modules(hdw);
Mike Isely1ab5e742009-03-07 00:24:24 -03002221 if (!pvr2_hdw_dev_ok(hdw)) return;
Mike Iselye9c64a72009-03-06 23:42:20 -03002222
Hans Verkuilcc26b072009-03-29 19:20:26 -03002223 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, load_fw);
Mike Isely5c6cb4e2009-03-07 01:59:34 -03002224
Mike Iselyc05c0462006-06-25 20:04:25 -03002225 for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002226 cptr = hdw->controls + idx;
2227 if (cptr->info->skip_init) continue;
2228 if (!cptr->info->set_value) continue;
2229 cptr->info->set_value(cptr,~0,cptr->info->default_value);
2230 }
2231
Mike Iselye17d7872009-06-20 14:45:52 -03002232 pvr2_hdw_cx25840_vbi_hack(hdw);
2233
Mike Isely1bde0282006-12-27 23:30:13 -03002234 /* Set up special default values for the television and radio
2235 frequencies here. It's not really important what these defaults
2236 are, but I set them to something usable in the Chicago area just
2237 to make driver testing a little easier. */
2238
Michael Krufky5a4f5da62008-05-11 16:37:50 -03002239 hdw->freqValTelevision = default_tv_freq;
2240 hdw->freqValRadio = default_radio_freq;
Mike Isely1bde0282006-12-27 23:30:13 -03002241
Mike Iselyd8554972006-06-26 20:58:46 -03002242 // Do not use pvr2_reset_ctl_endpoints() here. It is not
2243 // thread-safe against the normal pvr2_send_request() mechanism.
2244 // (We should make it thread safe).
2245
Mike Iselyaaf78842007-11-26 02:04:11 -03002246 if (hdw->hdw_desc->flag_has_hauppauge_rom) {
2247 ret = pvr2_hdw_get_eeprom_addr(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002248 if (!pvr2_hdw_dev_ok(hdw)) return;
Mike Iselyaaf78842007-11-26 02:04:11 -03002249 if (ret < 0) {
2250 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2251 "Unable to determine location of eeprom,"
2252 " skipping");
2253 } else {
2254 hdw->eeprom_addr = ret;
2255 pvr2_eeprom_analyze(hdw);
2256 if (!pvr2_hdw_dev_ok(hdw)) return;
2257 }
2258 } else {
2259 hdw->tuner_type = hdw->hdw_desc->default_tuner_type;
2260 hdw->tuner_updated = !0;
2261 hdw->std_mask_eeprom = V4L2_STD_ALL;
Mike Iselyd8554972006-06-26 20:58:46 -03002262 }
2263
Mike Isely13a88792009-01-14 04:22:56 -03002264 if (hdw->serial_number) {
2265 idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
2266 "sn-%lu", hdw->serial_number);
2267 } else if (hdw->unit_number >= 0) {
2268 idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
2269 "unit-%c",
2270 hdw->unit_number + 'a');
2271 } else {
2272 idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
2273 "unit-??");
2274 }
2275 hdw->identifier[idx] = 0;
2276
Mike Iselyd8554972006-06-26 20:58:46 -03002277 pvr2_hdw_setup_std(hdw);
2278
2279 if (!get_default_tuner_type(hdw)) {
2280 pvr2_trace(PVR2_TRACE_INIT,
2281 "pvr2_hdw_setup: Tuner type overridden to %d",
2282 hdw->tuner_type);
2283 }
2284
Mike Iselyd8554972006-06-26 20:58:46 -03002285
2286 if (!pvr2_hdw_dev_ok(hdw)) return;
2287
Mike Isely1df59f02008-04-21 03:50:39 -03002288 if (hdw->hdw_desc->signal_routing_scheme ==
2289 PVR2_ROUTING_SCHEME_GOTVIEW) {
2290 /* Ensure that GPIO 11 is set to output for GOTVIEW
2291 hardware. */
2292 pvr2_hdw_gpio_chg_dir(hdw,(1 << 11),~0);
2293 }
2294
Mike Isely681c7392007-11-26 01:48:52 -03002295 pvr2_hdw_commit_setup(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002296
2297 hdw->vid_stream = pvr2_stream_create();
2298 if (!pvr2_hdw_dev_ok(hdw)) return;
2299 pvr2_trace(PVR2_TRACE_INIT,
2300 "pvr2_hdw_setup: video stream is %p",hdw->vid_stream);
2301 if (hdw->vid_stream) {
2302 idx = get_default_error_tolerance(hdw);
2303 if (idx) {
2304 pvr2_trace(PVR2_TRACE_INIT,
2305 "pvr2_hdw_setup: video stream %p"
2306 " setting tolerance %u",
2307 hdw->vid_stream,idx);
2308 }
2309 pvr2_stream_setup(hdw->vid_stream,hdw->usb_dev,
2310 PVR2_VID_ENDPOINT,idx);
2311 }
2312
2313 if (!pvr2_hdw_dev_ok(hdw)) return;
2314
Mike Iselyd8554972006-06-26 20:58:46 -03002315 hdw->flag_init_ok = !0;
Mike Isely681c7392007-11-26 01:48:52 -03002316
2317 pvr2_hdw_state_sched(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002318}
2319
2320
Mike Isely681c7392007-11-26 01:48:52 -03002321/* Set up the structure and attempt to put the device into a usable state.
2322 This can be a time-consuming operation, which is why it is not done
2323 internally as part of the create() step. */
2324static void pvr2_hdw_setup(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002325{
2326 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_setup(hdw=%p) begin",hdw);
Mike Isely681c7392007-11-26 01:48:52 -03002327 do {
Mike Iselyd8554972006-06-26 20:58:46 -03002328 pvr2_hdw_setup_low(hdw);
2329 pvr2_trace(PVR2_TRACE_INIT,
2330 "pvr2_hdw_setup(hdw=%p) done, ok=%d init_ok=%d",
Mike Isely681c7392007-11-26 01:48:52 -03002331 hdw,pvr2_hdw_dev_ok(hdw),hdw->flag_init_ok);
Mike Iselyd8554972006-06-26 20:58:46 -03002332 if (pvr2_hdw_dev_ok(hdw)) {
Mike Isely681c7392007-11-26 01:48:52 -03002333 if (hdw->flag_init_ok) {
Mike Iselyd8554972006-06-26 20:58:46 -03002334 pvr2_trace(
2335 PVR2_TRACE_INFO,
2336 "Device initialization"
2337 " completed successfully.");
2338 break;
2339 }
2340 if (hdw->fw1_state == FW1_STATE_RELOAD) {
2341 pvr2_trace(
2342 PVR2_TRACE_INFO,
2343 "Device microcontroller firmware"
2344 " (re)loaded; it should now reset"
2345 " and reconnect.");
2346 break;
2347 }
2348 pvr2_trace(
2349 PVR2_TRACE_ERROR_LEGS,
2350 "Device initialization was not successful.");
2351 if (hdw->fw1_state == FW1_STATE_MISSING) {
2352 pvr2_trace(
2353 PVR2_TRACE_ERROR_LEGS,
2354 "Giving up since device"
2355 " microcontroller firmware"
2356 " appears to be missing.");
2357 break;
2358 }
2359 }
Mike Isely27108142009-10-12 00:21:20 -03002360 if (hdw->flag_modulefail) {
2361 pvr2_trace(
2362 PVR2_TRACE_ERROR_LEGS,
2363 "***WARNING*** pvrusb2 driver initialization"
2364 " failed due to the failure of one or more"
2365 " sub-device kernel modules.");
2366 pvr2_trace(
2367 PVR2_TRACE_ERROR_LEGS,
2368 "You need to resolve the failing condition"
2369 " before this driver can function. There"
2370 " should be some earlier messages giving more"
2371 " information about the problem.");
Mike Isely515ebf72009-10-12 00:27:38 -03002372 break;
Mike Isely27108142009-10-12 00:21:20 -03002373 }
Mike Iselyd8554972006-06-26 20:58:46 -03002374 if (procreload) {
2375 pvr2_trace(
2376 PVR2_TRACE_ERROR_LEGS,
2377 "Attempting pvrusb2 recovery by reloading"
2378 " primary firmware.");
2379 pvr2_trace(
2380 PVR2_TRACE_ERROR_LEGS,
2381 "If this works, device should disconnect"
2382 " and reconnect in a sane state.");
2383 hdw->fw1_state = FW1_STATE_UNKNOWN;
2384 pvr2_upload_firmware1(hdw);
2385 } else {
2386 pvr2_trace(
2387 PVR2_TRACE_ERROR_LEGS,
2388 "***WARNING*** pvrusb2 device hardware"
2389 " appears to be jammed"
2390 " and I can't clear it.");
2391 pvr2_trace(
2392 PVR2_TRACE_ERROR_LEGS,
2393 "You might need to power cycle"
2394 " the pvrusb2 device"
2395 " in order to recover.");
2396 }
Mike Isely681c7392007-11-26 01:48:52 -03002397 } while (0);
Mike Iselyd8554972006-06-26 20:58:46 -03002398 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_setup(hdw=%p) end",hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002399}
2400
2401
Mike Iselyc4a88282008-04-22 14:45:44 -03002402/* Perform second stage initialization. Set callback pointer first so that
2403 we can avoid a possible initialization race (if the kernel thread runs
2404 before the callback has been set). */
Mike Isely794b1602008-04-22 14:45:45 -03002405int pvr2_hdw_initialize(struct pvr2_hdw *hdw,
2406 void (*callback_func)(void *),
2407 void *callback_data)
Mike Iselyc4a88282008-04-22 14:45:44 -03002408{
2409 LOCK_TAKE(hdw->big_lock); do {
Mike Isely97f26ff2008-04-07 02:22:43 -03002410 if (hdw->flag_disconnected) {
2411 /* Handle a race here: If we're already
2412 disconnected by this point, then give up. If we
2413 get past this then we'll remain connected for
2414 the duration of initialization since the entire
2415 initialization sequence is now protected by the
2416 big_lock. */
2417 break;
2418 }
Mike Iselyc4a88282008-04-22 14:45:44 -03002419 hdw->state_data = callback_data;
2420 hdw->state_func = callback_func;
Mike Isely97f26ff2008-04-07 02:22:43 -03002421 pvr2_hdw_setup(hdw);
Mike Iselyc4a88282008-04-22 14:45:44 -03002422 } while (0); LOCK_GIVE(hdw->big_lock);
Mike Isely794b1602008-04-22 14:45:45 -03002423 return hdw->flag_init_ok;
Mike Iselyc4a88282008-04-22 14:45:44 -03002424}
2425
2426
2427/* Create, set up, and return a structure for interacting with the
2428 underlying hardware. */
Mike Iselyd8554972006-06-26 20:58:46 -03002429struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
2430 const struct usb_device_id *devid)
2431{
Mike Isely7fb20fa2008-04-22 14:45:37 -03002432 unsigned int idx,cnt1,cnt2,m;
Mike Iselyfe15f132008-08-30 18:11:40 -03002433 struct pvr2_hdw *hdw = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002434 int valid_std_mask;
2435 struct pvr2_ctrl *cptr;
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002436 struct usb_device *usb_dev;
Mike Isely989eb152007-11-26 01:53:12 -03002437 const struct pvr2_device_desc *hdw_desc;
Mike Iselyd8554972006-06-26 20:58:46 -03002438 __u8 ifnum;
Mike Iselyb30d2442006-06-25 20:05:01 -03002439 struct v4l2_queryctrl qctrl;
2440 struct pvr2_ctl_info *ciptr;
Mike Iselyd8554972006-06-26 20:58:46 -03002441
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002442 usb_dev = interface_to_usbdev(intf);
2443
Mike Iselyd130fa82007-12-08 17:20:06 -03002444 hdw_desc = (const struct pvr2_device_desc *)(devid->driver_info);
Mike Iselyd8554972006-06-26 20:58:46 -03002445
Mike Iselyfe15f132008-08-30 18:11:40 -03002446 if (hdw_desc == NULL) {
2447 pvr2_trace(PVR2_TRACE_INIT, "pvr2_hdw_create:"
2448 " No device description pointer,"
2449 " unable to continue.");
2450 pvr2_trace(PVR2_TRACE_INIT, "If you have a new device type,"
2451 " please contact Mike Isely <isely@pobox.com>"
2452 " to get it included in the driver\n");
2453 goto fail;
2454 }
2455
Mike Iselyca545f72007-01-20 00:37:11 -03002456 hdw = kzalloc(sizeof(*hdw),GFP_KERNEL);
Mike Iselyd8554972006-06-26 20:58:46 -03002457 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_create: hdw=%p, type \"%s\"",
Mike Isely989eb152007-11-26 01:53:12 -03002458 hdw,hdw_desc->description);
Mike Iselye67e3762009-10-12 00:28:19 -03002459 pvr2_trace(PVR2_TRACE_INFO, "Hardware description: %s",
Mike Isely00970be2009-10-12 00:23:37 -03002460 hdw_desc->description);
Mike Isely8fd04442010-05-15 00:13:35 -03002461 if (hdw_desc->flag_is_experimental) {
2462 pvr2_trace(PVR2_TRACE_INFO, "**********");
2463 pvr2_trace(PVR2_TRACE_INFO,
2464 "WARNING: Support for this device (%s) is"
2465 " experimental.", hdw_desc->description);
2466 pvr2_trace(PVR2_TRACE_INFO,
2467 "Important functionality might not be"
2468 " entirely working.");
2469 pvr2_trace(PVR2_TRACE_INFO,
2470 "Please consider contacting the driver author to"
2471 " help with further stabilization of the driver.");
2472 pvr2_trace(PVR2_TRACE_INFO, "**********");
2473 }
Mike Iselyd8554972006-06-26 20:58:46 -03002474 if (!hdw) goto fail;
Mike Isely681c7392007-11-26 01:48:52 -03002475
2476 init_timer(&hdw->quiescent_timer);
2477 hdw->quiescent_timer.data = (unsigned long)hdw;
2478 hdw->quiescent_timer.function = pvr2_hdw_quiescent_timeout;
2479
Mike Isely6e931372010-02-06 02:10:38 -03002480 init_timer(&hdw->decoder_stabilization_timer);
2481 hdw->decoder_stabilization_timer.data = (unsigned long)hdw;
2482 hdw->decoder_stabilization_timer.function =
2483 pvr2_hdw_decoder_stabilization_timeout;
2484
Mike Isely681c7392007-11-26 01:48:52 -03002485 init_timer(&hdw->encoder_wait_timer);
2486 hdw->encoder_wait_timer.data = (unsigned long)hdw;
2487 hdw->encoder_wait_timer.function = pvr2_hdw_encoder_wait_timeout;
2488
Mike Iselyd913d632008-04-06 04:04:35 -03002489 init_timer(&hdw->encoder_run_timer);
2490 hdw->encoder_run_timer.data = (unsigned long)hdw;
2491 hdw->encoder_run_timer.function = pvr2_hdw_encoder_run_timeout;
2492
Mike Isely681c7392007-11-26 01:48:52 -03002493 hdw->master_state = PVR2_STATE_DEAD;
2494
2495 init_waitqueue_head(&hdw->state_wait_data);
2496
Mike Isely18103c572007-01-20 00:09:47 -03002497 hdw->tuner_signal_stale = !0;
Mike Iselyb30d2442006-06-25 20:05:01 -03002498 cx2341x_fill_defaults(&hdw->enc_ctl_state);
Mike Iselyd8554972006-06-26 20:58:46 -03002499
Mike Isely7fb20fa2008-04-22 14:45:37 -03002500 /* Calculate which inputs are OK */
2501 m = 0;
2502 if (hdw_desc->flag_has_analogtuner) m |= 1 << PVR2_CVAL_INPUT_TV;
Mike Iselye8f5bac2008-04-22 14:45:40 -03002503 if (hdw_desc->digital_control_scheme != PVR2_DIGITAL_SCHEME_NONE) {
2504 m |= 1 << PVR2_CVAL_INPUT_DTV;
2505 }
Mike Isely7fb20fa2008-04-22 14:45:37 -03002506 if (hdw_desc->flag_has_svideo) m |= 1 << PVR2_CVAL_INPUT_SVIDEO;
2507 if (hdw_desc->flag_has_composite) m |= 1 << PVR2_CVAL_INPUT_COMPOSITE;
2508 if (hdw_desc->flag_has_fmradio) m |= 1 << PVR2_CVAL_INPUT_RADIO;
2509 hdw->input_avail_mask = m;
Mike Isely1cb03b72008-04-21 03:47:43 -03002510 hdw->input_allowed_mask = hdw->input_avail_mask;
Mike Isely7fb20fa2008-04-22 14:45:37 -03002511
Mike Isely62433e32008-04-22 14:45:40 -03002512 /* If not a hybrid device, pathway_state never changes. So
2513 initialize it here to what it should forever be. */
2514 if (!(hdw->input_avail_mask & (1 << PVR2_CVAL_INPUT_DTV))) {
2515 hdw->pathway_state = PVR2_PATHWAY_ANALOG;
2516 } else if (!(hdw->input_avail_mask & (1 << PVR2_CVAL_INPUT_TV))) {
2517 hdw->pathway_state = PVR2_PATHWAY_DIGITAL;
2518 }
2519
Mike Iselyc05c0462006-06-25 20:04:25 -03002520 hdw->control_cnt = CTRLDEF_COUNT;
Mike Iselyb30d2442006-06-25 20:05:01 -03002521 hdw->control_cnt += MPEGDEF_COUNT;
Mike Iselyca545f72007-01-20 00:37:11 -03002522 hdw->controls = kzalloc(sizeof(struct pvr2_ctrl) * hdw->control_cnt,
Mike Iselyd8554972006-06-26 20:58:46 -03002523 GFP_KERNEL);
2524 if (!hdw->controls) goto fail;
Mike Isely989eb152007-11-26 01:53:12 -03002525 hdw->hdw_desc = hdw_desc;
Mike Isely27eab382009-04-06 01:51:38 -03002526 hdw->ir_scheme_active = hdw->hdw_desc->ir_scheme;
Mike Iselyc05c0462006-06-25 20:04:25 -03002527 for (idx = 0; idx < hdw->control_cnt; idx++) {
2528 cptr = hdw->controls + idx;
2529 cptr->hdw = hdw;
2530 }
Mike Iselyd8554972006-06-26 20:58:46 -03002531 for (idx = 0; idx < 32; idx++) {
2532 hdw->std_mask_ptrs[idx] = hdw->std_mask_names[idx];
2533 }
Mike Iselyc05c0462006-06-25 20:04:25 -03002534 for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002535 cptr = hdw->controls + idx;
Mike Iselyd8554972006-06-26 20:58:46 -03002536 cptr->info = control_defs+idx;
2537 }
Mike Iselydbc40a02008-04-22 14:45:39 -03002538
2539 /* Ensure that default input choice is a valid one. */
2540 m = hdw->input_avail_mask;
2541 if (m) for (idx = 0; idx < (sizeof(m) << 3); idx++) {
2542 if (!((1 << idx) & m)) continue;
2543 hdw->input_val = idx;
2544 break;
2545 }
2546
Mike Iselyb30d2442006-06-25 20:05:01 -03002547 /* Define and configure additional controls from cx2341x module. */
Mike Iselyca545f72007-01-20 00:37:11 -03002548 hdw->mpeg_ctrl_info = kzalloc(
Mike Iselyb30d2442006-06-25 20:05:01 -03002549 sizeof(*(hdw->mpeg_ctrl_info)) * MPEGDEF_COUNT, GFP_KERNEL);
2550 if (!hdw->mpeg_ctrl_info) goto fail;
Mike Iselyb30d2442006-06-25 20:05:01 -03002551 for (idx = 0; idx < MPEGDEF_COUNT; idx++) {
2552 cptr = hdw->controls + idx + CTRLDEF_COUNT;
2553 ciptr = &(hdw->mpeg_ctrl_info[idx].info);
2554 ciptr->desc = hdw->mpeg_ctrl_info[idx].desc;
2555 ciptr->name = mpeg_ids[idx].strid;
2556 ciptr->v4l_id = mpeg_ids[idx].id;
2557 ciptr->skip_init = !0;
2558 ciptr->get_value = ctrl_cx2341x_get;
2559 ciptr->get_v4lflags = ctrl_cx2341x_getv4lflags;
2560 ciptr->is_dirty = ctrl_cx2341x_is_dirty;
2561 if (!idx) ciptr->clear_dirty = ctrl_cx2341x_clear_dirty;
2562 qctrl.id = ciptr->v4l_id;
2563 cx2341x_ctrl_query(&hdw->enc_ctl_state,&qctrl);
2564 if (!(qctrl.flags & V4L2_CTRL_FLAG_READ_ONLY)) {
2565 ciptr->set_value = ctrl_cx2341x_set;
2566 }
2567 strncpy(hdw->mpeg_ctrl_info[idx].desc,qctrl.name,
2568 PVR2_CTLD_INFO_DESC_SIZE);
2569 hdw->mpeg_ctrl_info[idx].desc[PVR2_CTLD_INFO_DESC_SIZE-1] = 0;
2570 ciptr->default_value = qctrl.default_value;
2571 switch (qctrl.type) {
2572 default:
2573 case V4L2_CTRL_TYPE_INTEGER:
2574 ciptr->type = pvr2_ctl_int;
2575 ciptr->def.type_int.min_value = qctrl.minimum;
2576 ciptr->def.type_int.max_value = qctrl.maximum;
2577 break;
2578 case V4L2_CTRL_TYPE_BOOLEAN:
2579 ciptr->type = pvr2_ctl_bool;
2580 break;
2581 case V4L2_CTRL_TYPE_MENU:
2582 ciptr->type = pvr2_ctl_enum;
2583 ciptr->def.type_enum.value_names =
Hans Verkuile0e31cd2008-06-22 12:03:28 -03002584 cx2341x_ctrl_get_menu(&hdw->enc_ctl_state,
2585 ciptr->v4l_id);
Mike Iselyb30d2442006-06-25 20:05:01 -03002586 for (cnt1 = 0;
2587 ciptr->def.type_enum.value_names[cnt1] != NULL;
2588 cnt1++) { }
2589 ciptr->def.type_enum.count = cnt1;
2590 break;
2591 }
2592 cptr->info = ciptr;
2593 }
Mike Iselyd8554972006-06-26 20:58:46 -03002594
2595 // Initialize video standard enum dynamic control
2596 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDENUM);
2597 if (cptr) {
2598 memcpy(&hdw->std_info_enum,cptr->info,
2599 sizeof(hdw->std_info_enum));
2600 cptr->info = &hdw->std_info_enum;
2601
2602 }
2603 // Initialize control data regarding video standard masks
2604 valid_std_mask = pvr2_std_get_usable();
2605 for (idx = 0; idx < 32; idx++) {
2606 if (!(valid_std_mask & (1 << idx))) continue;
2607 cnt1 = pvr2_std_id_to_str(
2608 hdw->std_mask_names[idx],
2609 sizeof(hdw->std_mask_names[idx])-1,
2610 1 << idx);
2611 hdw->std_mask_names[idx][cnt1] = 0;
2612 }
2613 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDAVAIL);
2614 if (cptr) {
2615 memcpy(&hdw->std_info_avail,cptr->info,
2616 sizeof(hdw->std_info_avail));
2617 cptr->info = &hdw->std_info_avail;
2618 hdw->std_info_avail.def.type_bitmask.bit_names =
2619 hdw->std_mask_ptrs;
2620 hdw->std_info_avail.def.type_bitmask.valid_bits =
2621 valid_std_mask;
2622 }
2623 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDCUR);
2624 if (cptr) {
2625 memcpy(&hdw->std_info_cur,cptr->info,
2626 sizeof(hdw->std_info_cur));
2627 cptr->info = &hdw->std_info_cur;
2628 hdw->std_info_cur.def.type_bitmask.bit_names =
2629 hdw->std_mask_ptrs;
2630 hdw->std_info_avail.def.type_bitmask.valid_bits =
2631 valid_std_mask;
2632 }
2633
Mike Isely432907f2008-08-31 21:02:20 -03002634 hdw->cropcap_stale = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03002635 hdw->eeprom_addr = -1;
2636 hdw->unit_number = -1;
Mike Isely80793842006-12-27 23:12:28 -03002637 hdw->v4l_minor_number_video = -1;
2638 hdw->v4l_minor_number_vbi = -1;
Mike Iselyfd5a75f2006-12-27 23:11:22 -03002639 hdw->v4l_minor_number_radio = -1;
Mike Iselyd8554972006-06-26 20:58:46 -03002640 hdw->ctl_write_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL);
2641 if (!hdw->ctl_write_buffer) goto fail;
2642 hdw->ctl_read_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL);
2643 if (!hdw->ctl_read_buffer) goto fail;
2644 hdw->ctl_write_urb = usb_alloc_urb(0,GFP_KERNEL);
2645 if (!hdw->ctl_write_urb) goto fail;
2646 hdw->ctl_read_urb = usb_alloc_urb(0,GFP_KERNEL);
2647 if (!hdw->ctl_read_urb) goto fail;
2648
Janne Grunau70ad6382009-04-01 08:46:50 -03002649 if (v4l2_device_register(&intf->dev, &hdw->v4l2_dev) != 0) {
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002650 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2651 "Error registering with v4l core, giving up");
2652 goto fail;
2653 }
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002654 mutex_lock(&pvr2_unit_mtx); do {
Mike Iselyd8554972006-06-26 20:58:46 -03002655 for (idx = 0; idx < PVR_NUM; idx++) {
2656 if (unit_pointers[idx]) continue;
2657 hdw->unit_number = idx;
2658 unit_pointers[idx] = hdw;
2659 break;
2660 }
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002661 } while (0); mutex_unlock(&pvr2_unit_mtx);
Mike Iselyd8554972006-06-26 20:58:46 -03002662
2663 cnt1 = 0;
2664 cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"pvrusb2");
2665 cnt1 += cnt2;
2666 if (hdw->unit_number >= 0) {
2667 cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"_%c",
2668 ('a' + hdw->unit_number));
2669 cnt1 += cnt2;
2670 }
2671 if (cnt1 >= sizeof(hdw->name)) cnt1 = sizeof(hdw->name)-1;
2672 hdw->name[cnt1] = 0;
2673
Mike Isely681c7392007-11-26 01:48:52 -03002674 hdw->workqueue = create_singlethread_workqueue(hdw->name);
2675 INIT_WORK(&hdw->workpoll,pvr2_hdw_worker_poll);
Mike Isely681c7392007-11-26 01:48:52 -03002676
Mike Iselyd8554972006-06-26 20:58:46 -03002677 pvr2_trace(PVR2_TRACE_INIT,"Driver unit number is %d, name is %s",
2678 hdw->unit_number,hdw->name);
2679
2680 hdw->tuner_type = -1;
2681 hdw->flag_ok = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03002682
2683 hdw->usb_intf = intf;
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002684 hdw->usb_dev = usb_dev;
Mike Iselyd8554972006-06-26 20:58:46 -03002685
Mike Isely87e34952009-01-23 01:20:24 -03002686 usb_make_path(hdw->usb_dev, hdw->bus_info, sizeof(hdw->bus_info));
Mike Isely31a18542007-04-08 01:11:47 -03002687
Mike Iselyd8554972006-06-26 20:58:46 -03002688 ifnum = hdw->usb_intf->cur_altsetting->desc.bInterfaceNumber;
2689 usb_set_interface(hdw->usb_dev,ifnum,0);
2690
2691 mutex_init(&hdw->ctl_lock_mutex);
2692 mutex_init(&hdw->big_lock_mutex);
2693
2694 return hdw;
2695 fail:
2696 if (hdw) {
Mike Isely681c7392007-11-26 01:48:52 -03002697 del_timer_sync(&hdw->quiescent_timer);
Mike Isely6e931372010-02-06 02:10:38 -03002698 del_timer_sync(&hdw->decoder_stabilization_timer);
Mike Iselyd913d632008-04-06 04:04:35 -03002699 del_timer_sync(&hdw->encoder_run_timer);
Mike Isely681c7392007-11-26 01:48:52 -03002700 del_timer_sync(&hdw->encoder_wait_timer);
2701 if (hdw->workqueue) {
2702 flush_workqueue(hdw->workqueue);
2703 destroy_workqueue(hdw->workqueue);
2704 hdw->workqueue = NULL;
2705 }
Mariusz Kozlowski5e55d2c2006-11-08 15:34:31 +01002706 usb_free_urb(hdw->ctl_read_urb);
2707 usb_free_urb(hdw->ctl_write_urb);
Mariusz Kozlowski22071a42007-01-07 10:33:39 -03002708 kfree(hdw->ctl_read_buffer);
2709 kfree(hdw->ctl_write_buffer);
2710 kfree(hdw->controls);
2711 kfree(hdw->mpeg_ctrl_info);
Mike Isely681c7392007-11-26 01:48:52 -03002712 kfree(hdw->std_defs);
2713 kfree(hdw->std_enum_names);
Mike Iselyd8554972006-06-26 20:58:46 -03002714 kfree(hdw);
2715 }
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002716 return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002717}
2718
2719
2720/* Remove _all_ associations between this driver and the underlying USB
2721 layer. */
Adrian Bunk07e337e2006-06-30 11:30:20 -03002722static void pvr2_hdw_remove_usb_stuff(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002723{
2724 if (hdw->flag_disconnected) return;
2725 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_remove_usb_stuff: hdw=%p",hdw);
2726 if (hdw->ctl_read_urb) {
2727 usb_kill_urb(hdw->ctl_read_urb);
2728 usb_free_urb(hdw->ctl_read_urb);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002729 hdw->ctl_read_urb = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002730 }
2731 if (hdw->ctl_write_urb) {
2732 usb_kill_urb(hdw->ctl_write_urb);
2733 usb_free_urb(hdw->ctl_write_urb);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002734 hdw->ctl_write_urb = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002735 }
2736 if (hdw->ctl_read_buffer) {
2737 kfree(hdw->ctl_read_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002738 hdw->ctl_read_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002739 }
2740 if (hdw->ctl_write_buffer) {
2741 kfree(hdw->ctl_write_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002742 hdw->ctl_write_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002743 }
Mike Iselyd8554972006-06-26 20:58:46 -03002744 hdw->flag_disconnected = !0;
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002745 /* If we don't do this, then there will be a dangling struct device
2746 reference to our disappearing device persisting inside the V4L
2747 core... */
Mike Iselydc070bc2009-03-25 00:30:45 -03002748 v4l2_device_disconnect(&hdw->v4l2_dev);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002749 hdw->usb_dev = NULL;
2750 hdw->usb_intf = NULL;
Mike Isely681c7392007-11-26 01:48:52 -03002751 pvr2_hdw_render_useless(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002752}
2753
2754
2755/* Destroy hardware interaction structure */
2756void pvr2_hdw_destroy(struct pvr2_hdw *hdw)
2757{
Mike Isely401c27c2007-09-08 22:11:46 -03002758 if (!hdw) return;
Mike Iselyd8554972006-06-26 20:58:46 -03002759 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_destroy: hdw=%p",hdw);
Mike Isely681c7392007-11-26 01:48:52 -03002760 if (hdw->workqueue) {
2761 flush_workqueue(hdw->workqueue);
2762 destroy_workqueue(hdw->workqueue);
2763 hdw->workqueue = NULL;
2764 }
Mike Isely8f591002008-04-22 14:45:45 -03002765 del_timer_sync(&hdw->quiescent_timer);
Mike Isely6e931372010-02-06 02:10:38 -03002766 del_timer_sync(&hdw->decoder_stabilization_timer);
Mike Iselyd913d632008-04-06 04:04:35 -03002767 del_timer_sync(&hdw->encoder_run_timer);
Mike Isely8f591002008-04-22 14:45:45 -03002768 del_timer_sync(&hdw->encoder_wait_timer);
Mike Iselyd8554972006-06-26 20:58:46 -03002769 if (hdw->fw_buffer) {
2770 kfree(hdw->fw_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002771 hdw->fw_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002772 }
2773 if (hdw->vid_stream) {
2774 pvr2_stream_destroy(hdw->vid_stream);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002775 hdw->vid_stream = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002776 }
Mike Iselyd8554972006-06-26 20:58:46 -03002777 pvr2_i2c_core_done(hdw);
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002778 v4l2_device_unregister(&hdw->v4l2_dev);
Mike Iselyd8554972006-06-26 20:58:46 -03002779 pvr2_hdw_remove_usb_stuff(hdw);
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002780 mutex_lock(&pvr2_unit_mtx); do {
Mike Iselyd8554972006-06-26 20:58:46 -03002781 if ((hdw->unit_number >= 0) &&
2782 (hdw->unit_number < PVR_NUM) &&
2783 (unit_pointers[hdw->unit_number] == hdw)) {
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002784 unit_pointers[hdw->unit_number] = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002785 }
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002786 } while (0); mutex_unlock(&pvr2_unit_mtx);
Mariusz Kozlowski22071a42007-01-07 10:33:39 -03002787 kfree(hdw->controls);
2788 kfree(hdw->mpeg_ctrl_info);
2789 kfree(hdw->std_defs);
2790 kfree(hdw->std_enum_names);
Mike Iselyd8554972006-06-26 20:58:46 -03002791 kfree(hdw);
2792}
2793
2794
Mike Iselyd8554972006-06-26 20:58:46 -03002795int pvr2_hdw_dev_ok(struct pvr2_hdw *hdw)
2796{
2797 return (hdw && hdw->flag_ok);
2798}
2799
2800
2801/* Called when hardware has been unplugged */
2802void pvr2_hdw_disconnect(struct pvr2_hdw *hdw)
2803{
2804 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_disconnect(hdw=%p)",hdw);
2805 LOCK_TAKE(hdw->big_lock);
2806 LOCK_TAKE(hdw->ctl_lock);
2807 pvr2_hdw_remove_usb_stuff(hdw);
2808 LOCK_GIVE(hdw->ctl_lock);
2809 LOCK_GIVE(hdw->big_lock);
2810}
2811
2812
2813// Attempt to autoselect an appropriate value for std_enum_cur given
2814// whatever is currently in std_mask_cur
Adrian Bunk07e337e2006-06-30 11:30:20 -03002815static void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002816{
2817 unsigned int idx;
2818 for (idx = 1; idx < hdw->std_enum_cnt; idx++) {
2819 if (hdw->std_defs[idx-1].id == hdw->std_mask_cur) {
2820 hdw->std_enum_cur = idx;
2821 return;
2822 }
2823 }
2824 hdw->std_enum_cur = 0;
2825}
2826
2827
2828// Calculate correct set of enumerated standards based on currently known
2829// set of available standards bits.
Adrian Bunk07e337e2006-06-30 11:30:20 -03002830static void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002831{
2832 struct v4l2_standard *newstd;
2833 unsigned int std_cnt;
2834 unsigned int idx;
2835
2836 newstd = pvr2_std_create_enum(&std_cnt,hdw->std_mask_avail);
2837
2838 if (hdw->std_defs) {
2839 kfree(hdw->std_defs);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002840 hdw->std_defs = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002841 }
2842 hdw->std_enum_cnt = 0;
2843 if (hdw->std_enum_names) {
2844 kfree(hdw->std_enum_names);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002845 hdw->std_enum_names = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002846 }
2847
2848 if (!std_cnt) {
2849 pvr2_trace(
2850 PVR2_TRACE_ERROR_LEGS,
2851 "WARNING: Failed to identify any viable standards");
2852 }
Xiaochen Wangc05df8b2011-03-13 22:32:53 -03002853
2854 /* Set up the dynamic control for this standard */
Mike Iselyd8554972006-06-26 20:58:46 -03002855 hdw->std_enum_names = kmalloc(sizeof(char *)*(std_cnt+1),GFP_KERNEL);
Xiaochen Wangc05df8b2011-03-13 22:32:53 -03002856 if (hdw->std_enum_names) {
2857 hdw->std_enum_names[0] = "none";
2858 for (idx = 0; idx < std_cnt; idx++)
2859 hdw->std_enum_names[idx+1] = newstd[idx].name;
2860 hdw->std_info_enum.def.type_enum.value_names =
2861 hdw->std_enum_names;
2862 hdw->std_info_enum.def.type_enum.count = std_cnt+1;
2863 } else {
2864 pvr2_trace(
2865 PVR2_TRACE_ERROR_LEGS,
2866 "WARNING: Failed to alloc memory for names");
2867 hdw->std_info_enum.def.type_enum.value_names = NULL;
2868 hdw->std_info_enum.def.type_enum.count = 0;
Mike Iselyd8554972006-06-26 20:58:46 -03002869 }
Mike Iselyd8554972006-06-26 20:58:46 -03002870 hdw->std_defs = newstd;
2871 hdw->std_enum_cnt = std_cnt+1;
2872 hdw->std_enum_cur = 0;
2873 hdw->std_info_cur.def.type_bitmask.valid_bits = hdw->std_mask_avail;
2874}
2875
2876
2877int pvr2_hdw_get_stdenum_value(struct pvr2_hdw *hdw,
2878 struct v4l2_standard *std,
2879 unsigned int idx)
2880{
2881 int ret = -EINVAL;
2882 if (!idx) return ret;
2883 LOCK_TAKE(hdw->big_lock); do {
2884 if (idx >= hdw->std_enum_cnt) break;
2885 idx--;
2886 memcpy(std,hdw->std_defs+idx,sizeof(*std));
2887 ret = 0;
2888 } while (0); LOCK_GIVE(hdw->big_lock);
2889 return ret;
2890}
2891
2892
2893/* Get the number of defined controls */
2894unsigned int pvr2_hdw_get_ctrl_count(struct pvr2_hdw *hdw)
2895{
Mike Iselyc05c0462006-06-25 20:04:25 -03002896 return hdw->control_cnt;
Mike Iselyd8554972006-06-26 20:58:46 -03002897}
2898
2899
2900/* Retrieve a control handle given its index (0..count-1) */
2901struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_index(struct pvr2_hdw *hdw,
2902 unsigned int idx)
2903{
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002904 if (idx >= hdw->control_cnt) return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002905 return hdw->controls + idx;
2906}
2907
2908
2909/* Retrieve a control handle given its index (0..count-1) */
2910struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_id(struct pvr2_hdw *hdw,
2911 unsigned int ctl_id)
2912{
2913 struct pvr2_ctrl *cptr;
2914 unsigned int idx;
2915 int i;
2916
2917 /* This could be made a lot more efficient, but for now... */
Mike Iselyc05c0462006-06-25 20:04:25 -03002918 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002919 cptr = hdw->controls + idx;
2920 i = cptr->info->internal_id;
2921 if (i && (i == ctl_id)) return cptr;
2922 }
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002923 return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002924}
2925
2926
Mike Iselya761f432006-06-25 20:04:44 -03002927/* Given a V4L ID, retrieve the control structure associated with it. */
Mike Iselyd8554972006-06-26 20:58:46 -03002928struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *hdw,unsigned int ctl_id)
2929{
2930 struct pvr2_ctrl *cptr;
2931 unsigned int idx;
2932 int i;
2933
2934 /* This could be made a lot more efficient, but for now... */
Mike Iselyc05c0462006-06-25 20:04:25 -03002935 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002936 cptr = hdw->controls + idx;
2937 i = cptr->info->v4l_id;
2938 if (i && (i == ctl_id)) return cptr;
2939 }
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002940 return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002941}
2942
2943
Mike Iselya761f432006-06-25 20:04:44 -03002944/* Given a V4L ID for its immediate predecessor, retrieve the control
2945 structure associated with it. */
2946struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *hdw,
2947 unsigned int ctl_id)
2948{
2949 struct pvr2_ctrl *cptr,*cp2;
2950 unsigned int idx;
2951 int i;
2952
2953 /* This could be made a lot more efficient, but for now... */
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002954 cp2 = NULL;
Mike Iselya761f432006-06-25 20:04:44 -03002955 for (idx = 0; idx < hdw->control_cnt; idx++) {
2956 cptr = hdw->controls + idx;
2957 i = cptr->info->v4l_id;
2958 if (!i) continue;
2959 if (i <= ctl_id) continue;
2960 if (cp2 && (cp2->info->v4l_id < i)) continue;
2961 cp2 = cptr;
2962 }
2963 return cp2;
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002964 return NULL;
Mike Iselya761f432006-06-25 20:04:44 -03002965}
2966
2967
Mike Iselyd8554972006-06-26 20:58:46 -03002968static const char *get_ctrl_typename(enum pvr2_ctl_type tp)
2969{
2970 switch (tp) {
2971 case pvr2_ctl_int: return "integer";
2972 case pvr2_ctl_enum: return "enum";
Mike Isely33213962006-06-25 20:04:40 -03002973 case pvr2_ctl_bool: return "boolean";
Mike Iselyd8554972006-06-26 20:58:46 -03002974 case pvr2_ctl_bitmask: return "bitmask";
2975 }
2976 return "";
2977}
2978
2979
Mike Isely2641df32009-03-07 00:13:25 -03002980static void pvr2_subdev_set_control(struct pvr2_hdw *hdw, int id,
2981 const char *name, int val)
2982{
2983 struct v4l2_control ctrl;
2984 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 %s=%d", name, val);
2985 memset(&ctrl, 0, sizeof(ctrl));
2986 ctrl.id = id;
2987 ctrl.value = val;
2988 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, s_ctrl, &ctrl);
2989}
2990
2991#define PVR2_SUBDEV_SET_CONTROL(hdw, id, lab) \
Mike Isely27764722009-03-07 01:57:25 -03002992 if ((hdw)->lab##_dirty || (hdw)->force_dirty) { \
Mike Isely2641df32009-03-07 00:13:25 -03002993 pvr2_subdev_set_control(hdw, id, #lab, (hdw)->lab##_val); \
2994 }
2995
Mauro Carvalho Chehab7383a472011-10-03 12:22:28 -03002996int pvr2_hdw_get_detected_std(struct pvr2_hdw *hdw, v4l2_std_id *std)
2997{
2998 v4l2_device_call_all(&hdw->v4l2_dev, 0,
2999 video, querystd, std);
3000 return 0;
3001}
3002
Mike Isely5ceaad12009-03-07 00:01:20 -03003003/* Execute whatever commands are required to update the state of all the
Mike Isely2641df32009-03-07 00:13:25 -03003004 sub-devices so that they match our current control values. */
Mike Isely5ceaad12009-03-07 00:01:20 -03003005static void pvr2_subdev_update(struct pvr2_hdw *hdw)
3006{
Mike Iselyedb9dcb2009-03-07 00:37:10 -03003007 struct v4l2_subdev *sd;
3008 unsigned int id;
3009 pvr2_subdev_update_func fp;
3010
Mike Isely75212a02009-03-07 01:48:42 -03003011 pvr2_trace(PVR2_TRACE_CHIPS, "subdev update...");
3012
Mike Isely27764722009-03-07 01:57:25 -03003013 if (hdw->tuner_updated || hdw->force_dirty) {
Mike Isely75212a02009-03-07 01:48:42 -03003014 struct tuner_setup setup;
3015 pvr2_trace(PVR2_TRACE_CHIPS, "subdev tuner set_type(%d)",
3016 hdw->tuner_type);
3017 if (((int)(hdw->tuner_type)) >= 0) {
Mike Iselyfcd62cf2009-04-01 01:55:26 -03003018 memset(&setup, 0, sizeof(setup));
Mike Isely75212a02009-03-07 01:48:42 -03003019 setup.addr = ADDR_UNSET;
3020 setup.type = hdw->tuner_type;
3021 setup.mode_mask = T_RADIO | T_ANALOG_TV;
3022 v4l2_device_call_all(&hdw->v4l2_dev, 0,
3023 tuner, s_type_addr, &setup);
3024 }
3025 }
3026
Mike Isely27764722009-03-07 01:57:25 -03003027 if (hdw->input_dirty || hdw->std_dirty || hdw->force_dirty) {
Mike Iselyb4818802009-03-07 01:46:17 -03003028 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_standard");
Mike Isely2641df32009-03-07 00:13:25 -03003029 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
3030 v4l2_device_call_all(&hdw->v4l2_dev, 0,
3031 tuner, s_radio);
3032 } else {
3033 v4l2_std_id vs;
3034 vs = hdw->std_mask_cur;
3035 v4l2_device_call_all(&hdw->v4l2_dev, 0,
Hans Verkuilf41737e2009-04-01 03:52:39 -03003036 core, s_std, vs);
Mike Iselya6862da2009-06-20 14:50:14 -03003037 pvr2_hdw_cx25840_vbi_hack(hdw);
Mike Isely2641df32009-03-07 00:13:25 -03003038 }
3039 hdw->tuner_signal_stale = !0;
3040 hdw->cropcap_stale = !0;
3041 }
3042
3043 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_BRIGHTNESS, brightness);
3044 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_CONTRAST, contrast);
3045 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_SATURATION, saturation);
3046 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_HUE, hue);
3047 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_MUTE, mute);
3048 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_VOLUME, volume);
3049 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_BALANCE, balance);
3050 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_BASS, bass);
3051 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_TREBLE, treble);
3052
Mike Isely27764722009-03-07 01:57:25 -03003053 if (hdw->input_dirty || hdw->audiomode_dirty || hdw->force_dirty) {
Mike Isely2641df32009-03-07 00:13:25 -03003054 struct v4l2_tuner vt;
3055 memset(&vt, 0, sizeof(vt));
Hans Verkuil50e9efd2011-06-12 06:39:52 -03003056 vt.type = (hdw->input_val == PVR2_CVAL_INPUT_RADIO) ?
3057 V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
Mike Isely2641df32009-03-07 00:13:25 -03003058 vt.audmode = hdw->audiomode_val;
3059 v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner, s_tuner, &vt);
3060 }
3061
Mike Isely27764722009-03-07 01:57:25 -03003062 if (hdw->freqDirty || hdw->force_dirty) {
Mike Isely2641df32009-03-07 00:13:25 -03003063 unsigned long fv;
3064 struct v4l2_frequency freq;
3065 fv = pvr2_hdw_get_cur_freq(hdw);
3066 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_freq(%lu)", fv);
3067 if (hdw->tuner_signal_stale) pvr2_hdw_status_poll(hdw);
3068 memset(&freq, 0, sizeof(freq));
3069 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
3070 /* ((fv * 1000) / 62500) */
3071 freq.frequency = (fv * 2) / 125;
3072 } else {
3073 freq.frequency = fv / 62500;
3074 }
3075 /* tuner-core currently doesn't seem to care about this, but
3076 let's set it anyway for completeness. */
3077 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
3078 freq.type = V4L2_TUNER_RADIO;
3079 } else {
3080 freq.type = V4L2_TUNER_ANALOG_TV;
3081 }
3082 freq.tuner = 0;
3083 v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner,
3084 s_frequency, &freq);
3085 }
3086
Mike Isely27764722009-03-07 01:57:25 -03003087 if (hdw->res_hor_dirty || hdw->res_ver_dirty || hdw->force_dirty) {
Hans Verkuilfa190ee2010-05-08 17:16:18 -03003088 struct v4l2_mbus_framefmt fmt;
Mike Isely2641df32009-03-07 00:13:25 -03003089 memset(&fmt, 0, sizeof(fmt));
Hans Verkuilfa190ee2010-05-08 17:16:18 -03003090 fmt.width = hdw->res_hor_val;
3091 fmt.height = hdw->res_ver_val;
3092 fmt.code = V4L2_MBUS_FMT_FIXED;
Mike Isely7dfdf1e2009-03-07 02:11:12 -03003093 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_size(%dx%d)",
Hans Verkuilfa190ee2010-05-08 17:16:18 -03003094 fmt.width, fmt.height);
3095 v4l2_device_call_all(&hdw->v4l2_dev, 0, video, s_mbus_fmt, &fmt);
Mike Isely2641df32009-03-07 00:13:25 -03003096 }
3097
Mike Isely27764722009-03-07 01:57:25 -03003098 if (hdw->srate_dirty || hdw->force_dirty) {
Mike Isely01c59df2009-03-07 00:48:09 -03003099 u32 val;
3100 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_audio %d",
3101 hdw->srate_val);
3102 switch (hdw->srate_val) {
3103 default:
3104 case V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000:
3105 val = 48000;
3106 break;
3107 case V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100:
3108 val = 44100;
3109 break;
3110 case V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000:
3111 val = 32000;
3112 break;
3113 }
3114 v4l2_device_call_all(&hdw->v4l2_dev, 0,
3115 audio, s_clock_freq, val);
3116 }
3117
Mike Isely2641df32009-03-07 00:13:25 -03003118 /* Unable to set crop parameters; there is apparently no equivalent
3119 for VIDIOC_S_CROP */
3120
Mike Iselyedb9dcb2009-03-07 00:37:10 -03003121 v4l2_device_for_each_subdev(sd, &hdw->v4l2_dev) {
3122 id = sd->grp_id;
3123 if (id >= ARRAY_SIZE(pvr2_module_update_functions)) continue;
3124 fp = pvr2_module_update_functions[id];
3125 if (!fp) continue;
3126 (*fp)(hdw, sd);
3127 }
Mike Isely2641df32009-03-07 00:13:25 -03003128
Mike Isely27764722009-03-07 01:57:25 -03003129 if (hdw->tuner_signal_stale || hdw->cropcap_stale) {
Mike Isely2641df32009-03-07 00:13:25 -03003130 pvr2_hdw_status_poll(hdw);
3131 }
Mike Isely5ceaad12009-03-07 00:01:20 -03003132}
3133
3134
Mike Isely681c7392007-11-26 01:48:52 -03003135/* Figure out if we need to commit control changes. If so, mark internal
3136 state flags to indicate this fact and return true. Otherwise do nothing
3137 else and return false. */
3138static int pvr2_hdw_commit_setup(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03003139{
Mike Iselyd8554972006-06-26 20:58:46 -03003140 unsigned int idx;
3141 struct pvr2_ctrl *cptr;
3142 int value;
Mike Isely27764722009-03-07 01:57:25 -03003143 int commit_flag = hdw->force_dirty;
Mike Iselyd8554972006-06-26 20:58:46 -03003144 char buf[100];
3145 unsigned int bcnt,ccnt;
3146
Mike Iselyc05c0462006-06-25 20:04:25 -03003147 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03003148 cptr = hdw->controls + idx;
Al Viro5fa12472008-03-29 03:07:38 +00003149 if (!cptr->info->is_dirty) continue;
Mike Iselyd8554972006-06-26 20:58:46 -03003150 if (!cptr->info->is_dirty(cptr)) continue;
Mike Iselyfe23a282007-01-20 00:10:55 -03003151 commit_flag = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03003152
Mike Iselyfe23a282007-01-20 00:10:55 -03003153 if (!(pvrusb2_debug & PVR2_TRACE_CTL)) continue;
Mike Iselyd8554972006-06-26 20:58:46 -03003154 bcnt = scnprintf(buf,sizeof(buf),"\"%s\" <-- ",
3155 cptr->info->name);
3156 value = 0;
3157 cptr->info->get_value(cptr,&value);
3158 pvr2_ctrl_value_to_sym_internal(cptr,~0,value,
3159 buf+bcnt,
3160 sizeof(buf)-bcnt,&ccnt);
3161 bcnt += ccnt;
3162 bcnt += scnprintf(buf+bcnt,sizeof(buf)-bcnt," <%s>",
3163 get_ctrl_typename(cptr->info->type));
3164 pvr2_trace(PVR2_TRACE_CTL,
3165 "/*--TRACE_COMMIT--*/ %.*s",
3166 bcnt,buf);
3167 }
3168
3169 if (!commit_flag) {
3170 /* Nothing has changed */
3171 return 0;
3172 }
3173
Mike Isely681c7392007-11-26 01:48:52 -03003174 hdw->state_pipeline_config = 0;
3175 trace_stbit("state_pipeline_config",hdw->state_pipeline_config);
3176 pvr2_hdw_state_sched(hdw);
3177
3178 return !0;
3179}
3180
3181
3182/* Perform all operations needed to commit all control changes. This must
3183 be performed in synchronization with the pipeline state and is thus
3184 expected to be called as part of the driver's worker thread. Return
3185 true if commit successful, otherwise return false to indicate that
3186 commit isn't possible at this time. */
3187static int pvr2_hdw_commit_execute(struct pvr2_hdw *hdw)
3188{
3189 unsigned int idx;
3190 struct pvr2_ctrl *cptr;
3191 int disruptive_change;
3192
Mike Isely9bf98322011-02-13 17:31:55 -03003193 if (hdw->input_dirty && hdw->state_pathway_ok &&
3194 (((hdw->input_val == PVR2_CVAL_INPUT_DTV) ?
3195 PVR2_PATHWAY_DIGITAL : PVR2_PATHWAY_ANALOG) !=
3196 hdw->pathway_state)) {
3197 /* Change of mode being asked for... */
3198 hdw->state_pathway_ok = 0;
3199 trace_stbit("state_pathway_ok", hdw->state_pathway_ok);
3200 }
3201 if (!hdw->state_pathway_ok) {
3202 /* Can't commit anything until pathway is ok. */
3203 return 0;
3204 }
3205
Mike Iselyab062fe2008-06-30 03:32:35 -03003206 /* Handle some required side effects when the video standard is
3207 changed.... */
Mike Iselyd8554972006-06-26 20:58:46 -03003208 if (hdw->std_dirty) {
Mike Iselyd8554972006-06-26 20:58:46 -03003209 int nvres;
Mike Isely00528d92008-06-30 03:35:52 -03003210 int gop_size;
Mike Iselyd8554972006-06-26 20:58:46 -03003211 if (hdw->std_mask_cur & V4L2_STD_525_60) {
3212 nvres = 480;
Mike Isely00528d92008-06-30 03:35:52 -03003213 gop_size = 15;
Mike Iselyd8554972006-06-26 20:58:46 -03003214 } else {
3215 nvres = 576;
Mike Isely00528d92008-06-30 03:35:52 -03003216 gop_size = 12;
Mike Iselyd8554972006-06-26 20:58:46 -03003217 }
Mike Isely00528d92008-06-30 03:35:52 -03003218 /* Rewrite the vertical resolution to be appropriate to the
3219 video standard that has been selected. */
Mike Iselyd8554972006-06-26 20:58:46 -03003220 if (nvres != hdw->res_ver_val) {
3221 hdw->res_ver_val = nvres;
3222 hdw->res_ver_dirty = !0;
3223 }
Mike Isely00528d92008-06-30 03:35:52 -03003224 /* Rewrite the GOP size to be appropriate to the video
3225 standard that has been selected. */
3226 if (gop_size != hdw->enc_ctl_state.video_gop_size) {
3227 struct v4l2_ext_controls cs;
3228 struct v4l2_ext_control c1;
3229 memset(&cs, 0, sizeof(cs));
3230 memset(&c1, 0, sizeof(c1));
3231 cs.controls = &c1;
3232 cs.count = 1;
3233 c1.id = V4L2_CID_MPEG_VIDEO_GOP_SIZE;
3234 c1.value = gop_size;
3235 cx2341x_ext_ctrls(&hdw->enc_ctl_state, 0, &cs,
3236 VIDIOC_S_EXT_CTRLS);
3237 }
Mike Iselyd8554972006-06-26 20:58:46 -03003238 }
3239
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03003240 /* The broadcast decoder can only scale down, so if
3241 * res_*_dirty && crop window < output format ==> enlarge crop.
3242 *
3243 * The mpeg encoder receives fields of res_hor_val dots and
3244 * res_ver_val halflines. Limits: hor<=720, ver<=576.
3245 */
3246 if (hdw->res_hor_dirty && hdw->cropw_val < hdw->res_hor_val) {
3247 hdw->cropw_val = hdw->res_hor_val;
3248 hdw->cropw_dirty = !0;
3249 } else if (hdw->cropw_dirty) {
3250 hdw->res_hor_dirty = !0; /* must rescale */
3251 hdw->res_hor_val = min(720, hdw->cropw_val);
3252 }
3253 if (hdw->res_ver_dirty && hdw->croph_val < hdw->res_ver_val) {
3254 hdw->croph_val = hdw->res_ver_val;
3255 hdw->croph_dirty = !0;
3256 } else if (hdw->croph_dirty) {
3257 int nvres = hdw->std_mask_cur & V4L2_STD_525_60 ? 480 : 576;
3258 hdw->res_ver_dirty = !0;
3259 hdw->res_ver_val = min(nvres, hdw->croph_val);
3260 }
3261
Mike Isely681c7392007-11-26 01:48:52 -03003262 /* If any of the below has changed, then we can't do the update
3263 while the pipeline is running. Pipeline must be paused first
3264 and decoder -> encoder connection be made quiescent before we
3265 can proceed. */
3266 disruptive_change =
3267 (hdw->std_dirty ||
3268 hdw->enc_unsafe_stale ||
3269 hdw->srate_dirty ||
3270 hdw->res_ver_dirty ||
3271 hdw->res_hor_dirty ||
Mike Isely755879c2008-08-31 20:50:59 -03003272 hdw->cropw_dirty ||
3273 hdw->croph_dirty ||
Mike Isely681c7392007-11-26 01:48:52 -03003274 hdw->input_dirty ||
3275 (hdw->active_stream_type != hdw->desired_stream_type));
3276 if (disruptive_change && !hdw->state_pipeline_idle) {
3277 /* Pipeline is not idle; we can't proceed. Arrange to
3278 cause pipeline to stop so that we can try this again
3279 later.... */
3280 hdw->state_pipeline_pause = !0;
3281 return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03003282 }
3283
Mike Iselyb30d2442006-06-25 20:05:01 -03003284 if (hdw->srate_dirty) {
3285 /* Write new sample rate into control structure since
3286 * the master copy is stale. We must track srate
3287 * separate from the mpeg control structure because
3288 * other logic also uses this value. */
3289 struct v4l2_ext_controls cs;
3290 struct v4l2_ext_control c1;
3291 memset(&cs,0,sizeof(cs));
3292 memset(&c1,0,sizeof(c1));
3293 cs.controls = &c1;
3294 cs.count = 1;
3295 c1.id = V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ;
3296 c1.value = hdw->srate_val;
Hans Verkuil01f1e442007-08-21 18:32:42 -03003297 cx2341x_ext_ctrls(&hdw->enc_ctl_state, 0, &cs,VIDIOC_S_EXT_CTRLS);
Mike Iselyb30d2442006-06-25 20:05:01 -03003298 }
Mike Iselyc05c0462006-06-25 20:04:25 -03003299
Mike Isely681c7392007-11-26 01:48:52 -03003300 if (hdw->active_stream_type != hdw->desired_stream_type) {
3301 /* Handle any side effects of stream config here */
3302 hdw->active_stream_type = hdw->desired_stream_type;
3303 }
3304
Mike Isely1df59f02008-04-21 03:50:39 -03003305 if (hdw->hdw_desc->signal_routing_scheme ==
3306 PVR2_ROUTING_SCHEME_GOTVIEW) {
3307 u32 b;
3308 /* Handle GOTVIEW audio switching */
3309 pvr2_hdw_gpio_get_out(hdw,&b);
3310 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
3311 /* Set GPIO 11 */
3312 pvr2_hdw_gpio_chg_out(hdw,(1 << 11),~0);
3313 } else {
3314 /* Clear GPIO 11 */
3315 pvr2_hdw_gpio_chg_out(hdw,(1 << 11),0);
3316 }
3317 }
3318
Mike Iselye68a6192009-03-07 01:45:10 -03003319 /* Check and update state for all sub-devices. */
3320 pvr2_subdev_update(hdw);
3321
Mike Isely75212a02009-03-07 01:48:42 -03003322 hdw->tuner_updated = 0;
Mike Isely27764722009-03-07 01:57:25 -03003323 hdw->force_dirty = 0;
Mike Isely5ceaad12009-03-07 00:01:20 -03003324 for (idx = 0; idx < hdw->control_cnt; idx++) {
3325 cptr = hdw->controls + idx;
3326 if (!cptr->info->clear_dirty) continue;
3327 cptr->info->clear_dirty(cptr);
3328 }
3329
Mike Isely62433e32008-04-22 14:45:40 -03003330 if ((hdw->pathway_state == PVR2_PATHWAY_ANALOG) &&
3331 hdw->state_encoder_run) {
3332 /* If encoder isn't running or it can't be touched, then
3333 this will get worked out later when we start the
3334 encoder. */
Mike Isely681c7392007-11-26 01:48:52 -03003335 if (pvr2_encoder_adjust(hdw) < 0) return !0;
3336 }
Mike Iselyd8554972006-06-26 20:58:46 -03003337
Mike Isely681c7392007-11-26 01:48:52 -03003338 hdw->state_pipeline_config = !0;
Mike Isely432907f2008-08-31 21:02:20 -03003339 /* Hardware state may have changed in a way to cause the cropping
3340 capabilities to have changed. So mark it stale, which will
3341 cause a later re-fetch. */
Mike Isely681c7392007-11-26 01:48:52 -03003342 trace_stbit("state_pipeline_config",hdw->state_pipeline_config);
3343 return !0;
Mike Iselyd8554972006-06-26 20:58:46 -03003344}
3345
3346
3347int pvr2_hdw_commit_ctl(struct pvr2_hdw *hdw)
3348{
Mike Isely681c7392007-11-26 01:48:52 -03003349 int fl;
3350 LOCK_TAKE(hdw->big_lock);
3351 fl = pvr2_hdw_commit_setup(hdw);
3352 LOCK_GIVE(hdw->big_lock);
3353 if (!fl) return 0;
3354 return pvr2_hdw_wait(hdw,0);
Mike Iselyd8554972006-06-26 20:58:46 -03003355}
3356
3357
Mike Isely681c7392007-11-26 01:48:52 -03003358static void pvr2_hdw_worker_poll(struct work_struct *work)
Mike Iselyd8554972006-06-26 20:58:46 -03003359{
Mike Isely681c7392007-11-26 01:48:52 -03003360 int fl = 0;
3361 struct pvr2_hdw *hdw = container_of(work,struct pvr2_hdw,workpoll);
Mike Iselyd8554972006-06-26 20:58:46 -03003362 LOCK_TAKE(hdw->big_lock); do {
Mike Isely681c7392007-11-26 01:48:52 -03003363 fl = pvr2_hdw_state_eval(hdw);
3364 } while (0); LOCK_GIVE(hdw->big_lock);
3365 if (fl && hdw->state_func) {
3366 hdw->state_func(hdw->state_data);
3367 }
3368}
3369
3370
Mike Isely681c7392007-11-26 01:48:52 -03003371static int pvr2_hdw_wait(struct pvr2_hdw *hdw,int state)
Mike Iselyd8554972006-06-26 20:58:46 -03003372{
Mike Isely681c7392007-11-26 01:48:52 -03003373 return wait_event_interruptible(
3374 hdw->state_wait_data,
3375 (hdw->state_stale == 0) &&
3376 (!state || (hdw->master_state != state)));
Mike Iselyd8554972006-06-26 20:58:46 -03003377}
3378
Mike Isely681c7392007-11-26 01:48:52 -03003379
Mike Iselyd8554972006-06-26 20:58:46 -03003380/* Return name for this driver instance */
3381const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw)
3382{
3383 return hdw->name;
3384}
3385
3386
Mike Isely78a47102007-11-26 01:58:20 -03003387const char *pvr2_hdw_get_desc(struct pvr2_hdw *hdw)
3388{
3389 return hdw->hdw_desc->description;
3390}
3391
3392
3393const char *pvr2_hdw_get_type(struct pvr2_hdw *hdw)
3394{
3395 return hdw->hdw_desc->shortname;
3396}
3397
3398
Mike Iselyd8554972006-06-26 20:58:46 -03003399int pvr2_hdw_is_hsm(struct pvr2_hdw *hdw)
3400{
3401 int result;
3402 LOCK_TAKE(hdw->ctl_lock); do {
Michael Krufky8d364362007-01-22 02:17:55 -03003403 hdw->cmd_buffer[0] = FX2CMD_GET_USB_SPEED;
Mike Iselyd8554972006-06-26 20:58:46 -03003404 result = pvr2_send_request(hdw,
3405 hdw->cmd_buffer,1,
3406 hdw->cmd_buffer,1);
3407 if (result < 0) break;
3408 result = (hdw->cmd_buffer[0] != 0);
3409 } while(0); LOCK_GIVE(hdw->ctl_lock);
3410 return result;
3411}
3412
3413
Mike Isely18103c572007-01-20 00:09:47 -03003414/* Execute poll of tuner status */
3415void pvr2_hdw_execute_tuner_poll(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03003416{
Mike Iselyd8554972006-06-26 20:58:46 -03003417 LOCK_TAKE(hdw->big_lock); do {
Mike Iselya51f5002009-03-06 23:30:37 -03003418 pvr2_hdw_status_poll(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003419 } while (0); LOCK_GIVE(hdw->big_lock);
Mike Isely18103c572007-01-20 00:09:47 -03003420}
3421
3422
Mike Isely432907f2008-08-31 21:02:20 -03003423static int pvr2_hdw_check_cropcap(struct pvr2_hdw *hdw)
3424{
3425 if (!hdw->cropcap_stale) {
Mike Isely432907f2008-08-31 21:02:20 -03003426 return 0;
3427 }
Mike Iselya51f5002009-03-06 23:30:37 -03003428 pvr2_hdw_status_poll(hdw);
Mike Isely432907f2008-08-31 21:02:20 -03003429 if (hdw->cropcap_stale) {
Mike Isely432907f2008-08-31 21:02:20 -03003430 return -EIO;
3431 }
3432 return 0;
3433}
3434
3435
3436/* Return information about cropping capabilities */
3437int pvr2_hdw_get_cropcap(struct pvr2_hdw *hdw, struct v4l2_cropcap *pp)
3438{
3439 int stat = 0;
3440 LOCK_TAKE(hdw->big_lock);
3441 stat = pvr2_hdw_check_cropcap(hdw);
3442 if (!stat) {
Mike Isely432907f2008-08-31 21:02:20 -03003443 memcpy(pp, &hdw->cropcap_info, sizeof(hdw->cropcap_info));
3444 }
3445 LOCK_GIVE(hdw->big_lock);
3446 return stat;
3447}
3448
3449
Mike Isely18103c572007-01-20 00:09:47 -03003450/* Return information about the tuner */
3451int pvr2_hdw_get_tuner_status(struct pvr2_hdw *hdw,struct v4l2_tuner *vtp)
3452{
3453 LOCK_TAKE(hdw->big_lock); do {
3454 if (hdw->tuner_signal_stale) {
Mike Iselya51f5002009-03-06 23:30:37 -03003455 pvr2_hdw_status_poll(hdw);
Mike Isely18103c572007-01-20 00:09:47 -03003456 }
3457 memcpy(vtp,&hdw->tuner_signal_info,sizeof(struct v4l2_tuner));
3458 } while (0); LOCK_GIVE(hdw->big_lock);
3459 return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03003460}
3461
3462
3463/* Get handle to video output stream */
3464struct pvr2_stream *pvr2_hdw_get_video_stream(struct pvr2_hdw *hp)
3465{
3466 return hp->vid_stream;
3467}
3468
3469
3470void pvr2_hdw_trigger_module_log(struct pvr2_hdw *hdw)
3471{
Mike Isely4f1a3e52006-06-25 20:04:31 -03003472 int nr = pvr2_hdw_get_unit_number(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003473 LOCK_TAKE(hdw->big_lock); do {
Mike Isely4f1a3e52006-06-25 20:04:31 -03003474 printk(KERN_INFO "pvrusb2: ================= START STATUS CARD #%d =================\n", nr);
Mike Iselyed3261a2009-03-07 00:02:33 -03003475 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, log_status);
Mike Iselyb30d2442006-06-25 20:05:01 -03003476 pvr2_trace(PVR2_TRACE_INFO,"cx2341x config:");
Hans Verkuil99eb44f2006-06-26 18:24:05 -03003477 cx2341x_log_status(&hdw->enc_ctl_state, "pvrusb2");
Mike Isely681c7392007-11-26 01:48:52 -03003478 pvr2_hdw_state_log_state(hdw);
Mike Isely4f1a3e52006-06-25 20:04:31 -03003479 printk(KERN_INFO "pvrusb2: ================== END STATUS CARD #%d ==================\n", nr);
Mike Iselyd8554972006-06-26 20:58:46 -03003480 } while (0); LOCK_GIVE(hdw->big_lock);
3481}
3482
Mike Isely4db666c2007-09-08 22:16:27 -03003483
3484/* Grab EEPROM contents, needed for direct method. */
3485#define EEPROM_SIZE 8192
3486#define trace_eeprom(...) pvr2_trace(PVR2_TRACE_EEPROM,__VA_ARGS__)
3487static u8 *pvr2_full_eeprom_fetch(struct pvr2_hdw *hdw)
3488{
3489 struct i2c_msg msg[2];
3490 u8 *eeprom;
3491 u8 iadd[2];
3492 u8 addr;
3493 u16 eepromSize;
3494 unsigned int offs;
3495 int ret;
3496 int mode16 = 0;
3497 unsigned pcnt,tcnt;
3498 eeprom = kmalloc(EEPROM_SIZE,GFP_KERNEL);
3499 if (!eeprom) {
3500 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3501 "Failed to allocate memory"
3502 " required to read eeprom");
3503 return NULL;
3504 }
3505
3506 trace_eeprom("Value for eeprom addr from controller was 0x%x",
3507 hdw->eeprom_addr);
3508 addr = hdw->eeprom_addr;
3509 /* Seems that if the high bit is set, then the *real* eeprom
3510 address is shifted right now bit position (noticed this in
3511 newer PVR USB2 hardware) */
3512 if (addr & 0x80) addr >>= 1;
3513
3514 /* FX2 documentation states that a 16bit-addressed eeprom is
3515 expected if the I2C address is an odd number (yeah, this is
3516 strange but it's what they do) */
3517 mode16 = (addr & 1);
3518 eepromSize = (mode16 ? EEPROM_SIZE : 256);
3519 trace_eeprom("Examining %d byte eeprom at location 0x%x"
3520 " using %d bit addressing",eepromSize,addr,
3521 mode16 ? 16 : 8);
3522
3523 msg[0].addr = addr;
3524 msg[0].flags = 0;
3525 msg[0].len = mode16 ? 2 : 1;
3526 msg[0].buf = iadd;
3527 msg[1].addr = addr;
3528 msg[1].flags = I2C_M_RD;
3529
3530 /* We have to do the actual eeprom data fetch ourselves, because
3531 (1) we're only fetching part of the eeprom, and (2) if we were
3532 getting the whole thing our I2C driver can't grab it in one
3533 pass - which is what tveeprom is otherwise going to attempt */
3534 memset(eeprom,0,EEPROM_SIZE);
3535 for (tcnt = 0; tcnt < EEPROM_SIZE; tcnt += pcnt) {
3536 pcnt = 16;
3537 if (pcnt + tcnt > EEPROM_SIZE) pcnt = EEPROM_SIZE-tcnt;
3538 offs = tcnt + (eepromSize - EEPROM_SIZE);
3539 if (mode16) {
3540 iadd[0] = offs >> 8;
3541 iadd[1] = offs;
3542 } else {
3543 iadd[0] = offs;
3544 }
3545 msg[1].len = pcnt;
3546 msg[1].buf = eeprom+tcnt;
3547 if ((ret = i2c_transfer(&hdw->i2c_adap,
3548 msg,ARRAY_SIZE(msg))) != 2) {
3549 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3550 "eeprom fetch set offs err=%d",ret);
3551 kfree(eeprom);
3552 return NULL;
3553 }
3554 }
3555 return eeprom;
3556}
3557
3558
3559void pvr2_hdw_cpufw_set_enabled(struct pvr2_hdw *hdw,
Mike Isely568efaa2009-11-25 02:52:06 -03003560 int mode,
Mike Isely4db666c2007-09-08 22:16:27 -03003561 int enable_flag)
Mike Iselyd8554972006-06-26 20:58:46 -03003562{
3563 int ret;
3564 u16 address;
3565 unsigned int pipe;
3566 LOCK_TAKE(hdw->big_lock); do {
Al Viro5fa12472008-03-29 03:07:38 +00003567 if ((hdw->fw_buffer == NULL) == !enable_flag) break;
Mike Iselyd8554972006-06-26 20:58:46 -03003568
3569 if (!enable_flag) {
3570 pvr2_trace(PVR2_TRACE_FIRMWARE,
3571 "Cleaning up after CPU firmware fetch");
3572 kfree(hdw->fw_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03003573 hdw->fw_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03003574 hdw->fw_size = 0;
Mike Isely4db666c2007-09-08 22:16:27 -03003575 if (hdw->fw_cpu_flag) {
3576 /* Now release the CPU. It will disconnect
3577 and reconnect later. */
3578 pvr2_hdw_cpureset_assert(hdw,0);
3579 }
Mike Iselyd8554972006-06-26 20:58:46 -03003580 break;
3581 }
3582
Mike Isely568efaa2009-11-25 02:52:06 -03003583 hdw->fw_cpu_flag = (mode != 2);
Mike Isely4db666c2007-09-08 22:16:27 -03003584 if (hdw->fw_cpu_flag) {
Mike Isely568efaa2009-11-25 02:52:06 -03003585 hdw->fw_size = (mode == 1) ? 0x4000 : 0x2000;
Mike Isely4db666c2007-09-08 22:16:27 -03003586 pvr2_trace(PVR2_TRACE_FIRMWARE,
Mike Isely568efaa2009-11-25 02:52:06 -03003587 "Preparing to suck out CPU firmware"
3588 " (size=%u)", hdw->fw_size);
Mike Isely4db666c2007-09-08 22:16:27 -03003589 hdw->fw_buffer = kzalloc(hdw->fw_size,GFP_KERNEL);
3590 if (!hdw->fw_buffer) {
3591 hdw->fw_size = 0;
3592 break;
3593 }
3594
3595 /* We have to hold the CPU during firmware upload. */
3596 pvr2_hdw_cpureset_assert(hdw,1);
3597
3598 /* download the firmware from address 0000-1fff in 2048
3599 (=0x800) bytes chunk. */
3600
3601 pvr2_trace(PVR2_TRACE_FIRMWARE,
3602 "Grabbing CPU firmware");
3603 pipe = usb_rcvctrlpipe(hdw->usb_dev, 0);
3604 for(address = 0; address < hdw->fw_size;
3605 address += 0x800) {
3606 ret = usb_control_msg(hdw->usb_dev,pipe,
3607 0xa0,0xc0,
3608 address,0,
3609 hdw->fw_buffer+address,
3610 0x800,HZ);
3611 if (ret < 0) break;
3612 }
3613
3614 pvr2_trace(PVR2_TRACE_FIRMWARE,
3615 "Done grabbing CPU firmware");
3616 } else {
3617 pvr2_trace(PVR2_TRACE_FIRMWARE,
3618 "Sucking down EEPROM contents");
3619 hdw->fw_buffer = pvr2_full_eeprom_fetch(hdw);
3620 if (!hdw->fw_buffer) {
3621 pvr2_trace(PVR2_TRACE_FIRMWARE,
3622 "EEPROM content suck failed.");
3623 break;
3624 }
3625 hdw->fw_size = EEPROM_SIZE;
3626 pvr2_trace(PVR2_TRACE_FIRMWARE,
3627 "Done sucking down EEPROM contents");
Mike Iselyd8554972006-06-26 20:58:46 -03003628 }
3629
Mike Iselyd8554972006-06-26 20:58:46 -03003630 } while (0); LOCK_GIVE(hdw->big_lock);
3631}
3632
3633
3634/* Return true if we're in a mode for retrieval CPU firmware */
3635int pvr2_hdw_cpufw_get_enabled(struct pvr2_hdw *hdw)
3636{
Al Viro5fa12472008-03-29 03:07:38 +00003637 return hdw->fw_buffer != NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03003638}
3639
3640
3641int pvr2_hdw_cpufw_get(struct pvr2_hdw *hdw,unsigned int offs,
3642 char *buf,unsigned int cnt)
3643{
3644 int ret = -EINVAL;
3645 LOCK_TAKE(hdw->big_lock); do {
3646 if (!buf) break;
3647 if (!cnt) break;
3648
3649 if (!hdw->fw_buffer) {
3650 ret = -EIO;
3651 break;
3652 }
3653
3654 if (offs >= hdw->fw_size) {
3655 pvr2_trace(PVR2_TRACE_FIRMWARE,
3656 "Read firmware data offs=%d EOF",
3657 offs);
3658 ret = 0;
3659 break;
3660 }
3661
3662 if (offs + cnt > hdw->fw_size) cnt = hdw->fw_size - offs;
3663
3664 memcpy(buf,hdw->fw_buffer+offs,cnt);
3665
3666 pvr2_trace(PVR2_TRACE_FIRMWARE,
3667 "Read firmware data offs=%d cnt=%d",
3668 offs,cnt);
3669 ret = cnt;
3670 } while (0); LOCK_GIVE(hdw->big_lock);
3671
3672 return ret;
3673}
3674
3675
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003676int pvr2_hdw_v4l_get_minor_number(struct pvr2_hdw *hdw,
Mike Isely80793842006-12-27 23:12:28 -03003677 enum pvr2_v4l_type index)
Mike Iselyd8554972006-06-26 20:58:46 -03003678{
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003679 switch (index) {
Mike Isely80793842006-12-27 23:12:28 -03003680 case pvr2_v4l_type_video: return hdw->v4l_minor_number_video;
3681 case pvr2_v4l_type_vbi: return hdw->v4l_minor_number_vbi;
3682 case pvr2_v4l_type_radio: return hdw->v4l_minor_number_radio;
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003683 default: return -1;
3684 }
Mike Iselyd8554972006-06-26 20:58:46 -03003685}
3686
3687
Pantelis Koukousoulas2fdf3d92006-12-27 23:07:58 -03003688/* Store a v4l minor device number */
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003689void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *hdw,
Mike Isely80793842006-12-27 23:12:28 -03003690 enum pvr2_v4l_type index,int v)
Mike Iselyd8554972006-06-26 20:58:46 -03003691{
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003692 switch (index) {
Mike Isely80793842006-12-27 23:12:28 -03003693 case pvr2_v4l_type_video: hdw->v4l_minor_number_video = v;
3694 case pvr2_v4l_type_vbi: hdw->v4l_minor_number_vbi = v;
3695 case pvr2_v4l_type_radio: hdw->v4l_minor_number_radio = v;
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003696 default: break;
3697 }
Mike Iselyd8554972006-06-26 20:58:46 -03003698}
3699
3700
David Howells7d12e782006-10-05 14:55:46 +01003701static void pvr2_ctl_write_complete(struct urb *urb)
Mike Iselyd8554972006-06-26 20:58:46 -03003702{
3703 struct pvr2_hdw *hdw = urb->context;
3704 hdw->ctl_write_pend_flag = 0;
3705 if (hdw->ctl_read_pend_flag) return;
3706 complete(&hdw->ctl_done);
3707}
3708
3709
David Howells7d12e782006-10-05 14:55:46 +01003710static void pvr2_ctl_read_complete(struct urb *urb)
Mike Iselyd8554972006-06-26 20:58:46 -03003711{
3712 struct pvr2_hdw *hdw = urb->context;
3713 hdw->ctl_read_pend_flag = 0;
3714 if (hdw->ctl_write_pend_flag) return;
3715 complete(&hdw->ctl_done);
3716}
3717
3718
3719static void pvr2_ctl_timeout(unsigned long data)
3720{
3721 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
3722 if (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
3723 hdw->ctl_timeout_flag = !0;
Mariusz Kozlowski5e55d2c2006-11-08 15:34:31 +01003724 if (hdw->ctl_write_pend_flag)
Mike Iselyd8554972006-06-26 20:58:46 -03003725 usb_unlink_urb(hdw->ctl_write_urb);
Mariusz Kozlowski5e55d2c2006-11-08 15:34:31 +01003726 if (hdw->ctl_read_pend_flag)
Mike Iselyd8554972006-06-26 20:58:46 -03003727 usb_unlink_urb(hdw->ctl_read_urb);
Mike Iselyd8554972006-06-26 20:58:46 -03003728 }
3729}
3730
3731
Mike Iselye61b6fc2006-07-18 22:42:18 -03003732/* Issue a command and get a response from the device. This extended
3733 version includes a probe flag (which if set means that device errors
3734 should not be logged or treated as fatal) and a timeout in jiffies.
3735 This can be used to non-lethally probe the health of endpoint 1. */
Adrian Bunk07e337e2006-06-30 11:30:20 -03003736static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
3737 unsigned int timeout,int probe_fl,
3738 void *write_data,unsigned int write_len,
3739 void *read_data,unsigned int read_len)
Mike Iselyd8554972006-06-26 20:58:46 -03003740{
3741 unsigned int idx;
3742 int status = 0;
3743 struct timer_list timer;
3744 if (!hdw->ctl_lock_held) {
3745 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3746 "Attempted to execute control transfer"
3747 " without lock!!");
3748 return -EDEADLK;
3749 }
Mike Isely681c7392007-11-26 01:48:52 -03003750 if (!hdw->flag_ok && !probe_fl) {
Mike Iselyd8554972006-06-26 20:58:46 -03003751 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3752 "Attempted to execute control transfer"
3753 " when device not ok");
3754 return -EIO;
3755 }
3756 if (!(hdw->ctl_read_urb && hdw->ctl_write_urb)) {
3757 if (!probe_fl) {
3758 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3759 "Attempted to execute control transfer"
3760 " when USB is disconnected");
3761 }
3762 return -ENOTTY;
3763 }
3764
3765 /* Ensure that we have sane parameters */
3766 if (!write_data) write_len = 0;
3767 if (!read_data) read_len = 0;
3768 if (write_len > PVR2_CTL_BUFFSIZE) {
3769 pvr2_trace(
3770 PVR2_TRACE_ERROR_LEGS,
3771 "Attempted to execute %d byte"
3772 " control-write transfer (limit=%d)",
3773 write_len,PVR2_CTL_BUFFSIZE);
3774 return -EINVAL;
3775 }
3776 if (read_len > PVR2_CTL_BUFFSIZE) {
3777 pvr2_trace(
3778 PVR2_TRACE_ERROR_LEGS,
3779 "Attempted to execute %d byte"
3780 " control-read transfer (limit=%d)",
3781 write_len,PVR2_CTL_BUFFSIZE);
3782 return -EINVAL;
3783 }
3784 if ((!write_len) && (!read_len)) {
3785 pvr2_trace(
3786 PVR2_TRACE_ERROR_LEGS,
3787 "Attempted to execute null control transfer?");
3788 return -EINVAL;
3789 }
3790
3791
3792 hdw->cmd_debug_state = 1;
3793 if (write_len) {
3794 hdw->cmd_debug_code = ((unsigned char *)write_data)[0];
3795 } else {
3796 hdw->cmd_debug_code = 0;
3797 }
3798 hdw->cmd_debug_write_len = write_len;
3799 hdw->cmd_debug_read_len = read_len;
3800
3801 /* Initialize common stuff */
3802 init_completion(&hdw->ctl_done);
3803 hdw->ctl_timeout_flag = 0;
3804 hdw->ctl_write_pend_flag = 0;
3805 hdw->ctl_read_pend_flag = 0;
3806 init_timer(&timer);
3807 timer.expires = jiffies + timeout;
3808 timer.data = (unsigned long)hdw;
3809 timer.function = pvr2_ctl_timeout;
3810
3811 if (write_len) {
3812 hdw->cmd_debug_state = 2;
3813 /* Transfer write data to internal buffer */
3814 for (idx = 0; idx < write_len; idx++) {
3815 hdw->ctl_write_buffer[idx] =
3816 ((unsigned char *)write_data)[idx];
3817 }
3818 /* Initiate a write request */
3819 usb_fill_bulk_urb(hdw->ctl_write_urb,
3820 hdw->usb_dev,
3821 usb_sndbulkpipe(hdw->usb_dev,
3822 PVR2_CTL_WRITE_ENDPOINT),
3823 hdw->ctl_write_buffer,
3824 write_len,
3825 pvr2_ctl_write_complete,
3826 hdw);
3827 hdw->ctl_write_urb->actual_length = 0;
3828 hdw->ctl_write_pend_flag = !0;
3829 status = usb_submit_urb(hdw->ctl_write_urb,GFP_KERNEL);
3830 if (status < 0) {
3831 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3832 "Failed to submit write-control"
3833 " URB status=%d",status);
3834 hdw->ctl_write_pend_flag = 0;
3835 goto done;
3836 }
3837 }
3838
3839 if (read_len) {
3840 hdw->cmd_debug_state = 3;
3841 memset(hdw->ctl_read_buffer,0x43,read_len);
3842 /* Initiate a read request */
3843 usb_fill_bulk_urb(hdw->ctl_read_urb,
3844 hdw->usb_dev,
3845 usb_rcvbulkpipe(hdw->usb_dev,
3846 PVR2_CTL_READ_ENDPOINT),
3847 hdw->ctl_read_buffer,
3848 read_len,
3849 pvr2_ctl_read_complete,
3850 hdw);
3851 hdw->ctl_read_urb->actual_length = 0;
3852 hdw->ctl_read_pend_flag = !0;
3853 status = usb_submit_urb(hdw->ctl_read_urb,GFP_KERNEL);
3854 if (status < 0) {
3855 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3856 "Failed to submit read-control"
3857 " URB status=%d",status);
3858 hdw->ctl_read_pend_flag = 0;
3859 goto done;
3860 }
3861 }
3862
3863 /* Start timer */
3864 add_timer(&timer);
3865
3866 /* Now wait for all I/O to complete */
3867 hdw->cmd_debug_state = 4;
3868 while (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
3869 wait_for_completion(&hdw->ctl_done);
3870 }
3871 hdw->cmd_debug_state = 5;
3872
3873 /* Stop timer */
3874 del_timer_sync(&timer);
3875
3876 hdw->cmd_debug_state = 6;
3877 status = 0;
3878
3879 if (hdw->ctl_timeout_flag) {
3880 status = -ETIMEDOUT;
3881 if (!probe_fl) {
3882 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3883 "Timed out control-write");
3884 }
3885 goto done;
3886 }
3887
3888 if (write_len) {
3889 /* Validate results of write request */
3890 if ((hdw->ctl_write_urb->status != 0) &&
3891 (hdw->ctl_write_urb->status != -ENOENT) &&
3892 (hdw->ctl_write_urb->status != -ESHUTDOWN) &&
3893 (hdw->ctl_write_urb->status != -ECONNRESET)) {
3894 /* USB subsystem is reporting some kind of failure
3895 on the write */
3896 status = hdw->ctl_write_urb->status;
3897 if (!probe_fl) {
3898 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3899 "control-write URB failure,"
3900 " status=%d",
3901 status);
3902 }
3903 goto done;
3904 }
3905 if (hdw->ctl_write_urb->actual_length < write_len) {
3906 /* Failed to write enough data */
3907 status = -EIO;
3908 if (!probe_fl) {
3909 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3910 "control-write URB short,"
3911 " expected=%d got=%d",
3912 write_len,
3913 hdw->ctl_write_urb->actual_length);
3914 }
3915 goto done;
3916 }
3917 }
3918 if (read_len) {
3919 /* Validate results of read request */
3920 if ((hdw->ctl_read_urb->status != 0) &&
3921 (hdw->ctl_read_urb->status != -ENOENT) &&
3922 (hdw->ctl_read_urb->status != -ESHUTDOWN) &&
3923 (hdw->ctl_read_urb->status != -ECONNRESET)) {
3924 /* USB subsystem is reporting some kind of failure
3925 on the read */
3926 status = hdw->ctl_read_urb->status;
3927 if (!probe_fl) {
3928 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3929 "control-read URB failure,"
3930 " status=%d",
3931 status);
3932 }
3933 goto done;
3934 }
3935 if (hdw->ctl_read_urb->actual_length < read_len) {
3936 /* Failed to read enough data */
3937 status = -EIO;
3938 if (!probe_fl) {
3939 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3940 "control-read URB short,"
3941 " expected=%d got=%d",
3942 read_len,
3943 hdw->ctl_read_urb->actual_length);
3944 }
3945 goto done;
3946 }
3947 /* Transfer retrieved data out from internal buffer */
3948 for (idx = 0; idx < read_len; idx++) {
3949 ((unsigned char *)read_data)[idx] =
3950 hdw->ctl_read_buffer[idx];
3951 }
3952 }
3953
3954 done:
3955
3956 hdw->cmd_debug_state = 0;
3957 if ((status < 0) && (!probe_fl)) {
Mike Isely681c7392007-11-26 01:48:52 -03003958 pvr2_hdw_render_useless(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003959 }
3960 return status;
3961}
3962
3963
3964int pvr2_send_request(struct pvr2_hdw *hdw,
3965 void *write_data,unsigned int write_len,
3966 void *read_data,unsigned int read_len)
3967{
3968 return pvr2_send_request_ex(hdw,HZ*4,0,
3969 write_data,write_len,
3970 read_data,read_len);
3971}
3972
Mike Isely1c9d10d2008-03-28 05:38:54 -03003973
3974static int pvr2_issue_simple_cmd(struct pvr2_hdw *hdw,u32 cmdcode)
3975{
3976 int ret;
3977 unsigned int cnt = 1;
3978 unsigned int args = 0;
3979 LOCK_TAKE(hdw->ctl_lock);
3980 hdw->cmd_buffer[0] = cmdcode & 0xffu;
3981 args = (cmdcode >> 8) & 0xffu;
3982 args = (args > 2) ? 2 : args;
3983 if (args) {
3984 cnt += args;
3985 hdw->cmd_buffer[1] = (cmdcode >> 16) & 0xffu;
3986 if (args > 1) {
3987 hdw->cmd_buffer[2] = (cmdcode >> 24) & 0xffu;
3988 }
3989 }
3990 if (pvrusb2_debug & PVR2_TRACE_INIT) {
3991 unsigned int idx;
3992 unsigned int ccnt,bcnt;
3993 char tbuf[50];
3994 cmdcode &= 0xffu;
3995 bcnt = 0;
3996 ccnt = scnprintf(tbuf+bcnt,
3997 sizeof(tbuf)-bcnt,
3998 "Sending FX2 command 0x%x",cmdcode);
3999 bcnt += ccnt;
4000 for (idx = 0; idx < ARRAY_SIZE(pvr2_fx2cmd_desc); idx++) {
4001 if (pvr2_fx2cmd_desc[idx].id == cmdcode) {
4002 ccnt = scnprintf(tbuf+bcnt,
4003 sizeof(tbuf)-bcnt,
4004 " \"%s\"",
4005 pvr2_fx2cmd_desc[idx].desc);
4006 bcnt += ccnt;
4007 break;
4008 }
4009 }
4010 if (args) {
4011 ccnt = scnprintf(tbuf+bcnt,
4012 sizeof(tbuf)-bcnt,
4013 " (%u",hdw->cmd_buffer[1]);
4014 bcnt += ccnt;
4015 if (args > 1) {
4016 ccnt = scnprintf(tbuf+bcnt,
4017 sizeof(tbuf)-bcnt,
4018 ",%u",hdw->cmd_buffer[2]);
4019 bcnt += ccnt;
4020 }
4021 ccnt = scnprintf(tbuf+bcnt,
4022 sizeof(tbuf)-bcnt,
4023 ")");
4024 bcnt += ccnt;
4025 }
4026 pvr2_trace(PVR2_TRACE_INIT,"%.*s",bcnt,tbuf);
4027 }
4028 ret = pvr2_send_request(hdw,hdw->cmd_buffer,cnt,NULL,0);
4029 LOCK_GIVE(hdw->ctl_lock);
4030 return ret;
4031}
4032
4033
Mike Iselyd8554972006-06-26 20:58:46 -03004034int pvr2_write_register(struct pvr2_hdw *hdw, u16 reg, u32 data)
4035{
4036 int ret;
4037
4038 LOCK_TAKE(hdw->ctl_lock);
4039
Michael Krufky8d364362007-01-22 02:17:55 -03004040 hdw->cmd_buffer[0] = FX2CMD_REG_WRITE; /* write register prefix */
Mike Iselyd8554972006-06-26 20:58:46 -03004041 PVR2_DECOMPOSE_LE(hdw->cmd_buffer,1,data);
4042 hdw->cmd_buffer[5] = 0;
4043 hdw->cmd_buffer[6] = (reg >> 8) & 0xff;
4044 hdw->cmd_buffer[7] = reg & 0xff;
4045
4046
4047 ret = pvr2_send_request(hdw, hdw->cmd_buffer, 8, hdw->cmd_buffer, 0);
4048
4049 LOCK_GIVE(hdw->ctl_lock);
4050
4051 return ret;
4052}
4053
4054
Adrian Bunk07e337e2006-06-30 11:30:20 -03004055static int pvr2_read_register(struct pvr2_hdw *hdw, u16 reg, u32 *data)
Mike Iselyd8554972006-06-26 20:58:46 -03004056{
4057 int ret = 0;
4058
4059 LOCK_TAKE(hdw->ctl_lock);
4060
Michael Krufky8d364362007-01-22 02:17:55 -03004061 hdw->cmd_buffer[0] = FX2CMD_REG_READ; /* read register prefix */
Mike Iselyd8554972006-06-26 20:58:46 -03004062 hdw->cmd_buffer[1] = 0;
4063 hdw->cmd_buffer[2] = 0;
4064 hdw->cmd_buffer[3] = 0;
4065 hdw->cmd_buffer[4] = 0;
4066 hdw->cmd_buffer[5] = 0;
4067 hdw->cmd_buffer[6] = (reg >> 8) & 0xff;
4068 hdw->cmd_buffer[7] = reg & 0xff;
4069
4070 ret |= pvr2_send_request(hdw, hdw->cmd_buffer, 8, hdw->cmd_buffer, 4);
4071 *data = PVR2_COMPOSE_LE(hdw->cmd_buffer,0);
4072
4073 LOCK_GIVE(hdw->ctl_lock);
4074
4075 return ret;
4076}
4077
4078
Mike Isely681c7392007-11-26 01:48:52 -03004079void pvr2_hdw_render_useless(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03004080{
4081 if (!hdw->flag_ok) return;
Mike Isely681c7392007-11-26 01:48:52 -03004082 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
4083 "Device being rendered inoperable");
Mike Iselyd8554972006-06-26 20:58:46 -03004084 if (hdw->vid_stream) {
Mike Iselya0fd1cb2006-06-30 11:35:28 -03004085 pvr2_stream_setup(hdw->vid_stream,NULL,0,0);
Mike Iselyd8554972006-06-26 20:58:46 -03004086 }
Mike Isely681c7392007-11-26 01:48:52 -03004087 hdw->flag_ok = 0;
4088 trace_stbit("flag_ok",hdw->flag_ok);
4089 pvr2_hdw_state_sched(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03004090}
4091
4092
4093void pvr2_hdw_device_reset(struct pvr2_hdw *hdw)
4094{
4095 int ret;
4096 pvr2_trace(PVR2_TRACE_INIT,"Performing a device reset...");
Mike Iselya0fd1cb2006-06-30 11:35:28 -03004097 ret = usb_lock_device_for_reset(hdw->usb_dev,NULL);
Alan Stern011b15d2008-11-04 11:29:27 -05004098 if (ret == 0) {
Mike Iselyd8554972006-06-26 20:58:46 -03004099 ret = usb_reset_device(hdw->usb_dev);
4100 usb_unlock_device(hdw->usb_dev);
4101 } else {
4102 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
4103 "Failed to lock USB device ret=%d",ret);
4104 }
4105 if (init_pause_msec) {
4106 pvr2_trace(PVR2_TRACE_INFO,
4107 "Waiting %u msec for hardware to settle",
4108 init_pause_msec);
4109 msleep(init_pause_msec);
4110 }
4111
4112}
4113
4114
4115void pvr2_hdw_cpureset_assert(struct pvr2_hdw *hdw,int val)
4116{
Mike Isely68618002010-05-15 00:09:47 -03004117 char *da;
Mike Iselyd8554972006-06-26 20:58:46 -03004118 unsigned int pipe;
4119 int ret;
4120
4121 if (!hdw->usb_dev) return;
4122
Mike Isely68618002010-05-15 00:09:47 -03004123 da = kmalloc(16, GFP_KERNEL);
4124
4125 if (da == NULL) {
4126 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
4127 "Unable to allocate memory to control CPU reset");
4128 return;
4129 }
4130
Mike Iselyd8554972006-06-26 20:58:46 -03004131 pvr2_trace(PVR2_TRACE_INIT,"cpureset_assert(%d)",val);
4132
4133 da[0] = val ? 0x01 : 0x00;
4134
4135 /* Write the CPUCS register on the 8051. The lsb of the register
4136 is the reset bit; a 1 asserts reset while a 0 clears it. */
4137 pipe = usb_sndctrlpipe(hdw->usb_dev, 0);
4138 ret = usb_control_msg(hdw->usb_dev,pipe,0xa0,0x40,0xe600,0,da,1,HZ);
4139 if (ret < 0) {
4140 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
4141 "cpureset_assert(%d) error=%d",val,ret);
4142 pvr2_hdw_render_useless(hdw);
4143 }
Mike Isely68618002010-05-15 00:09:47 -03004144
4145 kfree(da);
Mike Iselyd8554972006-06-26 20:58:46 -03004146}
4147
4148
4149int pvr2_hdw_cmd_deep_reset(struct pvr2_hdw *hdw)
4150{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004151 return pvr2_issue_simple_cmd(hdw,FX2CMD_DEEP_RESET);
Mike Iselyd8554972006-06-26 20:58:46 -03004152}
4153
4154
Michael Krufkye1edb192008-04-22 14:45:39 -03004155int pvr2_hdw_cmd_powerup(struct pvr2_hdw *hdw)
4156{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004157 return pvr2_issue_simple_cmd(hdw,FX2CMD_POWER_ON);
Michael Krufkye1edb192008-04-22 14:45:39 -03004158}
4159
Mike Isely1c9d10d2008-03-28 05:38:54 -03004160
Michael Krufkye1edb192008-04-22 14:45:39 -03004161int pvr2_hdw_cmd_powerdown(struct pvr2_hdw *hdw)
4162{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004163 return pvr2_issue_simple_cmd(hdw,FX2CMD_POWER_OFF);
Michael Krufkye1edb192008-04-22 14:45:39 -03004164}
4165
Mike Iselyd8554972006-06-26 20:58:46 -03004166
4167int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw)
4168{
Mike Iselyd8554972006-06-26 20:58:46 -03004169 pvr2_trace(PVR2_TRACE_INIT,
4170 "Requesting decoder reset");
Mike Iselyaf78e162009-03-07 00:21:30 -03004171 if (hdw->decoder_client_id) {
4172 v4l2_device_call_all(&hdw->v4l2_dev, hdw->decoder_client_id,
4173 core, reset, 0);
Mike Iselye17d7872009-06-20 14:45:52 -03004174 pvr2_hdw_cx25840_vbi_hack(hdw);
Mike Iselyaf78e162009-03-07 00:21:30 -03004175 return 0;
4176 }
4177 pvr2_trace(PVR2_TRACE_INIT,
4178 "Unable to reset decoder: nothing attached");
4179 return -ENOTTY;
Mike Iselyd8554972006-06-26 20:58:46 -03004180}
4181
4182
Mike Isely62433e32008-04-22 14:45:40 -03004183static int pvr2_hdw_cmd_hcw_demod_reset(struct pvr2_hdw *hdw, int onoff)
Mike Isely84147f32008-04-22 14:45:40 -03004184{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004185 hdw->flag_ok = !0;
4186 return pvr2_issue_simple_cmd(hdw,
4187 FX2CMD_HCW_DEMOD_RESETIN |
4188 (1 << 8) |
4189 ((onoff ? 1 : 0) << 16));
Mike Isely84147f32008-04-22 14:45:40 -03004190}
4191
Mike Isely84147f32008-04-22 14:45:40 -03004192
Mike Isely62433e32008-04-22 14:45:40 -03004193static int pvr2_hdw_cmd_onair_fe_power_ctrl(struct pvr2_hdw *hdw, int onoff)
Mike Isely84147f32008-04-22 14:45:40 -03004194{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004195 hdw->flag_ok = !0;
4196 return pvr2_issue_simple_cmd(hdw,(onoff ?
4197 FX2CMD_ONAIR_DTV_POWER_ON :
4198 FX2CMD_ONAIR_DTV_POWER_OFF));
Mike Isely84147f32008-04-22 14:45:40 -03004199}
4200
Mike Isely62433e32008-04-22 14:45:40 -03004201
4202static int pvr2_hdw_cmd_onair_digital_path_ctrl(struct pvr2_hdw *hdw,
4203 int onoff)
Mike Isely84147f32008-04-22 14:45:40 -03004204{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004205 return pvr2_issue_simple_cmd(hdw,(onoff ?
4206 FX2CMD_ONAIR_DTV_STREAMING_ON :
4207 FX2CMD_ONAIR_DTV_STREAMING_OFF));
Mike Isely84147f32008-04-22 14:45:40 -03004208}
4209
Mike Isely62433e32008-04-22 14:45:40 -03004210
4211static void pvr2_hdw_cmd_modeswitch(struct pvr2_hdw *hdw,int digitalFl)
4212{
4213 int cmode;
4214 /* Compare digital/analog desired setting with current setting. If
4215 they don't match, fix it... */
4216 cmode = (digitalFl ? PVR2_PATHWAY_DIGITAL : PVR2_PATHWAY_ANALOG);
4217 if (cmode == hdw->pathway_state) {
4218 /* They match; nothing to do */
4219 return;
4220 }
4221
4222 switch (hdw->hdw_desc->digital_control_scheme) {
4223 case PVR2_DIGITAL_SCHEME_HAUPPAUGE:
4224 pvr2_hdw_cmd_hcw_demod_reset(hdw,digitalFl);
4225 if (cmode == PVR2_PATHWAY_ANALOG) {
4226 /* If moving to analog mode, also force the decoder
4227 to reset. If no decoder is attached, then it's
4228 ok to ignore this because if/when the decoder
4229 attaches, it will reset itself at that time. */
4230 pvr2_hdw_cmd_decoder_reset(hdw);
4231 }
4232 break;
4233 case PVR2_DIGITAL_SCHEME_ONAIR:
4234 /* Supposedly we should always have the power on whether in
4235 digital or analog mode. But for now do what appears to
4236 work... */
Mike Iselybb0c2fe2008-03-28 05:41:19 -03004237 pvr2_hdw_cmd_onair_fe_power_ctrl(hdw,digitalFl);
Mike Isely62433e32008-04-22 14:45:40 -03004238 break;
4239 default: break;
4240 }
4241
Mike Isely1b9c18c2008-04-22 14:45:41 -03004242 pvr2_hdw_untrip_unlocked(hdw);
Mike Isely62433e32008-04-22 14:45:40 -03004243 hdw->pathway_state = cmode;
4244}
4245
4246
Adrian Bunke9b59f62008-05-10 04:35:24 -03004247static void pvr2_led_ctrl_hauppauge(struct pvr2_hdw *hdw, int onoff)
Mike Iselyc55a97d2008-04-22 14:45:41 -03004248{
4249 /* change some GPIO data
4250 *
4251 * note: bit d7 of dir appears to control the LED,
4252 * so we shut it off here.
4253 *
Mike Iselyc55a97d2008-04-22 14:45:41 -03004254 */
Mike Isely40381cb2008-04-22 14:45:42 -03004255 if (onoff) {
Mike Iselyc55a97d2008-04-22 14:45:41 -03004256 pvr2_hdw_gpio_chg_dir(hdw, 0xffffffff, 0x00000481);
Mike Isely40381cb2008-04-22 14:45:42 -03004257 } else {
Mike Iselyc55a97d2008-04-22 14:45:41 -03004258 pvr2_hdw_gpio_chg_dir(hdw, 0xffffffff, 0x00000401);
Mike Isely40381cb2008-04-22 14:45:42 -03004259 }
Mike Iselyc55a97d2008-04-22 14:45:41 -03004260 pvr2_hdw_gpio_chg_out(hdw, 0xffffffff, 0x00000000);
Mike Isely40381cb2008-04-22 14:45:42 -03004261}
Mike Iselyc55a97d2008-04-22 14:45:41 -03004262
Mike Isely40381cb2008-04-22 14:45:42 -03004263
4264typedef void (*led_method_func)(struct pvr2_hdw *,int);
4265
4266static led_method_func led_methods[] = {
4267 [PVR2_LED_SCHEME_HAUPPAUGE] = pvr2_led_ctrl_hauppauge,
4268};
4269
4270
4271/* Toggle LED */
4272static void pvr2_led_ctrl(struct pvr2_hdw *hdw,int onoff)
4273{
4274 unsigned int scheme_id;
4275 led_method_func fp;
4276
4277 if ((!onoff) == (!hdw->led_on)) return;
4278
4279 hdw->led_on = onoff != 0;
4280
4281 scheme_id = hdw->hdw_desc->led_scheme;
4282 if (scheme_id < ARRAY_SIZE(led_methods)) {
4283 fp = led_methods[scheme_id];
4284 } else {
4285 fp = NULL;
4286 }
4287
4288 if (fp) (*fp)(hdw,onoff);
Mike Iselyc55a97d2008-04-22 14:45:41 -03004289}
4290
4291
Mike Iselye61b6fc2006-07-18 22:42:18 -03004292/* Stop / start video stream transport */
Adrian Bunk07e337e2006-06-30 11:30:20 -03004293static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl)
Mike Iselyd8554972006-06-26 20:58:46 -03004294{
Mike Iselybb0c2fe2008-03-28 05:41:19 -03004295 int ret;
4296
4297 /* If we're in analog mode, then just issue the usual analog
4298 command. */
4299 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
4300 return pvr2_issue_simple_cmd(hdw,
4301 (runFl ?
4302 FX2CMD_STREAMING_ON :
4303 FX2CMD_STREAMING_OFF));
4304 /*Note: Not reached */
Mike Isely62433e32008-04-22 14:45:40 -03004305 }
Mike Iselybb0c2fe2008-03-28 05:41:19 -03004306
4307 if (hdw->pathway_state != PVR2_PATHWAY_DIGITAL) {
4308 /* Whoops, we don't know what mode we're in... */
4309 return -EINVAL;
4310 }
4311
4312 /* To get here we have to be in digital mode. The mechanism here
4313 is unfortunately different for different vendors. So we switch
4314 on the device's digital scheme attribute in order to figure out
4315 what to do. */
4316 switch (hdw->hdw_desc->digital_control_scheme) {
4317 case PVR2_DIGITAL_SCHEME_HAUPPAUGE:
4318 return pvr2_issue_simple_cmd(hdw,
4319 (runFl ?
4320 FX2CMD_HCW_DTV_STREAMING_ON :
4321 FX2CMD_HCW_DTV_STREAMING_OFF));
4322 case PVR2_DIGITAL_SCHEME_ONAIR:
4323 ret = pvr2_issue_simple_cmd(hdw,
4324 (runFl ?
4325 FX2CMD_STREAMING_ON :
4326 FX2CMD_STREAMING_OFF));
4327 if (ret) return ret;
4328 return pvr2_hdw_cmd_onair_digital_path_ctrl(hdw,runFl);
4329 default:
4330 return -EINVAL;
4331 }
Mike Iselyd8554972006-06-26 20:58:46 -03004332}
4333
4334
Mike Isely62433e32008-04-22 14:45:40 -03004335/* Evaluate whether or not state_pathway_ok can change */
4336static int state_eval_pathway_ok(struct pvr2_hdw *hdw)
4337{
4338 if (hdw->state_pathway_ok) {
4339 /* Nothing to do if pathway is already ok */
4340 return 0;
4341 }
4342 if (!hdw->state_pipeline_idle) {
4343 /* Not allowed to change anything if pipeline is not idle */
4344 return 0;
4345 }
4346 pvr2_hdw_cmd_modeswitch(hdw,hdw->input_val == PVR2_CVAL_INPUT_DTV);
4347 hdw->state_pathway_ok = !0;
Mike Iselye9db1ff2008-04-22 14:45:41 -03004348 trace_stbit("state_pathway_ok",hdw->state_pathway_ok);
Mike Isely62433e32008-04-22 14:45:40 -03004349 return !0;
4350}
4351
4352
Mike Isely681c7392007-11-26 01:48:52 -03004353/* Evaluate whether or not state_encoder_ok can change */
4354static int state_eval_encoder_ok(struct pvr2_hdw *hdw)
4355{
4356 if (hdw->state_encoder_ok) return 0;
4357 if (hdw->flag_tripped) return 0;
4358 if (hdw->state_encoder_run) return 0;
4359 if (hdw->state_encoder_config) return 0;
4360 if (hdw->state_decoder_run) return 0;
4361 if (hdw->state_usbstream_run) return 0;
Mike Isely72998b72008-04-03 04:51:19 -03004362 if (hdw->pathway_state == PVR2_PATHWAY_DIGITAL) {
4363 if (!hdw->hdw_desc->flag_digital_requires_cx23416) return 0;
4364 } else if (hdw->pathway_state != PVR2_PATHWAY_ANALOG) {
4365 return 0;
4366 }
4367
Mike Isely681c7392007-11-26 01:48:52 -03004368 if (pvr2_upload_firmware2(hdw) < 0) {
4369 hdw->flag_tripped = !0;
4370 trace_stbit("flag_tripped",hdw->flag_tripped);
4371 return !0;
4372 }
4373 hdw->state_encoder_ok = !0;
4374 trace_stbit("state_encoder_ok",hdw->state_encoder_ok);
4375 return !0;
4376}
4377
4378
4379/* Evaluate whether or not state_encoder_config can change */
4380static int state_eval_encoder_config(struct pvr2_hdw *hdw)
4381{
4382 if (hdw->state_encoder_config) {
4383 if (hdw->state_encoder_ok) {
4384 if (hdw->state_pipeline_req &&
4385 !hdw->state_pipeline_pause) return 0;
4386 }
4387 hdw->state_encoder_config = 0;
4388 hdw->state_encoder_waitok = 0;
4389 trace_stbit("state_encoder_waitok",hdw->state_encoder_waitok);
4390 /* paranoia - solve race if timer just completed */
4391 del_timer_sync(&hdw->encoder_wait_timer);
4392 } else {
Mike Isely62433e32008-04-22 14:45:40 -03004393 if (!hdw->state_pathway_ok ||
4394 (hdw->pathway_state != PVR2_PATHWAY_ANALOG) ||
4395 !hdw->state_encoder_ok ||
Mike Isely681c7392007-11-26 01:48:52 -03004396 !hdw->state_pipeline_idle ||
4397 hdw->state_pipeline_pause ||
4398 !hdw->state_pipeline_req ||
4399 !hdw->state_pipeline_config) {
4400 /* We must reset the enforced wait interval if
4401 anything has happened that might have disturbed
4402 the encoder. This should be a rare case. */
4403 if (timer_pending(&hdw->encoder_wait_timer)) {
4404 del_timer_sync(&hdw->encoder_wait_timer);
4405 }
4406 if (hdw->state_encoder_waitok) {
4407 /* Must clear the state - therefore we did
4408 something to a state bit and must also
4409 return true. */
4410 hdw->state_encoder_waitok = 0;
4411 trace_stbit("state_encoder_waitok",
4412 hdw->state_encoder_waitok);
4413 return !0;
4414 }
4415 return 0;
4416 }
4417 if (!hdw->state_encoder_waitok) {
4418 if (!timer_pending(&hdw->encoder_wait_timer)) {
4419 /* waitok flag wasn't set and timer isn't
4420 running. Check flag once more to avoid
4421 a race then start the timer. This is
4422 the point when we measure out a minimal
4423 quiet interval before doing something to
4424 the encoder. */
4425 if (!hdw->state_encoder_waitok) {
4426 hdw->encoder_wait_timer.expires =
Mike Isely83ce57a2008-05-26 05:51:57 -03004427 jiffies +
4428 (HZ * TIME_MSEC_ENCODER_WAIT
4429 / 1000);
Mike Isely681c7392007-11-26 01:48:52 -03004430 add_timer(&hdw->encoder_wait_timer);
4431 }
4432 }
4433 /* We can't continue until we know we have been
4434 quiet for the interval measured by this
4435 timer. */
4436 return 0;
4437 }
4438 pvr2_encoder_configure(hdw);
4439 if (hdw->state_encoder_ok) hdw->state_encoder_config = !0;
4440 }
4441 trace_stbit("state_encoder_config",hdw->state_encoder_config);
4442 return !0;
4443}
4444
4445
Mike Iselyd913d632008-04-06 04:04:35 -03004446/* Return true if the encoder should not be running. */
4447static int state_check_disable_encoder_run(struct pvr2_hdw *hdw)
4448{
4449 if (!hdw->state_encoder_ok) {
4450 /* Encoder isn't healthy at the moment, so stop it. */
4451 return !0;
4452 }
4453 if (!hdw->state_pathway_ok) {
4454 /* Mode is not understood at the moment (i.e. it wants to
4455 change), so encoder must be stopped. */
4456 return !0;
4457 }
4458
4459 switch (hdw->pathway_state) {
4460 case PVR2_PATHWAY_ANALOG:
4461 if (!hdw->state_decoder_run) {
4462 /* We're in analog mode and the decoder is not
4463 running; thus the encoder should be stopped as
4464 well. */
4465 return !0;
4466 }
4467 break;
4468 case PVR2_PATHWAY_DIGITAL:
4469 if (hdw->state_encoder_runok) {
4470 /* This is a funny case. We're in digital mode so
4471 really the encoder should be stopped. However
4472 if it really is running, only kill it after
4473 runok has been set. This gives a chance for the
4474 onair quirk to function (encoder must run
4475 briefly first, at least once, before onair
4476 digital streaming can work). */
4477 return !0;
4478 }
4479 break;
4480 default:
4481 /* Unknown mode; so encoder should be stopped. */
4482 return !0;
4483 }
4484
4485 /* If we get here, we haven't found a reason to stop the
4486 encoder. */
4487 return 0;
4488}
4489
4490
4491/* Return true if the encoder should be running. */
4492static int state_check_enable_encoder_run(struct pvr2_hdw *hdw)
4493{
4494 if (!hdw->state_encoder_ok) {
4495 /* Don't run the encoder if it isn't healthy... */
4496 return 0;
4497 }
4498 if (!hdw->state_pathway_ok) {
4499 /* Don't run the encoder if we don't (yet) know what mode
4500 we need to be in... */
4501 return 0;
4502 }
4503
4504 switch (hdw->pathway_state) {
4505 case PVR2_PATHWAY_ANALOG:
Mike Isely6e931372010-02-06 02:10:38 -03004506 if (hdw->state_decoder_run && hdw->state_decoder_ready) {
Mike Iselyd913d632008-04-06 04:04:35 -03004507 /* In analog mode, if the decoder is running, then
4508 run the encoder. */
4509 return !0;
4510 }
4511 break;
4512 case PVR2_PATHWAY_DIGITAL:
4513 if ((hdw->hdw_desc->digital_control_scheme ==
4514 PVR2_DIGITAL_SCHEME_ONAIR) &&
4515 !hdw->state_encoder_runok) {
4516 /* This is a quirk. OnAir hardware won't stream
4517 digital until the encoder has been run at least
4518 once, for a minimal period of time (empiricially
4519 measured to be 1/4 second). So if we're on
4520 OnAir hardware and the encoder has never been
4521 run at all, then start the encoder. Normal
4522 state machine logic in the driver will
4523 automatically handle the remaining bits. */
4524 return !0;
4525 }
4526 break;
4527 default:
4528 /* For completeness (unknown mode; encoder won't run ever) */
4529 break;
4530 }
4531 /* If we get here, then we haven't found any reason to run the
4532 encoder, so don't run it. */
4533 return 0;
4534}
4535
4536
Mike Isely681c7392007-11-26 01:48:52 -03004537/* Evaluate whether or not state_encoder_run can change */
4538static int state_eval_encoder_run(struct pvr2_hdw *hdw)
4539{
4540 if (hdw->state_encoder_run) {
Mike Iselyd913d632008-04-06 04:04:35 -03004541 if (!state_check_disable_encoder_run(hdw)) return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004542 if (hdw->state_encoder_ok) {
Mike Iselyd913d632008-04-06 04:04:35 -03004543 del_timer_sync(&hdw->encoder_run_timer);
Mike Isely681c7392007-11-26 01:48:52 -03004544 if (pvr2_encoder_stop(hdw) < 0) return !0;
4545 }
4546 hdw->state_encoder_run = 0;
4547 } else {
Mike Iselyd913d632008-04-06 04:04:35 -03004548 if (!state_check_enable_encoder_run(hdw)) return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004549 if (pvr2_encoder_start(hdw) < 0) return !0;
4550 hdw->state_encoder_run = !0;
Mike Iselyd913d632008-04-06 04:04:35 -03004551 if (!hdw->state_encoder_runok) {
4552 hdw->encoder_run_timer.expires =
Mike Isely83ce57a2008-05-26 05:51:57 -03004553 jiffies + (HZ * TIME_MSEC_ENCODER_OK / 1000);
Mike Iselyd913d632008-04-06 04:04:35 -03004554 add_timer(&hdw->encoder_run_timer);
4555 }
Mike Isely681c7392007-11-26 01:48:52 -03004556 }
4557 trace_stbit("state_encoder_run",hdw->state_encoder_run);
4558 return !0;
4559}
4560
4561
4562/* Timeout function for quiescent timer. */
4563static void pvr2_hdw_quiescent_timeout(unsigned long data)
4564{
4565 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4566 hdw->state_decoder_quiescent = !0;
4567 trace_stbit("state_decoder_quiescent",hdw->state_decoder_quiescent);
4568 hdw->state_stale = !0;
4569 queue_work(hdw->workqueue,&hdw->workpoll);
4570}
4571
4572
Mike Isely6e931372010-02-06 02:10:38 -03004573/* Timeout function for decoder stabilization timer. */
4574static void pvr2_hdw_decoder_stabilization_timeout(unsigned long data)
4575{
4576 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4577 hdw->state_decoder_ready = !0;
4578 trace_stbit("state_decoder_ready", hdw->state_decoder_ready);
4579 hdw->state_stale = !0;
4580 queue_work(hdw->workqueue, &hdw->workpoll);
4581}
4582
4583
Mike Isely681c7392007-11-26 01:48:52 -03004584/* Timeout function for encoder wait timer. */
4585static void pvr2_hdw_encoder_wait_timeout(unsigned long data)
4586{
4587 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4588 hdw->state_encoder_waitok = !0;
4589 trace_stbit("state_encoder_waitok",hdw->state_encoder_waitok);
4590 hdw->state_stale = !0;
4591 queue_work(hdw->workqueue,&hdw->workpoll);
4592}
4593
4594
Mike Iselyd913d632008-04-06 04:04:35 -03004595/* Timeout function for encoder run timer. */
4596static void pvr2_hdw_encoder_run_timeout(unsigned long data)
4597{
4598 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4599 if (!hdw->state_encoder_runok) {
4600 hdw->state_encoder_runok = !0;
4601 trace_stbit("state_encoder_runok",hdw->state_encoder_runok);
4602 hdw->state_stale = !0;
4603 queue_work(hdw->workqueue,&hdw->workpoll);
4604 }
4605}
4606
4607
Mike Isely681c7392007-11-26 01:48:52 -03004608/* Evaluate whether or not state_decoder_run can change */
4609static int state_eval_decoder_run(struct pvr2_hdw *hdw)
4610{
4611 if (hdw->state_decoder_run) {
4612 if (hdw->state_encoder_ok) {
4613 if (hdw->state_pipeline_req &&
Mike Isely62433e32008-04-22 14:45:40 -03004614 !hdw->state_pipeline_pause &&
4615 hdw->state_pathway_ok) return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004616 }
4617 if (!hdw->flag_decoder_missed) {
4618 pvr2_decoder_enable(hdw,0);
4619 }
4620 hdw->state_decoder_quiescent = 0;
4621 hdw->state_decoder_run = 0;
Mike Isely6e931372010-02-06 02:10:38 -03004622 /* paranoia - solve race if timer(s) just completed */
Mike Isely681c7392007-11-26 01:48:52 -03004623 del_timer_sync(&hdw->quiescent_timer);
Mike Isely6e931372010-02-06 02:10:38 -03004624 /* Kill the stabilization timer, in case we're killing the
4625 encoder before the previous stabilization interval has
4626 been properly timed. */
4627 del_timer_sync(&hdw->decoder_stabilization_timer);
4628 hdw->state_decoder_ready = 0;
Mike Isely681c7392007-11-26 01:48:52 -03004629 } else {
4630 if (!hdw->state_decoder_quiescent) {
4631 if (!timer_pending(&hdw->quiescent_timer)) {
4632 /* We don't do something about the
4633 quiescent timer until right here because
4634 we also want to catch cases where the
4635 decoder was already not running (like
4636 after initialization) as opposed to
4637 knowing that we had just stopped it.
4638 The second flag check is here to cover a
4639 race - the timer could have run and set
4640 this flag just after the previous check
4641 but before we did the pending check. */
4642 if (!hdw->state_decoder_quiescent) {
4643 hdw->quiescent_timer.expires =
Mike Isely83ce57a2008-05-26 05:51:57 -03004644 jiffies +
4645 (HZ * TIME_MSEC_DECODER_WAIT
4646 / 1000);
Mike Isely681c7392007-11-26 01:48:52 -03004647 add_timer(&hdw->quiescent_timer);
4648 }
4649 }
4650 /* Don't allow decoder to start again until it has
4651 been quiesced first. This little detail should
4652 hopefully further stabilize the encoder. */
4653 return 0;
4654 }
Mike Isely62433e32008-04-22 14:45:40 -03004655 if (!hdw->state_pathway_ok ||
4656 (hdw->pathway_state != PVR2_PATHWAY_ANALOG) ||
4657 !hdw->state_pipeline_req ||
Mike Isely681c7392007-11-26 01:48:52 -03004658 hdw->state_pipeline_pause ||
4659 !hdw->state_pipeline_config ||
4660 !hdw->state_encoder_config ||
4661 !hdw->state_encoder_ok) return 0;
4662 del_timer_sync(&hdw->quiescent_timer);
4663 if (hdw->flag_decoder_missed) return 0;
4664 if (pvr2_decoder_enable(hdw,!0) < 0) return 0;
4665 hdw->state_decoder_quiescent = 0;
Mike Isely6e931372010-02-06 02:10:38 -03004666 hdw->state_decoder_ready = 0;
Mike Isely681c7392007-11-26 01:48:52 -03004667 hdw->state_decoder_run = !0;
Mike Iselyfb640222010-02-06 02:17:17 -03004668 if (hdw->decoder_client_id == PVR2_CLIENT_ID_SAA7115) {
4669 hdw->decoder_stabilization_timer.expires =
4670 jiffies +
4671 (HZ * TIME_MSEC_DECODER_STABILIZATION_WAIT /
4672 1000);
4673 add_timer(&hdw->decoder_stabilization_timer);
4674 } else {
4675 hdw->state_decoder_ready = !0;
4676 }
Mike Isely681c7392007-11-26 01:48:52 -03004677 }
4678 trace_stbit("state_decoder_quiescent",hdw->state_decoder_quiescent);
4679 trace_stbit("state_decoder_run",hdw->state_decoder_run);
Mike Isely6e931372010-02-06 02:10:38 -03004680 trace_stbit("state_decoder_ready", hdw->state_decoder_ready);
Mike Isely681c7392007-11-26 01:48:52 -03004681 return !0;
4682}
4683
4684
4685/* Evaluate whether or not state_usbstream_run can change */
4686static int state_eval_usbstream_run(struct pvr2_hdw *hdw)
4687{
4688 if (hdw->state_usbstream_run) {
Mike Isely72998b72008-04-03 04:51:19 -03004689 int fl = !0;
Mike Isely62433e32008-04-22 14:45:40 -03004690 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
Mike Isely72998b72008-04-03 04:51:19 -03004691 fl = (hdw->state_encoder_ok &&
4692 hdw->state_encoder_run);
4693 } else if ((hdw->pathway_state == PVR2_PATHWAY_DIGITAL) &&
4694 (hdw->hdw_desc->flag_digital_requires_cx23416)) {
4695 fl = hdw->state_encoder_ok;
4696 }
4697 if (fl &&
4698 hdw->state_pipeline_req &&
4699 !hdw->state_pipeline_pause &&
4700 hdw->state_pathway_ok) {
4701 return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004702 }
4703 pvr2_hdw_cmd_usbstream(hdw,0);
4704 hdw->state_usbstream_run = 0;
4705 } else {
Mike Isely62433e32008-04-22 14:45:40 -03004706 if (!hdw->state_pipeline_req ||
4707 hdw->state_pipeline_pause ||
4708 !hdw->state_pathway_ok) return 0;
4709 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
4710 if (!hdw->state_encoder_ok ||
4711 !hdw->state_encoder_run) return 0;
Mike Isely72998b72008-04-03 04:51:19 -03004712 } else if ((hdw->pathway_state == PVR2_PATHWAY_DIGITAL) &&
4713 (hdw->hdw_desc->flag_digital_requires_cx23416)) {
4714 if (!hdw->state_encoder_ok) return 0;
Mike Iselyd913d632008-04-06 04:04:35 -03004715 if (hdw->state_encoder_run) return 0;
4716 if (hdw->hdw_desc->digital_control_scheme ==
4717 PVR2_DIGITAL_SCHEME_ONAIR) {
4718 /* OnAir digital receivers won't stream
4719 unless the analog encoder has run first.
4720 Why? I have no idea. But don't even
4721 try until we know the analog side is
4722 known to have run. */
4723 if (!hdw->state_encoder_runok) return 0;
4724 }
Mike Isely62433e32008-04-22 14:45:40 -03004725 }
Mike Isely681c7392007-11-26 01:48:52 -03004726 if (pvr2_hdw_cmd_usbstream(hdw,!0) < 0) return 0;
4727 hdw->state_usbstream_run = !0;
4728 }
4729 trace_stbit("state_usbstream_run",hdw->state_usbstream_run);
4730 return !0;
4731}
4732
4733
4734/* Attempt to configure pipeline, if needed */
4735static int state_eval_pipeline_config(struct pvr2_hdw *hdw)
4736{
4737 if (hdw->state_pipeline_config ||
4738 hdw->state_pipeline_pause) return 0;
4739 pvr2_hdw_commit_execute(hdw);
4740 return !0;
4741}
4742
4743
4744/* Update pipeline idle and pipeline pause tracking states based on other
4745 inputs. This must be called whenever the other relevant inputs have
4746 changed. */
4747static int state_update_pipeline_state(struct pvr2_hdw *hdw)
4748{
4749 unsigned int st;
4750 int updatedFl = 0;
4751 /* Update pipeline state */
4752 st = !(hdw->state_encoder_run ||
4753 hdw->state_decoder_run ||
4754 hdw->state_usbstream_run ||
4755 (!hdw->state_decoder_quiescent));
4756 if (!st != !hdw->state_pipeline_idle) {
4757 hdw->state_pipeline_idle = st;
4758 updatedFl = !0;
4759 }
4760 if (hdw->state_pipeline_idle && hdw->state_pipeline_pause) {
4761 hdw->state_pipeline_pause = 0;
4762 updatedFl = !0;
4763 }
4764 return updatedFl;
4765}
4766
4767
4768typedef int (*state_eval_func)(struct pvr2_hdw *);
4769
4770/* Set of functions to be run to evaluate various states in the driver. */
Tobias Klauserebff0332008-04-22 14:45:45 -03004771static const state_eval_func eval_funcs[] = {
Mike Isely62433e32008-04-22 14:45:40 -03004772 state_eval_pathway_ok,
Mike Isely681c7392007-11-26 01:48:52 -03004773 state_eval_pipeline_config,
4774 state_eval_encoder_ok,
4775 state_eval_encoder_config,
4776 state_eval_decoder_run,
4777 state_eval_encoder_run,
4778 state_eval_usbstream_run,
4779};
4780
4781
4782/* Process various states and return true if we did anything interesting. */
4783static int pvr2_hdw_state_update(struct pvr2_hdw *hdw)
4784{
4785 unsigned int i;
4786 int state_updated = 0;
4787 int check_flag;
4788
4789 if (!hdw->state_stale) return 0;
4790 if ((hdw->fw1_state != FW1_STATE_OK) ||
4791 !hdw->flag_ok) {
4792 hdw->state_stale = 0;
4793 return !0;
4794 }
4795 /* This loop is the heart of the entire driver. It keeps trying to
4796 evaluate various bits of driver state until nothing changes for
4797 one full iteration. Each "bit of state" tracks some global
4798 aspect of the driver, e.g. whether decoder should run, if
4799 pipeline is configured, usb streaming is on, etc. We separately
4800 evaluate each of those questions based on other driver state to
4801 arrive at the correct running configuration. */
4802 do {
4803 check_flag = 0;
4804 state_update_pipeline_state(hdw);
4805 /* Iterate over each bit of state */
4806 for (i = 0; (i<ARRAY_SIZE(eval_funcs)) && hdw->flag_ok; i++) {
4807 if ((*eval_funcs[i])(hdw)) {
4808 check_flag = !0;
4809 state_updated = !0;
4810 state_update_pipeline_state(hdw);
4811 }
4812 }
4813 } while (check_flag && hdw->flag_ok);
4814 hdw->state_stale = 0;
4815 trace_stbit("state_stale",hdw->state_stale);
4816 return state_updated;
4817}
4818
4819
Mike Isely1cb03b72008-04-21 03:47:43 -03004820static unsigned int print_input_mask(unsigned int msk,
4821 char *buf,unsigned int acnt)
4822{
4823 unsigned int idx,ccnt;
4824 unsigned int tcnt = 0;
4825 for (idx = 0; idx < ARRAY_SIZE(control_values_input); idx++) {
4826 if (!((1 << idx) & msk)) continue;
4827 ccnt = scnprintf(buf+tcnt,
4828 acnt-tcnt,
4829 "%s%s",
4830 (tcnt ? ", " : ""),
4831 control_values_input[idx]);
4832 tcnt += ccnt;
4833 }
4834 return tcnt;
4835}
4836
4837
Mike Isely62433e32008-04-22 14:45:40 -03004838static const char *pvr2_pathway_state_name(int id)
4839{
4840 switch (id) {
4841 case PVR2_PATHWAY_ANALOG: return "analog";
4842 case PVR2_PATHWAY_DIGITAL: return "digital";
4843 default: return "unknown";
4844 }
4845}
4846
4847
Mike Isely681c7392007-11-26 01:48:52 -03004848static unsigned int pvr2_hdw_report_unlocked(struct pvr2_hdw *hdw,int which,
4849 char *buf,unsigned int acnt)
4850{
4851 switch (which) {
4852 case 0:
4853 return scnprintf(
4854 buf,acnt,
Mike Iselye9db1ff2008-04-22 14:45:41 -03004855 "driver:%s%s%s%s%s <mode=%s>",
Mike Isely681c7392007-11-26 01:48:52 -03004856 (hdw->flag_ok ? " <ok>" : " <fail>"),
4857 (hdw->flag_init_ok ? " <init>" : " <uninitialized>"),
4858 (hdw->flag_disconnected ? " <disconnected>" :
4859 " <connected>"),
4860 (hdw->flag_tripped ? " <tripped>" : ""),
Mike Isely62433e32008-04-22 14:45:40 -03004861 (hdw->flag_decoder_missed ? " <no decoder>" : ""),
4862 pvr2_pathway_state_name(hdw->pathway_state));
4863
Mike Isely681c7392007-11-26 01:48:52 -03004864 case 1:
4865 return scnprintf(
4866 buf,acnt,
4867 "pipeline:%s%s%s%s",
4868 (hdw->state_pipeline_idle ? " <idle>" : ""),
4869 (hdw->state_pipeline_config ?
4870 " <configok>" : " <stale>"),
4871 (hdw->state_pipeline_req ? " <req>" : ""),
4872 (hdw->state_pipeline_pause ? " <pause>" : ""));
4873 case 2:
4874 return scnprintf(
4875 buf,acnt,
Mike Isely62433e32008-04-22 14:45:40 -03004876 "worker:%s%s%s%s%s%s%s",
Mike Isely681c7392007-11-26 01:48:52 -03004877 (hdw->state_decoder_run ?
Mike Isely6e931372010-02-06 02:10:38 -03004878 (hdw->state_decoder_ready ?
4879 "<decode:run>" : " <decode:start>") :
Mike Isely681c7392007-11-26 01:48:52 -03004880 (hdw->state_decoder_quiescent ?
4881 "" : " <decode:stop>")),
4882 (hdw->state_decoder_quiescent ?
4883 " <decode:quiescent>" : ""),
4884 (hdw->state_encoder_ok ?
4885 "" : " <encode:init>"),
4886 (hdw->state_encoder_run ?
Mike Iselyd913d632008-04-06 04:04:35 -03004887 (hdw->state_encoder_runok ?
4888 " <encode:run>" :
4889 " <encode:firstrun>") :
4890 (hdw->state_encoder_runok ?
4891 " <encode:stop>" :
4892 " <encode:virgin>")),
Mike Isely681c7392007-11-26 01:48:52 -03004893 (hdw->state_encoder_config ?
4894 " <encode:configok>" :
4895 (hdw->state_encoder_waitok ?
Mike Iselyb9a37d92008-03-28 05:31:40 -03004896 "" : " <encode:waitok>")),
Mike Isely681c7392007-11-26 01:48:52 -03004897 (hdw->state_usbstream_run ?
Mike Isely62433e32008-04-22 14:45:40 -03004898 " <usb:run>" : " <usb:stop>"),
4899 (hdw->state_pathway_ok ?
Mike Iselye9db1ff2008-04-22 14:45:41 -03004900 " <pathway:ok>" : ""));
Mike Isely681c7392007-11-26 01:48:52 -03004901 case 3:
4902 return scnprintf(
4903 buf,acnt,
4904 "state: %s",
4905 pvr2_get_state_name(hdw->master_state));
Mike Iselyad0992e2008-03-28 05:34:45 -03004906 case 4: {
Mike Isely1cb03b72008-04-21 03:47:43 -03004907 unsigned int tcnt = 0;
4908 unsigned int ccnt;
4909
4910 ccnt = scnprintf(buf,
4911 acnt,
4912 "Hardware supported inputs: ");
4913 tcnt += ccnt;
4914 tcnt += print_input_mask(hdw->input_avail_mask,
4915 buf+tcnt,
4916 acnt-tcnt);
4917 if (hdw->input_avail_mask != hdw->input_allowed_mask) {
4918 ccnt = scnprintf(buf+tcnt,
4919 acnt-tcnt,
4920 "; allowed inputs: ");
4921 tcnt += ccnt;
4922 tcnt += print_input_mask(hdw->input_allowed_mask,
4923 buf+tcnt,
4924 acnt-tcnt);
4925 }
4926 return tcnt;
4927 }
4928 case 5: {
Mike Iselyad0992e2008-03-28 05:34:45 -03004929 struct pvr2_stream_stats stats;
4930 if (!hdw->vid_stream) break;
4931 pvr2_stream_get_stats(hdw->vid_stream,
4932 &stats,
4933 0);
4934 return scnprintf(
4935 buf,acnt,
4936 "Bytes streamed=%u"
4937 " URBs: queued=%u idle=%u ready=%u"
4938 " processed=%u failed=%u",
4939 stats.bytes_processed,
4940 stats.buffers_in_queue,
4941 stats.buffers_in_idle,
4942 stats.buffers_in_ready,
4943 stats.buffers_processed,
4944 stats.buffers_failed);
4945 }
Mike Isely27eab382009-04-06 01:51:38 -03004946 case 6: {
4947 unsigned int id = hdw->ir_scheme_active;
4948 return scnprintf(buf, acnt, "ir scheme: id=%d %s", id,
4949 (id >= ARRAY_SIZE(ir_scheme_names) ?
4950 "?" : ir_scheme_names[id]));
4951 }
Mike Isely681c7392007-11-26 01:48:52 -03004952 default: break;
4953 }
4954 return 0;
4955}
4956
4957
Mike Isely2eb563b2009-03-08 18:25:46 -03004958/* Generate report containing info about attached sub-devices and attached
4959 i2c clients, including an indication of which attached i2c clients are
4960 actually sub-devices. */
4961static unsigned int pvr2_hdw_report_clients(struct pvr2_hdw *hdw,
4962 char *buf, unsigned int acnt)
4963{
4964 struct v4l2_subdev *sd;
4965 unsigned int tcnt = 0;
4966 unsigned int ccnt;
4967 struct i2c_client *client;
Mike Isely2eb563b2009-03-08 18:25:46 -03004968 const char *p;
4969 unsigned int id;
4970
Jean Delvarefa7ce76422009-05-02 00:22:27 -03004971 ccnt = scnprintf(buf, acnt, "Associated v4l2-subdev drivers and I2C clients:\n");
Mike Isely2eb563b2009-03-08 18:25:46 -03004972 tcnt += ccnt;
4973 v4l2_device_for_each_subdev(sd, &hdw->v4l2_dev) {
4974 id = sd->grp_id;
4975 p = NULL;
4976 if (id < ARRAY_SIZE(module_names)) p = module_names[id];
4977 if (p) {
Jean Delvarefa7ce76422009-05-02 00:22:27 -03004978 ccnt = scnprintf(buf + tcnt, acnt - tcnt, " %s:", p);
Mike Isely2eb563b2009-03-08 18:25:46 -03004979 tcnt += ccnt;
4980 } else {
4981 ccnt = scnprintf(buf + tcnt, acnt - tcnt,
Jean Delvarefa7ce76422009-05-02 00:22:27 -03004982 " (unknown id=%u):", id);
4983 tcnt += ccnt;
4984 }
4985 client = v4l2_get_subdevdata(sd);
4986 if (client) {
4987 ccnt = scnprintf(buf + tcnt, acnt - tcnt,
4988 " %s @ %02x\n", client->name,
4989 client->addr);
4990 tcnt += ccnt;
4991 } else {
4992 ccnt = scnprintf(buf + tcnt, acnt - tcnt,
4993 " no i2c client\n");
Mike Isely2eb563b2009-03-08 18:25:46 -03004994 tcnt += ccnt;
4995 }
4996 }
Mike Isely2eb563b2009-03-08 18:25:46 -03004997 return tcnt;
4998}
4999
5000
Mike Isely681c7392007-11-26 01:48:52 -03005001unsigned int pvr2_hdw_state_report(struct pvr2_hdw *hdw,
5002 char *buf,unsigned int acnt)
5003{
5004 unsigned int bcnt,ccnt,idx;
5005 bcnt = 0;
5006 LOCK_TAKE(hdw->big_lock);
5007 for (idx = 0; ; idx++) {
5008 ccnt = pvr2_hdw_report_unlocked(hdw,idx,buf,acnt);
5009 if (!ccnt) break;
5010 bcnt += ccnt; acnt -= ccnt; buf += ccnt;
5011 if (!acnt) break;
5012 buf[0] = '\n'; ccnt = 1;
5013 bcnt += ccnt; acnt -= ccnt; buf += ccnt;
5014 }
Mike Isely2eb563b2009-03-08 18:25:46 -03005015 ccnt = pvr2_hdw_report_clients(hdw, buf, acnt);
5016 bcnt += ccnt; acnt -= ccnt; buf += ccnt;
Mike Isely681c7392007-11-26 01:48:52 -03005017 LOCK_GIVE(hdw->big_lock);
5018 return bcnt;
5019}
5020
5021
5022static void pvr2_hdw_state_log_state(struct pvr2_hdw *hdw)
5023{
Mike Isely2eb563b2009-03-08 18:25:46 -03005024 char buf[256];
5025 unsigned int idx, ccnt;
5026 unsigned int lcnt, ucnt;
Mike Isely681c7392007-11-26 01:48:52 -03005027
5028 for (idx = 0; ; idx++) {
5029 ccnt = pvr2_hdw_report_unlocked(hdw,idx,buf,sizeof(buf));
5030 if (!ccnt) break;
5031 printk(KERN_INFO "%s %.*s\n",hdw->name,ccnt,buf);
5032 }
Mike Isely2eb563b2009-03-08 18:25:46 -03005033 ccnt = pvr2_hdw_report_clients(hdw, buf, sizeof(buf));
5034 ucnt = 0;
5035 while (ucnt < ccnt) {
5036 lcnt = 0;
5037 while ((lcnt + ucnt < ccnt) && (buf[lcnt + ucnt] != '\n')) {
5038 lcnt++;
5039 }
5040 printk(KERN_INFO "%s %.*s\n", hdw->name, lcnt, buf + ucnt);
5041 ucnt += lcnt + 1;
5042 }
Mike Isely681c7392007-11-26 01:48:52 -03005043}
5044
5045
5046/* Evaluate and update the driver's current state, taking various actions
5047 as appropriate for the update. */
5048static int pvr2_hdw_state_eval(struct pvr2_hdw *hdw)
5049{
5050 unsigned int st;
5051 int state_updated = 0;
5052 int callback_flag = 0;
Mike Isely1b9c18c2008-04-22 14:45:41 -03005053 int analog_mode;
Mike Isely681c7392007-11-26 01:48:52 -03005054
5055 pvr2_trace(PVR2_TRACE_STBITS,
5056 "Drive state check START");
5057 if (pvrusb2_debug & PVR2_TRACE_STBITS) {
5058 pvr2_hdw_state_log_state(hdw);
5059 }
5060
5061 /* Process all state and get back over disposition */
5062 state_updated = pvr2_hdw_state_update(hdw);
5063
Mike Isely1b9c18c2008-04-22 14:45:41 -03005064 analog_mode = (hdw->pathway_state != PVR2_PATHWAY_DIGITAL);
5065
Mike Isely681c7392007-11-26 01:48:52 -03005066 /* Update master state based upon all other states. */
5067 if (!hdw->flag_ok) {
5068 st = PVR2_STATE_DEAD;
5069 } else if (hdw->fw1_state != FW1_STATE_OK) {
5070 st = PVR2_STATE_COLD;
Mike Isely72998b72008-04-03 04:51:19 -03005071 } else if ((analog_mode ||
5072 hdw->hdw_desc->flag_digital_requires_cx23416) &&
5073 !hdw->state_encoder_ok) {
Mike Isely681c7392007-11-26 01:48:52 -03005074 st = PVR2_STATE_WARM;
Mike Isely1b9c18c2008-04-22 14:45:41 -03005075 } else if (hdw->flag_tripped ||
5076 (analog_mode && hdw->flag_decoder_missed)) {
Mike Isely681c7392007-11-26 01:48:52 -03005077 st = PVR2_STATE_ERROR;
Mike Isely62433e32008-04-22 14:45:40 -03005078 } else if (hdw->state_usbstream_run &&
Mike Isely1b9c18c2008-04-22 14:45:41 -03005079 (!analog_mode ||
Mike Isely62433e32008-04-22 14:45:40 -03005080 (hdw->state_encoder_run && hdw->state_decoder_run))) {
Mike Isely681c7392007-11-26 01:48:52 -03005081 st = PVR2_STATE_RUN;
5082 } else {
5083 st = PVR2_STATE_READY;
5084 }
5085 if (hdw->master_state != st) {
5086 pvr2_trace(PVR2_TRACE_STATE,
5087 "Device state change from %s to %s",
5088 pvr2_get_state_name(hdw->master_state),
5089 pvr2_get_state_name(st));
Mike Isely40381cb2008-04-22 14:45:42 -03005090 pvr2_led_ctrl(hdw,st == PVR2_STATE_RUN);
Mike Isely681c7392007-11-26 01:48:52 -03005091 hdw->master_state = st;
5092 state_updated = !0;
5093 callback_flag = !0;
5094 }
5095 if (state_updated) {
5096 /* Trigger anyone waiting on any state changes here. */
5097 wake_up(&hdw->state_wait_data);
5098 }
5099
5100 if (pvrusb2_debug & PVR2_TRACE_STBITS) {
5101 pvr2_hdw_state_log_state(hdw);
5102 }
5103 pvr2_trace(PVR2_TRACE_STBITS,
5104 "Drive state check DONE callback=%d",callback_flag);
5105
5106 return callback_flag;
5107}
5108
5109
5110/* Cause kernel thread to check / update driver state */
5111static void pvr2_hdw_state_sched(struct pvr2_hdw *hdw)
5112{
5113 if (hdw->state_stale) return;
5114 hdw->state_stale = !0;
5115 trace_stbit("state_stale",hdw->state_stale);
5116 queue_work(hdw->workqueue,&hdw->workpoll);
5117}
5118
5119
Mike Iselyd8554972006-06-26 20:58:46 -03005120int pvr2_hdw_gpio_get_dir(struct pvr2_hdw *hdw,u32 *dp)
5121{
5122 return pvr2_read_register(hdw,PVR2_GPIO_DIR,dp);
5123}
5124
5125
5126int pvr2_hdw_gpio_get_out(struct pvr2_hdw *hdw,u32 *dp)
5127{
5128 return pvr2_read_register(hdw,PVR2_GPIO_OUT,dp);
5129}
5130
5131
5132int pvr2_hdw_gpio_get_in(struct pvr2_hdw *hdw,u32 *dp)
5133{
5134 return pvr2_read_register(hdw,PVR2_GPIO_IN,dp);
5135}
5136
5137
5138int pvr2_hdw_gpio_chg_dir(struct pvr2_hdw *hdw,u32 msk,u32 val)
5139{
5140 u32 cval,nval;
5141 int ret;
5142 if (~msk) {
5143 ret = pvr2_read_register(hdw,PVR2_GPIO_DIR,&cval);
5144 if (ret) return ret;
5145 nval = (cval & ~msk) | (val & msk);
5146 pvr2_trace(PVR2_TRACE_GPIO,
5147 "GPIO direction changing 0x%x:0x%x"
5148 " from 0x%x to 0x%x",
5149 msk,val,cval,nval);
5150 } else {
5151 nval = val;
5152 pvr2_trace(PVR2_TRACE_GPIO,
5153 "GPIO direction changing to 0x%x",nval);
5154 }
5155 return pvr2_write_register(hdw,PVR2_GPIO_DIR,nval);
5156}
5157
5158
5159int pvr2_hdw_gpio_chg_out(struct pvr2_hdw *hdw,u32 msk,u32 val)
5160{
5161 u32 cval,nval;
5162 int ret;
5163 if (~msk) {
5164 ret = pvr2_read_register(hdw,PVR2_GPIO_OUT,&cval);
5165 if (ret) return ret;
5166 nval = (cval & ~msk) | (val & msk);
5167 pvr2_trace(PVR2_TRACE_GPIO,
5168 "GPIO output changing 0x%x:0x%x from 0x%x to 0x%x",
5169 msk,val,cval,nval);
5170 } else {
5171 nval = val;
5172 pvr2_trace(PVR2_TRACE_GPIO,
5173 "GPIO output changing to 0x%x",nval);
5174 }
5175 return pvr2_write_register(hdw,PVR2_GPIO_OUT,nval);
5176}
5177
5178
Mike Iselya51f5002009-03-06 23:30:37 -03005179void pvr2_hdw_status_poll(struct pvr2_hdw *hdw)
5180{
Mike Isely40f07112009-03-07 00:08:17 -03005181 struct v4l2_tuner *vtp = &hdw->tuner_signal_info;
5182 memset(vtp, 0, sizeof(*vtp));
Hans Verkuil50e9efd2011-06-12 06:39:52 -03005183 vtp->type = (hdw->input_val == PVR2_CVAL_INPUT_RADIO) ?
5184 V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
Mike Isely2641df32009-03-07 00:13:25 -03005185 hdw->tuner_signal_stale = 0;
Mike Isely40f07112009-03-07 00:08:17 -03005186 /* Note: There apparently is no replacement for VIDIOC_CROPCAP
5187 using v4l2-subdev - therefore we can't support that AT ALL right
5188 now. (Of course, no sub-drivers seem to implement it either.
5189 But now it's a a chicken and egg problem...) */
Mike Isely4cfe33192011-02-13 17:32:47 -03005190 v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner, g_tuner, vtp);
Mike Isely2641df32009-03-07 00:13:25 -03005191 pvr2_trace(PVR2_TRACE_CHIPS, "subdev status poll"
Mike Isely40f07112009-03-07 00:08:17 -03005192 " type=%u strength=%u audio=0x%x cap=0x%x"
5193 " low=%u hi=%u",
5194 vtp->type,
5195 vtp->signal, vtp->rxsubchans, vtp->capability,
5196 vtp->rangelow, vtp->rangehigh);
Mike Isely2641df32009-03-07 00:13:25 -03005197
5198 /* We have to do this to avoid getting into constant polling if
5199 there's nobody to answer a poll of cropcap info. */
5200 hdw->cropcap_stale = 0;
Mike Iselya51f5002009-03-06 23:30:37 -03005201}
5202
5203
Mike Isely7fb20fa2008-04-22 14:45:37 -03005204unsigned int pvr2_hdw_get_input_available(struct pvr2_hdw *hdw)
5205{
5206 return hdw->input_avail_mask;
5207}
5208
5209
Mike Isely1cb03b72008-04-21 03:47:43 -03005210unsigned int pvr2_hdw_get_input_allowed(struct pvr2_hdw *hdw)
5211{
5212 return hdw->input_allowed_mask;
5213}
5214
5215
5216static int pvr2_hdw_set_input(struct pvr2_hdw *hdw,int v)
5217{
5218 if (hdw->input_val != v) {
5219 hdw->input_val = v;
5220 hdw->input_dirty = !0;
5221 }
5222
5223 /* Handle side effects - if we switch to a mode that needs the RF
5224 tuner, then select the right frequency choice as well and mark
5225 it dirty. */
5226 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
5227 hdw->freqSelector = 0;
5228 hdw->freqDirty = !0;
5229 } else if ((hdw->input_val == PVR2_CVAL_INPUT_TV) ||
5230 (hdw->input_val == PVR2_CVAL_INPUT_DTV)) {
5231 hdw->freqSelector = 1;
5232 hdw->freqDirty = !0;
5233 }
5234 return 0;
5235}
5236
5237
5238int pvr2_hdw_set_input_allowed(struct pvr2_hdw *hdw,
5239 unsigned int change_mask,
5240 unsigned int change_val)
5241{
5242 int ret = 0;
5243 unsigned int nv,m,idx;
5244 LOCK_TAKE(hdw->big_lock);
5245 do {
5246 nv = hdw->input_allowed_mask & ~change_mask;
5247 nv |= (change_val & change_mask);
5248 nv &= hdw->input_avail_mask;
5249 if (!nv) {
5250 /* No legal modes left; return error instead. */
5251 ret = -EPERM;
5252 break;
5253 }
5254 hdw->input_allowed_mask = nv;
5255 if ((1 << hdw->input_val) & hdw->input_allowed_mask) {
5256 /* Current mode is still in the allowed mask, so
5257 we're done. */
5258 break;
5259 }
5260 /* Select and switch to a mode that is still in the allowed
5261 mask */
5262 if (!hdw->input_allowed_mask) {
5263 /* Nothing legal; give up */
5264 break;
5265 }
5266 m = hdw->input_allowed_mask;
5267 for (idx = 0; idx < (sizeof(m) << 3); idx++) {
5268 if (!((1 << idx) & m)) continue;
5269 pvr2_hdw_set_input(hdw,idx);
5270 break;
5271 }
5272 } while (0);
5273 LOCK_GIVE(hdw->big_lock);
5274 return ret;
5275}
5276
5277
Mike Iselye61b6fc2006-07-18 22:42:18 -03005278/* Find I2C address of eeprom */
Adrian Bunk07e337e2006-06-30 11:30:20 -03005279static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03005280{
5281 int result;
5282 LOCK_TAKE(hdw->ctl_lock); do {
Michael Krufky8d364362007-01-22 02:17:55 -03005283 hdw->cmd_buffer[0] = FX2CMD_GET_EEPROM_ADDR;
Mike Iselyd8554972006-06-26 20:58:46 -03005284 result = pvr2_send_request(hdw,
5285 hdw->cmd_buffer,1,
5286 hdw->cmd_buffer,1);
5287 if (result < 0) break;
5288 result = hdw->cmd_buffer[0];
5289 } while(0); LOCK_GIVE(hdw->ctl_lock);
5290 return result;
5291}
5292
5293
Mike Isely32ffa9a2006-09-23 22:26:52 -03005294int pvr2_hdw_register_access(struct pvr2_hdw *hdw,
Hans Verkuilaecde8b52008-12-30 07:14:19 -03005295 struct v4l2_dbg_match *match, u64 reg_id,
5296 int setFl, u64 *val_ptr)
Mike Isely32ffa9a2006-09-23 22:26:52 -03005297{
5298#ifdef CONFIG_VIDEO_ADV_DEBUG
Hans Verkuilaecde8b52008-12-30 07:14:19 -03005299 struct v4l2_dbg_register req;
Mike Isely6d988162006-09-28 17:53:49 -03005300 int stat = 0;
5301 int okFl = 0;
Mike Isely32ffa9a2006-09-23 22:26:52 -03005302
Mike Isely201f5c92007-01-28 16:08:36 -03005303 if (!capable(CAP_SYS_ADMIN)) return -EPERM;
5304
Hans Verkuilaecde8b52008-12-30 07:14:19 -03005305 req.match = *match;
Mike Isely32ffa9a2006-09-23 22:26:52 -03005306 req.reg = reg_id;
5307 if (setFl) req.val = *val_ptr;
Mike Iselyd8f5b9b2009-03-07 00:05:00 -03005308 /* It would be nice to know if a sub-device answered the request */
5309 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, g_register, &req);
5310 if (!setFl) *val_ptr = req.val;
Mike Isely6d988162006-09-28 17:53:49 -03005311 if (okFl) {
5312 return stat;
5313 }
Mike Isely32ffa9a2006-09-23 22:26:52 -03005314 return -EINVAL;
5315#else
5316 return -ENOSYS;
5317#endif
5318}
5319
5320
Mike Iselyd8554972006-06-26 20:58:46 -03005321/*
5322 Stuff for Emacs to see, in order to encourage consistent editing style:
5323 *** Local Variables: ***
5324 *** mode: c ***
5325 *** fill-column: 75 ***
5326 *** tab-width: 8 ***
5327 *** c-basic-offset: 8 ***
5328 *** End: ***
5329 */