blob: 79b2a544ccbade05fb479cb13363f1d1e7818b93 [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 Iselyfa98e592008-05-26 05:54:24 -030056 before we are allowed to configure it. I had this originally set to
57 50msec, but Martin Dauskardt <martin.dauskardt@gmx.de> reports that
58 things work better when it's set to 100msec. */
59#define TIME_MSEC_ENCODER_WAIT 100
Mike Isely83ce57a2008-05-26 05:51:57 -030060
61/* This defines the minimum interval that the encoder must successfully run
62 before we consider that the encoder has run at least once since its
63 firmware has been loaded. This measurement is in important for cases
64 where we can't do something until we know that the encoder has been run
65 at least once. */
66#define TIME_MSEC_ENCODER_OK 250
67
Mike Iselya0fd1cb2006-06-30 11:35:28 -030068static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = NULL};
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -030069static DEFINE_MUTEX(pvr2_unit_mtx);
Mike Iselyd8554972006-06-26 20:58:46 -030070
Douglas Schilling Landgrafff699e62008-04-22 14:41:48 -030071static int ctlchg;
Douglas Schilling Landgrafff699e62008-04-22 14:41:48 -030072static int procreload;
Mike Iselyd8554972006-06-26 20:58:46 -030073static int tuner[PVR_NUM] = { [0 ... PVR_NUM-1] = -1 };
74static int tolerance[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
75static int video_std[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
Douglas Schilling Landgrafff699e62008-04-22 14:41:48 -030076static int init_pause_msec;
Mike Iselyd8554972006-06-26 20:58:46 -030077
78module_param(ctlchg, int, S_IRUGO|S_IWUSR);
79MODULE_PARM_DESC(ctlchg, "0=optimize ctl change 1=always accept new ctl value");
80module_param(init_pause_msec, int, S_IRUGO|S_IWUSR);
81MODULE_PARM_DESC(init_pause_msec, "hardware initialization settling delay");
Mike Iselyd8554972006-06-26 20:58:46 -030082module_param(procreload, int, S_IRUGO|S_IWUSR);
83MODULE_PARM_DESC(procreload,
84 "Attempt init failure recovery with firmware reload");
85module_param_array(tuner, int, NULL, 0444);
86MODULE_PARM_DESC(tuner,"specify installed tuner type");
87module_param_array(video_std, int, NULL, 0444);
88MODULE_PARM_DESC(video_std,"specify initial video standard");
89module_param_array(tolerance, int, NULL, 0444);
90MODULE_PARM_DESC(tolerance,"specify stream error tolerance");
91
Mike Isely6f441ed2009-06-20 14:51:29 -030092/* US Broadcast channel 3 (61.25 MHz), to help with testing */
93static int default_tv_freq = 61250000L;
Michael Krufky5a4f5da62008-05-11 16:37:50 -030094/* 104.3 MHz, a usable FM station for my area */
95static int default_radio_freq = 104300000L;
96
97module_param_named(tv_freq, default_tv_freq, int, 0444);
98MODULE_PARM_DESC(tv_freq, "specify initial television frequency");
99module_param_named(radio_freq, default_radio_freq, int, 0444);
100MODULE_PARM_DESC(radio_freq, "specify initial radio frequency");
101
Mike Iselyd8554972006-06-26 20:58:46 -0300102#define PVR2_CTL_WRITE_ENDPOINT 0x01
103#define PVR2_CTL_READ_ENDPOINT 0x81
104
105#define PVR2_GPIO_IN 0x9008
106#define PVR2_GPIO_OUT 0x900c
107#define PVR2_GPIO_DIR 0x9020
108
109#define trace_firmware(...) pvr2_trace(PVR2_TRACE_FIRMWARE,__VA_ARGS__)
110
111#define PVR2_FIRMWARE_ENDPOINT 0x02
112
113/* size of a firmware chunk */
114#define FIRMWARE_CHUNK_SIZE 0x2000
115
Mike Iselyedb9dcb2009-03-07 00:37:10 -0300116typedef void (*pvr2_subdev_update_func)(struct pvr2_hdw *,
117 struct v4l2_subdev *);
118
119static const pvr2_subdev_update_func pvr2_module_update_functions[] = {
Mike Isely4ecbc282009-03-07 00:49:19 -0300120 [PVR2_CLIENT_ID_WM8775] = pvr2_wm8775_subdev_update,
Mike Isely6f956512009-03-07 00:43:26 -0300121 [PVR2_CLIENT_ID_SAA7115] = pvr2_saa7115_subdev_update,
Mike Isely76891d62009-03-07 00:52:06 -0300122 [PVR2_CLIENT_ID_MSP3400] = pvr2_msp3400_subdev_update,
Mike Isely634ba262009-03-07 00:54:02 -0300123 [PVR2_CLIENT_ID_CX25840] = pvr2_cx25840_subdev_update,
Mike Isely2a6b6272009-03-15 17:53:29 -0300124 [PVR2_CLIENT_ID_CS53L32A] = pvr2_cs53l32a_subdev_update,
Mike Iselyedb9dcb2009-03-07 00:37:10 -0300125};
126
Mike Iselye9c64a72009-03-06 23:42:20 -0300127static const char *module_names[] = {
128 [PVR2_CLIENT_ID_MSP3400] = "msp3400",
129 [PVR2_CLIENT_ID_CX25840] = "cx25840",
130 [PVR2_CLIENT_ID_SAA7115] = "saa7115",
131 [PVR2_CLIENT_ID_TUNER] = "tuner",
Mike Iselybb652422009-03-14 14:09:04 -0300132 [PVR2_CLIENT_ID_DEMOD] = "tuner",
Mike Isely851981a2009-03-07 02:02:32 -0300133 [PVR2_CLIENT_ID_CS53L32A] = "cs53l32a",
Mike Isely5f6dae82009-03-07 00:39:34 -0300134 [PVR2_CLIENT_ID_WM8775] = "wm8775",
Mike Iselye9c64a72009-03-06 23:42:20 -0300135};
136
137
138static const unsigned char *module_i2c_addresses[] = {
139 [PVR2_CLIENT_ID_TUNER] = "\x60\x61\x62\x63",
Mike Iselybb652422009-03-14 14:09:04 -0300140 [PVR2_CLIENT_ID_DEMOD] = "\x43",
Mike Isely1dfe6c72009-03-07 02:00:21 -0300141 [PVR2_CLIENT_ID_MSP3400] = "\x40",
142 [PVR2_CLIENT_ID_SAA7115] = "\x21",
Mike Iselyae111f72009-03-07 00:57:42 -0300143 [PVR2_CLIENT_ID_WM8775] = "\x1b",
Mike Isely0b467012009-03-07 01:49:37 -0300144 [PVR2_CLIENT_ID_CX25840] = "\x44",
Mike Isely23334a22009-03-07 02:03:28 -0300145 [PVR2_CLIENT_ID_CS53L32A] = "\x11",
Mike Iselye9c64a72009-03-06 23:42:20 -0300146};
147
148
Mike Isely27eab382009-04-06 01:51:38 -0300149static const char *ir_scheme_names[] = {
150 [PVR2_IR_SCHEME_NONE] = "none",
151 [PVR2_IR_SCHEME_29XXX] = "29xxx",
152 [PVR2_IR_SCHEME_24XXX] = "24xxx (29xxx emulation)",
153 [PVR2_IR_SCHEME_24XXX_MCE] = "24xxx (MCE device)",
154 [PVR2_IR_SCHEME_ZILOG] = "Zilog",
155};
156
157
Mike Iselyb30d2442006-06-25 20:05:01 -0300158/* Define the list of additional controls we'll dynamically construct based
159 on query of the cx2341x module. */
160struct pvr2_mpeg_ids {
161 const char *strid;
162 int id;
163};
164static const struct pvr2_mpeg_ids mpeg_ids[] = {
165 {
166 .strid = "audio_layer",
167 .id = V4L2_CID_MPEG_AUDIO_ENCODING,
168 },{
169 .strid = "audio_bitrate",
170 .id = V4L2_CID_MPEG_AUDIO_L2_BITRATE,
171 },{
172 /* Already using audio_mode elsewhere :-( */
173 .strid = "mpeg_audio_mode",
174 .id = V4L2_CID_MPEG_AUDIO_MODE,
175 },{
176 .strid = "mpeg_audio_mode_extension",
177 .id = V4L2_CID_MPEG_AUDIO_MODE_EXTENSION,
178 },{
179 .strid = "audio_emphasis",
180 .id = V4L2_CID_MPEG_AUDIO_EMPHASIS,
181 },{
182 .strid = "audio_crc",
183 .id = V4L2_CID_MPEG_AUDIO_CRC,
184 },{
185 .strid = "video_aspect",
186 .id = V4L2_CID_MPEG_VIDEO_ASPECT,
187 },{
188 .strid = "video_b_frames",
189 .id = V4L2_CID_MPEG_VIDEO_B_FRAMES,
190 },{
191 .strid = "video_gop_size",
192 .id = V4L2_CID_MPEG_VIDEO_GOP_SIZE,
193 },{
194 .strid = "video_gop_closure",
195 .id = V4L2_CID_MPEG_VIDEO_GOP_CLOSURE,
196 },{
Mike Iselyb30d2442006-06-25 20:05:01 -0300197 .strid = "video_bitrate_mode",
198 .id = V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
199 },{
200 .strid = "video_bitrate",
201 .id = V4L2_CID_MPEG_VIDEO_BITRATE,
202 },{
203 .strid = "video_bitrate_peak",
204 .id = V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
205 },{
206 .strid = "video_temporal_decimation",
207 .id = V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION,
208 },{
209 .strid = "stream_type",
210 .id = V4L2_CID_MPEG_STREAM_TYPE,
211 },{
212 .strid = "video_spatial_filter_mode",
213 .id = V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE,
214 },{
215 .strid = "video_spatial_filter",
216 .id = V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER,
217 },{
218 .strid = "video_luma_spatial_filter_type",
219 .id = V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE,
220 },{
221 .strid = "video_chroma_spatial_filter_type",
222 .id = V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE,
223 },{
224 .strid = "video_temporal_filter_mode",
225 .id = V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE,
226 },{
227 .strid = "video_temporal_filter",
228 .id = V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER,
229 },{
230 .strid = "video_median_filter_type",
231 .id = V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE,
232 },{
233 .strid = "video_luma_median_filter_top",
234 .id = V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP,
235 },{
236 .strid = "video_luma_median_filter_bottom",
237 .id = V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM,
238 },{
239 .strid = "video_chroma_median_filter_top",
240 .id = V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP,
241 },{
242 .strid = "video_chroma_median_filter_bottom",
243 .id = V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM,
244 }
245};
Ahmed S. Darwisheca8ebf2007-01-20 00:35:03 -0300246#define MPEGDEF_COUNT ARRAY_SIZE(mpeg_ids)
Mike Iselyc05c0462006-06-25 20:04:25 -0300247
Mike Iselyd8554972006-06-26 20:58:46 -0300248
Mike Isely434449f2006-08-08 09:10:06 -0300249static const char *control_values_srate[] = {
250 [V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100] = "44.1 kHz",
251 [V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000] = "48 kHz",
252 [V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000] = "32 kHz",
253};
Mike Iselyd8554972006-06-26 20:58:46 -0300254
Mike Iselyd8554972006-06-26 20:58:46 -0300255
256
257static const char *control_values_input[] = {
258 [PVR2_CVAL_INPUT_TV] = "television", /*xawtv needs this name*/
Mike Isely29bf5b12008-04-22 14:45:37 -0300259 [PVR2_CVAL_INPUT_DTV] = "dtv",
Mike Iselyd8554972006-06-26 20:58:46 -0300260 [PVR2_CVAL_INPUT_RADIO] = "radio",
261 [PVR2_CVAL_INPUT_SVIDEO] = "s-video",
262 [PVR2_CVAL_INPUT_COMPOSITE] = "composite",
263};
264
265
266static const char *control_values_audiomode[] = {
267 [V4L2_TUNER_MODE_MONO] = "Mono",
268 [V4L2_TUNER_MODE_STEREO] = "Stereo",
269 [V4L2_TUNER_MODE_LANG1] = "Lang1",
270 [V4L2_TUNER_MODE_LANG2] = "Lang2",
271 [V4L2_TUNER_MODE_LANG1_LANG2] = "Lang1+Lang2",
272};
273
274
275static const char *control_values_hsm[] = {
276 [PVR2_CVAL_HSM_FAIL] = "Fail",
277 [PVR2_CVAL_HSM_HIGH] = "High",
278 [PVR2_CVAL_HSM_FULL] = "Full",
279};
280
281
Mike Isely681c7392007-11-26 01:48:52 -0300282static const char *pvr2_state_names[] = {
283 [PVR2_STATE_NONE] = "none",
284 [PVR2_STATE_DEAD] = "dead",
285 [PVR2_STATE_COLD] = "cold",
286 [PVR2_STATE_WARM] = "warm",
287 [PVR2_STATE_ERROR] = "error",
288 [PVR2_STATE_READY] = "ready",
289 [PVR2_STATE_RUN] = "run",
Mike Iselyd8554972006-06-26 20:58:46 -0300290};
291
Mike Isely681c7392007-11-26 01:48:52 -0300292
Mike Isely694dca22008-03-28 05:42:10 -0300293struct pvr2_fx2cmd_descdef {
Mike Isely1c9d10d2008-03-28 05:38:54 -0300294 unsigned char id;
295 unsigned char *desc;
296};
297
Mike Isely694dca22008-03-28 05:42:10 -0300298static const struct pvr2_fx2cmd_descdef pvr2_fx2cmd_desc[] = {
Mike Isely1c9d10d2008-03-28 05:38:54 -0300299 {FX2CMD_MEM_WRITE_DWORD, "write encoder dword"},
300 {FX2CMD_MEM_READ_DWORD, "read encoder dword"},
Mike Isely31335b12008-07-25 19:35:31 -0300301 {FX2CMD_HCW_ZILOG_RESET, "zilog IR reset control"},
Mike Isely1c9d10d2008-03-28 05:38:54 -0300302 {FX2CMD_MEM_READ_64BYTES, "read encoder 64bytes"},
303 {FX2CMD_REG_WRITE, "write encoder register"},
304 {FX2CMD_REG_READ, "read encoder register"},
305 {FX2CMD_MEMSEL, "encoder memsel"},
306 {FX2CMD_I2C_WRITE, "i2c write"},
307 {FX2CMD_I2C_READ, "i2c read"},
308 {FX2CMD_GET_USB_SPEED, "get USB speed"},
309 {FX2CMD_STREAMING_ON, "stream on"},
310 {FX2CMD_STREAMING_OFF, "stream off"},
311 {FX2CMD_FWPOST1, "fwpost1"},
312 {FX2CMD_POWER_OFF, "power off"},
313 {FX2CMD_POWER_ON, "power on"},
314 {FX2CMD_DEEP_RESET, "deep reset"},
315 {FX2CMD_GET_EEPROM_ADDR, "get rom addr"},
316 {FX2CMD_GET_IR_CODE, "get IR code"},
317 {FX2CMD_HCW_DEMOD_RESETIN, "hcw demod resetin"},
318 {FX2CMD_HCW_DTV_STREAMING_ON, "hcw dtv stream on"},
319 {FX2CMD_HCW_DTV_STREAMING_OFF, "hcw dtv stream off"},
320 {FX2CMD_ONAIR_DTV_STREAMING_ON, "onair dtv stream on"},
321 {FX2CMD_ONAIR_DTV_STREAMING_OFF, "onair dtv stream off"},
322 {FX2CMD_ONAIR_DTV_POWER_ON, "onair dtv power on"},
323 {FX2CMD_ONAIR_DTV_POWER_OFF, "onair dtv power off"},
324};
325
326
Mike Isely1cb03b72008-04-21 03:47:43 -0300327static int pvr2_hdw_set_input(struct pvr2_hdw *hdw,int v);
Mike Isely681c7392007-11-26 01:48:52 -0300328static void pvr2_hdw_state_sched(struct pvr2_hdw *);
329static int pvr2_hdw_state_eval(struct pvr2_hdw *);
Mike Isely1bde0282006-12-27 23:30:13 -0300330static void pvr2_hdw_set_cur_freq(struct pvr2_hdw *,unsigned long);
Mike Isely681c7392007-11-26 01:48:52 -0300331static void pvr2_hdw_worker_poll(struct work_struct *work);
Mike Isely681c7392007-11-26 01:48:52 -0300332static int pvr2_hdw_wait(struct pvr2_hdw *,int state);
333static int pvr2_hdw_untrip_unlocked(struct pvr2_hdw *);
334static void pvr2_hdw_state_log_state(struct pvr2_hdw *);
Adrian Bunk07e337e2006-06-30 11:30:20 -0300335static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl);
Mike Isely681c7392007-11-26 01:48:52 -0300336static int pvr2_hdw_commit_setup(struct pvr2_hdw *hdw);
Adrian Bunk07e337e2006-06-30 11:30:20 -0300337static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw);
Adrian Bunk07e337e2006-06-30 11:30:20 -0300338static void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw);
339static void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw);
Mike Isely681c7392007-11-26 01:48:52 -0300340static void pvr2_hdw_quiescent_timeout(unsigned long);
Mike Isely6e931372010-02-06 02:10:38 -0300341static void pvr2_hdw_decoder_stabilization_timeout(unsigned long);
Mike Isely681c7392007-11-26 01:48:52 -0300342static void pvr2_hdw_encoder_wait_timeout(unsigned long);
Mike Iselyd913d632008-04-06 04:04:35 -0300343static void pvr2_hdw_encoder_run_timeout(unsigned long);
Mike Isely1c9d10d2008-03-28 05:38:54 -0300344static int pvr2_issue_simple_cmd(struct pvr2_hdw *,u32);
Adrian Bunk07e337e2006-06-30 11:30:20 -0300345static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
346 unsigned int timeout,int probe_fl,
347 void *write_data,unsigned int write_len,
348 void *read_data,unsigned int read_len);
Mike Isely432907f2008-08-31 21:02:20 -0300349static int pvr2_hdw_check_cropcap(struct pvr2_hdw *hdw);
Mike Iselyd8554972006-06-26 20:58:46 -0300350
Mike Isely681c7392007-11-26 01:48:52 -0300351
352static void trace_stbit(const char *name,int val)
353{
354 pvr2_trace(PVR2_TRACE_STBITS,
355 "State bit %s <-- %s",
356 name,(val ? "true" : "false"));
357}
358
Mike Iselyd8554972006-06-26 20:58:46 -0300359static int ctrl_channelfreq_get(struct pvr2_ctrl *cptr,int *vp)
360{
361 struct pvr2_hdw *hdw = cptr->hdw;
362 if ((hdw->freqProgSlot > 0) && (hdw->freqProgSlot <= FREQTABLE_SIZE)) {
363 *vp = hdw->freqTable[hdw->freqProgSlot-1];
364 } else {
365 *vp = 0;
366 }
367 return 0;
368}
369
370static int ctrl_channelfreq_set(struct pvr2_ctrl *cptr,int m,int v)
371{
372 struct pvr2_hdw *hdw = cptr->hdw;
Mike Isely1bde0282006-12-27 23:30:13 -0300373 unsigned int slotId = hdw->freqProgSlot;
374 if ((slotId > 0) && (slotId <= FREQTABLE_SIZE)) {
375 hdw->freqTable[slotId-1] = v;
376 /* Handle side effects correctly - if we're tuned to this
377 slot, then forgot the slot id relation since the stored
378 frequency has been changed. */
379 if (hdw->freqSelector) {
380 if (hdw->freqSlotRadio == slotId) {
381 hdw->freqSlotRadio = 0;
382 }
383 } else {
384 if (hdw->freqSlotTelevision == slotId) {
385 hdw->freqSlotTelevision = 0;
386 }
387 }
Mike Iselyd8554972006-06-26 20:58:46 -0300388 }
389 return 0;
390}
391
392static int ctrl_channelprog_get(struct pvr2_ctrl *cptr,int *vp)
393{
394 *vp = cptr->hdw->freqProgSlot;
395 return 0;
396}
397
398static int ctrl_channelprog_set(struct pvr2_ctrl *cptr,int m,int v)
399{
400 struct pvr2_hdw *hdw = cptr->hdw;
401 if ((v >= 0) && (v <= FREQTABLE_SIZE)) {
402 hdw->freqProgSlot = v;
403 }
404 return 0;
405}
406
407static int ctrl_channel_get(struct pvr2_ctrl *cptr,int *vp)
408{
Mike Isely1bde0282006-12-27 23:30:13 -0300409 struct pvr2_hdw *hdw = cptr->hdw;
410 *vp = hdw->freqSelector ? hdw->freqSlotRadio : hdw->freqSlotTelevision;
Mike Iselyd8554972006-06-26 20:58:46 -0300411 return 0;
412}
413
Mike Isely1bde0282006-12-27 23:30:13 -0300414static int ctrl_channel_set(struct pvr2_ctrl *cptr,int m,int slotId)
Mike Iselyd8554972006-06-26 20:58:46 -0300415{
416 unsigned freq = 0;
417 struct pvr2_hdw *hdw = cptr->hdw;
Mike Isely1bde0282006-12-27 23:30:13 -0300418 if ((slotId < 0) || (slotId > FREQTABLE_SIZE)) return 0;
419 if (slotId > 0) {
420 freq = hdw->freqTable[slotId-1];
421 if (!freq) return 0;
422 pvr2_hdw_set_cur_freq(hdw,freq);
Mike Iselyd8554972006-06-26 20:58:46 -0300423 }
Mike Isely1bde0282006-12-27 23:30:13 -0300424 if (hdw->freqSelector) {
425 hdw->freqSlotRadio = slotId;
426 } else {
427 hdw->freqSlotTelevision = slotId;
Mike Iselyd8554972006-06-26 20:58:46 -0300428 }
429 return 0;
430}
431
432static int ctrl_freq_get(struct pvr2_ctrl *cptr,int *vp)
433{
Mike Isely1bde0282006-12-27 23:30:13 -0300434 *vp = pvr2_hdw_get_cur_freq(cptr->hdw);
Mike Iselyd8554972006-06-26 20:58:46 -0300435 return 0;
436}
437
438static int ctrl_freq_is_dirty(struct pvr2_ctrl *cptr)
439{
440 return cptr->hdw->freqDirty != 0;
441}
442
443static void ctrl_freq_clear_dirty(struct pvr2_ctrl *cptr)
444{
445 cptr->hdw->freqDirty = 0;
446}
447
448static int ctrl_freq_set(struct pvr2_ctrl *cptr,int m,int v)
449{
Mike Isely1bde0282006-12-27 23:30:13 -0300450 pvr2_hdw_set_cur_freq(cptr->hdw,v);
Mike Iselyd8554972006-06-26 20:58:46 -0300451 return 0;
452}
453
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300454static int ctrl_cropl_min_get(struct pvr2_ctrl *cptr, int *left)
455{
Mike Isely432907f2008-08-31 21:02:20 -0300456 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
457 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
458 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300459 return stat;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300460 }
Mike Isely432907f2008-08-31 21:02:20 -0300461 *left = cap->bounds.left;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300462 return 0;
463}
464
465static int ctrl_cropl_max_get(struct pvr2_ctrl *cptr, int *left)
466{
Mike Isely432907f2008-08-31 21:02:20 -0300467 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
468 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
469 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300470 return stat;
471 }
472 *left = cap->bounds.left;
473 if (cap->bounds.width > cptr->hdw->cropw_val) {
Mike Isely432907f2008-08-31 21:02:20 -0300474 *left += cap->bounds.width - cptr->hdw->cropw_val;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300475 }
476 return 0;
477}
478
479static int ctrl_cropt_min_get(struct pvr2_ctrl *cptr, int *top)
480{
Mike Isely432907f2008-08-31 21:02:20 -0300481 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
482 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
483 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300484 return stat;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300485 }
Mike Isely432907f2008-08-31 21:02:20 -0300486 *top = cap->bounds.top;
487 return 0;
488}
489
490static int ctrl_cropt_max_get(struct pvr2_ctrl *cptr, int *top)
491{
492 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
493 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
494 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300495 return stat;
496 }
497 *top = cap->bounds.top;
498 if (cap->bounds.height > cptr->hdw->croph_val) {
Mike Isely432907f2008-08-31 21:02:20 -0300499 *top += cap->bounds.height - cptr->hdw->croph_val;
500 }
501 return 0;
502}
503
504static int ctrl_cropw_max_get(struct pvr2_ctrl *cptr, int *val)
505{
506 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
507 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
508 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300509 return stat;
510 }
511 *val = 0;
512 if (cap->bounds.width > cptr->hdw->cropl_val) {
Mike Isely432907f2008-08-31 21:02:20 -0300513 *val = cap->bounds.width - cptr->hdw->cropl_val;
514 }
515 return 0;
516}
517
518static int ctrl_croph_max_get(struct pvr2_ctrl *cptr, int *val)
519{
520 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
521 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
522 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300523 return stat;
524 }
525 *val = 0;
526 if (cap->bounds.height > cptr->hdw->cropt_val) {
Mike Isely432907f2008-08-31 21:02:20 -0300527 *val = cap->bounds.height - cptr->hdw->cropt_val;
528 }
529 return 0;
530}
531
532static int ctrl_get_cropcapbl(struct pvr2_ctrl *cptr, int *val)
533{
534 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
535 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
536 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300537 return stat;
538 }
539 *val = cap->bounds.left;
540 return 0;
541}
542
543static int ctrl_get_cropcapbt(struct pvr2_ctrl *cptr, int *val)
544{
545 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
546 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
547 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300548 return stat;
549 }
550 *val = cap->bounds.top;
551 return 0;
552}
553
554static int ctrl_get_cropcapbw(struct pvr2_ctrl *cptr, int *val)
555{
556 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
557 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
558 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300559 return stat;
560 }
561 *val = cap->bounds.width;
562 return 0;
563}
564
565static int ctrl_get_cropcapbh(struct pvr2_ctrl *cptr, int *val)
566{
567 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
568 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
569 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300570 return stat;
571 }
572 *val = cap->bounds.height;
573 return 0;
574}
575
576static int ctrl_get_cropcapdl(struct pvr2_ctrl *cptr, int *val)
577{
578 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
579 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
580 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300581 return stat;
582 }
583 *val = cap->defrect.left;
584 return 0;
585}
586
587static int ctrl_get_cropcapdt(struct pvr2_ctrl *cptr, int *val)
588{
589 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
590 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
591 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300592 return stat;
593 }
594 *val = cap->defrect.top;
595 return 0;
596}
597
598static int ctrl_get_cropcapdw(struct pvr2_ctrl *cptr, int *val)
599{
600 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
601 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
602 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300603 return stat;
604 }
605 *val = cap->defrect.width;
606 return 0;
607}
608
609static int ctrl_get_cropcapdh(struct pvr2_ctrl *cptr, int *val)
610{
611 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
612 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
613 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300614 return stat;
615 }
616 *val = cap->defrect.height;
617 return 0;
618}
619
620static int ctrl_get_cropcappan(struct pvr2_ctrl *cptr, int *val)
621{
622 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
623 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
624 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300625 return stat;
626 }
627 *val = cap->pixelaspect.numerator;
628 return 0;
629}
630
631static int ctrl_get_cropcappad(struct pvr2_ctrl *cptr, int *val)
632{
633 struct v4l2_cropcap *cap = &cptr->hdw->cropcap_info;
634 int stat = pvr2_hdw_check_cropcap(cptr->hdw);
635 if (stat != 0) {
Mike Isely432907f2008-08-31 21:02:20 -0300636 return stat;
637 }
638 *val = cap->pixelaspect.denominator;
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -0300639 return 0;
640}
641
Mike Isely3ad9fc32006-09-02 22:37:52 -0300642static int ctrl_vres_max_get(struct pvr2_ctrl *cptr,int *vp)
643{
644 /* Actual maximum depends on the video standard in effect. */
645 if (cptr->hdw->std_mask_cur & V4L2_STD_525_60) {
646 *vp = 480;
647 } else {
648 *vp = 576;
649 }
650 return 0;
651}
652
653static int ctrl_vres_min_get(struct pvr2_ctrl *cptr,int *vp)
654{
Mike Isely989eb152007-11-26 01:53:12 -0300655 /* Actual minimum depends on device digitizer type. */
656 if (cptr->hdw->hdw_desc->flag_has_cx25840) {
Mike Isely3ad9fc32006-09-02 22:37:52 -0300657 *vp = 75;
658 } else {
659 *vp = 17;
660 }
661 return 0;
662}
663
Mike Isely1bde0282006-12-27 23:30:13 -0300664static int ctrl_get_input(struct pvr2_ctrl *cptr,int *vp)
665{
666 *vp = cptr->hdw->input_val;
667 return 0;
668}
669
Mike Isely29bf5b12008-04-22 14:45:37 -0300670static int ctrl_check_input(struct pvr2_ctrl *cptr,int v)
671{
Mike Isely1cb03b72008-04-21 03:47:43 -0300672 return ((1 << v) & cptr->hdw->input_allowed_mask) != 0;
Mike Isely29bf5b12008-04-22 14:45:37 -0300673}
674
Mike Isely1bde0282006-12-27 23:30:13 -0300675static int ctrl_set_input(struct pvr2_ctrl *cptr,int m,int v)
676{
Mike Isely1cb03b72008-04-21 03:47:43 -0300677 return pvr2_hdw_set_input(cptr->hdw,v);
Mike Isely1bde0282006-12-27 23:30:13 -0300678}
679
680static int ctrl_isdirty_input(struct pvr2_ctrl *cptr)
681{
682 return cptr->hdw->input_dirty != 0;
683}
684
685static void ctrl_cleardirty_input(struct pvr2_ctrl *cptr)
686{
687 cptr->hdw->input_dirty = 0;
688}
689
Mike Isely5549f542006-12-27 23:28:54 -0300690
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300691static int ctrl_freq_max_get(struct pvr2_ctrl *cptr, int *vp)
692{
Mike Isely644afdb2007-01-20 00:19:23 -0300693 unsigned long fv;
694 struct pvr2_hdw *hdw = cptr->hdw;
695 if (hdw->tuner_signal_stale) {
Mike Iselya51f5002009-03-06 23:30:37 -0300696 pvr2_hdw_status_poll(hdw);
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300697 }
Mike Isely644afdb2007-01-20 00:19:23 -0300698 fv = hdw->tuner_signal_info.rangehigh;
699 if (!fv) {
700 /* Safety fallback */
701 *vp = TV_MAX_FREQ;
702 return 0;
703 }
704 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
705 fv = (fv * 125) / 2;
706 } else {
707 fv = fv * 62500;
708 }
709 *vp = fv;
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300710 return 0;
711}
712
713static int ctrl_freq_min_get(struct pvr2_ctrl *cptr, int *vp)
714{
Mike Isely644afdb2007-01-20 00:19:23 -0300715 unsigned long fv;
716 struct pvr2_hdw *hdw = cptr->hdw;
717 if (hdw->tuner_signal_stale) {
Mike Iselya51f5002009-03-06 23:30:37 -0300718 pvr2_hdw_status_poll(hdw);
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300719 }
Mike Isely644afdb2007-01-20 00:19:23 -0300720 fv = hdw->tuner_signal_info.rangelow;
721 if (!fv) {
722 /* Safety fallback */
723 *vp = TV_MIN_FREQ;
724 return 0;
725 }
726 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
727 fv = (fv * 125) / 2;
728 } else {
729 fv = fv * 62500;
730 }
731 *vp = fv;
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -0300732 return 0;
733}
734
Mike Iselyb30d2442006-06-25 20:05:01 -0300735static int ctrl_cx2341x_is_dirty(struct pvr2_ctrl *cptr)
736{
737 return cptr->hdw->enc_stale != 0;
738}
739
740static void ctrl_cx2341x_clear_dirty(struct pvr2_ctrl *cptr)
741{
742 cptr->hdw->enc_stale = 0;
Mike Isely681c7392007-11-26 01:48:52 -0300743 cptr->hdw->enc_unsafe_stale = 0;
Mike Iselyb30d2442006-06-25 20:05:01 -0300744}
745
746static int ctrl_cx2341x_get(struct pvr2_ctrl *cptr,int *vp)
747{
748 int ret;
749 struct v4l2_ext_controls cs;
750 struct v4l2_ext_control c1;
751 memset(&cs,0,sizeof(cs));
752 memset(&c1,0,sizeof(c1));
753 cs.controls = &c1;
754 cs.count = 1;
755 c1.id = cptr->info->v4l_id;
Hans Verkuil01f1e442007-08-21 18:32:42 -0300756 ret = cx2341x_ext_ctrls(&cptr->hdw->enc_ctl_state, 0, &cs,
Mike Iselyb30d2442006-06-25 20:05:01 -0300757 VIDIOC_G_EXT_CTRLS);
758 if (ret) return ret;
759 *vp = c1.value;
760 return 0;
761}
762
763static int ctrl_cx2341x_set(struct pvr2_ctrl *cptr,int m,int v)
764{
765 int ret;
Mike Isely681c7392007-11-26 01:48:52 -0300766 struct pvr2_hdw *hdw = cptr->hdw;
Mike Iselyb30d2442006-06-25 20:05:01 -0300767 struct v4l2_ext_controls cs;
768 struct v4l2_ext_control c1;
769 memset(&cs,0,sizeof(cs));
770 memset(&c1,0,sizeof(c1));
771 cs.controls = &c1;
772 cs.count = 1;
773 c1.id = cptr->info->v4l_id;
774 c1.value = v;
Mike Isely681c7392007-11-26 01:48:52 -0300775 ret = cx2341x_ext_ctrls(&hdw->enc_ctl_state,
776 hdw->state_encoder_run, &cs,
Mike Iselyb30d2442006-06-25 20:05:01 -0300777 VIDIOC_S_EXT_CTRLS);
Mike Isely681c7392007-11-26 01:48:52 -0300778 if (ret == -EBUSY) {
779 /* Oops. cx2341x is telling us it's not safe to change
780 this control while we're capturing. Make a note of this
781 fact so that the pipeline will be stopped the next time
782 controls are committed. Then go on ahead and store this
783 change anyway. */
784 ret = cx2341x_ext_ctrls(&hdw->enc_ctl_state,
785 0, &cs,
786 VIDIOC_S_EXT_CTRLS);
787 if (!ret) hdw->enc_unsafe_stale = !0;
788 }
Mike Iselyb30d2442006-06-25 20:05:01 -0300789 if (ret) return ret;
Mike Isely681c7392007-11-26 01:48:52 -0300790 hdw->enc_stale = !0;
Mike Iselyb30d2442006-06-25 20:05:01 -0300791 return 0;
792}
793
794static unsigned int ctrl_cx2341x_getv4lflags(struct pvr2_ctrl *cptr)
795{
796 struct v4l2_queryctrl qctrl;
797 struct pvr2_ctl_info *info;
798 qctrl.id = cptr->info->v4l_id;
799 cx2341x_ctrl_query(&cptr->hdw->enc_ctl_state,&qctrl);
800 /* Strip out the const so we can adjust a function pointer. It's
801 OK to do this here because we know this is a dynamically created
802 control, so the underlying storage for the info pointer is (a)
803 private to us, and (b) not in read-only storage. Either we do
804 this or we significantly complicate the underlying control
805 implementation. */
806 info = (struct pvr2_ctl_info *)(cptr->info);
807 if (qctrl.flags & V4L2_CTRL_FLAG_READ_ONLY) {
808 if (info->set_value) {
Mike Iselya0fd1cb2006-06-30 11:35:28 -0300809 info->set_value = NULL;
Mike Iselyb30d2442006-06-25 20:05:01 -0300810 }
811 } else {
812 if (!(info->set_value)) {
813 info->set_value = ctrl_cx2341x_set;
814 }
815 }
816 return qctrl.flags;
817}
818
Mike Iselyd8554972006-06-26 20:58:46 -0300819static int ctrl_streamingenabled_get(struct pvr2_ctrl *cptr,int *vp)
820{
Mike Isely681c7392007-11-26 01:48:52 -0300821 *vp = cptr->hdw->state_pipeline_req;
822 return 0;
823}
824
825static int ctrl_masterstate_get(struct pvr2_ctrl *cptr,int *vp)
826{
827 *vp = cptr->hdw->master_state;
Mike Iselyd8554972006-06-26 20:58:46 -0300828 return 0;
829}
830
831static int ctrl_hsm_get(struct pvr2_ctrl *cptr,int *vp)
832{
833 int result = pvr2_hdw_is_hsm(cptr->hdw);
834 *vp = PVR2_CVAL_HSM_FULL;
835 if (result < 0) *vp = PVR2_CVAL_HSM_FAIL;
836 if (result) *vp = PVR2_CVAL_HSM_HIGH;
837 return 0;
838}
839
840static int ctrl_stdavail_get(struct pvr2_ctrl *cptr,int *vp)
841{
842 *vp = cptr->hdw->std_mask_avail;
843 return 0;
844}
845
846static int ctrl_stdavail_set(struct pvr2_ctrl *cptr,int m,int v)
847{
848 struct pvr2_hdw *hdw = cptr->hdw;
849 v4l2_std_id ns;
850 ns = hdw->std_mask_avail;
851 ns = (ns & ~m) | (v & m);
852 if (ns == hdw->std_mask_avail) return 0;
853 hdw->std_mask_avail = ns;
854 pvr2_hdw_internal_set_std_avail(hdw);
855 pvr2_hdw_internal_find_stdenum(hdw);
856 return 0;
857}
858
859static int ctrl_std_val_to_sym(struct pvr2_ctrl *cptr,int msk,int val,
860 char *bufPtr,unsigned int bufSize,
861 unsigned int *len)
862{
863 *len = pvr2_std_id_to_str(bufPtr,bufSize,msk & val);
864 return 0;
865}
866
867static int ctrl_std_sym_to_val(struct pvr2_ctrl *cptr,
868 const char *bufPtr,unsigned int bufSize,
869 int *mskp,int *valp)
870{
871 int ret;
872 v4l2_std_id id;
873 ret = pvr2_std_str_to_id(&id,bufPtr,bufSize);
874 if (ret < 0) return ret;
875 if (mskp) *mskp = id;
876 if (valp) *valp = id;
877 return 0;
878}
879
880static int ctrl_stdcur_get(struct pvr2_ctrl *cptr,int *vp)
881{
882 *vp = cptr->hdw->std_mask_cur;
883 return 0;
884}
885
886static int ctrl_stdcur_set(struct pvr2_ctrl *cptr,int m,int v)
887{
888 struct pvr2_hdw *hdw = cptr->hdw;
889 v4l2_std_id ns;
890 ns = hdw->std_mask_cur;
891 ns = (ns & ~m) | (v & m);
892 if (ns == hdw->std_mask_cur) return 0;
893 hdw->std_mask_cur = ns;
894 hdw->std_dirty = !0;
895 pvr2_hdw_internal_find_stdenum(hdw);
896 return 0;
897}
898
899static int ctrl_stdcur_is_dirty(struct pvr2_ctrl *cptr)
900{
901 return cptr->hdw->std_dirty != 0;
902}
903
904static void ctrl_stdcur_clear_dirty(struct pvr2_ctrl *cptr)
905{
906 cptr->hdw->std_dirty = 0;
907}
908
909static int ctrl_signal_get(struct pvr2_ctrl *cptr,int *vp)
910{
Mike Isely18103c52007-01-20 00:09:47 -0300911 struct pvr2_hdw *hdw = cptr->hdw;
Mike Iselya51f5002009-03-06 23:30:37 -0300912 pvr2_hdw_status_poll(hdw);
Mike Isely18103c52007-01-20 00:09:47 -0300913 *vp = hdw->tuner_signal_info.signal;
914 return 0;
915}
916
917static int ctrl_audio_modes_present_get(struct pvr2_ctrl *cptr,int *vp)
918{
919 int val = 0;
920 unsigned int subchan;
921 struct pvr2_hdw *hdw = cptr->hdw;
Mike Iselya51f5002009-03-06 23:30:37 -0300922 pvr2_hdw_status_poll(hdw);
Mike Isely18103c52007-01-20 00:09:47 -0300923 subchan = hdw->tuner_signal_info.rxsubchans;
924 if (subchan & V4L2_TUNER_SUB_MONO) {
925 val |= (1 << V4L2_TUNER_MODE_MONO);
926 }
927 if (subchan & V4L2_TUNER_SUB_STEREO) {
928 val |= (1 << V4L2_TUNER_MODE_STEREO);
929 }
930 if (subchan & V4L2_TUNER_SUB_LANG1) {
931 val |= (1 << V4L2_TUNER_MODE_LANG1);
932 }
933 if (subchan & V4L2_TUNER_SUB_LANG2) {
934 val |= (1 << V4L2_TUNER_MODE_LANG2);
935 }
936 *vp = val;
Mike Iselyd8554972006-06-26 20:58:46 -0300937 return 0;
938}
939
Mike Iselyd8554972006-06-26 20:58:46 -0300940
941static int ctrl_stdenumcur_set(struct pvr2_ctrl *cptr,int m,int v)
942{
943 struct pvr2_hdw *hdw = cptr->hdw;
944 if (v < 0) return -EINVAL;
945 if (v > hdw->std_enum_cnt) return -EINVAL;
946 hdw->std_enum_cur = v;
947 if (!v) return 0;
948 v--;
949 if (hdw->std_mask_cur == hdw->std_defs[v].id) return 0;
950 hdw->std_mask_cur = hdw->std_defs[v].id;
951 hdw->std_dirty = !0;
952 return 0;
953}
954
955
956static int ctrl_stdenumcur_get(struct pvr2_ctrl *cptr,int *vp)
957{
958 *vp = cptr->hdw->std_enum_cur;
959 return 0;
960}
961
962
963static int ctrl_stdenumcur_is_dirty(struct pvr2_ctrl *cptr)
964{
965 return cptr->hdw->std_dirty != 0;
966}
967
968
969static void ctrl_stdenumcur_clear_dirty(struct pvr2_ctrl *cptr)
970{
971 cptr->hdw->std_dirty = 0;
972}
973
974
975#define DEFINT(vmin,vmax) \
976 .type = pvr2_ctl_int, \
977 .def.type_int.min_value = vmin, \
978 .def.type_int.max_value = vmax
979
980#define DEFENUM(tab) \
981 .type = pvr2_ctl_enum, \
Mike Isely27c7b712007-01-20 00:39:17 -0300982 .def.type_enum.count = ARRAY_SIZE(tab), \
Mike Iselyd8554972006-06-26 20:58:46 -0300983 .def.type_enum.value_names = tab
984
Mike Isely33213962006-06-25 20:04:40 -0300985#define DEFBOOL \
986 .type = pvr2_ctl_bool
987
Mike Iselyd8554972006-06-26 20:58:46 -0300988#define DEFMASK(msk,tab) \
989 .type = pvr2_ctl_bitmask, \
990 .def.type_bitmask.valid_bits = msk, \
991 .def.type_bitmask.bit_names = tab
992
993#define DEFREF(vname) \
994 .set_value = ctrl_set_##vname, \
995 .get_value = ctrl_get_##vname, \
996 .is_dirty = ctrl_isdirty_##vname, \
997 .clear_dirty = ctrl_cleardirty_##vname
998
999
1000#define VCREATE_FUNCS(vname) \
1001static int ctrl_get_##vname(struct pvr2_ctrl *cptr,int *vp) \
1002{*vp = cptr->hdw->vname##_val; return 0;} \
1003static int ctrl_set_##vname(struct pvr2_ctrl *cptr,int m,int v) \
1004{cptr->hdw->vname##_val = v; cptr->hdw->vname##_dirty = !0; return 0;} \
1005static int ctrl_isdirty_##vname(struct pvr2_ctrl *cptr) \
1006{return cptr->hdw->vname##_dirty != 0;} \
1007static void ctrl_cleardirty_##vname(struct pvr2_ctrl *cptr) \
1008{cptr->hdw->vname##_dirty = 0;}
1009
1010VCREATE_FUNCS(brightness)
1011VCREATE_FUNCS(contrast)
1012VCREATE_FUNCS(saturation)
1013VCREATE_FUNCS(hue)
1014VCREATE_FUNCS(volume)
1015VCREATE_FUNCS(balance)
1016VCREATE_FUNCS(bass)
1017VCREATE_FUNCS(treble)
1018VCREATE_FUNCS(mute)
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001019VCREATE_FUNCS(cropl)
1020VCREATE_FUNCS(cropt)
1021VCREATE_FUNCS(cropw)
1022VCREATE_FUNCS(croph)
Mike Iselyc05c0462006-06-25 20:04:25 -03001023VCREATE_FUNCS(audiomode)
1024VCREATE_FUNCS(res_hor)
1025VCREATE_FUNCS(res_ver)
Mike Iselyd8554972006-06-26 20:58:46 -03001026VCREATE_FUNCS(srate)
Mike Iselyd8554972006-06-26 20:58:46 -03001027
Mike Iselyd8554972006-06-26 20:58:46 -03001028/* Table definition of all controls which can be manipulated */
1029static const struct pvr2_ctl_info control_defs[] = {
1030 {
1031 .v4l_id = V4L2_CID_BRIGHTNESS,
1032 .desc = "Brightness",
1033 .name = "brightness",
1034 .default_value = 128,
1035 DEFREF(brightness),
1036 DEFINT(0,255),
1037 },{
1038 .v4l_id = V4L2_CID_CONTRAST,
1039 .desc = "Contrast",
1040 .name = "contrast",
1041 .default_value = 68,
1042 DEFREF(contrast),
1043 DEFINT(0,127),
1044 },{
1045 .v4l_id = V4L2_CID_SATURATION,
1046 .desc = "Saturation",
1047 .name = "saturation",
1048 .default_value = 64,
1049 DEFREF(saturation),
1050 DEFINT(0,127),
1051 },{
1052 .v4l_id = V4L2_CID_HUE,
1053 .desc = "Hue",
1054 .name = "hue",
1055 .default_value = 0,
1056 DEFREF(hue),
1057 DEFINT(-128,127),
1058 },{
1059 .v4l_id = V4L2_CID_AUDIO_VOLUME,
1060 .desc = "Volume",
1061 .name = "volume",
Mike Isely139eecf2006-12-27 23:36:33 -03001062 .default_value = 62000,
Mike Iselyd8554972006-06-26 20:58:46 -03001063 DEFREF(volume),
1064 DEFINT(0,65535),
1065 },{
1066 .v4l_id = V4L2_CID_AUDIO_BALANCE,
1067 .desc = "Balance",
1068 .name = "balance",
1069 .default_value = 0,
1070 DEFREF(balance),
1071 DEFINT(-32768,32767),
1072 },{
1073 .v4l_id = V4L2_CID_AUDIO_BASS,
1074 .desc = "Bass",
1075 .name = "bass",
1076 .default_value = 0,
1077 DEFREF(bass),
1078 DEFINT(-32768,32767),
1079 },{
1080 .v4l_id = V4L2_CID_AUDIO_TREBLE,
1081 .desc = "Treble",
1082 .name = "treble",
1083 .default_value = 0,
1084 DEFREF(treble),
1085 DEFINT(-32768,32767),
1086 },{
1087 .v4l_id = V4L2_CID_AUDIO_MUTE,
1088 .desc = "Mute",
1089 .name = "mute",
1090 .default_value = 0,
1091 DEFREF(mute),
Mike Isely33213962006-06-25 20:04:40 -03001092 DEFBOOL,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001093 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001094 .desc = "Capture crop left margin",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001095 .name = "crop_left",
1096 .internal_id = PVR2_CID_CROPL,
1097 .default_value = 0,
1098 DEFREF(cropl),
1099 DEFINT(-129, 340),
1100 .get_min_value = ctrl_cropl_min_get,
1101 .get_max_value = ctrl_cropl_max_get,
Mike Isely432907f2008-08-31 21:02:20 -03001102 .get_def_value = ctrl_get_cropcapdl,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001103 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001104 .desc = "Capture crop top margin",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001105 .name = "crop_top",
1106 .internal_id = PVR2_CID_CROPT,
1107 .default_value = 0,
1108 DEFREF(cropt),
1109 DEFINT(-35, 544),
1110 .get_min_value = ctrl_cropt_min_get,
1111 .get_max_value = ctrl_cropt_max_get,
Mike Isely432907f2008-08-31 21:02:20 -03001112 .get_def_value = ctrl_get_cropcapdt,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001113 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001114 .desc = "Capture crop width",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001115 .name = "crop_width",
1116 .internal_id = PVR2_CID_CROPW,
1117 .default_value = 720,
1118 DEFREF(cropw),
Mike Isely432907f2008-08-31 21:02:20 -03001119 .get_max_value = ctrl_cropw_max_get,
1120 .get_def_value = ctrl_get_cropcapdw,
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001121 }, {
Mike Isely432907f2008-08-31 21:02:20 -03001122 .desc = "Capture crop height",
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03001123 .name = "crop_height",
1124 .internal_id = PVR2_CID_CROPH,
1125 .default_value = 480,
1126 DEFREF(croph),
Mike Isely432907f2008-08-31 21:02:20 -03001127 .get_max_value = ctrl_croph_max_get,
1128 .get_def_value = ctrl_get_cropcapdh,
1129 }, {
1130 .desc = "Capture capability pixel aspect numerator",
1131 .name = "cropcap_pixel_numerator",
1132 .internal_id = PVR2_CID_CROPCAPPAN,
1133 .get_value = ctrl_get_cropcappan,
1134 }, {
1135 .desc = "Capture capability pixel aspect denominator",
1136 .name = "cropcap_pixel_denominator",
1137 .internal_id = PVR2_CID_CROPCAPPAD,
1138 .get_value = ctrl_get_cropcappad,
1139 }, {
1140 .desc = "Capture capability bounds top",
1141 .name = "cropcap_bounds_top",
1142 .internal_id = PVR2_CID_CROPCAPBT,
1143 .get_value = ctrl_get_cropcapbt,
1144 }, {
1145 .desc = "Capture capability bounds left",
1146 .name = "cropcap_bounds_left",
1147 .internal_id = PVR2_CID_CROPCAPBL,
1148 .get_value = ctrl_get_cropcapbl,
1149 }, {
1150 .desc = "Capture capability bounds width",
1151 .name = "cropcap_bounds_width",
1152 .internal_id = PVR2_CID_CROPCAPBW,
1153 .get_value = ctrl_get_cropcapbw,
1154 }, {
1155 .desc = "Capture capability bounds height",
1156 .name = "cropcap_bounds_height",
1157 .internal_id = PVR2_CID_CROPCAPBH,
1158 .get_value = ctrl_get_cropcapbh,
Mike Iselyd8554972006-06-26 20:58:46 -03001159 },{
Mike Iselyc05c0462006-06-25 20:04:25 -03001160 .desc = "Video Source",
1161 .name = "input",
1162 .internal_id = PVR2_CID_INPUT,
1163 .default_value = PVR2_CVAL_INPUT_TV,
Mike Isely29bf5b12008-04-22 14:45:37 -03001164 .check_value = ctrl_check_input,
Mike Iselyc05c0462006-06-25 20:04:25 -03001165 DEFREF(input),
1166 DEFENUM(control_values_input),
1167 },{
1168 .desc = "Audio Mode",
1169 .name = "audio_mode",
1170 .internal_id = PVR2_CID_AUDIOMODE,
1171 .default_value = V4L2_TUNER_MODE_STEREO,
1172 DEFREF(audiomode),
1173 DEFENUM(control_values_audiomode),
1174 },{
1175 .desc = "Horizontal capture resolution",
1176 .name = "resolution_hor",
1177 .internal_id = PVR2_CID_HRES,
1178 .default_value = 720,
1179 DEFREF(res_hor),
Mike Isely3ad9fc32006-09-02 22:37:52 -03001180 DEFINT(19,720),
Mike Iselyc05c0462006-06-25 20:04:25 -03001181 },{
1182 .desc = "Vertical capture resolution",
1183 .name = "resolution_ver",
1184 .internal_id = PVR2_CID_VRES,
1185 .default_value = 480,
1186 DEFREF(res_ver),
Mike Isely3ad9fc32006-09-02 22:37:52 -03001187 DEFINT(17,576),
1188 /* Hook in check for video standard and adjust maximum
1189 depending on the standard. */
1190 .get_max_value = ctrl_vres_max_get,
1191 .get_min_value = ctrl_vres_min_get,
Mike Iselyc05c0462006-06-25 20:04:25 -03001192 },{
Mike Iselyb30d2442006-06-25 20:05:01 -03001193 .v4l_id = V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
Mike Isely434449f2006-08-08 09:10:06 -03001194 .default_value = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000,
1195 .desc = "Audio Sampling Frequency",
Mike Iselyd8554972006-06-26 20:58:46 -03001196 .name = "srate",
Mike Iselyd8554972006-06-26 20:58:46 -03001197 DEFREF(srate),
1198 DEFENUM(control_values_srate),
1199 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001200 .desc = "Tuner Frequency (Hz)",
1201 .name = "frequency",
1202 .internal_id = PVR2_CID_FREQUENCY,
Mike Isely1bde0282006-12-27 23:30:13 -03001203 .default_value = 0,
Mike Iselyd8554972006-06-26 20:58:46 -03001204 .set_value = ctrl_freq_set,
1205 .get_value = ctrl_freq_get,
1206 .is_dirty = ctrl_freq_is_dirty,
1207 .clear_dirty = ctrl_freq_clear_dirty,
Mike Isely644afdb2007-01-20 00:19:23 -03001208 DEFINT(0,0),
Pantelis Koukousoulas25d85272006-12-27 23:06:04 -03001209 /* Hook in check for input value (tv/radio) and adjust
1210 max/min values accordingly */
1211 .get_max_value = ctrl_freq_max_get,
1212 .get_min_value = ctrl_freq_min_get,
Mike Iselyd8554972006-06-26 20:58:46 -03001213 },{
1214 .desc = "Channel",
1215 .name = "channel",
1216 .set_value = ctrl_channel_set,
1217 .get_value = ctrl_channel_get,
1218 DEFINT(0,FREQTABLE_SIZE),
1219 },{
1220 .desc = "Channel Program Frequency",
1221 .name = "freq_table_value",
1222 .set_value = ctrl_channelfreq_set,
1223 .get_value = ctrl_channelfreq_get,
Mike Isely644afdb2007-01-20 00:19:23 -03001224 DEFINT(0,0),
Mike Isely1bde0282006-12-27 23:30:13 -03001225 /* Hook in check for input value (tv/radio) and adjust
1226 max/min values accordingly */
Mike Isely1bde0282006-12-27 23:30:13 -03001227 .get_max_value = ctrl_freq_max_get,
1228 .get_min_value = ctrl_freq_min_get,
Mike Iselyd8554972006-06-26 20:58:46 -03001229 },{
1230 .desc = "Channel Program ID",
1231 .name = "freq_table_channel",
1232 .set_value = ctrl_channelprog_set,
1233 .get_value = ctrl_channelprog_get,
1234 DEFINT(0,FREQTABLE_SIZE),
1235 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001236 .desc = "Streaming Enabled",
1237 .name = "streaming_enabled",
1238 .get_value = ctrl_streamingenabled_get,
Mike Isely33213962006-06-25 20:04:40 -03001239 DEFBOOL,
Mike Iselyd8554972006-06-26 20:58:46 -03001240 },{
1241 .desc = "USB Speed",
1242 .name = "usb_speed",
1243 .get_value = ctrl_hsm_get,
1244 DEFENUM(control_values_hsm),
1245 },{
Mike Isely681c7392007-11-26 01:48:52 -03001246 .desc = "Master State",
1247 .name = "master_state",
1248 .get_value = ctrl_masterstate_get,
1249 DEFENUM(pvr2_state_names),
1250 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001251 .desc = "Signal Present",
1252 .name = "signal_present",
1253 .get_value = ctrl_signal_get,
Mike Isely18103c52007-01-20 00:09:47 -03001254 DEFINT(0,65535),
1255 },{
1256 .desc = "Audio Modes Present",
1257 .name = "audio_modes_present",
1258 .get_value = ctrl_audio_modes_present_get,
1259 /* For this type we "borrow" the V4L2_TUNER_MODE enum from
1260 v4l. Nothing outside of this module cares about this,
1261 but I reuse it in order to also reuse the
1262 control_values_audiomode string table. */
1263 DEFMASK(((1 << V4L2_TUNER_MODE_MONO)|
1264 (1 << V4L2_TUNER_MODE_STEREO)|
1265 (1 << V4L2_TUNER_MODE_LANG1)|
1266 (1 << V4L2_TUNER_MODE_LANG2)),
1267 control_values_audiomode),
Mike Iselyd8554972006-06-26 20:58:46 -03001268 },{
1269 .desc = "Video Standards Available Mask",
1270 .name = "video_standard_mask_available",
1271 .internal_id = PVR2_CID_STDAVAIL,
1272 .skip_init = !0,
1273 .get_value = ctrl_stdavail_get,
1274 .set_value = ctrl_stdavail_set,
1275 .val_to_sym = ctrl_std_val_to_sym,
1276 .sym_to_val = ctrl_std_sym_to_val,
1277 .type = pvr2_ctl_bitmask,
1278 },{
1279 .desc = "Video Standards In Use Mask",
1280 .name = "video_standard_mask_active",
1281 .internal_id = PVR2_CID_STDCUR,
1282 .skip_init = !0,
1283 .get_value = ctrl_stdcur_get,
1284 .set_value = ctrl_stdcur_set,
1285 .is_dirty = ctrl_stdcur_is_dirty,
1286 .clear_dirty = ctrl_stdcur_clear_dirty,
1287 .val_to_sym = ctrl_std_val_to_sym,
1288 .sym_to_val = ctrl_std_sym_to_val,
1289 .type = pvr2_ctl_bitmask,
1290 },{
Mike Iselyd8554972006-06-26 20:58:46 -03001291 .desc = "Video Standard Name",
1292 .name = "video_standard",
1293 .internal_id = PVR2_CID_STDENUM,
1294 .skip_init = !0,
1295 .get_value = ctrl_stdenumcur_get,
1296 .set_value = ctrl_stdenumcur_set,
1297 .is_dirty = ctrl_stdenumcur_is_dirty,
1298 .clear_dirty = ctrl_stdenumcur_clear_dirty,
1299 .type = pvr2_ctl_enum,
1300 }
1301};
1302
Ahmed S. Darwisheca8ebf2007-01-20 00:35:03 -03001303#define CTRLDEF_COUNT ARRAY_SIZE(control_defs)
Mike Iselyd8554972006-06-26 20:58:46 -03001304
1305
1306const char *pvr2_config_get_name(enum pvr2_config cfg)
1307{
1308 switch (cfg) {
1309 case pvr2_config_empty: return "empty";
1310 case pvr2_config_mpeg: return "mpeg";
1311 case pvr2_config_vbi: return "vbi";
Mike Isely16eb40d2006-12-30 18:27:32 -03001312 case pvr2_config_pcm: return "pcm";
1313 case pvr2_config_rawvideo: return "raw video";
Mike Iselyd8554972006-06-26 20:58:46 -03001314 }
1315 return "<unknown>";
1316}
1317
1318
1319struct usb_device *pvr2_hdw_get_dev(struct pvr2_hdw *hdw)
1320{
1321 return hdw->usb_dev;
1322}
1323
1324
1325unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw)
1326{
1327 return hdw->serial_number;
1328}
1329
Mike Isely31a18542007-04-08 01:11:47 -03001330
1331const char *pvr2_hdw_get_bus_info(struct pvr2_hdw *hdw)
1332{
1333 return hdw->bus_info;
1334}
1335
1336
Mike Isely13a88792009-01-14 04:22:56 -03001337const char *pvr2_hdw_get_device_identifier(struct pvr2_hdw *hdw)
1338{
1339 return hdw->identifier;
1340}
1341
1342
Mike Isely1bde0282006-12-27 23:30:13 -03001343unsigned long pvr2_hdw_get_cur_freq(struct pvr2_hdw *hdw)
1344{
1345 return hdw->freqSelector ? hdw->freqValTelevision : hdw->freqValRadio;
1346}
1347
1348/* Set the currently tuned frequency and account for all possible
1349 driver-core side effects of this action. */
Adrian Bunkf55a8712008-04-18 05:38:56 -03001350static void pvr2_hdw_set_cur_freq(struct pvr2_hdw *hdw,unsigned long val)
Mike Isely1bde0282006-12-27 23:30:13 -03001351{
Mike Isely7c74e572007-01-20 00:15:41 -03001352 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
Mike Isely1bde0282006-12-27 23:30:13 -03001353 if (hdw->freqSelector) {
1354 /* Swing over to radio frequency selection */
1355 hdw->freqSelector = 0;
1356 hdw->freqDirty = !0;
1357 }
Mike Isely1bde0282006-12-27 23:30:13 -03001358 if (hdw->freqValRadio != val) {
1359 hdw->freqValRadio = val;
1360 hdw->freqSlotRadio = 0;
Mike Isely7c74e572007-01-20 00:15:41 -03001361 hdw->freqDirty = !0;
Mike Isely1bde0282006-12-27 23:30:13 -03001362 }
Mike Isely7c74e572007-01-20 00:15:41 -03001363 } else {
Mike Isely1bde0282006-12-27 23:30:13 -03001364 if (!(hdw->freqSelector)) {
1365 /* Swing over to television frequency selection */
1366 hdw->freqSelector = 1;
1367 hdw->freqDirty = !0;
1368 }
Mike Isely1bde0282006-12-27 23:30:13 -03001369 if (hdw->freqValTelevision != val) {
1370 hdw->freqValTelevision = val;
1371 hdw->freqSlotTelevision = 0;
Mike Isely7c74e572007-01-20 00:15:41 -03001372 hdw->freqDirty = !0;
Mike Isely1bde0282006-12-27 23:30:13 -03001373 }
Mike Isely1bde0282006-12-27 23:30:13 -03001374 }
1375}
1376
Mike Iselyd8554972006-06-26 20:58:46 -03001377int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw)
1378{
1379 return hdw->unit_number;
1380}
1381
1382
1383/* Attempt to locate one of the given set of files. Messages are logged
1384 appropriate to what has been found. The return value will be 0 or
1385 greater on success (it will be the index of the file name found) and
1386 fw_entry will be filled in. Otherwise a negative error is returned on
1387 failure. If the return value is -ENOENT then no viable firmware file
1388 could be located. */
1389static int pvr2_locate_firmware(struct pvr2_hdw *hdw,
1390 const struct firmware **fw_entry,
1391 const char *fwtypename,
1392 unsigned int fwcount,
1393 const char *fwnames[])
1394{
1395 unsigned int idx;
1396 int ret = -EINVAL;
1397 for (idx = 0; idx < fwcount; idx++) {
1398 ret = request_firmware(fw_entry,
1399 fwnames[idx],
1400 &hdw->usb_dev->dev);
1401 if (!ret) {
1402 trace_firmware("Located %s firmware: %s;"
1403 " uploading...",
1404 fwtypename,
1405 fwnames[idx]);
1406 return idx;
1407 }
1408 if (ret == -ENOENT) continue;
1409 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1410 "request_firmware fatal error with code=%d",ret);
1411 return ret;
1412 }
1413 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1414 "***WARNING***"
1415 " Device %s firmware"
1416 " seems to be missing.",
1417 fwtypename);
1418 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1419 "Did you install the pvrusb2 firmware files"
1420 " in their proper location?");
1421 if (fwcount == 1) {
1422 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1423 "request_firmware unable to locate %s file %s",
1424 fwtypename,fwnames[0]);
1425 } else {
1426 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1427 "request_firmware unable to locate"
1428 " one of the following %s files:",
1429 fwtypename);
1430 for (idx = 0; idx < fwcount; idx++) {
1431 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1432 "request_firmware: Failed to find %s",
1433 fwnames[idx]);
1434 }
1435 }
1436 return ret;
1437}
1438
1439
1440/*
1441 * pvr2_upload_firmware1().
1442 *
1443 * Send the 8051 firmware to the device. After the upload, arrange for
1444 * device to re-enumerate.
1445 *
1446 * NOTE : the pointer to the firmware data given by request_firmware()
1447 * is not suitable for an usb transaction.
1448 *
1449 */
Adrian Bunk07e337e2006-06-30 11:30:20 -03001450static int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03001451{
Mike Iselya0fd1cb2006-06-30 11:35:28 -03001452 const struct firmware *fw_entry = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03001453 void *fw_ptr;
1454 unsigned int pipe;
Mike Isely9081d902009-11-25 02:59:34 -03001455 unsigned int fwsize;
Mike Iselyd8554972006-06-26 20:58:46 -03001456 int ret;
1457 u16 address;
Mike Isely1d643a32007-09-08 22:18:50 -03001458
Mike Isely989eb152007-11-26 01:53:12 -03001459 if (!hdw->hdw_desc->fx2_firmware.cnt) {
Mike Isely1d643a32007-09-08 22:18:50 -03001460 hdw->fw1_state = FW1_STATE_OK;
Mike Isely56dcbfa2007-11-26 02:00:51 -03001461 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1462 "Connected device type defines"
1463 " no firmware to upload; ignoring firmware");
1464 return -ENOTTY;
Mike Isely1d643a32007-09-08 22:18:50 -03001465 }
1466
Mike Iselyd8554972006-06-26 20:58:46 -03001467 hdw->fw1_state = FW1_STATE_FAILED; // default result
1468
1469 trace_firmware("pvr2_upload_firmware1");
1470
1471 ret = pvr2_locate_firmware(hdw,&fw_entry,"fx2 controller",
Mike Isely989eb152007-11-26 01:53:12 -03001472 hdw->hdw_desc->fx2_firmware.cnt,
1473 hdw->hdw_desc->fx2_firmware.lst);
Mike Iselyd8554972006-06-26 20:58:46 -03001474 if (ret < 0) {
1475 if (ret == -ENOENT) hdw->fw1_state = FW1_STATE_MISSING;
1476 return ret;
1477 }
1478
Mike Iselyd8554972006-06-26 20:58:46 -03001479 usb_clear_halt(hdw->usb_dev, usb_sndbulkpipe(hdw->usb_dev, 0 & 0x7f));
1480
1481 pipe = usb_sndctrlpipe(hdw->usb_dev, 0);
Mike Isely9081d902009-11-25 02:59:34 -03001482 fwsize = fw_entry->size;
Mike Iselyd8554972006-06-26 20:58:46 -03001483
Mike Isely9081d902009-11-25 02:59:34 -03001484 if ((fwsize != 0x2000) &&
1485 (!(hdw->hdw_desc->flag_fx2_16kb && (fwsize == 0x4000)))) {
Mike Iselyc21c2db2009-11-25 02:49:21 -03001486 if (hdw->hdw_desc->flag_fx2_16kb) {
1487 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1488 "Wrong fx2 firmware size"
1489 " (expected 8192 or 16384, got %u)",
Mike Isely9081d902009-11-25 02:59:34 -03001490 fwsize);
Mike Iselyc21c2db2009-11-25 02:49:21 -03001491 } else {
1492 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1493 "Wrong fx2 firmware size"
1494 " (expected 8192, got %u)",
Mike Isely9081d902009-11-25 02:59:34 -03001495 fwsize);
Mike Iselyc21c2db2009-11-25 02:49:21 -03001496 }
Mike Iselyd8554972006-06-26 20:58:46 -03001497 release_firmware(fw_entry);
1498 return -ENOMEM;
1499 }
1500
1501 fw_ptr = kmalloc(0x800, GFP_KERNEL);
1502 if (fw_ptr == NULL){
1503 release_firmware(fw_entry);
1504 return -ENOMEM;
1505 }
1506
1507 /* We have to hold the CPU during firmware upload. */
1508 pvr2_hdw_cpureset_assert(hdw,1);
1509
1510 /* upload the firmware to address 0000-1fff in 2048 (=0x800) bytes
1511 chunk. */
1512
1513 ret = 0;
Mike Isely9081d902009-11-25 02:59:34 -03001514 for (address = 0; address < fwsize; address += 0x800) {
Mike Iselyd8554972006-06-26 20:58:46 -03001515 memcpy(fw_ptr, fw_entry->data + address, 0x800);
1516 ret += usb_control_msg(hdw->usb_dev, pipe, 0xa0, 0x40, address,
1517 0, fw_ptr, 0x800, HZ);
1518 }
1519
1520 trace_firmware("Upload done, releasing device's CPU");
1521
1522 /* Now release the CPU. It will disconnect and reconnect later. */
1523 pvr2_hdw_cpureset_assert(hdw,0);
1524
1525 kfree(fw_ptr);
1526 release_firmware(fw_entry);
1527
1528 trace_firmware("Upload done (%d bytes sent)",ret);
1529
Gary Francis75727462009-11-25 03:03:31 -03001530 /* We should have written fwsize bytes */
1531 if (ret == fwsize) {
Mike Iselyd8554972006-06-26 20:58:46 -03001532 hdw->fw1_state = FW1_STATE_RELOAD;
1533 return 0;
1534 }
1535
1536 return -EIO;
1537}
1538
1539
1540/*
1541 * pvr2_upload_firmware2()
1542 *
1543 * This uploads encoder firmware on endpoint 2.
1544 *
1545 */
1546
1547int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
1548{
Mike Iselya0fd1cb2006-06-30 11:35:28 -03001549 const struct firmware *fw_entry = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03001550 void *fw_ptr;
Mike Isely90060d32007-02-08 02:02:53 -03001551 unsigned int pipe, fw_len, fw_done, bcnt, icnt;
Mike Iselyd8554972006-06-26 20:58:46 -03001552 int actual_length;
1553 int ret = 0;
1554 int fwidx;
1555 static const char *fw_files[] = {
1556 CX2341X_FIRM_ENC_FILENAME,
1557 };
1558
Mike Isely989eb152007-11-26 01:53:12 -03001559 if (hdw->hdw_desc->flag_skip_cx23416_firmware) {
Mike Isely1d643a32007-09-08 22:18:50 -03001560 return 0;
1561 }
1562
Mike Iselyd8554972006-06-26 20:58:46 -03001563 trace_firmware("pvr2_upload_firmware2");
1564
1565 ret = pvr2_locate_firmware(hdw,&fw_entry,"encoder",
Ahmed S. Darwisheca8ebf2007-01-20 00:35:03 -03001566 ARRAY_SIZE(fw_files), fw_files);
Mike Iselyd8554972006-06-26 20:58:46 -03001567 if (ret < 0) return ret;
1568 fwidx = ret;
1569 ret = 0;
Mike Iselyb30d2442006-06-25 20:05:01 -03001570 /* Since we're about to completely reinitialize the encoder,
1571 invalidate our cached copy of its configuration state. Next
1572 time we configure the encoder, then we'll fully configure it. */
1573 hdw->enc_cur_valid = 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001574
Mike Iselyd913d632008-04-06 04:04:35 -03001575 /* Encoder is about to be reset so note that as far as we're
1576 concerned now, the encoder has never been run. */
1577 del_timer_sync(&hdw->encoder_run_timer);
1578 if (hdw->state_encoder_runok) {
1579 hdw->state_encoder_runok = 0;
1580 trace_stbit("state_encoder_runok",hdw->state_encoder_runok);
1581 }
1582
Mike Iselyd8554972006-06-26 20:58:46 -03001583 /* First prepare firmware loading */
1584 ret |= pvr2_write_register(hdw, 0x0048, 0xffffffff); /*interrupt mask*/
1585 ret |= pvr2_hdw_gpio_chg_dir(hdw,0xffffffff,0x00000088); /*gpio dir*/
1586 ret |= pvr2_hdw_gpio_chg_out(hdw,0xffffffff,0x00000008); /*gpio output state*/
1587 ret |= pvr2_hdw_cmd_deep_reset(hdw);
1588 ret |= pvr2_write_register(hdw, 0xa064, 0x00000000); /*APU command*/
1589 ret |= pvr2_hdw_gpio_chg_dir(hdw,0xffffffff,0x00000408); /*gpio dir*/
1590 ret |= pvr2_hdw_gpio_chg_out(hdw,0xffffffff,0x00000008); /*gpio output state*/
1591 ret |= pvr2_write_register(hdw, 0x9058, 0xffffffed); /*VPU ctrl*/
1592 ret |= pvr2_write_register(hdw, 0x9054, 0xfffffffd); /*reset hw blocks*/
1593 ret |= pvr2_write_register(hdw, 0x07f8, 0x80000800); /*encoder SDRAM refresh*/
1594 ret |= pvr2_write_register(hdw, 0x07fc, 0x0000001a); /*encoder SDRAM pre-charge*/
1595 ret |= pvr2_write_register(hdw, 0x0700, 0x00000000); /*I2C clock*/
1596 ret |= pvr2_write_register(hdw, 0xaa00, 0x00000000); /*unknown*/
1597 ret |= pvr2_write_register(hdw, 0xaa04, 0x00057810); /*unknown*/
1598 ret |= pvr2_write_register(hdw, 0xaa10, 0x00148500); /*unknown*/
1599 ret |= pvr2_write_register(hdw, 0xaa18, 0x00840000); /*unknown*/
Mike Isely1c9d10d2008-03-28 05:38:54 -03001600 ret |= pvr2_issue_simple_cmd(hdw,FX2CMD_FWPOST1);
1601 ret |= pvr2_issue_simple_cmd(hdw,FX2CMD_MEMSEL | (1 << 8) | (0 << 16));
Mike Iselyd8554972006-06-26 20:58:46 -03001602
1603 if (ret) {
1604 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1605 "firmware2 upload prep failed, ret=%d",ret);
1606 release_firmware(fw_entry);
Mike Isely21684ba2008-04-21 03:49:33 -03001607 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001608 }
1609
1610 /* Now send firmware */
1611
1612 fw_len = fw_entry->size;
1613
Mike Isely90060d32007-02-08 02:02:53 -03001614 if (fw_len % sizeof(u32)) {
Mike Iselyd8554972006-06-26 20:58:46 -03001615 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1616 "size of %s firmware"
Mike Isely48dc30a2007-03-03 10:13:05 -02001617 " must be a multiple of %zu bytes",
Mike Isely90060d32007-02-08 02:02:53 -03001618 fw_files[fwidx],sizeof(u32));
Mike Iselyd8554972006-06-26 20:58:46 -03001619 release_firmware(fw_entry);
Mike Isely21684ba2008-04-21 03:49:33 -03001620 ret = -EINVAL;
1621 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001622 }
1623
1624 fw_ptr = kmalloc(FIRMWARE_CHUNK_SIZE, GFP_KERNEL);
1625 if (fw_ptr == NULL){
1626 release_firmware(fw_entry);
1627 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1628 "failed to allocate memory for firmware2 upload");
Mike Isely21684ba2008-04-21 03:49:33 -03001629 ret = -ENOMEM;
1630 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001631 }
1632
1633 pipe = usb_sndbulkpipe(hdw->usb_dev, PVR2_FIRMWARE_ENDPOINT);
1634
Mike Isely90060d32007-02-08 02:02:53 -03001635 fw_done = 0;
1636 for (fw_done = 0; fw_done < fw_len;) {
1637 bcnt = fw_len - fw_done;
1638 if (bcnt > FIRMWARE_CHUNK_SIZE) bcnt = FIRMWARE_CHUNK_SIZE;
1639 memcpy(fw_ptr, fw_entry->data + fw_done, bcnt);
1640 /* Usbsnoop log shows that we must swap bytes... */
Mike Isely5f33df12008-08-30 15:09:31 -03001641 /* Some background info: The data being swapped here is a
1642 firmware image destined for the mpeg encoder chip that
1643 lives at the other end of a USB endpoint. The encoder
1644 chip always talks in 32 bit chunks and its storage is
1645 organized into 32 bit words. However from the file
1646 system to the encoder chip everything is purely a byte
1647 stream. The firmware file's contents are always 32 bit
1648 swapped from what the encoder expects. Thus the need
1649 always exists to swap the bytes regardless of the endian
1650 type of the host processor and therefore swab32() makes
1651 the most sense. */
Mike Isely90060d32007-02-08 02:02:53 -03001652 for (icnt = 0; icnt < bcnt/4 ; icnt++)
Harvey Harrison513edce2008-08-18 17:38:01 -03001653 ((u32 *)fw_ptr)[icnt] = swab32(((u32 *)fw_ptr)[icnt]);
Mike Iselyd8554972006-06-26 20:58:46 -03001654
Mike Isely90060d32007-02-08 02:02:53 -03001655 ret |= usb_bulk_msg(hdw->usb_dev, pipe, fw_ptr,bcnt,
Mike Iselyd8554972006-06-26 20:58:46 -03001656 &actual_length, HZ);
Mike Isely90060d32007-02-08 02:02:53 -03001657 ret |= (actual_length != bcnt);
1658 if (ret) break;
1659 fw_done += bcnt;
Mike Iselyd8554972006-06-26 20:58:46 -03001660 }
1661
1662 trace_firmware("upload of %s : %i / %i ",
1663 fw_files[fwidx],fw_done,fw_len);
1664
1665 kfree(fw_ptr);
1666 release_firmware(fw_entry);
1667
1668 if (ret) {
1669 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1670 "firmware2 upload transfer failure");
Mike Isely21684ba2008-04-21 03:49:33 -03001671 goto done;
Mike Iselyd8554972006-06-26 20:58:46 -03001672 }
1673
1674 /* Finish upload */
1675
1676 ret |= pvr2_write_register(hdw, 0x9054, 0xffffffff); /*reset hw blocks*/
1677 ret |= pvr2_write_register(hdw, 0x9058, 0xffffffe8); /*VPU ctrl*/
Mike Isely1c9d10d2008-03-28 05:38:54 -03001678 ret |= pvr2_issue_simple_cmd(hdw,FX2CMD_MEMSEL | (1 << 8) | (0 << 16));
Mike Iselyd8554972006-06-26 20:58:46 -03001679
1680 if (ret) {
1681 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1682 "firmware2 upload post-proc failure");
Mike Iselyd8554972006-06-26 20:58:46 -03001683 }
Mike Isely21684ba2008-04-21 03:49:33 -03001684
1685 done:
Mike Isely1df59f02008-04-21 03:50:39 -03001686 if (hdw->hdw_desc->signal_routing_scheme ==
1687 PVR2_ROUTING_SCHEME_GOTVIEW) {
1688 /* Ensure that GPIO 11 is set to output for GOTVIEW
1689 hardware. */
1690 pvr2_hdw_gpio_chg_dir(hdw,(1 << 11),~0);
1691 }
Mike Iselyd8554972006-06-26 20:58:46 -03001692 return ret;
1693}
1694
1695
Mike Isely681c7392007-11-26 01:48:52 -03001696static const char *pvr2_get_state_name(unsigned int st)
Mike Iselyd8554972006-06-26 20:58:46 -03001697{
Mike Isely681c7392007-11-26 01:48:52 -03001698 if (st < ARRAY_SIZE(pvr2_state_names)) {
1699 return pvr2_state_names[st];
Mike Iselyd8554972006-06-26 20:58:46 -03001700 }
Mike Isely681c7392007-11-26 01:48:52 -03001701 return "???";
Mike Iselyd8554972006-06-26 20:58:46 -03001702}
1703
Mike Isely681c7392007-11-26 01:48:52 -03001704static int pvr2_decoder_enable(struct pvr2_hdw *hdw,int enablefl)
Mike Iselyd8554972006-06-26 20:58:46 -03001705{
Mike Iselyaf78e162009-03-07 00:21:30 -03001706 /* Even though we really only care about the video decoder chip at
1707 this point, we'll broadcast stream on/off to all sub-devices
1708 anyway, just in case somebody else wants to hear the
1709 command... */
Mike Iselye2605082009-03-07 01:50:48 -03001710 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 stream=%s",
1711 (enablefl ? "on" : "off"));
Mike Iselyaf78e162009-03-07 00:21:30 -03001712 v4l2_device_call_all(&hdw->v4l2_dev, 0, video, s_stream, enablefl);
Andy Walls3ccc6462009-12-24 13:06:08 -03001713 v4l2_device_call_all(&hdw->v4l2_dev, 0, audio, s_stream, enablefl);
Mike Iselyaf78e162009-03-07 00:21:30 -03001714 if (hdw->decoder_client_id) {
1715 /* We get here if the encoder has been noticed. Otherwise
1716 we'll issue a warning to the user (which should
1717 normally never happen). */
1718 return 0;
1719 }
1720 if (!hdw->flag_decoder_missed) {
1721 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1722 "WARNING: No decoder present");
1723 hdw->flag_decoder_missed = !0;
1724 trace_stbit("flag_decoder_missed",
1725 hdw->flag_decoder_missed);
1726 }
1727 return -EIO;
Mike Iselyd8554972006-06-26 20:58:46 -03001728}
1729
1730
Mike Isely681c7392007-11-26 01:48:52 -03001731int pvr2_hdw_get_state(struct pvr2_hdw *hdw)
1732{
1733 return hdw->master_state;
1734}
1735
1736
1737static int pvr2_hdw_untrip_unlocked(struct pvr2_hdw *hdw)
1738{
1739 if (!hdw->flag_tripped) return 0;
1740 hdw->flag_tripped = 0;
1741 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1742 "Clearing driver error statuss");
1743 return !0;
1744}
1745
1746
1747int pvr2_hdw_untrip(struct pvr2_hdw *hdw)
1748{
1749 int fl;
1750 LOCK_TAKE(hdw->big_lock); do {
1751 fl = pvr2_hdw_untrip_unlocked(hdw);
1752 } while (0); LOCK_GIVE(hdw->big_lock);
1753 if (fl) pvr2_hdw_state_sched(hdw);
1754 return 0;
1755}
1756
1757
Mike Isely681c7392007-11-26 01:48:52 -03001758
1759
Mike Iselyd8554972006-06-26 20:58:46 -03001760int pvr2_hdw_get_streaming(struct pvr2_hdw *hdw)
1761{
Mike Isely681c7392007-11-26 01:48:52 -03001762 return hdw->state_pipeline_req != 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001763}
1764
1765
1766int pvr2_hdw_set_streaming(struct pvr2_hdw *hdw,int enable_flag)
1767{
Mike Isely681c7392007-11-26 01:48:52 -03001768 int ret,st;
Mike Iselyd8554972006-06-26 20:58:46 -03001769 LOCK_TAKE(hdw->big_lock); do {
Mike Isely681c7392007-11-26 01:48:52 -03001770 pvr2_hdw_untrip_unlocked(hdw);
1771 if ((!enable_flag) != !(hdw->state_pipeline_req)) {
1772 hdw->state_pipeline_req = enable_flag != 0;
1773 pvr2_trace(PVR2_TRACE_START_STOP,
1774 "/*--TRACE_STREAM--*/ %s",
1775 enable_flag ? "enable" : "disable");
1776 }
1777 pvr2_hdw_state_sched(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03001778 } while (0); LOCK_GIVE(hdw->big_lock);
Mike Isely681c7392007-11-26 01:48:52 -03001779 if ((ret = pvr2_hdw_wait(hdw,0)) < 0) return ret;
1780 if (enable_flag) {
1781 while ((st = hdw->master_state) != PVR2_STATE_RUN) {
1782 if (st != PVR2_STATE_READY) return -EIO;
1783 if ((ret = pvr2_hdw_wait(hdw,st)) < 0) return ret;
1784 }
1785 }
Mike Iselyd8554972006-06-26 20:58:46 -03001786 return 0;
1787}
1788
1789
1790int pvr2_hdw_set_stream_type(struct pvr2_hdw *hdw,enum pvr2_config config)
1791{
Mike Isely681c7392007-11-26 01:48:52 -03001792 int fl;
Mike Iselyd8554972006-06-26 20:58:46 -03001793 LOCK_TAKE(hdw->big_lock);
Mike Isely681c7392007-11-26 01:48:52 -03001794 if ((fl = (hdw->desired_stream_type != config)) != 0) {
1795 hdw->desired_stream_type = config;
1796 hdw->state_pipeline_config = 0;
1797 trace_stbit("state_pipeline_config",
1798 hdw->state_pipeline_config);
1799 pvr2_hdw_state_sched(hdw);
1800 }
Mike Iselyd8554972006-06-26 20:58:46 -03001801 LOCK_GIVE(hdw->big_lock);
Mike Isely681c7392007-11-26 01:48:52 -03001802 if (fl) return 0;
1803 return pvr2_hdw_wait(hdw,0);
Mike Iselyd8554972006-06-26 20:58:46 -03001804}
1805
1806
1807static int get_default_tuner_type(struct pvr2_hdw *hdw)
1808{
1809 int unit_number = hdw->unit_number;
1810 int tp = -1;
1811 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1812 tp = tuner[unit_number];
1813 }
1814 if (tp < 0) return -EINVAL;
1815 hdw->tuner_type = tp;
Mike Iselyaaf78842007-11-26 02:04:11 -03001816 hdw->tuner_updated = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03001817 return 0;
1818}
1819
1820
1821static v4l2_std_id get_default_standard(struct pvr2_hdw *hdw)
1822{
1823 int unit_number = hdw->unit_number;
1824 int tp = 0;
1825 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1826 tp = video_std[unit_number];
Mike Isely6a540252007-12-02 23:51:34 -03001827 if (tp) return tp;
Mike Iselyd8554972006-06-26 20:58:46 -03001828 }
Mike Isely6a540252007-12-02 23:51:34 -03001829 return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03001830}
1831
1832
1833static unsigned int get_default_error_tolerance(struct pvr2_hdw *hdw)
1834{
1835 int unit_number = hdw->unit_number;
1836 int tp = 0;
1837 if ((unit_number >= 0) && (unit_number < PVR_NUM)) {
1838 tp = tolerance[unit_number];
1839 }
1840 return tp;
1841}
1842
1843
1844static int pvr2_hdw_check_firmware(struct pvr2_hdw *hdw)
1845{
1846 /* Try a harmless request to fetch the eeprom's address over
1847 endpoint 1. See what happens. Only the full FX2 image can
1848 respond to this. If this probe fails then likely the FX2
1849 firmware needs be loaded. */
1850 int result;
1851 LOCK_TAKE(hdw->ctl_lock); do {
Michael Krufky8d364362007-01-22 02:17:55 -03001852 hdw->cmd_buffer[0] = FX2CMD_GET_EEPROM_ADDR;
Mike Iselyd8554972006-06-26 20:58:46 -03001853 result = pvr2_send_request_ex(hdw,HZ*1,!0,
1854 hdw->cmd_buffer,1,
1855 hdw->cmd_buffer,1);
1856 if (result < 0) break;
1857 } while(0); LOCK_GIVE(hdw->ctl_lock);
1858 if (result) {
1859 pvr2_trace(PVR2_TRACE_INIT,
1860 "Probe of device endpoint 1 result status %d",
1861 result);
1862 } else {
1863 pvr2_trace(PVR2_TRACE_INIT,
1864 "Probe of device endpoint 1 succeeded");
1865 }
1866 return result == 0;
1867}
1868
Mike Isely9f66d4e2007-09-08 22:28:51 -03001869struct pvr2_std_hack {
1870 v4l2_std_id pat; /* Pattern to match */
1871 v4l2_std_id msk; /* Which bits we care about */
1872 v4l2_std_id std; /* What additional standards or default to set */
1873};
1874
1875/* This data structure labels specific combinations of standards from
1876 tveeprom that we'll try to recognize. If we recognize one, then assume
1877 a specified default standard to use. This is here because tveeprom only
1878 tells us about available standards not the intended default standard (if
1879 any) for the device in question. We guess the default based on what has
1880 been reported as available. Note that this is only for guessing a
1881 default - which can always be overridden explicitly - and if the user
1882 has otherwise named a default then that default will always be used in
1883 place of this table. */
Tobias Klauserebff0332008-04-22 14:45:45 -03001884static const struct pvr2_std_hack std_eeprom_maps[] = {
Mike Isely9f66d4e2007-09-08 22:28:51 -03001885 { /* PAL(B/G) */
1886 .pat = V4L2_STD_B|V4L2_STD_GH,
1887 .std = V4L2_STD_PAL_B|V4L2_STD_PAL_B1|V4L2_STD_PAL_G,
1888 },
1889 { /* NTSC(M) */
1890 .pat = V4L2_STD_MN,
1891 .std = V4L2_STD_NTSC_M,
1892 },
1893 { /* PAL(I) */
1894 .pat = V4L2_STD_PAL_I,
1895 .std = V4L2_STD_PAL_I,
1896 },
1897 { /* SECAM(L/L') */
1898 .pat = V4L2_STD_SECAM_L|V4L2_STD_SECAM_LC,
1899 .std = V4L2_STD_SECAM_L|V4L2_STD_SECAM_LC,
1900 },
1901 { /* PAL(D/D1/K) */
1902 .pat = V4L2_STD_DK,
Roel Kluinea2562d2007-12-02 23:04:57 -03001903 .std = V4L2_STD_PAL_D|V4L2_STD_PAL_D1|V4L2_STD_PAL_K,
Mike Isely9f66d4e2007-09-08 22:28:51 -03001904 },
1905};
1906
Mike Iselyd8554972006-06-26 20:58:46 -03001907static void pvr2_hdw_setup_std(struct pvr2_hdw *hdw)
1908{
1909 char buf[40];
1910 unsigned int bcnt;
Mike Isely3d290bd2007-12-03 01:47:12 -03001911 v4l2_std_id std1,std2,std3;
Mike Iselyd8554972006-06-26 20:58:46 -03001912
1913 std1 = get_default_standard(hdw);
Mike Isely3d290bd2007-12-03 01:47:12 -03001914 std3 = std1 ? 0 : hdw->hdw_desc->default_std_mask;
Mike Iselyd8554972006-06-26 20:58:46 -03001915
1916 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),hdw->std_mask_eeprom);
Mike Isely56585382007-09-08 22:32:12 -03001917 pvr2_trace(PVR2_TRACE_STD,
Mike Isely56dcbfa2007-11-26 02:00:51 -03001918 "Supported video standard(s) reported available"
1919 " in hardware: %.*s",
Mike Iselyd8554972006-06-26 20:58:46 -03001920 bcnt,buf);
1921
1922 hdw->std_mask_avail = hdw->std_mask_eeprom;
1923
Mike Isely3d290bd2007-12-03 01:47:12 -03001924 std2 = (std1|std3) & ~hdw->std_mask_avail;
Mike Iselyd8554972006-06-26 20:58:46 -03001925 if (std2) {
1926 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std2);
Mike Isely56585382007-09-08 22:32:12 -03001927 pvr2_trace(PVR2_TRACE_STD,
Mike Iselyd8554972006-06-26 20:58:46 -03001928 "Expanding supported video standards"
1929 " to include: %.*s",
1930 bcnt,buf);
1931 hdw->std_mask_avail |= std2;
1932 }
1933
1934 pvr2_hdw_internal_set_std_avail(hdw);
1935
1936 if (std1) {
1937 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std1);
Mike Isely56585382007-09-08 22:32:12 -03001938 pvr2_trace(PVR2_TRACE_STD,
Mike Iselyd8554972006-06-26 20:58:46 -03001939 "Initial video standard forced to %.*s",
1940 bcnt,buf);
1941 hdw->std_mask_cur = std1;
1942 hdw->std_dirty = !0;
1943 pvr2_hdw_internal_find_stdenum(hdw);
1944 return;
1945 }
Mike Isely3d290bd2007-12-03 01:47:12 -03001946 if (std3) {
1947 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),std3);
1948 pvr2_trace(PVR2_TRACE_STD,
1949 "Initial video standard"
1950 " (determined by device type): %.*s",bcnt,buf);
1951 hdw->std_mask_cur = std3;
1952 hdw->std_dirty = !0;
1953 pvr2_hdw_internal_find_stdenum(hdw);
1954 return;
1955 }
Mike Iselyd8554972006-06-26 20:58:46 -03001956
Mike Isely9f66d4e2007-09-08 22:28:51 -03001957 {
1958 unsigned int idx;
1959 for (idx = 0; idx < ARRAY_SIZE(std_eeprom_maps); idx++) {
1960 if (std_eeprom_maps[idx].msk ?
1961 ((std_eeprom_maps[idx].pat ^
1962 hdw->std_mask_eeprom) &
1963 std_eeprom_maps[idx].msk) :
1964 (std_eeprom_maps[idx].pat !=
1965 hdw->std_mask_eeprom)) continue;
1966 bcnt = pvr2_std_id_to_str(buf,sizeof(buf),
1967 std_eeprom_maps[idx].std);
Mike Isely56585382007-09-08 22:32:12 -03001968 pvr2_trace(PVR2_TRACE_STD,
Mike Isely9f66d4e2007-09-08 22:28:51 -03001969 "Initial video standard guessed as %.*s",
1970 bcnt,buf);
1971 hdw->std_mask_cur = std_eeprom_maps[idx].std;
1972 hdw->std_dirty = !0;
1973 pvr2_hdw_internal_find_stdenum(hdw);
1974 return;
1975 }
1976 }
1977
Mike Iselyd8554972006-06-26 20:58:46 -03001978 if (hdw->std_enum_cnt > 1) {
1979 // Autoselect the first listed standard
1980 hdw->std_enum_cur = 1;
1981 hdw->std_mask_cur = hdw->std_defs[hdw->std_enum_cur-1].id;
1982 hdw->std_dirty = !0;
Mike Isely56585382007-09-08 22:32:12 -03001983 pvr2_trace(PVR2_TRACE_STD,
Mike Iselyd8554972006-06-26 20:58:46 -03001984 "Initial video standard auto-selected to %s",
1985 hdw->std_defs[hdw->std_enum_cur-1].name);
1986 return;
1987 }
1988
Mike Isely0885ba12006-06-25 21:30:47 -03001989 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Iselyd8554972006-06-26 20:58:46 -03001990 "Unable to select a viable initial video standard");
1991}
1992
1993
Mike Iselye9c64a72009-03-06 23:42:20 -03001994static unsigned int pvr2_copy_i2c_addr_list(
1995 unsigned short *dst, const unsigned char *src,
1996 unsigned int dst_max)
1997{
Mike Isely3ab8d292009-03-07 01:37:58 -03001998 unsigned int cnt = 0;
Mike Iselye9c64a72009-03-06 23:42:20 -03001999 if (!src) return 0;
2000 while (src[cnt] && (cnt + 1) < dst_max) {
2001 dst[cnt] = src[cnt];
2002 cnt++;
2003 }
2004 dst[cnt] = I2C_CLIENT_END;
2005 return cnt;
2006}
2007
2008
Mike Iselye17d7872009-06-20 14:45:52 -03002009static void pvr2_hdw_cx25840_vbi_hack(struct pvr2_hdw *hdw)
2010{
2011 /*
2012 Mike Isely <isely@pobox.com> 19-Nov-2006 - This bit of nuttiness
2013 for cx25840 causes that module to correctly set up its video
2014 scaling. This is really a problem in the cx25840 module itself,
2015 but we work around it here. The problem has not been seen in
2016 ivtv because there VBI is supported and set up. We don't do VBI
2017 here (at least not yet) and thus we never attempted to even set
2018 it up.
2019 */
2020 struct v4l2_format fmt;
2021 if (hdw->decoder_client_id != PVR2_CLIENT_ID_CX25840) {
2022 /* We're not using a cx25840 so don't enable the hack */
2023 return;
2024 }
2025
2026 pvr2_trace(PVR2_TRACE_INIT,
2027 "Module ID %u:"
2028 " Executing cx25840 VBI hack",
2029 hdw->decoder_client_id);
2030 memset(&fmt, 0, sizeof(fmt));
2031 fmt.type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
2032 v4l2_device_call_all(&hdw->v4l2_dev, hdw->decoder_client_id,
2033 video, s_fmt, &fmt);
2034}
2035
2036
Mike Isely1ab5e742009-03-07 00:24:24 -03002037static int pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
2038 const struct pvr2_device_client_desc *cd)
Mike Iselye9c64a72009-03-06 23:42:20 -03002039{
2040 const char *fname;
2041 unsigned char mid;
2042 struct v4l2_subdev *sd;
2043 unsigned int i2ccnt;
2044 const unsigned char *p;
2045 /* Arbitrary count - max # i2c addresses we will probe */
2046 unsigned short i2caddr[25];
2047
2048 mid = cd->module_id;
2049 fname = (mid < ARRAY_SIZE(module_names)) ? module_names[mid] : NULL;
2050 if (!fname) {
2051 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Isely27108142009-10-12 00:21:20 -03002052 "Module ID %u for device %s has no name?"
2053 " The driver might have a configuration problem.",
Mike Iselye9c64a72009-03-06 23:42:20 -03002054 mid,
2055 hdw->hdw_desc->description);
Mike Isely1ab5e742009-03-07 00:24:24 -03002056 return -EINVAL;
Mike Iselye9c64a72009-03-06 23:42:20 -03002057 }
Mike Iselybd14d4f2009-03-07 00:56:52 -03002058 pvr2_trace(PVR2_TRACE_INIT,
2059 "Module ID %u (%s) for device %s being loaded...",
2060 mid, fname,
2061 hdw->hdw_desc->description);
Mike Iselye9c64a72009-03-06 23:42:20 -03002062
2063 i2ccnt = pvr2_copy_i2c_addr_list(i2caddr, cd->i2c_address_list,
2064 ARRAY_SIZE(i2caddr));
2065 if (!i2ccnt && ((p = (mid < ARRAY_SIZE(module_i2c_addresses)) ?
2066 module_i2c_addresses[mid] : NULL) != NULL)) {
2067 /* Second chance: Try default i2c address list */
2068 i2ccnt = pvr2_copy_i2c_addr_list(i2caddr, p,
2069 ARRAY_SIZE(i2caddr));
Mike Iselybd14d4f2009-03-07 00:56:52 -03002070 if (i2ccnt) {
2071 pvr2_trace(PVR2_TRACE_INIT,
2072 "Module ID %u:"
2073 " Using default i2c address list",
2074 mid);
2075 }
Mike Iselye9c64a72009-03-06 23:42:20 -03002076 }
2077
2078 if (!i2ccnt) {
2079 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Isely1ab5e742009-03-07 00:24:24 -03002080 "Module ID %u (%s) for device %s:"
Mike Isely27108142009-10-12 00:21:20 -03002081 " No i2c addresses."
2082 " The driver might have a configuration problem.",
Mike Isely1ab5e742009-03-07 00:24:24 -03002083 mid, fname, hdw->hdw_desc->description);
2084 return -EINVAL;
Mike Iselye9c64a72009-03-06 23:42:20 -03002085 }
2086
Hans Verkuil53dacb12009-08-10 02:49:08 -03002087 /* Note how the 2nd and 3rd arguments are the same for
2088 * v4l2_i2c_new_subdev(). Why?
Mike Iselye9c64a72009-03-06 23:42:20 -03002089 * Well the 2nd argument is the module name to load, while the 3rd
2090 * argument is documented in the framework as being the "chipid" -
2091 * and every other place where I can find examples of this, the
2092 * "chipid" appears to just be the module name again. So here we
2093 * just do the same thing. */
2094 if (i2ccnt == 1) {
Mike Iselybd14d4f2009-03-07 00:56:52 -03002095 pvr2_trace(PVR2_TRACE_INIT,
2096 "Module ID %u:"
2097 " Setting up with specified i2c address 0x%x",
2098 mid, i2caddr[0]);
Hans Verkuile6574f22009-04-01 03:57:53 -03002099 sd = v4l2_i2c_new_subdev(&hdw->v4l2_dev, &hdw->i2c_adap,
Mike Iselye9c64a72009-03-06 23:42:20 -03002100 fname, fname,
Hans Verkuil53dacb12009-08-10 02:49:08 -03002101 i2caddr[0], NULL);
Mike Iselye9c64a72009-03-06 23:42:20 -03002102 } else {
Mike Iselybd14d4f2009-03-07 00:56:52 -03002103 pvr2_trace(PVR2_TRACE_INIT,
2104 "Module ID %u:"
2105 " Setting up with address probe list",
2106 mid);
Hans Verkuil53dacb12009-08-10 02:49:08 -03002107 sd = v4l2_i2c_new_subdev(&hdw->v4l2_dev, &hdw->i2c_adap,
Mike Iselye9c64a72009-03-06 23:42:20 -03002108 fname, fname,
Hans Verkuil53dacb12009-08-10 02:49:08 -03002109 0, i2caddr);
Mike Iselye9c64a72009-03-06 23:42:20 -03002110 }
2111
Mike Isely446dfdc2009-03-06 23:58:15 -03002112 if (!sd) {
2113 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
Mike Isely27108142009-10-12 00:21:20 -03002114 "Module ID %u (%s) for device %s failed to load."
2115 " Possible missing sub-device kernel module or"
2116 " initialization failure within module.",
Mike Isely1ab5e742009-03-07 00:24:24 -03002117 mid, fname, hdw->hdw_desc->description);
2118 return -EIO;
Mike Isely446dfdc2009-03-06 23:58:15 -03002119 }
2120
2121 /* Tag this sub-device instance with the module ID we know about.
2122 In other places we'll use that tag to determine if the instance
2123 requires special handling. */
2124 sd->grp_id = mid;
2125
Mike Iselybd14d4f2009-03-07 00:56:52 -03002126 pvr2_trace(PVR2_TRACE_INFO, "Attached sub-driver %s", fname);
Mike Iselya932f502009-03-06 23:47:10 -03002127
Mike Iselye9c64a72009-03-06 23:42:20 -03002128
Mike Isely00e5f732009-03-07 00:17:11 -03002129 /* client-specific setup... */
2130 switch (mid) {
2131 case PVR2_CLIENT_ID_CX25840:
Mike Isely00e5f732009-03-07 00:17:11 -03002132 case PVR2_CLIENT_ID_SAA7115:
2133 hdw->decoder_client_id = mid;
2134 break;
2135 default: break;
2136 }
Mike Isely1ab5e742009-03-07 00:24:24 -03002137
2138 return 0;
Mike Iselye9c64a72009-03-06 23:42:20 -03002139}
2140
2141
2142static void pvr2_hdw_load_modules(struct pvr2_hdw *hdw)
2143{
2144 unsigned int idx;
2145 const struct pvr2_string_table *cm;
2146 const struct pvr2_device_client_table *ct;
Mike Isely1ab5e742009-03-07 00:24:24 -03002147 int okFl = !0;
Mike Iselye9c64a72009-03-06 23:42:20 -03002148
2149 cm = &hdw->hdw_desc->client_modules;
2150 for (idx = 0; idx < cm->cnt; idx++) {
2151 request_module(cm->lst[idx]);
2152 }
2153
2154 ct = &hdw->hdw_desc->client_table;
2155 for (idx = 0; idx < ct->cnt; idx++) {
Mike Iselybd14d4f2009-03-07 00:56:52 -03002156 if (pvr2_hdw_load_subdev(hdw, &ct->lst[idx]) < 0) okFl = 0;
Mike Iselye9c64a72009-03-06 23:42:20 -03002157 }
Mike Isely27108142009-10-12 00:21:20 -03002158 if (!okFl) {
2159 hdw->flag_modulefail = !0;
2160 pvr2_hdw_render_useless(hdw);
2161 }
Mike Iselye9c64a72009-03-06 23:42:20 -03002162}
2163
2164
Mike Iselyd8554972006-06-26 20:58:46 -03002165static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
2166{
2167 int ret;
2168 unsigned int idx;
2169 struct pvr2_ctrl *cptr;
2170 int reloadFl = 0;
Mike Isely989eb152007-11-26 01:53:12 -03002171 if (hdw->hdw_desc->fx2_firmware.cnt) {
Mike Isely1d643a32007-09-08 22:18:50 -03002172 if (!reloadFl) {
2173 reloadFl =
2174 (hdw->usb_intf->cur_altsetting->desc.bNumEndpoints
2175 == 0);
2176 if (reloadFl) {
2177 pvr2_trace(PVR2_TRACE_INIT,
2178 "USB endpoint config looks strange"
2179 "; possibly firmware needs to be"
2180 " loaded");
2181 }
2182 }
2183 if (!reloadFl) {
2184 reloadFl = !pvr2_hdw_check_firmware(hdw);
2185 if (reloadFl) {
2186 pvr2_trace(PVR2_TRACE_INIT,
2187 "Check for FX2 firmware failed"
2188 "; possibly firmware needs to be"
2189 " loaded");
2190 }
2191 }
Mike Iselyd8554972006-06-26 20:58:46 -03002192 if (reloadFl) {
Mike Isely1d643a32007-09-08 22:18:50 -03002193 if (pvr2_upload_firmware1(hdw) != 0) {
2194 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2195 "Failure uploading firmware1");
2196 }
2197 return;
Mike Iselyd8554972006-06-26 20:58:46 -03002198 }
2199 }
Mike Iselyd8554972006-06-26 20:58:46 -03002200 hdw->fw1_state = FW1_STATE_OK;
2201
Mike Iselyd8554972006-06-26 20:58:46 -03002202 if (!pvr2_hdw_dev_ok(hdw)) return;
2203
Mike Isely27764722009-03-07 01:57:25 -03002204 hdw->force_dirty = !0;
2205
Mike Isely989eb152007-11-26 01:53:12 -03002206 if (!hdw->hdw_desc->flag_no_powerup) {
Mike Isely1d643a32007-09-08 22:18:50 -03002207 pvr2_hdw_cmd_powerup(hdw);
2208 if (!pvr2_hdw_dev_ok(hdw)) return;
Mike Iselyd8554972006-06-26 20:58:46 -03002209 }
2210
Mike Isely31335b12008-07-25 19:35:31 -03002211 /* Take the IR chip out of reset, if appropriate */
Mike Isely27eab382009-04-06 01:51:38 -03002212 if (hdw->ir_scheme_active == PVR2_IR_SCHEME_ZILOG) {
Mike Isely31335b12008-07-25 19:35:31 -03002213 pvr2_issue_simple_cmd(hdw,
2214 FX2CMD_HCW_ZILOG_RESET |
2215 (1 << 8) |
2216 ((0) << 16));
2217 }
2218
Mike Iselyd8554972006-06-26 20:58:46 -03002219 // This step MUST happen after the earlier powerup step.
2220 pvr2_i2c_core_init(hdw);
2221 if (!pvr2_hdw_dev_ok(hdw)) return;
2222
Mike Iselye9c64a72009-03-06 23:42:20 -03002223 pvr2_hdw_load_modules(hdw);
Mike Isely1ab5e742009-03-07 00:24:24 -03002224 if (!pvr2_hdw_dev_ok(hdw)) return;
Mike Iselye9c64a72009-03-06 23:42:20 -03002225
Hans Verkuilcc26b072009-03-29 19:20:26 -03002226 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, load_fw);
Mike Isely5c6cb4e2009-03-07 01:59:34 -03002227
Mike Iselyc05c0462006-06-25 20:04:25 -03002228 for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002229 cptr = hdw->controls + idx;
2230 if (cptr->info->skip_init) continue;
2231 if (!cptr->info->set_value) continue;
2232 cptr->info->set_value(cptr,~0,cptr->info->default_value);
2233 }
2234
Mike Iselye17d7872009-06-20 14:45:52 -03002235 pvr2_hdw_cx25840_vbi_hack(hdw);
2236
Mike Isely1bde0282006-12-27 23:30:13 -03002237 /* Set up special default values for the television and radio
2238 frequencies here. It's not really important what these defaults
2239 are, but I set them to something usable in the Chicago area just
2240 to make driver testing a little easier. */
2241
Michael Krufky5a4f5da62008-05-11 16:37:50 -03002242 hdw->freqValTelevision = default_tv_freq;
2243 hdw->freqValRadio = default_radio_freq;
Mike Isely1bde0282006-12-27 23:30:13 -03002244
Mike Iselyd8554972006-06-26 20:58:46 -03002245 // Do not use pvr2_reset_ctl_endpoints() here. It is not
2246 // thread-safe against the normal pvr2_send_request() mechanism.
2247 // (We should make it thread safe).
2248
Mike Iselyaaf78842007-11-26 02:04:11 -03002249 if (hdw->hdw_desc->flag_has_hauppauge_rom) {
2250 ret = pvr2_hdw_get_eeprom_addr(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002251 if (!pvr2_hdw_dev_ok(hdw)) return;
Mike Iselyaaf78842007-11-26 02:04:11 -03002252 if (ret < 0) {
2253 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2254 "Unable to determine location of eeprom,"
2255 " skipping");
2256 } else {
2257 hdw->eeprom_addr = ret;
2258 pvr2_eeprom_analyze(hdw);
2259 if (!pvr2_hdw_dev_ok(hdw)) return;
2260 }
2261 } else {
2262 hdw->tuner_type = hdw->hdw_desc->default_tuner_type;
2263 hdw->tuner_updated = !0;
2264 hdw->std_mask_eeprom = V4L2_STD_ALL;
Mike Iselyd8554972006-06-26 20:58:46 -03002265 }
2266
Mike Isely13a88792009-01-14 04:22:56 -03002267 if (hdw->serial_number) {
2268 idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
2269 "sn-%lu", hdw->serial_number);
2270 } else if (hdw->unit_number >= 0) {
2271 idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
2272 "unit-%c",
2273 hdw->unit_number + 'a');
2274 } else {
2275 idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
2276 "unit-??");
2277 }
2278 hdw->identifier[idx] = 0;
2279
Mike Iselyd8554972006-06-26 20:58:46 -03002280 pvr2_hdw_setup_std(hdw);
2281
2282 if (!get_default_tuner_type(hdw)) {
2283 pvr2_trace(PVR2_TRACE_INIT,
2284 "pvr2_hdw_setup: Tuner type overridden to %d",
2285 hdw->tuner_type);
2286 }
2287
Mike Iselyd8554972006-06-26 20:58:46 -03002288
2289 if (!pvr2_hdw_dev_ok(hdw)) return;
2290
Mike Isely1df59f02008-04-21 03:50:39 -03002291 if (hdw->hdw_desc->signal_routing_scheme ==
2292 PVR2_ROUTING_SCHEME_GOTVIEW) {
2293 /* Ensure that GPIO 11 is set to output for GOTVIEW
2294 hardware. */
2295 pvr2_hdw_gpio_chg_dir(hdw,(1 << 11),~0);
2296 }
2297
Mike Isely681c7392007-11-26 01:48:52 -03002298 pvr2_hdw_commit_setup(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002299
2300 hdw->vid_stream = pvr2_stream_create();
2301 if (!pvr2_hdw_dev_ok(hdw)) return;
2302 pvr2_trace(PVR2_TRACE_INIT,
2303 "pvr2_hdw_setup: video stream is %p",hdw->vid_stream);
2304 if (hdw->vid_stream) {
2305 idx = get_default_error_tolerance(hdw);
2306 if (idx) {
2307 pvr2_trace(PVR2_TRACE_INIT,
2308 "pvr2_hdw_setup: video stream %p"
2309 " setting tolerance %u",
2310 hdw->vid_stream,idx);
2311 }
2312 pvr2_stream_setup(hdw->vid_stream,hdw->usb_dev,
2313 PVR2_VID_ENDPOINT,idx);
2314 }
2315
2316 if (!pvr2_hdw_dev_ok(hdw)) return;
2317
Mike Iselyd8554972006-06-26 20:58:46 -03002318 hdw->flag_init_ok = !0;
Mike Isely681c7392007-11-26 01:48:52 -03002319
2320 pvr2_hdw_state_sched(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002321}
2322
2323
Mike Isely681c7392007-11-26 01:48:52 -03002324/* Set up the structure and attempt to put the device into a usable state.
2325 This can be a time-consuming operation, which is why it is not done
2326 internally as part of the create() step. */
2327static void pvr2_hdw_setup(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002328{
2329 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_setup(hdw=%p) begin",hdw);
Mike Isely681c7392007-11-26 01:48:52 -03002330 do {
Mike Iselyd8554972006-06-26 20:58:46 -03002331 pvr2_hdw_setup_low(hdw);
2332 pvr2_trace(PVR2_TRACE_INIT,
2333 "pvr2_hdw_setup(hdw=%p) done, ok=%d init_ok=%d",
Mike Isely681c7392007-11-26 01:48:52 -03002334 hdw,pvr2_hdw_dev_ok(hdw),hdw->flag_init_ok);
Mike Iselyd8554972006-06-26 20:58:46 -03002335 if (pvr2_hdw_dev_ok(hdw)) {
Mike Isely681c7392007-11-26 01:48:52 -03002336 if (hdw->flag_init_ok) {
Mike Iselyd8554972006-06-26 20:58:46 -03002337 pvr2_trace(
2338 PVR2_TRACE_INFO,
2339 "Device initialization"
2340 " completed successfully.");
2341 break;
2342 }
2343 if (hdw->fw1_state == FW1_STATE_RELOAD) {
2344 pvr2_trace(
2345 PVR2_TRACE_INFO,
2346 "Device microcontroller firmware"
2347 " (re)loaded; it should now reset"
2348 " and reconnect.");
2349 break;
2350 }
2351 pvr2_trace(
2352 PVR2_TRACE_ERROR_LEGS,
2353 "Device initialization was not successful.");
2354 if (hdw->fw1_state == FW1_STATE_MISSING) {
2355 pvr2_trace(
2356 PVR2_TRACE_ERROR_LEGS,
2357 "Giving up since device"
2358 " microcontroller firmware"
2359 " appears to be missing.");
2360 break;
2361 }
2362 }
Mike Isely27108142009-10-12 00:21:20 -03002363 if (hdw->flag_modulefail) {
2364 pvr2_trace(
2365 PVR2_TRACE_ERROR_LEGS,
2366 "***WARNING*** pvrusb2 driver initialization"
2367 " failed due to the failure of one or more"
2368 " sub-device kernel modules.");
2369 pvr2_trace(
2370 PVR2_TRACE_ERROR_LEGS,
2371 "You need to resolve the failing condition"
2372 " before this driver can function. There"
2373 " should be some earlier messages giving more"
2374 " information about the problem.");
Mike Isely515ebf72009-10-12 00:27:38 -03002375 break;
Mike Isely27108142009-10-12 00:21:20 -03002376 }
Mike Iselyd8554972006-06-26 20:58:46 -03002377 if (procreload) {
2378 pvr2_trace(
2379 PVR2_TRACE_ERROR_LEGS,
2380 "Attempting pvrusb2 recovery by reloading"
2381 " primary firmware.");
2382 pvr2_trace(
2383 PVR2_TRACE_ERROR_LEGS,
2384 "If this works, device should disconnect"
2385 " and reconnect in a sane state.");
2386 hdw->fw1_state = FW1_STATE_UNKNOWN;
2387 pvr2_upload_firmware1(hdw);
2388 } else {
2389 pvr2_trace(
2390 PVR2_TRACE_ERROR_LEGS,
2391 "***WARNING*** pvrusb2 device hardware"
2392 " appears to be jammed"
2393 " and I can't clear it.");
2394 pvr2_trace(
2395 PVR2_TRACE_ERROR_LEGS,
2396 "You might need to power cycle"
2397 " the pvrusb2 device"
2398 " in order to recover.");
2399 }
Mike Isely681c7392007-11-26 01:48:52 -03002400 } while (0);
Mike Iselyd8554972006-06-26 20:58:46 -03002401 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_setup(hdw=%p) end",hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002402}
2403
2404
Mike Iselyc4a88282008-04-22 14:45:44 -03002405/* Perform second stage initialization. Set callback pointer first so that
2406 we can avoid a possible initialization race (if the kernel thread runs
2407 before the callback has been set). */
Mike Isely794b1602008-04-22 14:45:45 -03002408int pvr2_hdw_initialize(struct pvr2_hdw *hdw,
2409 void (*callback_func)(void *),
2410 void *callback_data)
Mike Iselyc4a88282008-04-22 14:45:44 -03002411{
2412 LOCK_TAKE(hdw->big_lock); do {
Mike Isely97f26ff2008-04-07 02:22:43 -03002413 if (hdw->flag_disconnected) {
2414 /* Handle a race here: If we're already
2415 disconnected by this point, then give up. If we
2416 get past this then we'll remain connected for
2417 the duration of initialization since the entire
2418 initialization sequence is now protected by the
2419 big_lock. */
2420 break;
2421 }
Mike Iselyc4a88282008-04-22 14:45:44 -03002422 hdw->state_data = callback_data;
2423 hdw->state_func = callback_func;
Mike Isely97f26ff2008-04-07 02:22:43 -03002424 pvr2_hdw_setup(hdw);
Mike Iselyc4a88282008-04-22 14:45:44 -03002425 } while (0); LOCK_GIVE(hdw->big_lock);
Mike Isely794b1602008-04-22 14:45:45 -03002426 return hdw->flag_init_ok;
Mike Iselyc4a88282008-04-22 14:45:44 -03002427}
2428
2429
2430/* Create, set up, and return a structure for interacting with the
2431 underlying hardware. */
Mike Iselyd8554972006-06-26 20:58:46 -03002432struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
2433 const struct usb_device_id *devid)
2434{
Mike Isely7fb20fa2008-04-22 14:45:37 -03002435 unsigned int idx,cnt1,cnt2,m;
Mike Iselyfe15f132008-08-30 18:11:40 -03002436 struct pvr2_hdw *hdw = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002437 int valid_std_mask;
2438 struct pvr2_ctrl *cptr;
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002439 struct usb_device *usb_dev;
Mike Isely989eb152007-11-26 01:53:12 -03002440 const struct pvr2_device_desc *hdw_desc;
Mike Iselyd8554972006-06-26 20:58:46 -03002441 __u8 ifnum;
Mike Iselyb30d2442006-06-25 20:05:01 -03002442 struct v4l2_queryctrl qctrl;
2443 struct pvr2_ctl_info *ciptr;
Mike Iselyd8554972006-06-26 20:58:46 -03002444
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002445 usb_dev = interface_to_usbdev(intf);
2446
Mike Iselyd130fa82007-12-08 17:20:06 -03002447 hdw_desc = (const struct pvr2_device_desc *)(devid->driver_info);
Mike Iselyd8554972006-06-26 20:58:46 -03002448
Mike Iselyfe15f132008-08-30 18:11:40 -03002449 if (hdw_desc == NULL) {
2450 pvr2_trace(PVR2_TRACE_INIT, "pvr2_hdw_create:"
2451 " No device description pointer,"
2452 " unable to continue.");
2453 pvr2_trace(PVR2_TRACE_INIT, "If you have a new device type,"
2454 " please contact Mike Isely <isely@pobox.com>"
2455 " to get it included in the driver\n");
2456 goto fail;
2457 }
2458
Mike Iselyca545f72007-01-20 00:37:11 -03002459 hdw = kzalloc(sizeof(*hdw),GFP_KERNEL);
Mike Iselyd8554972006-06-26 20:58:46 -03002460 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_create: hdw=%p, type \"%s\"",
Mike Isely989eb152007-11-26 01:53:12 -03002461 hdw,hdw_desc->description);
Mike Iselye67e3762009-10-12 00:28:19 -03002462 pvr2_trace(PVR2_TRACE_INFO, "Hardware description: %s",
Mike Isely00970be2009-10-12 00:23:37 -03002463 hdw_desc->description);
Mike Iselyd8554972006-06-26 20:58:46 -03002464 if (!hdw) goto fail;
Mike Isely681c7392007-11-26 01:48:52 -03002465
2466 init_timer(&hdw->quiescent_timer);
2467 hdw->quiescent_timer.data = (unsigned long)hdw;
2468 hdw->quiescent_timer.function = pvr2_hdw_quiescent_timeout;
2469
Mike Isely6e931372010-02-06 02:10:38 -03002470 init_timer(&hdw->decoder_stabilization_timer);
2471 hdw->decoder_stabilization_timer.data = (unsigned long)hdw;
2472 hdw->decoder_stabilization_timer.function =
2473 pvr2_hdw_decoder_stabilization_timeout;
2474
Mike Isely681c7392007-11-26 01:48:52 -03002475 init_timer(&hdw->encoder_wait_timer);
2476 hdw->encoder_wait_timer.data = (unsigned long)hdw;
2477 hdw->encoder_wait_timer.function = pvr2_hdw_encoder_wait_timeout;
2478
Mike Iselyd913d632008-04-06 04:04:35 -03002479 init_timer(&hdw->encoder_run_timer);
2480 hdw->encoder_run_timer.data = (unsigned long)hdw;
2481 hdw->encoder_run_timer.function = pvr2_hdw_encoder_run_timeout;
2482
Mike Isely681c7392007-11-26 01:48:52 -03002483 hdw->master_state = PVR2_STATE_DEAD;
2484
2485 init_waitqueue_head(&hdw->state_wait_data);
2486
Mike Isely18103c52007-01-20 00:09:47 -03002487 hdw->tuner_signal_stale = !0;
Mike Iselyb30d2442006-06-25 20:05:01 -03002488 cx2341x_fill_defaults(&hdw->enc_ctl_state);
Mike Iselyd8554972006-06-26 20:58:46 -03002489
Mike Isely7fb20fa2008-04-22 14:45:37 -03002490 /* Calculate which inputs are OK */
2491 m = 0;
2492 if (hdw_desc->flag_has_analogtuner) m |= 1 << PVR2_CVAL_INPUT_TV;
Mike Iselye8f5bac2008-04-22 14:45:40 -03002493 if (hdw_desc->digital_control_scheme != PVR2_DIGITAL_SCHEME_NONE) {
2494 m |= 1 << PVR2_CVAL_INPUT_DTV;
2495 }
Mike Isely7fb20fa2008-04-22 14:45:37 -03002496 if (hdw_desc->flag_has_svideo) m |= 1 << PVR2_CVAL_INPUT_SVIDEO;
2497 if (hdw_desc->flag_has_composite) m |= 1 << PVR2_CVAL_INPUT_COMPOSITE;
2498 if (hdw_desc->flag_has_fmradio) m |= 1 << PVR2_CVAL_INPUT_RADIO;
2499 hdw->input_avail_mask = m;
Mike Isely1cb03b72008-04-21 03:47:43 -03002500 hdw->input_allowed_mask = hdw->input_avail_mask;
Mike Isely7fb20fa2008-04-22 14:45:37 -03002501
Mike Isely62433e32008-04-22 14:45:40 -03002502 /* If not a hybrid device, pathway_state never changes. So
2503 initialize it here to what it should forever be. */
2504 if (!(hdw->input_avail_mask & (1 << PVR2_CVAL_INPUT_DTV))) {
2505 hdw->pathway_state = PVR2_PATHWAY_ANALOG;
2506 } else if (!(hdw->input_avail_mask & (1 << PVR2_CVAL_INPUT_TV))) {
2507 hdw->pathway_state = PVR2_PATHWAY_DIGITAL;
2508 }
2509
Mike Iselyc05c0462006-06-25 20:04:25 -03002510 hdw->control_cnt = CTRLDEF_COUNT;
Mike Iselyb30d2442006-06-25 20:05:01 -03002511 hdw->control_cnt += MPEGDEF_COUNT;
Mike Iselyca545f72007-01-20 00:37:11 -03002512 hdw->controls = kzalloc(sizeof(struct pvr2_ctrl) * hdw->control_cnt,
Mike Iselyd8554972006-06-26 20:58:46 -03002513 GFP_KERNEL);
2514 if (!hdw->controls) goto fail;
Mike Isely989eb152007-11-26 01:53:12 -03002515 hdw->hdw_desc = hdw_desc;
Mike Isely27eab382009-04-06 01:51:38 -03002516 hdw->ir_scheme_active = hdw->hdw_desc->ir_scheme;
Mike Iselyc05c0462006-06-25 20:04:25 -03002517 for (idx = 0; idx < hdw->control_cnt; idx++) {
2518 cptr = hdw->controls + idx;
2519 cptr->hdw = hdw;
2520 }
Mike Iselyd8554972006-06-26 20:58:46 -03002521 for (idx = 0; idx < 32; idx++) {
2522 hdw->std_mask_ptrs[idx] = hdw->std_mask_names[idx];
2523 }
Mike Iselyc05c0462006-06-25 20:04:25 -03002524 for (idx = 0; idx < CTRLDEF_COUNT; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002525 cptr = hdw->controls + idx;
Mike Iselyd8554972006-06-26 20:58:46 -03002526 cptr->info = control_defs+idx;
2527 }
Mike Iselydbc40a02008-04-22 14:45:39 -03002528
2529 /* Ensure that default input choice is a valid one. */
2530 m = hdw->input_avail_mask;
2531 if (m) for (idx = 0; idx < (sizeof(m) << 3); idx++) {
2532 if (!((1 << idx) & m)) continue;
2533 hdw->input_val = idx;
2534 break;
2535 }
2536
Mike Iselyb30d2442006-06-25 20:05:01 -03002537 /* Define and configure additional controls from cx2341x module. */
Mike Iselyca545f72007-01-20 00:37:11 -03002538 hdw->mpeg_ctrl_info = kzalloc(
Mike Iselyb30d2442006-06-25 20:05:01 -03002539 sizeof(*(hdw->mpeg_ctrl_info)) * MPEGDEF_COUNT, GFP_KERNEL);
2540 if (!hdw->mpeg_ctrl_info) goto fail;
Mike Iselyb30d2442006-06-25 20:05:01 -03002541 for (idx = 0; idx < MPEGDEF_COUNT; idx++) {
2542 cptr = hdw->controls + idx + CTRLDEF_COUNT;
2543 ciptr = &(hdw->mpeg_ctrl_info[idx].info);
2544 ciptr->desc = hdw->mpeg_ctrl_info[idx].desc;
2545 ciptr->name = mpeg_ids[idx].strid;
2546 ciptr->v4l_id = mpeg_ids[idx].id;
2547 ciptr->skip_init = !0;
2548 ciptr->get_value = ctrl_cx2341x_get;
2549 ciptr->get_v4lflags = ctrl_cx2341x_getv4lflags;
2550 ciptr->is_dirty = ctrl_cx2341x_is_dirty;
2551 if (!idx) ciptr->clear_dirty = ctrl_cx2341x_clear_dirty;
2552 qctrl.id = ciptr->v4l_id;
2553 cx2341x_ctrl_query(&hdw->enc_ctl_state,&qctrl);
2554 if (!(qctrl.flags & V4L2_CTRL_FLAG_READ_ONLY)) {
2555 ciptr->set_value = ctrl_cx2341x_set;
2556 }
2557 strncpy(hdw->mpeg_ctrl_info[idx].desc,qctrl.name,
2558 PVR2_CTLD_INFO_DESC_SIZE);
2559 hdw->mpeg_ctrl_info[idx].desc[PVR2_CTLD_INFO_DESC_SIZE-1] = 0;
2560 ciptr->default_value = qctrl.default_value;
2561 switch (qctrl.type) {
2562 default:
2563 case V4L2_CTRL_TYPE_INTEGER:
2564 ciptr->type = pvr2_ctl_int;
2565 ciptr->def.type_int.min_value = qctrl.minimum;
2566 ciptr->def.type_int.max_value = qctrl.maximum;
2567 break;
2568 case V4L2_CTRL_TYPE_BOOLEAN:
2569 ciptr->type = pvr2_ctl_bool;
2570 break;
2571 case V4L2_CTRL_TYPE_MENU:
2572 ciptr->type = pvr2_ctl_enum;
2573 ciptr->def.type_enum.value_names =
Hans Verkuile0e31cd2008-06-22 12:03:28 -03002574 cx2341x_ctrl_get_menu(&hdw->enc_ctl_state,
2575 ciptr->v4l_id);
Mike Iselyb30d2442006-06-25 20:05:01 -03002576 for (cnt1 = 0;
2577 ciptr->def.type_enum.value_names[cnt1] != NULL;
2578 cnt1++) { }
2579 ciptr->def.type_enum.count = cnt1;
2580 break;
2581 }
2582 cptr->info = ciptr;
2583 }
Mike Iselyd8554972006-06-26 20:58:46 -03002584
2585 // Initialize video standard enum dynamic control
2586 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDENUM);
2587 if (cptr) {
2588 memcpy(&hdw->std_info_enum,cptr->info,
2589 sizeof(hdw->std_info_enum));
2590 cptr->info = &hdw->std_info_enum;
2591
2592 }
2593 // Initialize control data regarding video standard masks
2594 valid_std_mask = pvr2_std_get_usable();
2595 for (idx = 0; idx < 32; idx++) {
2596 if (!(valid_std_mask & (1 << idx))) continue;
2597 cnt1 = pvr2_std_id_to_str(
2598 hdw->std_mask_names[idx],
2599 sizeof(hdw->std_mask_names[idx])-1,
2600 1 << idx);
2601 hdw->std_mask_names[idx][cnt1] = 0;
2602 }
2603 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDAVAIL);
2604 if (cptr) {
2605 memcpy(&hdw->std_info_avail,cptr->info,
2606 sizeof(hdw->std_info_avail));
2607 cptr->info = &hdw->std_info_avail;
2608 hdw->std_info_avail.def.type_bitmask.bit_names =
2609 hdw->std_mask_ptrs;
2610 hdw->std_info_avail.def.type_bitmask.valid_bits =
2611 valid_std_mask;
2612 }
2613 cptr = pvr2_hdw_get_ctrl_by_id(hdw,PVR2_CID_STDCUR);
2614 if (cptr) {
2615 memcpy(&hdw->std_info_cur,cptr->info,
2616 sizeof(hdw->std_info_cur));
2617 cptr->info = &hdw->std_info_cur;
2618 hdw->std_info_cur.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
Mike Isely432907f2008-08-31 21:02:20 -03002624 hdw->cropcap_stale = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03002625 hdw->eeprom_addr = -1;
2626 hdw->unit_number = -1;
Mike Isely80793842006-12-27 23:12:28 -03002627 hdw->v4l_minor_number_video = -1;
2628 hdw->v4l_minor_number_vbi = -1;
Mike Iselyfd5a75f2006-12-27 23:11:22 -03002629 hdw->v4l_minor_number_radio = -1;
Mike Iselyd8554972006-06-26 20:58:46 -03002630 hdw->ctl_write_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL);
2631 if (!hdw->ctl_write_buffer) goto fail;
2632 hdw->ctl_read_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL);
2633 if (!hdw->ctl_read_buffer) goto fail;
2634 hdw->ctl_write_urb = usb_alloc_urb(0,GFP_KERNEL);
2635 if (!hdw->ctl_write_urb) goto fail;
2636 hdw->ctl_read_urb = usb_alloc_urb(0,GFP_KERNEL);
2637 if (!hdw->ctl_read_urb) goto fail;
2638
Janne Grunau70ad6382009-04-01 08:46:50 -03002639 if (v4l2_device_register(&intf->dev, &hdw->v4l2_dev) != 0) {
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002640 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
2641 "Error registering with v4l core, giving up");
2642 goto fail;
2643 }
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002644 mutex_lock(&pvr2_unit_mtx); do {
Mike Iselyd8554972006-06-26 20:58:46 -03002645 for (idx = 0; idx < PVR_NUM; idx++) {
2646 if (unit_pointers[idx]) continue;
2647 hdw->unit_number = idx;
2648 unit_pointers[idx] = hdw;
2649 break;
2650 }
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002651 } while (0); mutex_unlock(&pvr2_unit_mtx);
Mike Iselyd8554972006-06-26 20:58:46 -03002652
2653 cnt1 = 0;
2654 cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"pvrusb2");
2655 cnt1 += cnt2;
2656 if (hdw->unit_number >= 0) {
2657 cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"_%c",
2658 ('a' + hdw->unit_number));
2659 cnt1 += cnt2;
2660 }
2661 if (cnt1 >= sizeof(hdw->name)) cnt1 = sizeof(hdw->name)-1;
2662 hdw->name[cnt1] = 0;
2663
Mike Isely681c7392007-11-26 01:48:52 -03002664 hdw->workqueue = create_singlethread_workqueue(hdw->name);
2665 INIT_WORK(&hdw->workpoll,pvr2_hdw_worker_poll);
Mike Isely681c7392007-11-26 01:48:52 -03002666
Mike Iselyd8554972006-06-26 20:58:46 -03002667 pvr2_trace(PVR2_TRACE_INIT,"Driver unit number is %d, name is %s",
2668 hdw->unit_number,hdw->name);
2669
2670 hdw->tuner_type = -1;
2671 hdw->flag_ok = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03002672
2673 hdw->usb_intf = intf;
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002674 hdw->usb_dev = usb_dev;
Mike Iselyd8554972006-06-26 20:58:46 -03002675
Mike Isely87e34952009-01-23 01:20:24 -03002676 usb_make_path(hdw->usb_dev, hdw->bus_info, sizeof(hdw->bus_info));
Mike Isely31a18542007-04-08 01:11:47 -03002677
Mike Iselyd8554972006-06-26 20:58:46 -03002678 ifnum = hdw->usb_intf->cur_altsetting->desc.bInterfaceNumber;
2679 usb_set_interface(hdw->usb_dev,ifnum,0);
2680
2681 mutex_init(&hdw->ctl_lock_mutex);
2682 mutex_init(&hdw->big_lock_mutex);
2683
2684 return hdw;
2685 fail:
2686 if (hdw) {
Mike Isely681c7392007-11-26 01:48:52 -03002687 del_timer_sync(&hdw->quiescent_timer);
Mike Isely6e931372010-02-06 02:10:38 -03002688 del_timer_sync(&hdw->decoder_stabilization_timer);
Mike Iselyd913d632008-04-06 04:04:35 -03002689 del_timer_sync(&hdw->encoder_run_timer);
Mike Isely681c7392007-11-26 01:48:52 -03002690 del_timer_sync(&hdw->encoder_wait_timer);
2691 if (hdw->workqueue) {
2692 flush_workqueue(hdw->workqueue);
2693 destroy_workqueue(hdw->workqueue);
2694 hdw->workqueue = NULL;
2695 }
Mariusz Kozlowski5e55d2c2006-11-08 15:34:31 +01002696 usb_free_urb(hdw->ctl_read_urb);
2697 usb_free_urb(hdw->ctl_write_urb);
Mariusz Kozlowski22071a42007-01-07 10:33:39 -03002698 kfree(hdw->ctl_read_buffer);
2699 kfree(hdw->ctl_write_buffer);
2700 kfree(hdw->controls);
2701 kfree(hdw->mpeg_ctrl_info);
Mike Isely681c7392007-11-26 01:48:52 -03002702 kfree(hdw->std_defs);
2703 kfree(hdw->std_enum_names);
Mike Iselyd8554972006-06-26 20:58:46 -03002704 kfree(hdw);
2705 }
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002706 return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002707}
2708
2709
2710/* Remove _all_ associations between this driver and the underlying USB
2711 layer. */
Adrian Bunk07e337e2006-06-30 11:30:20 -03002712static void pvr2_hdw_remove_usb_stuff(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002713{
2714 if (hdw->flag_disconnected) return;
2715 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_remove_usb_stuff: hdw=%p",hdw);
2716 if (hdw->ctl_read_urb) {
2717 usb_kill_urb(hdw->ctl_read_urb);
2718 usb_free_urb(hdw->ctl_read_urb);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002719 hdw->ctl_read_urb = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002720 }
2721 if (hdw->ctl_write_urb) {
2722 usb_kill_urb(hdw->ctl_write_urb);
2723 usb_free_urb(hdw->ctl_write_urb);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002724 hdw->ctl_write_urb = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002725 }
2726 if (hdw->ctl_read_buffer) {
2727 kfree(hdw->ctl_read_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002728 hdw->ctl_read_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002729 }
2730 if (hdw->ctl_write_buffer) {
2731 kfree(hdw->ctl_write_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002732 hdw->ctl_write_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002733 }
Mike Iselyd8554972006-06-26 20:58:46 -03002734 hdw->flag_disconnected = !0;
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002735 /* If we don't do this, then there will be a dangling struct device
2736 reference to our disappearing device persisting inside the V4L
2737 core... */
Mike Iselydc070bc2009-03-25 00:30:45 -03002738 v4l2_device_disconnect(&hdw->v4l2_dev);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002739 hdw->usb_dev = NULL;
2740 hdw->usb_intf = NULL;
Mike Isely681c7392007-11-26 01:48:52 -03002741 pvr2_hdw_render_useless(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03002742}
2743
2744
2745/* Destroy hardware interaction structure */
2746void pvr2_hdw_destroy(struct pvr2_hdw *hdw)
2747{
Mike Isely401c27c2007-09-08 22:11:46 -03002748 if (!hdw) return;
Mike Iselyd8554972006-06-26 20:58:46 -03002749 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_destroy: hdw=%p",hdw);
Mike Isely681c7392007-11-26 01:48:52 -03002750 if (hdw->workqueue) {
2751 flush_workqueue(hdw->workqueue);
2752 destroy_workqueue(hdw->workqueue);
2753 hdw->workqueue = NULL;
2754 }
Mike Isely8f591002008-04-22 14:45:45 -03002755 del_timer_sync(&hdw->quiescent_timer);
Mike Isely6e931372010-02-06 02:10:38 -03002756 del_timer_sync(&hdw->decoder_stabilization_timer);
Mike Iselyd913d632008-04-06 04:04:35 -03002757 del_timer_sync(&hdw->encoder_run_timer);
Mike Isely8f591002008-04-22 14:45:45 -03002758 del_timer_sync(&hdw->encoder_wait_timer);
Mike Iselyd8554972006-06-26 20:58:46 -03002759 if (hdw->fw_buffer) {
2760 kfree(hdw->fw_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002761 hdw->fw_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002762 }
2763 if (hdw->vid_stream) {
2764 pvr2_stream_destroy(hdw->vid_stream);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002765 hdw->vid_stream = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002766 }
Mike Iselyd8554972006-06-26 20:58:46 -03002767 pvr2_i2c_core_done(hdw);
Mike Iselyb72b7bf2009-03-06 23:20:31 -03002768 v4l2_device_unregister(&hdw->v4l2_dev);
Mike Iselyd8554972006-06-26 20:58:46 -03002769 pvr2_hdw_remove_usb_stuff(hdw);
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002770 mutex_lock(&pvr2_unit_mtx); do {
Mike Iselyd8554972006-06-26 20:58:46 -03002771 if ((hdw->unit_number >= 0) &&
2772 (hdw->unit_number < PVR_NUM) &&
2773 (unit_pointers[hdw->unit_number] == hdw)) {
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002774 unit_pointers[hdw->unit_number] = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002775 }
Matthias Kaehlcke8df0c872007-04-28 20:00:18 -03002776 } while (0); mutex_unlock(&pvr2_unit_mtx);
Mariusz Kozlowski22071a42007-01-07 10:33:39 -03002777 kfree(hdw->controls);
2778 kfree(hdw->mpeg_ctrl_info);
2779 kfree(hdw->std_defs);
2780 kfree(hdw->std_enum_names);
Mike Iselyd8554972006-06-26 20:58:46 -03002781 kfree(hdw);
2782}
2783
2784
Mike Iselyd8554972006-06-26 20:58:46 -03002785int pvr2_hdw_dev_ok(struct pvr2_hdw *hdw)
2786{
2787 return (hdw && hdw->flag_ok);
2788}
2789
2790
2791/* Called when hardware has been unplugged */
2792void pvr2_hdw_disconnect(struct pvr2_hdw *hdw)
2793{
2794 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_disconnect(hdw=%p)",hdw);
2795 LOCK_TAKE(hdw->big_lock);
2796 LOCK_TAKE(hdw->ctl_lock);
2797 pvr2_hdw_remove_usb_stuff(hdw);
2798 LOCK_GIVE(hdw->ctl_lock);
2799 LOCK_GIVE(hdw->big_lock);
2800}
2801
2802
2803// Attempt to autoselect an appropriate value for std_enum_cur given
2804// whatever is currently in std_mask_cur
Adrian Bunk07e337e2006-06-30 11:30:20 -03002805static void pvr2_hdw_internal_find_stdenum(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002806{
2807 unsigned int idx;
2808 for (idx = 1; idx < hdw->std_enum_cnt; idx++) {
2809 if (hdw->std_defs[idx-1].id == hdw->std_mask_cur) {
2810 hdw->std_enum_cur = idx;
2811 return;
2812 }
2813 }
2814 hdw->std_enum_cur = 0;
2815}
2816
2817
2818// Calculate correct set of enumerated standards based on currently known
2819// set of available standards bits.
Adrian Bunk07e337e2006-06-30 11:30:20 -03002820static void pvr2_hdw_internal_set_std_avail(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03002821{
2822 struct v4l2_standard *newstd;
2823 unsigned int std_cnt;
2824 unsigned int idx;
2825
2826 newstd = pvr2_std_create_enum(&std_cnt,hdw->std_mask_avail);
2827
2828 if (hdw->std_defs) {
2829 kfree(hdw->std_defs);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002830 hdw->std_defs = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002831 }
2832 hdw->std_enum_cnt = 0;
2833 if (hdw->std_enum_names) {
2834 kfree(hdw->std_enum_names);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002835 hdw->std_enum_names = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002836 }
2837
2838 if (!std_cnt) {
2839 pvr2_trace(
2840 PVR2_TRACE_ERROR_LEGS,
2841 "WARNING: Failed to identify any viable standards");
2842 }
2843 hdw->std_enum_names = kmalloc(sizeof(char *)*(std_cnt+1),GFP_KERNEL);
2844 hdw->std_enum_names[0] = "none";
2845 for (idx = 0; idx < std_cnt; idx++) {
2846 hdw->std_enum_names[idx+1] =
2847 newstd[idx].name;
2848 }
2849 // Set up the dynamic control for this standard
2850 hdw->std_info_enum.def.type_enum.value_names = hdw->std_enum_names;
2851 hdw->std_info_enum.def.type_enum.count = std_cnt+1;
2852 hdw->std_defs = newstd;
2853 hdw->std_enum_cnt = std_cnt+1;
2854 hdw->std_enum_cur = 0;
2855 hdw->std_info_cur.def.type_bitmask.valid_bits = hdw->std_mask_avail;
2856}
2857
2858
2859int pvr2_hdw_get_stdenum_value(struct pvr2_hdw *hdw,
2860 struct v4l2_standard *std,
2861 unsigned int idx)
2862{
2863 int ret = -EINVAL;
2864 if (!idx) return ret;
2865 LOCK_TAKE(hdw->big_lock); do {
2866 if (idx >= hdw->std_enum_cnt) break;
2867 idx--;
2868 memcpy(std,hdw->std_defs+idx,sizeof(*std));
2869 ret = 0;
2870 } while (0); LOCK_GIVE(hdw->big_lock);
2871 return ret;
2872}
2873
2874
2875/* Get the number of defined controls */
2876unsigned int pvr2_hdw_get_ctrl_count(struct pvr2_hdw *hdw)
2877{
Mike Iselyc05c0462006-06-25 20:04:25 -03002878 return hdw->control_cnt;
Mike Iselyd8554972006-06-26 20:58:46 -03002879}
2880
2881
2882/* Retrieve a control handle given its index (0..count-1) */
2883struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_index(struct pvr2_hdw *hdw,
2884 unsigned int idx)
2885{
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002886 if (idx >= hdw->control_cnt) return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002887 return hdw->controls + idx;
2888}
2889
2890
2891/* Retrieve a control handle given its index (0..count-1) */
2892struct pvr2_ctrl *pvr2_hdw_get_ctrl_by_id(struct pvr2_hdw *hdw,
2893 unsigned int ctl_id)
2894{
2895 struct pvr2_ctrl *cptr;
2896 unsigned int idx;
2897 int i;
2898
2899 /* This could be made a lot more efficient, but for now... */
Mike Iselyc05c0462006-06-25 20:04:25 -03002900 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002901 cptr = hdw->controls + idx;
2902 i = cptr->info->internal_id;
2903 if (i && (i == ctl_id)) return cptr;
2904 }
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002905 return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002906}
2907
2908
Mike Iselya761f432006-06-25 20:04:44 -03002909/* Given a V4L ID, retrieve the control structure associated with it. */
Mike Iselyd8554972006-06-26 20:58:46 -03002910struct pvr2_ctrl *pvr2_hdw_get_ctrl_v4l(struct pvr2_hdw *hdw,unsigned int ctl_id)
2911{
2912 struct pvr2_ctrl *cptr;
2913 unsigned int idx;
2914 int i;
2915
2916 /* This could be made a lot more efficient, but for now... */
Mike Iselyc05c0462006-06-25 20:04:25 -03002917 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03002918 cptr = hdw->controls + idx;
2919 i = cptr->info->v4l_id;
2920 if (i && (i == ctl_id)) return cptr;
2921 }
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002922 return NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03002923}
2924
2925
Mike Iselya761f432006-06-25 20:04:44 -03002926/* Given a V4L ID for its immediate predecessor, retrieve the control
2927 structure associated with it. */
2928struct pvr2_ctrl *pvr2_hdw_get_ctrl_nextv4l(struct pvr2_hdw *hdw,
2929 unsigned int ctl_id)
2930{
2931 struct pvr2_ctrl *cptr,*cp2;
2932 unsigned int idx;
2933 int i;
2934
2935 /* This could be made a lot more efficient, but for now... */
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002936 cp2 = NULL;
Mike Iselya761f432006-06-25 20:04:44 -03002937 for (idx = 0; idx < hdw->control_cnt; idx++) {
2938 cptr = hdw->controls + idx;
2939 i = cptr->info->v4l_id;
2940 if (!i) continue;
2941 if (i <= ctl_id) continue;
2942 if (cp2 && (cp2->info->v4l_id < i)) continue;
2943 cp2 = cptr;
2944 }
2945 return cp2;
Mike Iselya0fd1cb2006-06-30 11:35:28 -03002946 return NULL;
Mike Iselya761f432006-06-25 20:04:44 -03002947}
2948
2949
Mike Iselyd8554972006-06-26 20:58:46 -03002950static const char *get_ctrl_typename(enum pvr2_ctl_type tp)
2951{
2952 switch (tp) {
2953 case pvr2_ctl_int: return "integer";
2954 case pvr2_ctl_enum: return "enum";
Mike Isely33213962006-06-25 20:04:40 -03002955 case pvr2_ctl_bool: return "boolean";
Mike Iselyd8554972006-06-26 20:58:46 -03002956 case pvr2_ctl_bitmask: return "bitmask";
2957 }
2958 return "";
2959}
2960
2961
Mike Isely2641df32009-03-07 00:13:25 -03002962static void pvr2_subdev_set_control(struct pvr2_hdw *hdw, int id,
2963 const char *name, int val)
2964{
2965 struct v4l2_control ctrl;
2966 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 %s=%d", name, val);
2967 memset(&ctrl, 0, sizeof(ctrl));
2968 ctrl.id = id;
2969 ctrl.value = val;
2970 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, s_ctrl, &ctrl);
2971}
2972
2973#define PVR2_SUBDEV_SET_CONTROL(hdw, id, lab) \
Mike Isely27764722009-03-07 01:57:25 -03002974 if ((hdw)->lab##_dirty || (hdw)->force_dirty) { \
Mike Isely2641df32009-03-07 00:13:25 -03002975 pvr2_subdev_set_control(hdw, id, #lab, (hdw)->lab##_val); \
2976 }
2977
Mike Isely5ceaad12009-03-07 00:01:20 -03002978/* Execute whatever commands are required to update the state of all the
Mike Isely2641df32009-03-07 00:13:25 -03002979 sub-devices so that they match our current control values. */
Mike Isely5ceaad12009-03-07 00:01:20 -03002980static void pvr2_subdev_update(struct pvr2_hdw *hdw)
2981{
Mike Iselyedb9dcb2009-03-07 00:37:10 -03002982 struct v4l2_subdev *sd;
2983 unsigned int id;
2984 pvr2_subdev_update_func fp;
2985
Mike Isely75212a02009-03-07 01:48:42 -03002986 pvr2_trace(PVR2_TRACE_CHIPS, "subdev update...");
2987
Mike Isely27764722009-03-07 01:57:25 -03002988 if (hdw->tuner_updated || hdw->force_dirty) {
Mike Isely75212a02009-03-07 01:48:42 -03002989 struct tuner_setup setup;
2990 pvr2_trace(PVR2_TRACE_CHIPS, "subdev tuner set_type(%d)",
2991 hdw->tuner_type);
2992 if (((int)(hdw->tuner_type)) >= 0) {
Mike Iselyfcd62cf2009-04-01 01:55:26 -03002993 memset(&setup, 0, sizeof(setup));
Mike Isely75212a02009-03-07 01:48:42 -03002994 setup.addr = ADDR_UNSET;
2995 setup.type = hdw->tuner_type;
2996 setup.mode_mask = T_RADIO | T_ANALOG_TV;
2997 v4l2_device_call_all(&hdw->v4l2_dev, 0,
2998 tuner, s_type_addr, &setup);
2999 }
3000 }
3001
Mike Isely27764722009-03-07 01:57:25 -03003002 if (hdw->input_dirty || hdw->std_dirty || hdw->force_dirty) {
Mike Iselyb4818802009-03-07 01:46:17 -03003003 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_standard");
Mike Isely2641df32009-03-07 00:13:25 -03003004 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
3005 v4l2_device_call_all(&hdw->v4l2_dev, 0,
3006 tuner, s_radio);
3007 } else {
3008 v4l2_std_id vs;
3009 vs = hdw->std_mask_cur;
3010 v4l2_device_call_all(&hdw->v4l2_dev, 0,
Hans Verkuilf41737e2009-04-01 03:52:39 -03003011 core, s_std, vs);
Mike Iselya6862da2009-06-20 14:50:14 -03003012 pvr2_hdw_cx25840_vbi_hack(hdw);
Mike Isely2641df32009-03-07 00:13:25 -03003013 }
3014 hdw->tuner_signal_stale = !0;
3015 hdw->cropcap_stale = !0;
3016 }
3017
3018 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_BRIGHTNESS, brightness);
3019 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_CONTRAST, contrast);
3020 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_SATURATION, saturation);
3021 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_HUE, hue);
3022 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_MUTE, mute);
3023 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_VOLUME, volume);
3024 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_BALANCE, balance);
3025 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_BASS, bass);
3026 PVR2_SUBDEV_SET_CONTROL(hdw, V4L2_CID_AUDIO_TREBLE, treble);
3027
Mike Isely27764722009-03-07 01:57:25 -03003028 if (hdw->input_dirty || hdw->audiomode_dirty || hdw->force_dirty) {
Mike Isely2641df32009-03-07 00:13:25 -03003029 struct v4l2_tuner vt;
3030 memset(&vt, 0, sizeof(vt));
3031 vt.audmode = hdw->audiomode_val;
3032 v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner, s_tuner, &vt);
3033 }
3034
Mike Isely27764722009-03-07 01:57:25 -03003035 if (hdw->freqDirty || hdw->force_dirty) {
Mike Isely2641df32009-03-07 00:13:25 -03003036 unsigned long fv;
3037 struct v4l2_frequency freq;
3038 fv = pvr2_hdw_get_cur_freq(hdw);
3039 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_freq(%lu)", fv);
3040 if (hdw->tuner_signal_stale) pvr2_hdw_status_poll(hdw);
3041 memset(&freq, 0, sizeof(freq));
3042 if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) {
3043 /* ((fv * 1000) / 62500) */
3044 freq.frequency = (fv * 2) / 125;
3045 } else {
3046 freq.frequency = fv / 62500;
3047 }
3048 /* tuner-core currently doesn't seem to care about this, but
3049 let's set it anyway for completeness. */
3050 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
3051 freq.type = V4L2_TUNER_RADIO;
3052 } else {
3053 freq.type = V4L2_TUNER_ANALOG_TV;
3054 }
3055 freq.tuner = 0;
3056 v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner,
3057 s_frequency, &freq);
3058 }
3059
Mike Isely27764722009-03-07 01:57:25 -03003060 if (hdw->res_hor_dirty || hdw->res_ver_dirty || hdw->force_dirty) {
Mike Isely2641df32009-03-07 00:13:25 -03003061 struct v4l2_format fmt;
3062 memset(&fmt, 0, sizeof(fmt));
3063 fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
3064 fmt.fmt.pix.width = hdw->res_hor_val;
3065 fmt.fmt.pix.height = hdw->res_ver_val;
Mike Isely7dfdf1e2009-03-07 02:11:12 -03003066 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_size(%dx%d)",
Mike Isely2641df32009-03-07 00:13:25 -03003067 fmt.fmt.pix.width, fmt.fmt.pix.height);
3068 v4l2_device_call_all(&hdw->v4l2_dev, 0, video, s_fmt, &fmt);
3069 }
3070
Mike Isely27764722009-03-07 01:57:25 -03003071 if (hdw->srate_dirty || hdw->force_dirty) {
Mike Isely01c59df2009-03-07 00:48:09 -03003072 u32 val;
3073 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_audio %d",
3074 hdw->srate_val);
3075 switch (hdw->srate_val) {
3076 default:
3077 case V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000:
3078 val = 48000;
3079 break;
3080 case V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100:
3081 val = 44100;
3082 break;
3083 case V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000:
3084 val = 32000;
3085 break;
3086 }
3087 v4l2_device_call_all(&hdw->v4l2_dev, 0,
3088 audio, s_clock_freq, val);
3089 }
3090
Mike Isely2641df32009-03-07 00:13:25 -03003091 /* Unable to set crop parameters; there is apparently no equivalent
3092 for VIDIOC_S_CROP */
3093
Mike Iselyedb9dcb2009-03-07 00:37:10 -03003094 v4l2_device_for_each_subdev(sd, &hdw->v4l2_dev) {
3095 id = sd->grp_id;
3096 if (id >= ARRAY_SIZE(pvr2_module_update_functions)) continue;
3097 fp = pvr2_module_update_functions[id];
3098 if (!fp) continue;
3099 (*fp)(hdw, sd);
3100 }
Mike Isely2641df32009-03-07 00:13:25 -03003101
Mike Isely27764722009-03-07 01:57:25 -03003102 if (hdw->tuner_signal_stale || hdw->cropcap_stale) {
Mike Isely2641df32009-03-07 00:13:25 -03003103 pvr2_hdw_status_poll(hdw);
3104 }
Mike Isely5ceaad12009-03-07 00:01:20 -03003105}
3106
3107
Mike Isely681c7392007-11-26 01:48:52 -03003108/* Figure out if we need to commit control changes. If so, mark internal
3109 state flags to indicate this fact and return true. Otherwise do nothing
3110 else and return false. */
3111static int pvr2_hdw_commit_setup(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03003112{
Mike Iselyd8554972006-06-26 20:58:46 -03003113 unsigned int idx;
3114 struct pvr2_ctrl *cptr;
3115 int value;
Mike Isely27764722009-03-07 01:57:25 -03003116 int commit_flag = hdw->force_dirty;
Mike Iselyd8554972006-06-26 20:58:46 -03003117 char buf[100];
3118 unsigned int bcnt,ccnt;
3119
Mike Iselyc05c0462006-06-25 20:04:25 -03003120 for (idx = 0; idx < hdw->control_cnt; idx++) {
Mike Iselyd8554972006-06-26 20:58:46 -03003121 cptr = hdw->controls + idx;
Al Viro5fa12472008-03-29 03:07:38 +00003122 if (!cptr->info->is_dirty) continue;
Mike Iselyd8554972006-06-26 20:58:46 -03003123 if (!cptr->info->is_dirty(cptr)) continue;
Mike Iselyfe23a282007-01-20 00:10:55 -03003124 commit_flag = !0;
Mike Iselyd8554972006-06-26 20:58:46 -03003125
Mike Iselyfe23a282007-01-20 00:10:55 -03003126 if (!(pvrusb2_debug & PVR2_TRACE_CTL)) continue;
Mike Iselyd8554972006-06-26 20:58:46 -03003127 bcnt = scnprintf(buf,sizeof(buf),"\"%s\" <-- ",
3128 cptr->info->name);
3129 value = 0;
3130 cptr->info->get_value(cptr,&value);
3131 pvr2_ctrl_value_to_sym_internal(cptr,~0,value,
3132 buf+bcnt,
3133 sizeof(buf)-bcnt,&ccnt);
3134 bcnt += ccnt;
3135 bcnt += scnprintf(buf+bcnt,sizeof(buf)-bcnt," <%s>",
3136 get_ctrl_typename(cptr->info->type));
3137 pvr2_trace(PVR2_TRACE_CTL,
3138 "/*--TRACE_COMMIT--*/ %.*s",
3139 bcnt,buf);
3140 }
3141
3142 if (!commit_flag) {
3143 /* Nothing has changed */
3144 return 0;
3145 }
3146
Mike Isely681c7392007-11-26 01:48:52 -03003147 hdw->state_pipeline_config = 0;
3148 trace_stbit("state_pipeline_config",hdw->state_pipeline_config);
3149 pvr2_hdw_state_sched(hdw);
3150
3151 return !0;
3152}
3153
3154
3155/* Perform all operations needed to commit all control changes. This must
3156 be performed in synchronization with the pipeline state and is thus
3157 expected to be called as part of the driver's worker thread. Return
3158 true if commit successful, otherwise return false to indicate that
3159 commit isn't possible at this time. */
3160static int pvr2_hdw_commit_execute(struct pvr2_hdw *hdw)
3161{
3162 unsigned int idx;
3163 struct pvr2_ctrl *cptr;
3164 int disruptive_change;
3165
Mike Iselyab062fe2008-06-30 03:32:35 -03003166 /* Handle some required side effects when the video standard is
3167 changed.... */
Mike Iselyd8554972006-06-26 20:58:46 -03003168 if (hdw->std_dirty) {
Mike Iselyd8554972006-06-26 20:58:46 -03003169 int nvres;
Mike Isely00528d92008-06-30 03:35:52 -03003170 int gop_size;
Mike Iselyd8554972006-06-26 20:58:46 -03003171 if (hdw->std_mask_cur & V4L2_STD_525_60) {
3172 nvres = 480;
Mike Isely00528d92008-06-30 03:35:52 -03003173 gop_size = 15;
Mike Iselyd8554972006-06-26 20:58:46 -03003174 } else {
3175 nvres = 576;
Mike Isely00528d92008-06-30 03:35:52 -03003176 gop_size = 12;
Mike Iselyd8554972006-06-26 20:58:46 -03003177 }
Mike Isely00528d92008-06-30 03:35:52 -03003178 /* Rewrite the vertical resolution to be appropriate to the
3179 video standard that has been selected. */
Mike Iselyd8554972006-06-26 20:58:46 -03003180 if (nvres != hdw->res_ver_val) {
3181 hdw->res_ver_val = nvres;
3182 hdw->res_ver_dirty = !0;
3183 }
Mike Isely00528d92008-06-30 03:35:52 -03003184 /* Rewrite the GOP size to be appropriate to the video
3185 standard that has been selected. */
3186 if (gop_size != hdw->enc_ctl_state.video_gop_size) {
3187 struct v4l2_ext_controls cs;
3188 struct v4l2_ext_control c1;
3189 memset(&cs, 0, sizeof(cs));
3190 memset(&c1, 0, sizeof(c1));
3191 cs.controls = &c1;
3192 cs.count = 1;
3193 c1.id = V4L2_CID_MPEG_VIDEO_GOP_SIZE;
3194 c1.value = gop_size;
3195 cx2341x_ext_ctrls(&hdw->enc_ctl_state, 0, &cs,
3196 VIDIOC_S_EXT_CTRLS);
3197 }
Mike Iselyd8554972006-06-26 20:58:46 -03003198 }
3199
Mike Isely38d9a2c2008-03-28 05:30:48 -03003200 if (hdw->input_dirty && hdw->state_pathway_ok &&
Mike Isely62433e32008-04-22 14:45:40 -03003201 (((hdw->input_val == PVR2_CVAL_INPUT_DTV) ?
3202 PVR2_PATHWAY_DIGITAL : PVR2_PATHWAY_ANALOG) !=
3203 hdw->pathway_state)) {
3204 /* Change of mode being asked for... */
3205 hdw->state_pathway_ok = 0;
Mike Iselye9db1ff2008-04-22 14:45:41 -03003206 trace_stbit("state_pathway_ok",hdw->state_pathway_ok);
Mike Isely62433e32008-04-22 14:45:40 -03003207 }
3208 if (!hdw->state_pathway_ok) {
3209 /* Can't commit anything until pathway is ok. */
3210 return 0;
3211 }
vdb128@picaros.orge784bfb2008-08-30 18:26:39 -03003212 /* The broadcast decoder can only scale down, so if
3213 * res_*_dirty && crop window < output format ==> enlarge crop.
3214 *
3215 * The mpeg encoder receives fields of res_hor_val dots and
3216 * res_ver_val halflines. Limits: hor<=720, ver<=576.
3217 */
3218 if (hdw->res_hor_dirty && hdw->cropw_val < hdw->res_hor_val) {
3219 hdw->cropw_val = hdw->res_hor_val;
3220 hdw->cropw_dirty = !0;
3221 } else if (hdw->cropw_dirty) {
3222 hdw->res_hor_dirty = !0; /* must rescale */
3223 hdw->res_hor_val = min(720, hdw->cropw_val);
3224 }
3225 if (hdw->res_ver_dirty && hdw->croph_val < hdw->res_ver_val) {
3226 hdw->croph_val = hdw->res_ver_val;
3227 hdw->croph_dirty = !0;
3228 } else if (hdw->croph_dirty) {
3229 int nvres = hdw->std_mask_cur & V4L2_STD_525_60 ? 480 : 576;
3230 hdw->res_ver_dirty = !0;
3231 hdw->res_ver_val = min(nvres, hdw->croph_val);
3232 }
3233
Mike Isely681c7392007-11-26 01:48:52 -03003234 /* If any of the below has changed, then we can't do the update
3235 while the pipeline is running. Pipeline must be paused first
3236 and decoder -> encoder connection be made quiescent before we
3237 can proceed. */
3238 disruptive_change =
3239 (hdw->std_dirty ||
3240 hdw->enc_unsafe_stale ||
3241 hdw->srate_dirty ||
3242 hdw->res_ver_dirty ||
3243 hdw->res_hor_dirty ||
Mike Isely755879c2008-08-31 20:50:59 -03003244 hdw->cropw_dirty ||
3245 hdw->croph_dirty ||
Mike Isely681c7392007-11-26 01:48:52 -03003246 hdw->input_dirty ||
3247 (hdw->active_stream_type != hdw->desired_stream_type));
3248 if (disruptive_change && !hdw->state_pipeline_idle) {
3249 /* Pipeline is not idle; we can't proceed. Arrange to
3250 cause pipeline to stop so that we can try this again
3251 later.... */
3252 hdw->state_pipeline_pause = !0;
3253 return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03003254 }
3255
Mike Iselyb30d2442006-06-25 20:05:01 -03003256 if (hdw->srate_dirty) {
3257 /* Write new sample rate into control structure since
3258 * the master copy is stale. We must track srate
3259 * separate from the mpeg control structure because
3260 * other logic also uses this value. */
3261 struct v4l2_ext_controls cs;
3262 struct v4l2_ext_control c1;
3263 memset(&cs,0,sizeof(cs));
3264 memset(&c1,0,sizeof(c1));
3265 cs.controls = &c1;
3266 cs.count = 1;
3267 c1.id = V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ;
3268 c1.value = hdw->srate_val;
Hans Verkuil01f1e442007-08-21 18:32:42 -03003269 cx2341x_ext_ctrls(&hdw->enc_ctl_state, 0, &cs,VIDIOC_S_EXT_CTRLS);
Mike Iselyb30d2442006-06-25 20:05:01 -03003270 }
Mike Iselyc05c0462006-06-25 20:04:25 -03003271
Mike Isely681c7392007-11-26 01:48:52 -03003272 if (hdw->active_stream_type != hdw->desired_stream_type) {
3273 /* Handle any side effects of stream config here */
3274 hdw->active_stream_type = hdw->desired_stream_type;
3275 }
3276
Mike Isely1df59f02008-04-21 03:50:39 -03003277 if (hdw->hdw_desc->signal_routing_scheme ==
3278 PVR2_ROUTING_SCHEME_GOTVIEW) {
3279 u32 b;
3280 /* Handle GOTVIEW audio switching */
3281 pvr2_hdw_gpio_get_out(hdw,&b);
3282 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
3283 /* Set GPIO 11 */
3284 pvr2_hdw_gpio_chg_out(hdw,(1 << 11),~0);
3285 } else {
3286 /* Clear GPIO 11 */
3287 pvr2_hdw_gpio_chg_out(hdw,(1 << 11),0);
3288 }
3289 }
3290
Mike Iselye68a6192009-03-07 01:45:10 -03003291 /* Check and update state for all sub-devices. */
3292 pvr2_subdev_update(hdw);
3293
Mike Isely75212a02009-03-07 01:48:42 -03003294 hdw->tuner_updated = 0;
Mike Isely27764722009-03-07 01:57:25 -03003295 hdw->force_dirty = 0;
Mike Isely5ceaad12009-03-07 00:01:20 -03003296 for (idx = 0; idx < hdw->control_cnt; idx++) {
3297 cptr = hdw->controls + idx;
3298 if (!cptr->info->clear_dirty) continue;
3299 cptr->info->clear_dirty(cptr);
3300 }
3301
Mike Isely62433e32008-04-22 14:45:40 -03003302 if ((hdw->pathway_state == PVR2_PATHWAY_ANALOG) &&
3303 hdw->state_encoder_run) {
3304 /* If encoder isn't running or it can't be touched, then
3305 this will get worked out later when we start the
3306 encoder. */
Mike Isely681c7392007-11-26 01:48:52 -03003307 if (pvr2_encoder_adjust(hdw) < 0) return !0;
3308 }
Mike Iselyd8554972006-06-26 20:58:46 -03003309
Mike Isely681c7392007-11-26 01:48:52 -03003310 hdw->state_pipeline_config = !0;
Mike Isely432907f2008-08-31 21:02:20 -03003311 /* Hardware state may have changed in a way to cause the cropping
3312 capabilities to have changed. So mark it stale, which will
3313 cause a later re-fetch. */
Mike Isely681c7392007-11-26 01:48:52 -03003314 trace_stbit("state_pipeline_config",hdw->state_pipeline_config);
3315 return !0;
Mike Iselyd8554972006-06-26 20:58:46 -03003316}
3317
3318
3319int pvr2_hdw_commit_ctl(struct pvr2_hdw *hdw)
3320{
Mike Isely681c7392007-11-26 01:48:52 -03003321 int fl;
3322 LOCK_TAKE(hdw->big_lock);
3323 fl = pvr2_hdw_commit_setup(hdw);
3324 LOCK_GIVE(hdw->big_lock);
3325 if (!fl) return 0;
3326 return pvr2_hdw_wait(hdw,0);
Mike Iselyd8554972006-06-26 20:58:46 -03003327}
3328
3329
Mike Isely681c7392007-11-26 01:48:52 -03003330static void pvr2_hdw_worker_poll(struct work_struct *work)
Mike Iselyd8554972006-06-26 20:58:46 -03003331{
Mike Isely681c7392007-11-26 01:48:52 -03003332 int fl = 0;
3333 struct pvr2_hdw *hdw = container_of(work,struct pvr2_hdw,workpoll);
Mike Iselyd8554972006-06-26 20:58:46 -03003334 LOCK_TAKE(hdw->big_lock); do {
Mike Isely681c7392007-11-26 01:48:52 -03003335 fl = pvr2_hdw_state_eval(hdw);
3336 } while (0); LOCK_GIVE(hdw->big_lock);
3337 if (fl && hdw->state_func) {
3338 hdw->state_func(hdw->state_data);
3339 }
3340}
3341
3342
Mike Isely681c7392007-11-26 01:48:52 -03003343static int pvr2_hdw_wait(struct pvr2_hdw *hdw,int state)
Mike Iselyd8554972006-06-26 20:58:46 -03003344{
Mike Isely681c7392007-11-26 01:48:52 -03003345 return wait_event_interruptible(
3346 hdw->state_wait_data,
3347 (hdw->state_stale == 0) &&
3348 (!state || (hdw->master_state != state)));
Mike Iselyd8554972006-06-26 20:58:46 -03003349}
3350
Mike Isely681c7392007-11-26 01:48:52 -03003351
Mike Iselyd8554972006-06-26 20:58:46 -03003352/* Return name for this driver instance */
3353const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw)
3354{
3355 return hdw->name;
3356}
3357
3358
Mike Isely78a47102007-11-26 01:58:20 -03003359const char *pvr2_hdw_get_desc(struct pvr2_hdw *hdw)
3360{
3361 return hdw->hdw_desc->description;
3362}
3363
3364
3365const char *pvr2_hdw_get_type(struct pvr2_hdw *hdw)
3366{
3367 return hdw->hdw_desc->shortname;
3368}
3369
3370
Mike Iselyd8554972006-06-26 20:58:46 -03003371int pvr2_hdw_is_hsm(struct pvr2_hdw *hdw)
3372{
3373 int result;
3374 LOCK_TAKE(hdw->ctl_lock); do {
Michael Krufky8d364362007-01-22 02:17:55 -03003375 hdw->cmd_buffer[0] = FX2CMD_GET_USB_SPEED;
Mike Iselyd8554972006-06-26 20:58:46 -03003376 result = pvr2_send_request(hdw,
3377 hdw->cmd_buffer,1,
3378 hdw->cmd_buffer,1);
3379 if (result < 0) break;
3380 result = (hdw->cmd_buffer[0] != 0);
3381 } while(0); LOCK_GIVE(hdw->ctl_lock);
3382 return result;
3383}
3384
3385
Mike Isely18103c52007-01-20 00:09:47 -03003386/* Execute poll of tuner status */
3387void pvr2_hdw_execute_tuner_poll(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03003388{
Mike Iselyd8554972006-06-26 20:58:46 -03003389 LOCK_TAKE(hdw->big_lock); do {
Mike Iselya51f5002009-03-06 23:30:37 -03003390 pvr2_hdw_status_poll(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003391 } while (0); LOCK_GIVE(hdw->big_lock);
Mike Isely18103c52007-01-20 00:09:47 -03003392}
3393
3394
Mike Isely432907f2008-08-31 21:02:20 -03003395static int pvr2_hdw_check_cropcap(struct pvr2_hdw *hdw)
3396{
3397 if (!hdw->cropcap_stale) {
Mike Isely432907f2008-08-31 21:02:20 -03003398 return 0;
3399 }
Mike Iselya51f5002009-03-06 23:30:37 -03003400 pvr2_hdw_status_poll(hdw);
Mike Isely432907f2008-08-31 21:02:20 -03003401 if (hdw->cropcap_stale) {
Mike Isely432907f2008-08-31 21:02:20 -03003402 return -EIO;
3403 }
3404 return 0;
3405}
3406
3407
3408/* Return information about cropping capabilities */
3409int pvr2_hdw_get_cropcap(struct pvr2_hdw *hdw, struct v4l2_cropcap *pp)
3410{
3411 int stat = 0;
3412 LOCK_TAKE(hdw->big_lock);
3413 stat = pvr2_hdw_check_cropcap(hdw);
3414 if (!stat) {
Mike Isely432907f2008-08-31 21:02:20 -03003415 memcpy(pp, &hdw->cropcap_info, sizeof(hdw->cropcap_info));
3416 }
3417 LOCK_GIVE(hdw->big_lock);
3418 return stat;
3419}
3420
3421
Mike Isely18103c52007-01-20 00:09:47 -03003422/* Return information about the tuner */
3423int pvr2_hdw_get_tuner_status(struct pvr2_hdw *hdw,struct v4l2_tuner *vtp)
3424{
3425 LOCK_TAKE(hdw->big_lock); do {
3426 if (hdw->tuner_signal_stale) {
Mike Iselya51f5002009-03-06 23:30:37 -03003427 pvr2_hdw_status_poll(hdw);
Mike Isely18103c52007-01-20 00:09:47 -03003428 }
3429 memcpy(vtp,&hdw->tuner_signal_info,sizeof(struct v4l2_tuner));
3430 } while (0); LOCK_GIVE(hdw->big_lock);
3431 return 0;
Mike Iselyd8554972006-06-26 20:58:46 -03003432}
3433
3434
3435/* Get handle to video output stream */
3436struct pvr2_stream *pvr2_hdw_get_video_stream(struct pvr2_hdw *hp)
3437{
3438 return hp->vid_stream;
3439}
3440
3441
3442void pvr2_hdw_trigger_module_log(struct pvr2_hdw *hdw)
3443{
Mike Isely4f1a3e52006-06-25 20:04:31 -03003444 int nr = pvr2_hdw_get_unit_number(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003445 LOCK_TAKE(hdw->big_lock); do {
Mike Isely4f1a3e52006-06-25 20:04:31 -03003446 printk(KERN_INFO "pvrusb2: ================= START STATUS CARD #%d =================\n", nr);
Mike Iselyed3261a2009-03-07 00:02:33 -03003447 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, log_status);
Mike Iselyb30d2442006-06-25 20:05:01 -03003448 pvr2_trace(PVR2_TRACE_INFO,"cx2341x config:");
Hans Verkuil99eb44f2006-06-26 18:24:05 -03003449 cx2341x_log_status(&hdw->enc_ctl_state, "pvrusb2");
Mike Isely681c7392007-11-26 01:48:52 -03003450 pvr2_hdw_state_log_state(hdw);
Mike Isely4f1a3e52006-06-25 20:04:31 -03003451 printk(KERN_INFO "pvrusb2: ================== END STATUS CARD #%d ==================\n", nr);
Mike Iselyd8554972006-06-26 20:58:46 -03003452 } while (0); LOCK_GIVE(hdw->big_lock);
3453}
3454
Mike Isely4db666c2007-09-08 22:16:27 -03003455
3456/* Grab EEPROM contents, needed for direct method. */
3457#define EEPROM_SIZE 8192
3458#define trace_eeprom(...) pvr2_trace(PVR2_TRACE_EEPROM,__VA_ARGS__)
3459static u8 *pvr2_full_eeprom_fetch(struct pvr2_hdw *hdw)
3460{
3461 struct i2c_msg msg[2];
3462 u8 *eeprom;
3463 u8 iadd[2];
3464 u8 addr;
3465 u16 eepromSize;
3466 unsigned int offs;
3467 int ret;
3468 int mode16 = 0;
3469 unsigned pcnt,tcnt;
3470 eeprom = kmalloc(EEPROM_SIZE,GFP_KERNEL);
3471 if (!eeprom) {
3472 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3473 "Failed to allocate memory"
3474 " required to read eeprom");
3475 return NULL;
3476 }
3477
3478 trace_eeprom("Value for eeprom addr from controller was 0x%x",
3479 hdw->eeprom_addr);
3480 addr = hdw->eeprom_addr;
3481 /* Seems that if the high bit is set, then the *real* eeprom
3482 address is shifted right now bit position (noticed this in
3483 newer PVR USB2 hardware) */
3484 if (addr & 0x80) addr >>= 1;
3485
3486 /* FX2 documentation states that a 16bit-addressed eeprom is
3487 expected if the I2C address is an odd number (yeah, this is
3488 strange but it's what they do) */
3489 mode16 = (addr & 1);
3490 eepromSize = (mode16 ? EEPROM_SIZE : 256);
3491 trace_eeprom("Examining %d byte eeprom at location 0x%x"
3492 " using %d bit addressing",eepromSize,addr,
3493 mode16 ? 16 : 8);
3494
3495 msg[0].addr = addr;
3496 msg[0].flags = 0;
3497 msg[0].len = mode16 ? 2 : 1;
3498 msg[0].buf = iadd;
3499 msg[1].addr = addr;
3500 msg[1].flags = I2C_M_RD;
3501
3502 /* We have to do the actual eeprom data fetch ourselves, because
3503 (1) we're only fetching part of the eeprom, and (2) if we were
3504 getting the whole thing our I2C driver can't grab it in one
3505 pass - which is what tveeprom is otherwise going to attempt */
3506 memset(eeprom,0,EEPROM_SIZE);
3507 for (tcnt = 0; tcnt < EEPROM_SIZE; tcnt += pcnt) {
3508 pcnt = 16;
3509 if (pcnt + tcnt > EEPROM_SIZE) pcnt = EEPROM_SIZE-tcnt;
3510 offs = tcnt + (eepromSize - EEPROM_SIZE);
3511 if (mode16) {
3512 iadd[0] = offs >> 8;
3513 iadd[1] = offs;
3514 } else {
3515 iadd[0] = offs;
3516 }
3517 msg[1].len = pcnt;
3518 msg[1].buf = eeprom+tcnt;
3519 if ((ret = i2c_transfer(&hdw->i2c_adap,
3520 msg,ARRAY_SIZE(msg))) != 2) {
3521 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3522 "eeprom fetch set offs err=%d",ret);
3523 kfree(eeprom);
3524 return NULL;
3525 }
3526 }
3527 return eeprom;
3528}
3529
3530
3531void pvr2_hdw_cpufw_set_enabled(struct pvr2_hdw *hdw,
Mike Isely568efaa2009-11-25 02:52:06 -03003532 int mode,
Mike Isely4db666c2007-09-08 22:16:27 -03003533 int enable_flag)
Mike Iselyd8554972006-06-26 20:58:46 -03003534{
3535 int ret;
3536 u16 address;
3537 unsigned int pipe;
3538 LOCK_TAKE(hdw->big_lock); do {
Al Viro5fa12472008-03-29 03:07:38 +00003539 if ((hdw->fw_buffer == NULL) == !enable_flag) break;
Mike Iselyd8554972006-06-26 20:58:46 -03003540
3541 if (!enable_flag) {
3542 pvr2_trace(PVR2_TRACE_FIRMWARE,
3543 "Cleaning up after CPU firmware fetch");
3544 kfree(hdw->fw_buffer);
Mike Iselya0fd1cb2006-06-30 11:35:28 -03003545 hdw->fw_buffer = NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03003546 hdw->fw_size = 0;
Mike Isely4db666c2007-09-08 22:16:27 -03003547 if (hdw->fw_cpu_flag) {
3548 /* Now release the CPU. It will disconnect
3549 and reconnect later. */
3550 pvr2_hdw_cpureset_assert(hdw,0);
3551 }
Mike Iselyd8554972006-06-26 20:58:46 -03003552 break;
3553 }
3554
Mike Isely568efaa2009-11-25 02:52:06 -03003555 hdw->fw_cpu_flag = (mode != 2);
Mike Isely4db666c2007-09-08 22:16:27 -03003556 if (hdw->fw_cpu_flag) {
Mike Isely568efaa2009-11-25 02:52:06 -03003557 hdw->fw_size = (mode == 1) ? 0x4000 : 0x2000;
Mike Isely4db666c2007-09-08 22:16:27 -03003558 pvr2_trace(PVR2_TRACE_FIRMWARE,
Mike Isely568efaa2009-11-25 02:52:06 -03003559 "Preparing to suck out CPU firmware"
3560 " (size=%u)", hdw->fw_size);
Mike Isely4db666c2007-09-08 22:16:27 -03003561 hdw->fw_buffer = kzalloc(hdw->fw_size,GFP_KERNEL);
3562 if (!hdw->fw_buffer) {
3563 hdw->fw_size = 0;
3564 break;
3565 }
3566
3567 /* We have to hold the CPU during firmware upload. */
3568 pvr2_hdw_cpureset_assert(hdw,1);
3569
3570 /* download the firmware from address 0000-1fff in 2048
3571 (=0x800) bytes chunk. */
3572
3573 pvr2_trace(PVR2_TRACE_FIRMWARE,
3574 "Grabbing CPU firmware");
3575 pipe = usb_rcvctrlpipe(hdw->usb_dev, 0);
3576 for(address = 0; address < hdw->fw_size;
3577 address += 0x800) {
3578 ret = usb_control_msg(hdw->usb_dev,pipe,
3579 0xa0,0xc0,
3580 address,0,
3581 hdw->fw_buffer+address,
3582 0x800,HZ);
3583 if (ret < 0) break;
3584 }
3585
3586 pvr2_trace(PVR2_TRACE_FIRMWARE,
3587 "Done grabbing CPU firmware");
3588 } else {
3589 pvr2_trace(PVR2_TRACE_FIRMWARE,
3590 "Sucking down EEPROM contents");
3591 hdw->fw_buffer = pvr2_full_eeprom_fetch(hdw);
3592 if (!hdw->fw_buffer) {
3593 pvr2_trace(PVR2_TRACE_FIRMWARE,
3594 "EEPROM content suck failed.");
3595 break;
3596 }
3597 hdw->fw_size = EEPROM_SIZE;
3598 pvr2_trace(PVR2_TRACE_FIRMWARE,
3599 "Done sucking down EEPROM contents");
Mike Iselyd8554972006-06-26 20:58:46 -03003600 }
3601
Mike Iselyd8554972006-06-26 20:58:46 -03003602 } while (0); LOCK_GIVE(hdw->big_lock);
3603}
3604
3605
3606/* Return true if we're in a mode for retrieval CPU firmware */
3607int pvr2_hdw_cpufw_get_enabled(struct pvr2_hdw *hdw)
3608{
Al Viro5fa12472008-03-29 03:07:38 +00003609 return hdw->fw_buffer != NULL;
Mike Iselyd8554972006-06-26 20:58:46 -03003610}
3611
3612
3613int pvr2_hdw_cpufw_get(struct pvr2_hdw *hdw,unsigned int offs,
3614 char *buf,unsigned int cnt)
3615{
3616 int ret = -EINVAL;
3617 LOCK_TAKE(hdw->big_lock); do {
3618 if (!buf) break;
3619 if (!cnt) break;
3620
3621 if (!hdw->fw_buffer) {
3622 ret = -EIO;
3623 break;
3624 }
3625
3626 if (offs >= hdw->fw_size) {
3627 pvr2_trace(PVR2_TRACE_FIRMWARE,
3628 "Read firmware data offs=%d EOF",
3629 offs);
3630 ret = 0;
3631 break;
3632 }
3633
3634 if (offs + cnt > hdw->fw_size) cnt = hdw->fw_size - offs;
3635
3636 memcpy(buf,hdw->fw_buffer+offs,cnt);
3637
3638 pvr2_trace(PVR2_TRACE_FIRMWARE,
3639 "Read firmware data offs=%d cnt=%d",
3640 offs,cnt);
3641 ret = cnt;
3642 } while (0); LOCK_GIVE(hdw->big_lock);
3643
3644 return ret;
3645}
3646
3647
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003648int pvr2_hdw_v4l_get_minor_number(struct pvr2_hdw *hdw,
Mike Isely80793842006-12-27 23:12:28 -03003649 enum pvr2_v4l_type index)
Mike Iselyd8554972006-06-26 20:58:46 -03003650{
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003651 switch (index) {
Mike Isely80793842006-12-27 23:12:28 -03003652 case pvr2_v4l_type_video: return hdw->v4l_minor_number_video;
3653 case pvr2_v4l_type_vbi: return hdw->v4l_minor_number_vbi;
3654 case pvr2_v4l_type_radio: return hdw->v4l_minor_number_radio;
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003655 default: return -1;
3656 }
Mike Iselyd8554972006-06-26 20:58:46 -03003657}
3658
3659
Pantelis Koukousoulas2fdf3d92006-12-27 23:07:58 -03003660/* Store a v4l minor device number */
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003661void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *hdw,
Mike Isely80793842006-12-27 23:12:28 -03003662 enum pvr2_v4l_type index,int v)
Mike Iselyd8554972006-06-26 20:58:46 -03003663{
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003664 switch (index) {
Mike Isely80793842006-12-27 23:12:28 -03003665 case pvr2_v4l_type_video: hdw->v4l_minor_number_video = v;
3666 case pvr2_v4l_type_vbi: hdw->v4l_minor_number_vbi = v;
3667 case pvr2_v4l_type_radio: hdw->v4l_minor_number_radio = v;
Mike Iselyfd5a75f2006-12-27 23:11:22 -03003668 default: break;
3669 }
Mike Iselyd8554972006-06-26 20:58:46 -03003670}
3671
3672
David Howells7d12e782006-10-05 14:55:46 +01003673static void pvr2_ctl_write_complete(struct urb *urb)
Mike Iselyd8554972006-06-26 20:58:46 -03003674{
3675 struct pvr2_hdw *hdw = urb->context;
3676 hdw->ctl_write_pend_flag = 0;
3677 if (hdw->ctl_read_pend_flag) return;
3678 complete(&hdw->ctl_done);
3679}
3680
3681
David Howells7d12e782006-10-05 14:55:46 +01003682static void pvr2_ctl_read_complete(struct urb *urb)
Mike Iselyd8554972006-06-26 20:58:46 -03003683{
3684 struct pvr2_hdw *hdw = urb->context;
3685 hdw->ctl_read_pend_flag = 0;
3686 if (hdw->ctl_write_pend_flag) return;
3687 complete(&hdw->ctl_done);
3688}
3689
3690
3691static void pvr2_ctl_timeout(unsigned long data)
3692{
3693 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
3694 if (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
3695 hdw->ctl_timeout_flag = !0;
Mariusz Kozlowski5e55d2c2006-11-08 15:34:31 +01003696 if (hdw->ctl_write_pend_flag)
Mike Iselyd8554972006-06-26 20:58:46 -03003697 usb_unlink_urb(hdw->ctl_write_urb);
Mariusz Kozlowski5e55d2c2006-11-08 15:34:31 +01003698 if (hdw->ctl_read_pend_flag)
Mike Iselyd8554972006-06-26 20:58:46 -03003699 usb_unlink_urb(hdw->ctl_read_urb);
Mike Iselyd8554972006-06-26 20:58:46 -03003700 }
3701}
3702
3703
Mike Iselye61b6fc2006-07-18 22:42:18 -03003704/* Issue a command and get a response from the device. This extended
3705 version includes a probe flag (which if set means that device errors
3706 should not be logged or treated as fatal) and a timeout in jiffies.
3707 This can be used to non-lethally probe the health of endpoint 1. */
Adrian Bunk07e337e2006-06-30 11:30:20 -03003708static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
3709 unsigned int timeout,int probe_fl,
3710 void *write_data,unsigned int write_len,
3711 void *read_data,unsigned int read_len)
Mike Iselyd8554972006-06-26 20:58:46 -03003712{
3713 unsigned int idx;
3714 int status = 0;
3715 struct timer_list timer;
3716 if (!hdw->ctl_lock_held) {
3717 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3718 "Attempted to execute control transfer"
3719 " without lock!!");
3720 return -EDEADLK;
3721 }
Mike Isely681c7392007-11-26 01:48:52 -03003722 if (!hdw->flag_ok && !probe_fl) {
Mike Iselyd8554972006-06-26 20:58:46 -03003723 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3724 "Attempted to execute control transfer"
3725 " when device not ok");
3726 return -EIO;
3727 }
3728 if (!(hdw->ctl_read_urb && hdw->ctl_write_urb)) {
3729 if (!probe_fl) {
3730 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3731 "Attempted to execute control transfer"
3732 " when USB is disconnected");
3733 }
3734 return -ENOTTY;
3735 }
3736
3737 /* Ensure that we have sane parameters */
3738 if (!write_data) write_len = 0;
3739 if (!read_data) read_len = 0;
3740 if (write_len > PVR2_CTL_BUFFSIZE) {
3741 pvr2_trace(
3742 PVR2_TRACE_ERROR_LEGS,
3743 "Attempted to execute %d byte"
3744 " control-write transfer (limit=%d)",
3745 write_len,PVR2_CTL_BUFFSIZE);
3746 return -EINVAL;
3747 }
3748 if (read_len > PVR2_CTL_BUFFSIZE) {
3749 pvr2_trace(
3750 PVR2_TRACE_ERROR_LEGS,
3751 "Attempted to execute %d byte"
3752 " control-read transfer (limit=%d)",
3753 write_len,PVR2_CTL_BUFFSIZE);
3754 return -EINVAL;
3755 }
3756 if ((!write_len) && (!read_len)) {
3757 pvr2_trace(
3758 PVR2_TRACE_ERROR_LEGS,
3759 "Attempted to execute null control transfer?");
3760 return -EINVAL;
3761 }
3762
3763
3764 hdw->cmd_debug_state = 1;
3765 if (write_len) {
3766 hdw->cmd_debug_code = ((unsigned char *)write_data)[0];
3767 } else {
3768 hdw->cmd_debug_code = 0;
3769 }
3770 hdw->cmd_debug_write_len = write_len;
3771 hdw->cmd_debug_read_len = read_len;
3772
3773 /* Initialize common stuff */
3774 init_completion(&hdw->ctl_done);
3775 hdw->ctl_timeout_flag = 0;
3776 hdw->ctl_write_pend_flag = 0;
3777 hdw->ctl_read_pend_flag = 0;
3778 init_timer(&timer);
3779 timer.expires = jiffies + timeout;
3780 timer.data = (unsigned long)hdw;
3781 timer.function = pvr2_ctl_timeout;
3782
3783 if (write_len) {
3784 hdw->cmd_debug_state = 2;
3785 /* Transfer write data to internal buffer */
3786 for (idx = 0; idx < write_len; idx++) {
3787 hdw->ctl_write_buffer[idx] =
3788 ((unsigned char *)write_data)[idx];
3789 }
3790 /* Initiate a write request */
3791 usb_fill_bulk_urb(hdw->ctl_write_urb,
3792 hdw->usb_dev,
3793 usb_sndbulkpipe(hdw->usb_dev,
3794 PVR2_CTL_WRITE_ENDPOINT),
3795 hdw->ctl_write_buffer,
3796 write_len,
3797 pvr2_ctl_write_complete,
3798 hdw);
3799 hdw->ctl_write_urb->actual_length = 0;
3800 hdw->ctl_write_pend_flag = !0;
3801 status = usb_submit_urb(hdw->ctl_write_urb,GFP_KERNEL);
3802 if (status < 0) {
3803 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3804 "Failed to submit write-control"
3805 " URB status=%d",status);
3806 hdw->ctl_write_pend_flag = 0;
3807 goto done;
3808 }
3809 }
3810
3811 if (read_len) {
3812 hdw->cmd_debug_state = 3;
3813 memset(hdw->ctl_read_buffer,0x43,read_len);
3814 /* Initiate a read request */
3815 usb_fill_bulk_urb(hdw->ctl_read_urb,
3816 hdw->usb_dev,
3817 usb_rcvbulkpipe(hdw->usb_dev,
3818 PVR2_CTL_READ_ENDPOINT),
3819 hdw->ctl_read_buffer,
3820 read_len,
3821 pvr2_ctl_read_complete,
3822 hdw);
3823 hdw->ctl_read_urb->actual_length = 0;
3824 hdw->ctl_read_pend_flag = !0;
3825 status = usb_submit_urb(hdw->ctl_read_urb,GFP_KERNEL);
3826 if (status < 0) {
3827 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3828 "Failed to submit read-control"
3829 " URB status=%d",status);
3830 hdw->ctl_read_pend_flag = 0;
3831 goto done;
3832 }
3833 }
3834
3835 /* Start timer */
3836 add_timer(&timer);
3837
3838 /* Now wait for all I/O to complete */
3839 hdw->cmd_debug_state = 4;
3840 while (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
3841 wait_for_completion(&hdw->ctl_done);
3842 }
3843 hdw->cmd_debug_state = 5;
3844
3845 /* Stop timer */
3846 del_timer_sync(&timer);
3847
3848 hdw->cmd_debug_state = 6;
3849 status = 0;
3850
3851 if (hdw->ctl_timeout_flag) {
3852 status = -ETIMEDOUT;
3853 if (!probe_fl) {
3854 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3855 "Timed out control-write");
3856 }
3857 goto done;
3858 }
3859
3860 if (write_len) {
3861 /* Validate results of write request */
3862 if ((hdw->ctl_write_urb->status != 0) &&
3863 (hdw->ctl_write_urb->status != -ENOENT) &&
3864 (hdw->ctl_write_urb->status != -ESHUTDOWN) &&
3865 (hdw->ctl_write_urb->status != -ECONNRESET)) {
3866 /* USB subsystem is reporting some kind of failure
3867 on the write */
3868 status = hdw->ctl_write_urb->status;
3869 if (!probe_fl) {
3870 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3871 "control-write URB failure,"
3872 " status=%d",
3873 status);
3874 }
3875 goto done;
3876 }
3877 if (hdw->ctl_write_urb->actual_length < write_len) {
3878 /* Failed to write enough data */
3879 status = -EIO;
3880 if (!probe_fl) {
3881 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3882 "control-write URB short,"
3883 " expected=%d got=%d",
3884 write_len,
3885 hdw->ctl_write_urb->actual_length);
3886 }
3887 goto done;
3888 }
3889 }
3890 if (read_len) {
3891 /* Validate results of read request */
3892 if ((hdw->ctl_read_urb->status != 0) &&
3893 (hdw->ctl_read_urb->status != -ENOENT) &&
3894 (hdw->ctl_read_urb->status != -ESHUTDOWN) &&
3895 (hdw->ctl_read_urb->status != -ECONNRESET)) {
3896 /* USB subsystem is reporting some kind of failure
3897 on the read */
3898 status = hdw->ctl_read_urb->status;
3899 if (!probe_fl) {
3900 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3901 "control-read URB failure,"
3902 " status=%d",
3903 status);
3904 }
3905 goto done;
3906 }
3907 if (hdw->ctl_read_urb->actual_length < read_len) {
3908 /* Failed to read enough data */
3909 status = -EIO;
3910 if (!probe_fl) {
3911 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
3912 "control-read URB short,"
3913 " expected=%d got=%d",
3914 read_len,
3915 hdw->ctl_read_urb->actual_length);
3916 }
3917 goto done;
3918 }
3919 /* Transfer retrieved data out from internal buffer */
3920 for (idx = 0; idx < read_len; idx++) {
3921 ((unsigned char *)read_data)[idx] =
3922 hdw->ctl_read_buffer[idx];
3923 }
3924 }
3925
3926 done:
3927
3928 hdw->cmd_debug_state = 0;
3929 if ((status < 0) && (!probe_fl)) {
Mike Isely681c7392007-11-26 01:48:52 -03003930 pvr2_hdw_render_useless(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03003931 }
3932 return status;
3933}
3934
3935
3936int pvr2_send_request(struct pvr2_hdw *hdw,
3937 void *write_data,unsigned int write_len,
3938 void *read_data,unsigned int read_len)
3939{
3940 return pvr2_send_request_ex(hdw,HZ*4,0,
3941 write_data,write_len,
3942 read_data,read_len);
3943}
3944
Mike Isely1c9d10d2008-03-28 05:38:54 -03003945
3946static int pvr2_issue_simple_cmd(struct pvr2_hdw *hdw,u32 cmdcode)
3947{
3948 int ret;
3949 unsigned int cnt = 1;
3950 unsigned int args = 0;
3951 LOCK_TAKE(hdw->ctl_lock);
3952 hdw->cmd_buffer[0] = cmdcode & 0xffu;
3953 args = (cmdcode >> 8) & 0xffu;
3954 args = (args > 2) ? 2 : args;
3955 if (args) {
3956 cnt += args;
3957 hdw->cmd_buffer[1] = (cmdcode >> 16) & 0xffu;
3958 if (args > 1) {
3959 hdw->cmd_buffer[2] = (cmdcode >> 24) & 0xffu;
3960 }
3961 }
3962 if (pvrusb2_debug & PVR2_TRACE_INIT) {
3963 unsigned int idx;
3964 unsigned int ccnt,bcnt;
3965 char tbuf[50];
3966 cmdcode &= 0xffu;
3967 bcnt = 0;
3968 ccnt = scnprintf(tbuf+bcnt,
3969 sizeof(tbuf)-bcnt,
3970 "Sending FX2 command 0x%x",cmdcode);
3971 bcnt += ccnt;
3972 for (idx = 0; idx < ARRAY_SIZE(pvr2_fx2cmd_desc); idx++) {
3973 if (pvr2_fx2cmd_desc[idx].id == cmdcode) {
3974 ccnt = scnprintf(tbuf+bcnt,
3975 sizeof(tbuf)-bcnt,
3976 " \"%s\"",
3977 pvr2_fx2cmd_desc[idx].desc);
3978 bcnt += ccnt;
3979 break;
3980 }
3981 }
3982 if (args) {
3983 ccnt = scnprintf(tbuf+bcnt,
3984 sizeof(tbuf)-bcnt,
3985 " (%u",hdw->cmd_buffer[1]);
3986 bcnt += ccnt;
3987 if (args > 1) {
3988 ccnt = scnprintf(tbuf+bcnt,
3989 sizeof(tbuf)-bcnt,
3990 ",%u",hdw->cmd_buffer[2]);
3991 bcnt += ccnt;
3992 }
3993 ccnt = scnprintf(tbuf+bcnt,
3994 sizeof(tbuf)-bcnt,
3995 ")");
3996 bcnt += ccnt;
3997 }
3998 pvr2_trace(PVR2_TRACE_INIT,"%.*s",bcnt,tbuf);
3999 }
4000 ret = pvr2_send_request(hdw,hdw->cmd_buffer,cnt,NULL,0);
4001 LOCK_GIVE(hdw->ctl_lock);
4002 return ret;
4003}
4004
4005
Mike Iselyd8554972006-06-26 20:58:46 -03004006int pvr2_write_register(struct pvr2_hdw *hdw, u16 reg, u32 data)
4007{
4008 int ret;
4009
4010 LOCK_TAKE(hdw->ctl_lock);
4011
Michael Krufky8d364362007-01-22 02:17:55 -03004012 hdw->cmd_buffer[0] = FX2CMD_REG_WRITE; /* write register prefix */
Mike Iselyd8554972006-06-26 20:58:46 -03004013 PVR2_DECOMPOSE_LE(hdw->cmd_buffer,1,data);
4014 hdw->cmd_buffer[5] = 0;
4015 hdw->cmd_buffer[6] = (reg >> 8) & 0xff;
4016 hdw->cmd_buffer[7] = reg & 0xff;
4017
4018
4019 ret = pvr2_send_request(hdw, hdw->cmd_buffer, 8, hdw->cmd_buffer, 0);
4020
4021 LOCK_GIVE(hdw->ctl_lock);
4022
4023 return ret;
4024}
4025
4026
Adrian Bunk07e337e2006-06-30 11:30:20 -03004027static int pvr2_read_register(struct pvr2_hdw *hdw, u16 reg, u32 *data)
Mike Iselyd8554972006-06-26 20:58:46 -03004028{
4029 int ret = 0;
4030
4031 LOCK_TAKE(hdw->ctl_lock);
4032
Michael Krufky8d364362007-01-22 02:17:55 -03004033 hdw->cmd_buffer[0] = FX2CMD_REG_READ; /* read register prefix */
Mike Iselyd8554972006-06-26 20:58:46 -03004034 hdw->cmd_buffer[1] = 0;
4035 hdw->cmd_buffer[2] = 0;
4036 hdw->cmd_buffer[3] = 0;
4037 hdw->cmd_buffer[4] = 0;
4038 hdw->cmd_buffer[5] = 0;
4039 hdw->cmd_buffer[6] = (reg >> 8) & 0xff;
4040 hdw->cmd_buffer[7] = reg & 0xff;
4041
4042 ret |= pvr2_send_request(hdw, hdw->cmd_buffer, 8, hdw->cmd_buffer, 4);
4043 *data = PVR2_COMPOSE_LE(hdw->cmd_buffer,0);
4044
4045 LOCK_GIVE(hdw->ctl_lock);
4046
4047 return ret;
4048}
4049
4050
Mike Isely681c7392007-11-26 01:48:52 -03004051void pvr2_hdw_render_useless(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03004052{
4053 if (!hdw->flag_ok) return;
Mike Isely681c7392007-11-26 01:48:52 -03004054 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
4055 "Device being rendered inoperable");
Mike Iselyd8554972006-06-26 20:58:46 -03004056 if (hdw->vid_stream) {
Mike Iselya0fd1cb2006-06-30 11:35:28 -03004057 pvr2_stream_setup(hdw->vid_stream,NULL,0,0);
Mike Iselyd8554972006-06-26 20:58:46 -03004058 }
Mike Isely681c7392007-11-26 01:48:52 -03004059 hdw->flag_ok = 0;
4060 trace_stbit("flag_ok",hdw->flag_ok);
4061 pvr2_hdw_state_sched(hdw);
Mike Iselyd8554972006-06-26 20:58:46 -03004062}
4063
4064
4065void pvr2_hdw_device_reset(struct pvr2_hdw *hdw)
4066{
4067 int ret;
4068 pvr2_trace(PVR2_TRACE_INIT,"Performing a device reset...");
Mike Iselya0fd1cb2006-06-30 11:35:28 -03004069 ret = usb_lock_device_for_reset(hdw->usb_dev,NULL);
Alan Stern011b15d2008-11-04 11:29:27 -05004070 if (ret == 0) {
Mike Iselyd8554972006-06-26 20:58:46 -03004071 ret = usb_reset_device(hdw->usb_dev);
4072 usb_unlock_device(hdw->usb_dev);
4073 } else {
4074 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
4075 "Failed to lock USB device ret=%d",ret);
4076 }
4077 if (init_pause_msec) {
4078 pvr2_trace(PVR2_TRACE_INFO,
4079 "Waiting %u msec for hardware to settle",
4080 init_pause_msec);
4081 msleep(init_pause_msec);
4082 }
4083
4084}
4085
4086
4087void pvr2_hdw_cpureset_assert(struct pvr2_hdw *hdw,int val)
4088{
4089 char da[1];
4090 unsigned int pipe;
4091 int ret;
4092
4093 if (!hdw->usb_dev) return;
4094
4095 pvr2_trace(PVR2_TRACE_INIT,"cpureset_assert(%d)",val);
4096
4097 da[0] = val ? 0x01 : 0x00;
4098
4099 /* Write the CPUCS register on the 8051. The lsb of the register
4100 is the reset bit; a 1 asserts reset while a 0 clears it. */
4101 pipe = usb_sndctrlpipe(hdw->usb_dev, 0);
4102 ret = usb_control_msg(hdw->usb_dev,pipe,0xa0,0x40,0xe600,0,da,1,HZ);
4103 if (ret < 0) {
4104 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
4105 "cpureset_assert(%d) error=%d",val,ret);
4106 pvr2_hdw_render_useless(hdw);
4107 }
4108}
4109
4110
4111int pvr2_hdw_cmd_deep_reset(struct pvr2_hdw *hdw)
4112{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004113 return pvr2_issue_simple_cmd(hdw,FX2CMD_DEEP_RESET);
Mike Iselyd8554972006-06-26 20:58:46 -03004114}
4115
4116
Michael Krufkye1edb192008-04-22 14:45:39 -03004117int pvr2_hdw_cmd_powerup(struct pvr2_hdw *hdw)
4118{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004119 return pvr2_issue_simple_cmd(hdw,FX2CMD_POWER_ON);
Michael Krufkye1edb192008-04-22 14:45:39 -03004120}
4121
Mike Isely1c9d10d2008-03-28 05:38:54 -03004122
Michael Krufkye1edb192008-04-22 14:45:39 -03004123int pvr2_hdw_cmd_powerdown(struct pvr2_hdw *hdw)
4124{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004125 return pvr2_issue_simple_cmd(hdw,FX2CMD_POWER_OFF);
Michael Krufkye1edb192008-04-22 14:45:39 -03004126}
4127
Mike Iselyd8554972006-06-26 20:58:46 -03004128
4129int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw)
4130{
Mike Iselyd8554972006-06-26 20:58:46 -03004131 pvr2_trace(PVR2_TRACE_INIT,
4132 "Requesting decoder reset");
Mike Iselyaf78e162009-03-07 00:21:30 -03004133 if (hdw->decoder_client_id) {
4134 v4l2_device_call_all(&hdw->v4l2_dev, hdw->decoder_client_id,
4135 core, reset, 0);
Mike Iselye17d7872009-06-20 14:45:52 -03004136 pvr2_hdw_cx25840_vbi_hack(hdw);
Mike Iselyaf78e162009-03-07 00:21:30 -03004137 return 0;
4138 }
4139 pvr2_trace(PVR2_TRACE_INIT,
4140 "Unable to reset decoder: nothing attached");
4141 return -ENOTTY;
Mike Iselyd8554972006-06-26 20:58:46 -03004142}
4143
4144
Mike Isely62433e32008-04-22 14:45:40 -03004145static int pvr2_hdw_cmd_hcw_demod_reset(struct pvr2_hdw *hdw, int onoff)
Mike Isely84147f32008-04-22 14:45:40 -03004146{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004147 hdw->flag_ok = !0;
4148 return pvr2_issue_simple_cmd(hdw,
4149 FX2CMD_HCW_DEMOD_RESETIN |
4150 (1 << 8) |
4151 ((onoff ? 1 : 0) << 16));
Mike Isely84147f32008-04-22 14:45:40 -03004152}
4153
Mike Isely84147f32008-04-22 14:45:40 -03004154
Mike Isely62433e32008-04-22 14:45:40 -03004155static int pvr2_hdw_cmd_onair_fe_power_ctrl(struct pvr2_hdw *hdw, int onoff)
Mike Isely84147f32008-04-22 14:45:40 -03004156{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004157 hdw->flag_ok = !0;
4158 return pvr2_issue_simple_cmd(hdw,(onoff ?
4159 FX2CMD_ONAIR_DTV_POWER_ON :
4160 FX2CMD_ONAIR_DTV_POWER_OFF));
Mike Isely84147f32008-04-22 14:45:40 -03004161}
4162
Mike Isely62433e32008-04-22 14:45:40 -03004163
4164static int pvr2_hdw_cmd_onair_digital_path_ctrl(struct pvr2_hdw *hdw,
4165 int onoff)
Mike Isely84147f32008-04-22 14:45:40 -03004166{
Mike Isely1c9d10d2008-03-28 05:38:54 -03004167 return pvr2_issue_simple_cmd(hdw,(onoff ?
4168 FX2CMD_ONAIR_DTV_STREAMING_ON :
4169 FX2CMD_ONAIR_DTV_STREAMING_OFF));
Mike Isely84147f32008-04-22 14:45:40 -03004170}
4171
Mike Isely62433e32008-04-22 14:45:40 -03004172
4173static void pvr2_hdw_cmd_modeswitch(struct pvr2_hdw *hdw,int digitalFl)
4174{
4175 int cmode;
4176 /* Compare digital/analog desired setting with current setting. If
4177 they don't match, fix it... */
4178 cmode = (digitalFl ? PVR2_PATHWAY_DIGITAL : PVR2_PATHWAY_ANALOG);
4179 if (cmode == hdw->pathway_state) {
4180 /* They match; nothing to do */
4181 return;
4182 }
4183
4184 switch (hdw->hdw_desc->digital_control_scheme) {
4185 case PVR2_DIGITAL_SCHEME_HAUPPAUGE:
4186 pvr2_hdw_cmd_hcw_demod_reset(hdw,digitalFl);
4187 if (cmode == PVR2_PATHWAY_ANALOG) {
4188 /* If moving to analog mode, also force the decoder
4189 to reset. If no decoder is attached, then it's
4190 ok to ignore this because if/when the decoder
4191 attaches, it will reset itself at that time. */
4192 pvr2_hdw_cmd_decoder_reset(hdw);
4193 }
4194 break;
4195 case PVR2_DIGITAL_SCHEME_ONAIR:
4196 /* Supposedly we should always have the power on whether in
4197 digital or analog mode. But for now do what appears to
4198 work... */
Mike Iselybb0c2fe2008-03-28 05:41:19 -03004199 pvr2_hdw_cmd_onair_fe_power_ctrl(hdw,digitalFl);
Mike Isely62433e32008-04-22 14:45:40 -03004200 break;
4201 default: break;
4202 }
4203
Mike Isely1b9c18c2008-04-22 14:45:41 -03004204 pvr2_hdw_untrip_unlocked(hdw);
Mike Isely62433e32008-04-22 14:45:40 -03004205 hdw->pathway_state = cmode;
4206}
4207
4208
Adrian Bunke9b59f62008-05-10 04:35:24 -03004209static void pvr2_led_ctrl_hauppauge(struct pvr2_hdw *hdw, int onoff)
Mike Iselyc55a97d2008-04-22 14:45:41 -03004210{
4211 /* change some GPIO data
4212 *
4213 * note: bit d7 of dir appears to control the LED,
4214 * so we shut it off here.
4215 *
Mike Iselyc55a97d2008-04-22 14:45:41 -03004216 */
Mike Isely40381cb2008-04-22 14:45:42 -03004217 if (onoff) {
Mike Iselyc55a97d2008-04-22 14:45:41 -03004218 pvr2_hdw_gpio_chg_dir(hdw, 0xffffffff, 0x00000481);
Mike Isely40381cb2008-04-22 14:45:42 -03004219 } else {
Mike Iselyc55a97d2008-04-22 14:45:41 -03004220 pvr2_hdw_gpio_chg_dir(hdw, 0xffffffff, 0x00000401);
Mike Isely40381cb2008-04-22 14:45:42 -03004221 }
Mike Iselyc55a97d2008-04-22 14:45:41 -03004222 pvr2_hdw_gpio_chg_out(hdw, 0xffffffff, 0x00000000);
Mike Isely40381cb2008-04-22 14:45:42 -03004223}
Mike Iselyc55a97d2008-04-22 14:45:41 -03004224
Mike Isely40381cb2008-04-22 14:45:42 -03004225
4226typedef void (*led_method_func)(struct pvr2_hdw *,int);
4227
4228static led_method_func led_methods[] = {
4229 [PVR2_LED_SCHEME_HAUPPAUGE] = pvr2_led_ctrl_hauppauge,
4230};
4231
4232
4233/* Toggle LED */
4234static void pvr2_led_ctrl(struct pvr2_hdw *hdw,int onoff)
4235{
4236 unsigned int scheme_id;
4237 led_method_func fp;
4238
4239 if ((!onoff) == (!hdw->led_on)) return;
4240
4241 hdw->led_on = onoff != 0;
4242
4243 scheme_id = hdw->hdw_desc->led_scheme;
4244 if (scheme_id < ARRAY_SIZE(led_methods)) {
4245 fp = led_methods[scheme_id];
4246 } else {
4247 fp = NULL;
4248 }
4249
4250 if (fp) (*fp)(hdw,onoff);
Mike Iselyc55a97d2008-04-22 14:45:41 -03004251}
4252
4253
Mike Iselye61b6fc2006-07-18 22:42:18 -03004254/* Stop / start video stream transport */
Adrian Bunk07e337e2006-06-30 11:30:20 -03004255static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl)
Mike Iselyd8554972006-06-26 20:58:46 -03004256{
Mike Iselybb0c2fe2008-03-28 05:41:19 -03004257 int ret;
4258
4259 /* If we're in analog mode, then just issue the usual analog
4260 command. */
4261 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
4262 return pvr2_issue_simple_cmd(hdw,
4263 (runFl ?
4264 FX2CMD_STREAMING_ON :
4265 FX2CMD_STREAMING_OFF));
4266 /*Note: Not reached */
Mike Isely62433e32008-04-22 14:45:40 -03004267 }
Mike Iselybb0c2fe2008-03-28 05:41:19 -03004268
4269 if (hdw->pathway_state != PVR2_PATHWAY_DIGITAL) {
4270 /* Whoops, we don't know what mode we're in... */
4271 return -EINVAL;
4272 }
4273
4274 /* To get here we have to be in digital mode. The mechanism here
4275 is unfortunately different for different vendors. So we switch
4276 on the device's digital scheme attribute in order to figure out
4277 what to do. */
4278 switch (hdw->hdw_desc->digital_control_scheme) {
4279 case PVR2_DIGITAL_SCHEME_HAUPPAUGE:
4280 return pvr2_issue_simple_cmd(hdw,
4281 (runFl ?
4282 FX2CMD_HCW_DTV_STREAMING_ON :
4283 FX2CMD_HCW_DTV_STREAMING_OFF));
4284 case PVR2_DIGITAL_SCHEME_ONAIR:
4285 ret = pvr2_issue_simple_cmd(hdw,
4286 (runFl ?
4287 FX2CMD_STREAMING_ON :
4288 FX2CMD_STREAMING_OFF));
4289 if (ret) return ret;
4290 return pvr2_hdw_cmd_onair_digital_path_ctrl(hdw,runFl);
4291 default:
4292 return -EINVAL;
4293 }
Mike Iselyd8554972006-06-26 20:58:46 -03004294}
4295
4296
Mike Isely62433e32008-04-22 14:45:40 -03004297/* Evaluate whether or not state_pathway_ok can change */
4298static int state_eval_pathway_ok(struct pvr2_hdw *hdw)
4299{
4300 if (hdw->state_pathway_ok) {
4301 /* Nothing to do if pathway is already ok */
4302 return 0;
4303 }
4304 if (!hdw->state_pipeline_idle) {
4305 /* Not allowed to change anything if pipeline is not idle */
4306 return 0;
4307 }
4308 pvr2_hdw_cmd_modeswitch(hdw,hdw->input_val == PVR2_CVAL_INPUT_DTV);
4309 hdw->state_pathway_ok = !0;
Mike Iselye9db1ff2008-04-22 14:45:41 -03004310 trace_stbit("state_pathway_ok",hdw->state_pathway_ok);
Mike Isely62433e32008-04-22 14:45:40 -03004311 return !0;
4312}
4313
4314
Mike Isely681c7392007-11-26 01:48:52 -03004315/* Evaluate whether or not state_encoder_ok can change */
4316static int state_eval_encoder_ok(struct pvr2_hdw *hdw)
4317{
4318 if (hdw->state_encoder_ok) return 0;
4319 if (hdw->flag_tripped) return 0;
4320 if (hdw->state_encoder_run) return 0;
4321 if (hdw->state_encoder_config) return 0;
4322 if (hdw->state_decoder_run) return 0;
4323 if (hdw->state_usbstream_run) return 0;
Mike Isely72998b72008-04-03 04:51:19 -03004324 if (hdw->pathway_state == PVR2_PATHWAY_DIGITAL) {
4325 if (!hdw->hdw_desc->flag_digital_requires_cx23416) return 0;
4326 } else if (hdw->pathway_state != PVR2_PATHWAY_ANALOG) {
4327 return 0;
4328 }
4329
Mike Isely681c7392007-11-26 01:48:52 -03004330 if (pvr2_upload_firmware2(hdw) < 0) {
4331 hdw->flag_tripped = !0;
4332 trace_stbit("flag_tripped",hdw->flag_tripped);
4333 return !0;
4334 }
4335 hdw->state_encoder_ok = !0;
4336 trace_stbit("state_encoder_ok",hdw->state_encoder_ok);
4337 return !0;
4338}
4339
4340
4341/* Evaluate whether or not state_encoder_config can change */
4342static int state_eval_encoder_config(struct pvr2_hdw *hdw)
4343{
4344 if (hdw->state_encoder_config) {
4345 if (hdw->state_encoder_ok) {
4346 if (hdw->state_pipeline_req &&
4347 !hdw->state_pipeline_pause) return 0;
4348 }
4349 hdw->state_encoder_config = 0;
4350 hdw->state_encoder_waitok = 0;
4351 trace_stbit("state_encoder_waitok",hdw->state_encoder_waitok);
4352 /* paranoia - solve race if timer just completed */
4353 del_timer_sync(&hdw->encoder_wait_timer);
4354 } else {
Mike Isely62433e32008-04-22 14:45:40 -03004355 if (!hdw->state_pathway_ok ||
4356 (hdw->pathway_state != PVR2_PATHWAY_ANALOG) ||
4357 !hdw->state_encoder_ok ||
Mike Isely681c7392007-11-26 01:48:52 -03004358 !hdw->state_pipeline_idle ||
4359 hdw->state_pipeline_pause ||
4360 !hdw->state_pipeline_req ||
4361 !hdw->state_pipeline_config) {
4362 /* We must reset the enforced wait interval if
4363 anything has happened that might have disturbed
4364 the encoder. This should be a rare case. */
4365 if (timer_pending(&hdw->encoder_wait_timer)) {
4366 del_timer_sync(&hdw->encoder_wait_timer);
4367 }
4368 if (hdw->state_encoder_waitok) {
4369 /* Must clear the state - therefore we did
4370 something to a state bit and must also
4371 return true. */
4372 hdw->state_encoder_waitok = 0;
4373 trace_stbit("state_encoder_waitok",
4374 hdw->state_encoder_waitok);
4375 return !0;
4376 }
4377 return 0;
4378 }
4379 if (!hdw->state_encoder_waitok) {
4380 if (!timer_pending(&hdw->encoder_wait_timer)) {
4381 /* waitok flag wasn't set and timer isn't
4382 running. Check flag once more to avoid
4383 a race then start the timer. This is
4384 the point when we measure out a minimal
4385 quiet interval before doing something to
4386 the encoder. */
4387 if (!hdw->state_encoder_waitok) {
4388 hdw->encoder_wait_timer.expires =
Mike Isely83ce57a2008-05-26 05:51:57 -03004389 jiffies +
4390 (HZ * TIME_MSEC_ENCODER_WAIT
4391 / 1000);
Mike Isely681c7392007-11-26 01:48:52 -03004392 add_timer(&hdw->encoder_wait_timer);
4393 }
4394 }
4395 /* We can't continue until we know we have been
4396 quiet for the interval measured by this
4397 timer. */
4398 return 0;
4399 }
4400 pvr2_encoder_configure(hdw);
4401 if (hdw->state_encoder_ok) hdw->state_encoder_config = !0;
4402 }
4403 trace_stbit("state_encoder_config",hdw->state_encoder_config);
4404 return !0;
4405}
4406
4407
Mike Iselyd913d632008-04-06 04:04:35 -03004408/* Return true if the encoder should not be running. */
4409static int state_check_disable_encoder_run(struct pvr2_hdw *hdw)
4410{
4411 if (!hdw->state_encoder_ok) {
4412 /* Encoder isn't healthy at the moment, so stop it. */
4413 return !0;
4414 }
4415 if (!hdw->state_pathway_ok) {
4416 /* Mode is not understood at the moment (i.e. it wants to
4417 change), so encoder must be stopped. */
4418 return !0;
4419 }
4420
4421 switch (hdw->pathway_state) {
4422 case PVR2_PATHWAY_ANALOG:
4423 if (!hdw->state_decoder_run) {
4424 /* We're in analog mode and the decoder is not
4425 running; thus the encoder should be stopped as
4426 well. */
4427 return !0;
4428 }
4429 break;
4430 case PVR2_PATHWAY_DIGITAL:
4431 if (hdw->state_encoder_runok) {
4432 /* This is a funny case. We're in digital mode so
4433 really the encoder should be stopped. However
4434 if it really is running, only kill it after
4435 runok has been set. This gives a chance for the
4436 onair quirk to function (encoder must run
4437 briefly first, at least once, before onair
4438 digital streaming can work). */
4439 return !0;
4440 }
4441 break;
4442 default:
4443 /* Unknown mode; so encoder should be stopped. */
4444 return !0;
4445 }
4446
4447 /* If we get here, we haven't found a reason to stop the
4448 encoder. */
4449 return 0;
4450}
4451
4452
4453/* Return true if the encoder should be running. */
4454static int state_check_enable_encoder_run(struct pvr2_hdw *hdw)
4455{
4456 if (!hdw->state_encoder_ok) {
4457 /* Don't run the encoder if it isn't healthy... */
4458 return 0;
4459 }
4460 if (!hdw->state_pathway_ok) {
4461 /* Don't run the encoder if we don't (yet) know what mode
4462 we need to be in... */
4463 return 0;
4464 }
4465
4466 switch (hdw->pathway_state) {
4467 case PVR2_PATHWAY_ANALOG:
Mike Isely6e931372010-02-06 02:10:38 -03004468 if (hdw->state_decoder_run && hdw->state_decoder_ready) {
Mike Iselyd913d632008-04-06 04:04:35 -03004469 /* In analog mode, if the decoder is running, then
4470 run the encoder. */
4471 return !0;
4472 }
4473 break;
4474 case PVR2_PATHWAY_DIGITAL:
4475 if ((hdw->hdw_desc->digital_control_scheme ==
4476 PVR2_DIGITAL_SCHEME_ONAIR) &&
4477 !hdw->state_encoder_runok) {
4478 /* This is a quirk. OnAir hardware won't stream
4479 digital until the encoder has been run at least
4480 once, for a minimal period of time (empiricially
4481 measured to be 1/4 second). So if we're on
4482 OnAir hardware and the encoder has never been
4483 run at all, then start the encoder. Normal
4484 state machine logic in the driver will
4485 automatically handle the remaining bits. */
4486 return !0;
4487 }
4488 break;
4489 default:
4490 /* For completeness (unknown mode; encoder won't run ever) */
4491 break;
4492 }
4493 /* If we get here, then we haven't found any reason to run the
4494 encoder, so don't run it. */
4495 return 0;
4496}
4497
4498
Mike Isely681c7392007-11-26 01:48:52 -03004499/* Evaluate whether or not state_encoder_run can change */
4500static int state_eval_encoder_run(struct pvr2_hdw *hdw)
4501{
4502 if (hdw->state_encoder_run) {
Mike Iselyd913d632008-04-06 04:04:35 -03004503 if (!state_check_disable_encoder_run(hdw)) return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004504 if (hdw->state_encoder_ok) {
Mike Iselyd913d632008-04-06 04:04:35 -03004505 del_timer_sync(&hdw->encoder_run_timer);
Mike Isely681c7392007-11-26 01:48:52 -03004506 if (pvr2_encoder_stop(hdw) < 0) return !0;
4507 }
4508 hdw->state_encoder_run = 0;
4509 } else {
Mike Iselyd913d632008-04-06 04:04:35 -03004510 if (!state_check_enable_encoder_run(hdw)) return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004511 if (pvr2_encoder_start(hdw) < 0) return !0;
4512 hdw->state_encoder_run = !0;
Mike Iselyd913d632008-04-06 04:04:35 -03004513 if (!hdw->state_encoder_runok) {
4514 hdw->encoder_run_timer.expires =
Mike Isely83ce57a2008-05-26 05:51:57 -03004515 jiffies + (HZ * TIME_MSEC_ENCODER_OK / 1000);
Mike Iselyd913d632008-04-06 04:04:35 -03004516 add_timer(&hdw->encoder_run_timer);
4517 }
Mike Isely681c7392007-11-26 01:48:52 -03004518 }
4519 trace_stbit("state_encoder_run",hdw->state_encoder_run);
4520 return !0;
4521}
4522
4523
4524/* Timeout function for quiescent timer. */
4525static void pvr2_hdw_quiescent_timeout(unsigned long data)
4526{
4527 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4528 hdw->state_decoder_quiescent = !0;
4529 trace_stbit("state_decoder_quiescent",hdw->state_decoder_quiescent);
4530 hdw->state_stale = !0;
4531 queue_work(hdw->workqueue,&hdw->workpoll);
4532}
4533
4534
Mike Isely6e931372010-02-06 02:10:38 -03004535/* Timeout function for decoder stabilization timer. */
4536static void pvr2_hdw_decoder_stabilization_timeout(unsigned long data)
4537{
4538 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4539 hdw->state_decoder_ready = !0;
4540 trace_stbit("state_decoder_ready", hdw->state_decoder_ready);
4541 hdw->state_stale = !0;
4542 queue_work(hdw->workqueue, &hdw->workpoll);
4543}
4544
4545
Mike Isely681c7392007-11-26 01:48:52 -03004546/* Timeout function for encoder wait timer. */
4547static void pvr2_hdw_encoder_wait_timeout(unsigned long data)
4548{
4549 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4550 hdw->state_encoder_waitok = !0;
4551 trace_stbit("state_encoder_waitok",hdw->state_encoder_waitok);
4552 hdw->state_stale = !0;
4553 queue_work(hdw->workqueue,&hdw->workpoll);
4554}
4555
4556
Mike Iselyd913d632008-04-06 04:04:35 -03004557/* Timeout function for encoder run timer. */
4558static void pvr2_hdw_encoder_run_timeout(unsigned long data)
4559{
4560 struct pvr2_hdw *hdw = (struct pvr2_hdw *)data;
4561 if (!hdw->state_encoder_runok) {
4562 hdw->state_encoder_runok = !0;
4563 trace_stbit("state_encoder_runok",hdw->state_encoder_runok);
4564 hdw->state_stale = !0;
4565 queue_work(hdw->workqueue,&hdw->workpoll);
4566 }
4567}
4568
4569
Mike Isely681c7392007-11-26 01:48:52 -03004570/* Evaluate whether or not state_decoder_run can change */
4571static int state_eval_decoder_run(struct pvr2_hdw *hdw)
4572{
4573 if (hdw->state_decoder_run) {
4574 if (hdw->state_encoder_ok) {
4575 if (hdw->state_pipeline_req &&
Mike Isely62433e32008-04-22 14:45:40 -03004576 !hdw->state_pipeline_pause &&
4577 hdw->state_pathway_ok) return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004578 }
4579 if (!hdw->flag_decoder_missed) {
4580 pvr2_decoder_enable(hdw,0);
4581 }
4582 hdw->state_decoder_quiescent = 0;
4583 hdw->state_decoder_run = 0;
Mike Isely6e931372010-02-06 02:10:38 -03004584 /* paranoia - solve race if timer(s) just completed */
Mike Isely681c7392007-11-26 01:48:52 -03004585 del_timer_sync(&hdw->quiescent_timer);
Mike Isely6e931372010-02-06 02:10:38 -03004586 /* Kill the stabilization timer, in case we're killing the
4587 encoder before the previous stabilization interval has
4588 been properly timed. */
4589 del_timer_sync(&hdw->decoder_stabilization_timer);
4590 hdw->state_decoder_ready = 0;
Mike Isely681c7392007-11-26 01:48:52 -03004591 } else {
4592 if (!hdw->state_decoder_quiescent) {
4593 if (!timer_pending(&hdw->quiescent_timer)) {
4594 /* We don't do something about the
4595 quiescent timer until right here because
4596 we also want to catch cases where the
4597 decoder was already not running (like
4598 after initialization) as opposed to
4599 knowing that we had just stopped it.
4600 The second flag check is here to cover a
4601 race - the timer could have run and set
4602 this flag just after the previous check
4603 but before we did the pending check. */
4604 if (!hdw->state_decoder_quiescent) {
4605 hdw->quiescent_timer.expires =
Mike Isely83ce57a2008-05-26 05:51:57 -03004606 jiffies +
4607 (HZ * TIME_MSEC_DECODER_WAIT
4608 / 1000);
Mike Isely681c7392007-11-26 01:48:52 -03004609 add_timer(&hdw->quiescent_timer);
4610 }
4611 }
4612 /* Don't allow decoder to start again until it has
4613 been quiesced first. This little detail should
4614 hopefully further stabilize the encoder. */
4615 return 0;
4616 }
Mike Isely62433e32008-04-22 14:45:40 -03004617 if (!hdw->state_pathway_ok ||
4618 (hdw->pathway_state != PVR2_PATHWAY_ANALOG) ||
4619 !hdw->state_pipeline_req ||
Mike Isely681c7392007-11-26 01:48:52 -03004620 hdw->state_pipeline_pause ||
4621 !hdw->state_pipeline_config ||
4622 !hdw->state_encoder_config ||
4623 !hdw->state_encoder_ok) return 0;
4624 del_timer_sync(&hdw->quiescent_timer);
4625 if (hdw->flag_decoder_missed) return 0;
4626 if (pvr2_decoder_enable(hdw,!0) < 0) return 0;
4627 hdw->state_decoder_quiescent = 0;
Mike Isely6e931372010-02-06 02:10:38 -03004628 hdw->state_decoder_ready = 0;
Mike Isely681c7392007-11-26 01:48:52 -03004629 hdw->state_decoder_run = !0;
Mike Isely6e931372010-02-06 02:10:38 -03004630 hdw->decoder_stabilization_timer.expires =
4631 jiffies +
4632 (HZ * TIME_MSEC_DECODER_STABILIZATION_WAIT / 1000);
4633 add_timer(&hdw->decoder_stabilization_timer);
Mike Isely681c7392007-11-26 01:48:52 -03004634 }
4635 trace_stbit("state_decoder_quiescent",hdw->state_decoder_quiescent);
4636 trace_stbit("state_decoder_run",hdw->state_decoder_run);
Mike Isely6e931372010-02-06 02:10:38 -03004637 trace_stbit("state_decoder_ready", hdw->state_decoder_ready);
Mike Isely681c7392007-11-26 01:48:52 -03004638 return !0;
4639}
4640
4641
4642/* Evaluate whether or not state_usbstream_run can change */
4643static int state_eval_usbstream_run(struct pvr2_hdw *hdw)
4644{
4645 if (hdw->state_usbstream_run) {
Mike Isely72998b72008-04-03 04:51:19 -03004646 int fl = !0;
Mike Isely62433e32008-04-22 14:45:40 -03004647 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
Mike Isely72998b72008-04-03 04:51:19 -03004648 fl = (hdw->state_encoder_ok &&
4649 hdw->state_encoder_run);
4650 } else if ((hdw->pathway_state == PVR2_PATHWAY_DIGITAL) &&
4651 (hdw->hdw_desc->flag_digital_requires_cx23416)) {
4652 fl = hdw->state_encoder_ok;
4653 }
4654 if (fl &&
4655 hdw->state_pipeline_req &&
4656 !hdw->state_pipeline_pause &&
4657 hdw->state_pathway_ok) {
4658 return 0;
Mike Isely681c7392007-11-26 01:48:52 -03004659 }
4660 pvr2_hdw_cmd_usbstream(hdw,0);
4661 hdw->state_usbstream_run = 0;
4662 } else {
Mike Isely62433e32008-04-22 14:45:40 -03004663 if (!hdw->state_pipeline_req ||
4664 hdw->state_pipeline_pause ||
4665 !hdw->state_pathway_ok) return 0;
4666 if (hdw->pathway_state == PVR2_PATHWAY_ANALOG) {
4667 if (!hdw->state_encoder_ok ||
4668 !hdw->state_encoder_run) return 0;
Mike Isely72998b72008-04-03 04:51:19 -03004669 } else if ((hdw->pathway_state == PVR2_PATHWAY_DIGITAL) &&
4670 (hdw->hdw_desc->flag_digital_requires_cx23416)) {
4671 if (!hdw->state_encoder_ok) return 0;
Mike Iselyd913d632008-04-06 04:04:35 -03004672 if (hdw->state_encoder_run) return 0;
4673 if (hdw->hdw_desc->digital_control_scheme ==
4674 PVR2_DIGITAL_SCHEME_ONAIR) {
4675 /* OnAir digital receivers won't stream
4676 unless the analog encoder has run first.
4677 Why? I have no idea. But don't even
4678 try until we know the analog side is
4679 known to have run. */
4680 if (!hdw->state_encoder_runok) return 0;
4681 }
Mike Isely62433e32008-04-22 14:45:40 -03004682 }
Mike Isely681c7392007-11-26 01:48:52 -03004683 if (pvr2_hdw_cmd_usbstream(hdw,!0) < 0) return 0;
4684 hdw->state_usbstream_run = !0;
4685 }
4686 trace_stbit("state_usbstream_run",hdw->state_usbstream_run);
4687 return !0;
4688}
4689
4690
4691/* Attempt to configure pipeline, if needed */
4692static int state_eval_pipeline_config(struct pvr2_hdw *hdw)
4693{
4694 if (hdw->state_pipeline_config ||
4695 hdw->state_pipeline_pause) return 0;
4696 pvr2_hdw_commit_execute(hdw);
4697 return !0;
4698}
4699
4700
4701/* Update pipeline idle and pipeline pause tracking states based on other
4702 inputs. This must be called whenever the other relevant inputs have
4703 changed. */
4704static int state_update_pipeline_state(struct pvr2_hdw *hdw)
4705{
4706 unsigned int st;
4707 int updatedFl = 0;
4708 /* Update pipeline state */
4709 st = !(hdw->state_encoder_run ||
4710 hdw->state_decoder_run ||
4711 hdw->state_usbstream_run ||
4712 (!hdw->state_decoder_quiescent));
4713 if (!st != !hdw->state_pipeline_idle) {
4714 hdw->state_pipeline_idle = st;
4715 updatedFl = !0;
4716 }
4717 if (hdw->state_pipeline_idle && hdw->state_pipeline_pause) {
4718 hdw->state_pipeline_pause = 0;
4719 updatedFl = !0;
4720 }
4721 return updatedFl;
4722}
4723
4724
4725typedef int (*state_eval_func)(struct pvr2_hdw *);
4726
4727/* Set of functions to be run to evaluate various states in the driver. */
Tobias Klauserebff0332008-04-22 14:45:45 -03004728static const state_eval_func eval_funcs[] = {
Mike Isely62433e32008-04-22 14:45:40 -03004729 state_eval_pathway_ok,
Mike Isely681c7392007-11-26 01:48:52 -03004730 state_eval_pipeline_config,
4731 state_eval_encoder_ok,
4732 state_eval_encoder_config,
4733 state_eval_decoder_run,
4734 state_eval_encoder_run,
4735 state_eval_usbstream_run,
4736};
4737
4738
4739/* Process various states and return true if we did anything interesting. */
4740static int pvr2_hdw_state_update(struct pvr2_hdw *hdw)
4741{
4742 unsigned int i;
4743 int state_updated = 0;
4744 int check_flag;
4745
4746 if (!hdw->state_stale) return 0;
4747 if ((hdw->fw1_state != FW1_STATE_OK) ||
4748 !hdw->flag_ok) {
4749 hdw->state_stale = 0;
4750 return !0;
4751 }
4752 /* This loop is the heart of the entire driver. It keeps trying to
4753 evaluate various bits of driver state until nothing changes for
4754 one full iteration. Each "bit of state" tracks some global
4755 aspect of the driver, e.g. whether decoder should run, if
4756 pipeline is configured, usb streaming is on, etc. We separately
4757 evaluate each of those questions based on other driver state to
4758 arrive at the correct running configuration. */
4759 do {
4760 check_flag = 0;
4761 state_update_pipeline_state(hdw);
4762 /* Iterate over each bit of state */
4763 for (i = 0; (i<ARRAY_SIZE(eval_funcs)) && hdw->flag_ok; i++) {
4764 if ((*eval_funcs[i])(hdw)) {
4765 check_flag = !0;
4766 state_updated = !0;
4767 state_update_pipeline_state(hdw);
4768 }
4769 }
4770 } while (check_flag && hdw->flag_ok);
4771 hdw->state_stale = 0;
4772 trace_stbit("state_stale",hdw->state_stale);
4773 return state_updated;
4774}
4775
4776
Mike Isely1cb03b72008-04-21 03:47:43 -03004777static unsigned int print_input_mask(unsigned int msk,
4778 char *buf,unsigned int acnt)
4779{
4780 unsigned int idx,ccnt;
4781 unsigned int tcnt = 0;
4782 for (idx = 0; idx < ARRAY_SIZE(control_values_input); idx++) {
4783 if (!((1 << idx) & msk)) continue;
4784 ccnt = scnprintf(buf+tcnt,
4785 acnt-tcnt,
4786 "%s%s",
4787 (tcnt ? ", " : ""),
4788 control_values_input[idx]);
4789 tcnt += ccnt;
4790 }
4791 return tcnt;
4792}
4793
4794
Mike Isely62433e32008-04-22 14:45:40 -03004795static const char *pvr2_pathway_state_name(int id)
4796{
4797 switch (id) {
4798 case PVR2_PATHWAY_ANALOG: return "analog";
4799 case PVR2_PATHWAY_DIGITAL: return "digital";
4800 default: return "unknown";
4801 }
4802}
4803
4804
Mike Isely681c7392007-11-26 01:48:52 -03004805static unsigned int pvr2_hdw_report_unlocked(struct pvr2_hdw *hdw,int which,
4806 char *buf,unsigned int acnt)
4807{
4808 switch (which) {
4809 case 0:
4810 return scnprintf(
4811 buf,acnt,
Mike Iselye9db1ff2008-04-22 14:45:41 -03004812 "driver:%s%s%s%s%s <mode=%s>",
Mike Isely681c7392007-11-26 01:48:52 -03004813 (hdw->flag_ok ? " <ok>" : " <fail>"),
4814 (hdw->flag_init_ok ? " <init>" : " <uninitialized>"),
4815 (hdw->flag_disconnected ? " <disconnected>" :
4816 " <connected>"),
4817 (hdw->flag_tripped ? " <tripped>" : ""),
Mike Isely62433e32008-04-22 14:45:40 -03004818 (hdw->flag_decoder_missed ? " <no decoder>" : ""),
4819 pvr2_pathway_state_name(hdw->pathway_state));
4820
Mike Isely681c7392007-11-26 01:48:52 -03004821 case 1:
4822 return scnprintf(
4823 buf,acnt,
4824 "pipeline:%s%s%s%s",
4825 (hdw->state_pipeline_idle ? " <idle>" : ""),
4826 (hdw->state_pipeline_config ?
4827 " <configok>" : " <stale>"),
4828 (hdw->state_pipeline_req ? " <req>" : ""),
4829 (hdw->state_pipeline_pause ? " <pause>" : ""));
4830 case 2:
4831 return scnprintf(
4832 buf,acnt,
Mike Isely62433e32008-04-22 14:45:40 -03004833 "worker:%s%s%s%s%s%s%s",
Mike Isely681c7392007-11-26 01:48:52 -03004834 (hdw->state_decoder_run ?
Mike Isely6e931372010-02-06 02:10:38 -03004835 (hdw->state_decoder_ready ?
4836 "<decode:run>" : " <decode:start>") :
Mike Isely681c7392007-11-26 01:48:52 -03004837 (hdw->state_decoder_quiescent ?
4838 "" : " <decode:stop>")),
4839 (hdw->state_decoder_quiescent ?
4840 " <decode:quiescent>" : ""),
4841 (hdw->state_encoder_ok ?
4842 "" : " <encode:init>"),
4843 (hdw->state_encoder_run ?
Mike Iselyd913d632008-04-06 04:04:35 -03004844 (hdw->state_encoder_runok ?
4845 " <encode:run>" :
4846 " <encode:firstrun>") :
4847 (hdw->state_encoder_runok ?
4848 " <encode:stop>" :
4849 " <encode:virgin>")),
Mike Isely681c7392007-11-26 01:48:52 -03004850 (hdw->state_encoder_config ?
4851 " <encode:configok>" :
4852 (hdw->state_encoder_waitok ?
Mike Iselyb9a37d92008-03-28 05:31:40 -03004853 "" : " <encode:waitok>")),
Mike Isely681c7392007-11-26 01:48:52 -03004854 (hdw->state_usbstream_run ?
Mike Isely62433e32008-04-22 14:45:40 -03004855 " <usb:run>" : " <usb:stop>"),
4856 (hdw->state_pathway_ok ?
Mike Iselye9db1ff2008-04-22 14:45:41 -03004857 " <pathway:ok>" : ""));
Mike Isely681c7392007-11-26 01:48:52 -03004858 case 3:
4859 return scnprintf(
4860 buf,acnt,
4861 "state: %s",
4862 pvr2_get_state_name(hdw->master_state));
Mike Iselyad0992e2008-03-28 05:34:45 -03004863 case 4: {
Mike Isely1cb03b72008-04-21 03:47:43 -03004864 unsigned int tcnt = 0;
4865 unsigned int ccnt;
4866
4867 ccnt = scnprintf(buf,
4868 acnt,
4869 "Hardware supported inputs: ");
4870 tcnt += ccnt;
4871 tcnt += print_input_mask(hdw->input_avail_mask,
4872 buf+tcnt,
4873 acnt-tcnt);
4874 if (hdw->input_avail_mask != hdw->input_allowed_mask) {
4875 ccnt = scnprintf(buf+tcnt,
4876 acnt-tcnt,
4877 "; allowed inputs: ");
4878 tcnt += ccnt;
4879 tcnt += print_input_mask(hdw->input_allowed_mask,
4880 buf+tcnt,
4881 acnt-tcnt);
4882 }
4883 return tcnt;
4884 }
4885 case 5: {
Mike Iselyad0992e2008-03-28 05:34:45 -03004886 struct pvr2_stream_stats stats;
4887 if (!hdw->vid_stream) break;
4888 pvr2_stream_get_stats(hdw->vid_stream,
4889 &stats,
4890 0);
4891 return scnprintf(
4892 buf,acnt,
4893 "Bytes streamed=%u"
4894 " URBs: queued=%u idle=%u ready=%u"
4895 " processed=%u failed=%u",
4896 stats.bytes_processed,
4897 stats.buffers_in_queue,
4898 stats.buffers_in_idle,
4899 stats.buffers_in_ready,
4900 stats.buffers_processed,
4901 stats.buffers_failed);
4902 }
Mike Isely27eab382009-04-06 01:51:38 -03004903 case 6: {
4904 unsigned int id = hdw->ir_scheme_active;
4905 return scnprintf(buf, acnt, "ir scheme: id=%d %s", id,
4906 (id >= ARRAY_SIZE(ir_scheme_names) ?
4907 "?" : ir_scheme_names[id]));
4908 }
Mike Isely681c7392007-11-26 01:48:52 -03004909 default: break;
4910 }
4911 return 0;
4912}
4913
4914
Mike Isely2eb563b2009-03-08 18:25:46 -03004915/* Generate report containing info about attached sub-devices and attached
4916 i2c clients, including an indication of which attached i2c clients are
4917 actually sub-devices. */
4918static unsigned int pvr2_hdw_report_clients(struct pvr2_hdw *hdw,
4919 char *buf, unsigned int acnt)
4920{
4921 struct v4l2_subdev *sd;
4922 unsigned int tcnt = 0;
4923 unsigned int ccnt;
4924 struct i2c_client *client;
Mike Isely2eb563b2009-03-08 18:25:46 -03004925 const char *p;
4926 unsigned int id;
4927
Jean Delvarefa7ce762009-05-02 00:22:27 -03004928 ccnt = scnprintf(buf, acnt, "Associated v4l2-subdev drivers and I2C clients:\n");
Mike Isely2eb563b2009-03-08 18:25:46 -03004929 tcnt += ccnt;
4930 v4l2_device_for_each_subdev(sd, &hdw->v4l2_dev) {
4931 id = sd->grp_id;
4932 p = NULL;
4933 if (id < ARRAY_SIZE(module_names)) p = module_names[id];
4934 if (p) {
Jean Delvarefa7ce762009-05-02 00:22:27 -03004935 ccnt = scnprintf(buf + tcnt, acnt - tcnt, " %s:", p);
Mike Isely2eb563b2009-03-08 18:25:46 -03004936 tcnt += ccnt;
4937 } else {
4938 ccnt = scnprintf(buf + tcnt, acnt - tcnt,
Jean Delvarefa7ce762009-05-02 00:22:27 -03004939 " (unknown id=%u):", id);
4940 tcnt += ccnt;
4941 }
4942 client = v4l2_get_subdevdata(sd);
4943 if (client) {
4944 ccnt = scnprintf(buf + tcnt, acnt - tcnt,
4945 " %s @ %02x\n", client->name,
4946 client->addr);
4947 tcnt += ccnt;
4948 } else {
4949 ccnt = scnprintf(buf + tcnt, acnt - tcnt,
4950 " no i2c client\n");
Mike Isely2eb563b2009-03-08 18:25:46 -03004951 tcnt += ccnt;
4952 }
4953 }
Mike Isely2eb563b2009-03-08 18:25:46 -03004954 return tcnt;
4955}
4956
4957
Mike Isely681c7392007-11-26 01:48:52 -03004958unsigned int pvr2_hdw_state_report(struct pvr2_hdw *hdw,
4959 char *buf,unsigned int acnt)
4960{
4961 unsigned int bcnt,ccnt,idx;
4962 bcnt = 0;
4963 LOCK_TAKE(hdw->big_lock);
4964 for (idx = 0; ; idx++) {
4965 ccnt = pvr2_hdw_report_unlocked(hdw,idx,buf,acnt);
4966 if (!ccnt) break;
4967 bcnt += ccnt; acnt -= ccnt; buf += ccnt;
4968 if (!acnt) break;
4969 buf[0] = '\n'; ccnt = 1;
4970 bcnt += ccnt; acnt -= ccnt; buf += ccnt;
4971 }
Mike Isely2eb563b2009-03-08 18:25:46 -03004972 ccnt = pvr2_hdw_report_clients(hdw, buf, acnt);
4973 bcnt += ccnt; acnt -= ccnt; buf += ccnt;
Mike Isely681c7392007-11-26 01:48:52 -03004974 LOCK_GIVE(hdw->big_lock);
4975 return bcnt;
4976}
4977
4978
4979static void pvr2_hdw_state_log_state(struct pvr2_hdw *hdw)
4980{
Mike Isely2eb563b2009-03-08 18:25:46 -03004981 char buf[256];
4982 unsigned int idx, ccnt;
4983 unsigned int lcnt, ucnt;
Mike Isely681c7392007-11-26 01:48:52 -03004984
4985 for (idx = 0; ; idx++) {
4986 ccnt = pvr2_hdw_report_unlocked(hdw,idx,buf,sizeof(buf));
4987 if (!ccnt) break;
4988 printk(KERN_INFO "%s %.*s\n",hdw->name,ccnt,buf);
4989 }
Mike Isely2eb563b2009-03-08 18:25:46 -03004990 ccnt = pvr2_hdw_report_clients(hdw, buf, sizeof(buf));
4991 ucnt = 0;
4992 while (ucnt < ccnt) {
4993 lcnt = 0;
4994 while ((lcnt + ucnt < ccnt) && (buf[lcnt + ucnt] != '\n')) {
4995 lcnt++;
4996 }
4997 printk(KERN_INFO "%s %.*s\n", hdw->name, lcnt, buf + ucnt);
4998 ucnt += lcnt + 1;
4999 }
Mike Isely681c7392007-11-26 01:48:52 -03005000}
5001
5002
5003/* Evaluate and update the driver's current state, taking various actions
5004 as appropriate for the update. */
5005static int pvr2_hdw_state_eval(struct pvr2_hdw *hdw)
5006{
5007 unsigned int st;
5008 int state_updated = 0;
5009 int callback_flag = 0;
Mike Isely1b9c18c2008-04-22 14:45:41 -03005010 int analog_mode;
Mike Isely681c7392007-11-26 01:48:52 -03005011
5012 pvr2_trace(PVR2_TRACE_STBITS,
5013 "Drive state check START");
5014 if (pvrusb2_debug & PVR2_TRACE_STBITS) {
5015 pvr2_hdw_state_log_state(hdw);
5016 }
5017
5018 /* Process all state and get back over disposition */
5019 state_updated = pvr2_hdw_state_update(hdw);
5020
Mike Isely1b9c18c2008-04-22 14:45:41 -03005021 analog_mode = (hdw->pathway_state != PVR2_PATHWAY_DIGITAL);
5022
Mike Isely681c7392007-11-26 01:48:52 -03005023 /* Update master state based upon all other states. */
5024 if (!hdw->flag_ok) {
5025 st = PVR2_STATE_DEAD;
5026 } else if (hdw->fw1_state != FW1_STATE_OK) {
5027 st = PVR2_STATE_COLD;
Mike Isely72998b72008-04-03 04:51:19 -03005028 } else if ((analog_mode ||
5029 hdw->hdw_desc->flag_digital_requires_cx23416) &&
5030 !hdw->state_encoder_ok) {
Mike Isely681c7392007-11-26 01:48:52 -03005031 st = PVR2_STATE_WARM;
Mike Isely1b9c18c2008-04-22 14:45:41 -03005032 } else if (hdw->flag_tripped ||
5033 (analog_mode && hdw->flag_decoder_missed)) {
Mike Isely681c7392007-11-26 01:48:52 -03005034 st = PVR2_STATE_ERROR;
Mike Isely62433e32008-04-22 14:45:40 -03005035 } else if (hdw->state_usbstream_run &&
Mike Isely1b9c18c2008-04-22 14:45:41 -03005036 (!analog_mode ||
Mike Isely62433e32008-04-22 14:45:40 -03005037 (hdw->state_encoder_run && hdw->state_decoder_run))) {
Mike Isely681c7392007-11-26 01:48:52 -03005038 st = PVR2_STATE_RUN;
5039 } else {
5040 st = PVR2_STATE_READY;
5041 }
5042 if (hdw->master_state != st) {
5043 pvr2_trace(PVR2_TRACE_STATE,
5044 "Device state change from %s to %s",
5045 pvr2_get_state_name(hdw->master_state),
5046 pvr2_get_state_name(st));
Mike Isely40381cb2008-04-22 14:45:42 -03005047 pvr2_led_ctrl(hdw,st == PVR2_STATE_RUN);
Mike Isely681c7392007-11-26 01:48:52 -03005048 hdw->master_state = st;
5049 state_updated = !0;
5050 callback_flag = !0;
5051 }
5052 if (state_updated) {
5053 /* Trigger anyone waiting on any state changes here. */
5054 wake_up(&hdw->state_wait_data);
5055 }
5056
5057 if (pvrusb2_debug & PVR2_TRACE_STBITS) {
5058 pvr2_hdw_state_log_state(hdw);
5059 }
5060 pvr2_trace(PVR2_TRACE_STBITS,
5061 "Drive state check DONE callback=%d",callback_flag);
5062
5063 return callback_flag;
5064}
5065
5066
5067/* Cause kernel thread to check / update driver state */
5068static void pvr2_hdw_state_sched(struct pvr2_hdw *hdw)
5069{
5070 if (hdw->state_stale) return;
5071 hdw->state_stale = !0;
5072 trace_stbit("state_stale",hdw->state_stale);
5073 queue_work(hdw->workqueue,&hdw->workpoll);
5074}
5075
5076
Mike Iselyd8554972006-06-26 20:58:46 -03005077int pvr2_hdw_gpio_get_dir(struct pvr2_hdw *hdw,u32 *dp)
5078{
5079 return pvr2_read_register(hdw,PVR2_GPIO_DIR,dp);
5080}
5081
5082
5083int pvr2_hdw_gpio_get_out(struct pvr2_hdw *hdw,u32 *dp)
5084{
5085 return pvr2_read_register(hdw,PVR2_GPIO_OUT,dp);
5086}
5087
5088
5089int pvr2_hdw_gpio_get_in(struct pvr2_hdw *hdw,u32 *dp)
5090{
5091 return pvr2_read_register(hdw,PVR2_GPIO_IN,dp);
5092}
5093
5094
5095int pvr2_hdw_gpio_chg_dir(struct pvr2_hdw *hdw,u32 msk,u32 val)
5096{
5097 u32 cval,nval;
5098 int ret;
5099 if (~msk) {
5100 ret = pvr2_read_register(hdw,PVR2_GPIO_DIR,&cval);
5101 if (ret) return ret;
5102 nval = (cval & ~msk) | (val & msk);
5103 pvr2_trace(PVR2_TRACE_GPIO,
5104 "GPIO direction changing 0x%x:0x%x"
5105 " from 0x%x to 0x%x",
5106 msk,val,cval,nval);
5107 } else {
5108 nval = val;
5109 pvr2_trace(PVR2_TRACE_GPIO,
5110 "GPIO direction changing to 0x%x",nval);
5111 }
5112 return pvr2_write_register(hdw,PVR2_GPIO_DIR,nval);
5113}
5114
5115
5116int pvr2_hdw_gpio_chg_out(struct pvr2_hdw *hdw,u32 msk,u32 val)
5117{
5118 u32 cval,nval;
5119 int ret;
5120 if (~msk) {
5121 ret = pvr2_read_register(hdw,PVR2_GPIO_OUT,&cval);
5122 if (ret) return ret;
5123 nval = (cval & ~msk) | (val & msk);
5124 pvr2_trace(PVR2_TRACE_GPIO,
5125 "GPIO output changing 0x%x:0x%x from 0x%x to 0x%x",
5126 msk,val,cval,nval);
5127 } else {
5128 nval = val;
5129 pvr2_trace(PVR2_TRACE_GPIO,
5130 "GPIO output changing to 0x%x",nval);
5131 }
5132 return pvr2_write_register(hdw,PVR2_GPIO_OUT,nval);
5133}
5134
5135
Mike Iselya51f5002009-03-06 23:30:37 -03005136void pvr2_hdw_status_poll(struct pvr2_hdw *hdw)
5137{
Mike Isely40f07112009-03-07 00:08:17 -03005138 struct v4l2_tuner *vtp = &hdw->tuner_signal_info;
5139 memset(vtp, 0, sizeof(*vtp));
Mike Isely2641df32009-03-07 00:13:25 -03005140 hdw->tuner_signal_stale = 0;
Mike Isely40f07112009-03-07 00:08:17 -03005141 /* Note: There apparently is no replacement for VIDIOC_CROPCAP
5142 using v4l2-subdev - therefore we can't support that AT ALL right
5143 now. (Of course, no sub-drivers seem to implement it either.
5144 But now it's a a chicken and egg problem...) */
5145 v4l2_device_call_all(&hdw->v4l2_dev, 0, tuner, g_tuner,
5146 &hdw->tuner_signal_info);
Mike Isely2641df32009-03-07 00:13:25 -03005147 pvr2_trace(PVR2_TRACE_CHIPS, "subdev status poll"
Mike Isely40f07112009-03-07 00:08:17 -03005148 " type=%u strength=%u audio=0x%x cap=0x%x"
5149 " low=%u hi=%u",
5150 vtp->type,
5151 vtp->signal, vtp->rxsubchans, vtp->capability,
5152 vtp->rangelow, vtp->rangehigh);
Mike Isely2641df32009-03-07 00:13:25 -03005153
5154 /* We have to do this to avoid getting into constant polling if
5155 there's nobody to answer a poll of cropcap info. */
5156 hdw->cropcap_stale = 0;
Mike Iselya51f5002009-03-06 23:30:37 -03005157}
5158
5159
Mike Isely7fb20fa2008-04-22 14:45:37 -03005160unsigned int pvr2_hdw_get_input_available(struct pvr2_hdw *hdw)
5161{
5162 return hdw->input_avail_mask;
5163}
5164
5165
Mike Isely1cb03b72008-04-21 03:47:43 -03005166unsigned int pvr2_hdw_get_input_allowed(struct pvr2_hdw *hdw)
5167{
5168 return hdw->input_allowed_mask;
5169}
5170
5171
5172static int pvr2_hdw_set_input(struct pvr2_hdw *hdw,int v)
5173{
5174 if (hdw->input_val != v) {
5175 hdw->input_val = v;
5176 hdw->input_dirty = !0;
5177 }
5178
5179 /* Handle side effects - if we switch to a mode that needs the RF
5180 tuner, then select the right frequency choice as well and mark
5181 it dirty. */
5182 if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) {
5183 hdw->freqSelector = 0;
5184 hdw->freqDirty = !0;
5185 } else if ((hdw->input_val == PVR2_CVAL_INPUT_TV) ||
5186 (hdw->input_val == PVR2_CVAL_INPUT_DTV)) {
5187 hdw->freqSelector = 1;
5188 hdw->freqDirty = !0;
5189 }
5190 return 0;
5191}
5192
5193
5194int pvr2_hdw_set_input_allowed(struct pvr2_hdw *hdw,
5195 unsigned int change_mask,
5196 unsigned int change_val)
5197{
5198 int ret = 0;
5199 unsigned int nv,m,idx;
5200 LOCK_TAKE(hdw->big_lock);
5201 do {
5202 nv = hdw->input_allowed_mask & ~change_mask;
5203 nv |= (change_val & change_mask);
5204 nv &= hdw->input_avail_mask;
5205 if (!nv) {
5206 /* No legal modes left; return error instead. */
5207 ret = -EPERM;
5208 break;
5209 }
5210 hdw->input_allowed_mask = nv;
5211 if ((1 << hdw->input_val) & hdw->input_allowed_mask) {
5212 /* Current mode is still in the allowed mask, so
5213 we're done. */
5214 break;
5215 }
5216 /* Select and switch to a mode that is still in the allowed
5217 mask */
5218 if (!hdw->input_allowed_mask) {
5219 /* Nothing legal; give up */
5220 break;
5221 }
5222 m = hdw->input_allowed_mask;
5223 for (idx = 0; idx < (sizeof(m) << 3); idx++) {
5224 if (!((1 << idx) & m)) continue;
5225 pvr2_hdw_set_input(hdw,idx);
5226 break;
5227 }
5228 } while (0);
5229 LOCK_GIVE(hdw->big_lock);
5230 return ret;
5231}
5232
5233
Mike Iselye61b6fc2006-07-18 22:42:18 -03005234/* Find I2C address of eeprom */
Adrian Bunk07e337e2006-06-30 11:30:20 -03005235static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw)
Mike Iselyd8554972006-06-26 20:58:46 -03005236{
5237 int result;
5238 LOCK_TAKE(hdw->ctl_lock); do {
Michael Krufky8d364362007-01-22 02:17:55 -03005239 hdw->cmd_buffer[0] = FX2CMD_GET_EEPROM_ADDR;
Mike Iselyd8554972006-06-26 20:58:46 -03005240 result = pvr2_send_request(hdw,
5241 hdw->cmd_buffer,1,
5242 hdw->cmd_buffer,1);
5243 if (result < 0) break;
5244 result = hdw->cmd_buffer[0];
5245 } while(0); LOCK_GIVE(hdw->ctl_lock);
5246 return result;
5247}
5248
5249
Mike Isely32ffa9a2006-09-23 22:26:52 -03005250int pvr2_hdw_register_access(struct pvr2_hdw *hdw,
Hans Verkuilaecde8b2008-12-30 07:14:19 -03005251 struct v4l2_dbg_match *match, u64 reg_id,
5252 int setFl, u64 *val_ptr)
Mike Isely32ffa9a2006-09-23 22:26:52 -03005253{
5254#ifdef CONFIG_VIDEO_ADV_DEBUG
Hans Verkuilaecde8b2008-12-30 07:14:19 -03005255 struct v4l2_dbg_register req;
Mike Isely6d988162006-09-28 17:53:49 -03005256 int stat = 0;
5257 int okFl = 0;
Mike Isely32ffa9a2006-09-23 22:26:52 -03005258
Mike Isely201f5c92007-01-28 16:08:36 -03005259 if (!capable(CAP_SYS_ADMIN)) return -EPERM;
5260
Hans Verkuilaecde8b2008-12-30 07:14:19 -03005261 req.match = *match;
Mike Isely32ffa9a2006-09-23 22:26:52 -03005262 req.reg = reg_id;
5263 if (setFl) req.val = *val_ptr;
Mike Iselyd8f5b9b2009-03-07 00:05:00 -03005264 /* It would be nice to know if a sub-device answered the request */
5265 v4l2_device_call_all(&hdw->v4l2_dev, 0, core, g_register, &req);
5266 if (!setFl) *val_ptr = req.val;
Mike Isely6d988162006-09-28 17:53:49 -03005267 if (okFl) {
5268 return stat;
5269 }
Mike Isely32ffa9a2006-09-23 22:26:52 -03005270 return -EINVAL;
5271#else
5272 return -ENOSYS;
5273#endif
5274}
5275
5276
Mike Iselyd8554972006-06-26 20:58:46 -03005277/*
5278 Stuff for Emacs to see, in order to encourage consistent editing style:
5279 *** Local Variables: ***
5280 *** mode: c ***
5281 *** fill-column: 75 ***
5282 *** tab-width: 8 ***
5283 *** c-basic-offset: 8 ***
5284 *** End: ***
5285 */