diff options
author | Mike Isely <isely@pobox.com> | 2009-03-08 17:47:47 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-03-30 11:43:39 -0400 |
commit | 5a3bab8eb02f9413b802540530ea390d8d063e43 (patch) | |
tree | 70f29f62325b7ced90612f30909ddd0c7bc03e49 /drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c | |
parent | 2eb563b7e726b517ef86213df436f50ec6c1740c (diff) |
V4L/DVB (11204): pvrusb2: Remove old i2c layer; we use v4l2-subdev now
This change removes the old i2c module controlling layer from the
pvrusb2 driver. This is code that first had appeared in the driver
back in December 2005. It's history. Now we use v4l2-subdev. Please
note also that with this change, the driver will no longer be usable
in kernels older that 2.6.22.
Signed-off-by: Mike Isely <isely@pobox.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c')
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c | 221 |
1 files changed, 0 insertions, 221 deletions
diff --git a/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c b/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c index 5adbf00323e5..4e017ff26c36 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c +++ b/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c | |||
@@ -28,7 +28,6 @@ | |||
28 | 28 | ||
29 | #include "pvrusb2-cx2584x-v4l.h" | 29 | #include "pvrusb2-cx2584x-v4l.h" |
30 | #include "pvrusb2-video-v4l.h" | 30 | #include "pvrusb2-video-v4l.h" |
31 | #include "pvrusb2-i2c-cmd-v4l2.h" | ||
32 | 31 | ||
33 | 32 | ||
34 | #include "pvrusb2-hdw-internal.h" | 33 | #include "pvrusb2-hdw-internal.h" |
@@ -102,226 +101,6 @@ static const struct routing_scheme routing_schemes[] = { | |||
102 | }, | 101 | }, |
103 | }; | 102 | }; |
104 | 103 | ||
105 | struct pvr2_v4l_cx2584x { | ||
106 | struct pvr2_i2c_handler handler; | ||
107 | struct pvr2_decoder_ctrl ctrl; | ||
108 | struct pvr2_i2c_client *client; | ||
109 | struct pvr2_hdw *hdw; | ||
110 | unsigned long stale_mask; | ||
111 | }; | ||
112 | |||
113 | |||
114 | static void set_input(struct pvr2_v4l_cx2584x *ctxt) | ||
115 | { | ||
116 | struct pvr2_hdw *hdw = ctxt->hdw; | ||
117 | struct v4l2_routing route; | ||
118 | enum cx25840_video_input vid_input; | ||
119 | enum cx25840_audio_input aud_input; | ||
120 | const struct routing_scheme *sp; | ||
121 | unsigned int sid = hdw->hdw_desc->signal_routing_scheme; | ||
122 | |||
123 | memset(&route,0,sizeof(route)); | ||
124 | |||
125 | if ((sid < ARRAY_SIZE(routing_schemes)) && | ||
126 | ((sp = routing_schemes + sid) != NULL) && | ||
127 | (hdw->input_val >= 0) && | ||
128 | (hdw->input_val < sp->cnt)) { | ||
129 | vid_input = sp->def[hdw->input_val].vid; | ||
130 | aud_input = sp->def[hdw->input_val].aud; | ||
131 | } else { | ||
132 | pvr2_trace(PVR2_TRACE_ERROR_LEGS, | ||
133 | "*** WARNING *** i2c cx2584x set_input:" | ||
134 | " Invalid routing scheme (%u) and/or input (%d)", | ||
135 | sid,hdw->input_val); | ||
136 | return; | ||
137 | } | ||
138 | |||
139 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c cx2584x set_input vid=0x%x aud=0x%x", | ||
140 | vid_input,aud_input); | ||
141 | route.input = (u32)vid_input; | ||
142 | pvr2_i2c_client_cmd(ctxt->client,VIDIOC_INT_S_VIDEO_ROUTING,&route); | ||
143 | route.input = (u32)aud_input; | ||
144 | pvr2_i2c_client_cmd(ctxt->client,VIDIOC_INT_S_AUDIO_ROUTING,&route); | ||
145 | } | ||
146 | |||
147 | |||
148 | static int check_input(struct pvr2_v4l_cx2584x *ctxt) | ||
149 | { | ||
150 | struct pvr2_hdw *hdw = ctxt->hdw; | ||
151 | return hdw->input_dirty != 0; | ||
152 | } | ||
153 | |||
154 | |||
155 | static void set_audio(struct pvr2_v4l_cx2584x *ctxt) | ||
156 | { | ||
157 | u32 val; | ||
158 | struct pvr2_hdw *hdw = ctxt->hdw; | ||
159 | |||
160 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c cx2584x set_audio %d", | ||
161 | hdw->srate_val); | ||
162 | switch (hdw->srate_val) { | ||
163 | default: | ||
164 | case V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000: | ||
165 | val = 48000; | ||
166 | break; | ||
167 | case V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100: | ||
168 | val = 44100; | ||
169 | break; | ||
170 | case V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000: | ||
171 | val = 32000; | ||
172 | break; | ||
173 | } | ||
174 | pvr2_i2c_client_cmd(ctxt->client,VIDIOC_INT_AUDIO_CLOCK_FREQ,&val); | ||
175 | } | ||
176 | |||
177 | |||
178 | static int check_audio(struct pvr2_v4l_cx2584x *ctxt) | ||
179 | { | ||
180 | struct pvr2_hdw *hdw = ctxt->hdw; | ||
181 | return hdw->srate_dirty != 0; | ||
182 | } | ||
183 | |||
184 | |||
185 | struct pvr2_v4l_cx2584x_ops { | ||
186 | void (*update)(struct pvr2_v4l_cx2584x *); | ||
187 | int (*check)(struct pvr2_v4l_cx2584x *); | ||
188 | }; | ||
189 | |||
190 | |||
191 | static const struct pvr2_v4l_cx2584x_ops decoder_ops[] = { | ||
192 | { .update = set_input, .check = check_input}, | ||
193 | { .update = set_audio, .check = check_audio}, | ||
194 | }; | ||
195 | |||
196 | |||
197 | static void decoder_detach(struct pvr2_v4l_cx2584x *ctxt) | ||
198 | { | ||
199 | ctxt->client->handler = NULL; | ||
200 | pvr2_hdw_set_decoder(ctxt->hdw,NULL); | ||
201 | kfree(ctxt); | ||
202 | } | ||
203 | |||
204 | |||
205 | static int decoder_check(struct pvr2_v4l_cx2584x *ctxt) | ||
206 | { | ||
207 | unsigned long msk; | ||
208 | unsigned int idx; | ||
209 | |||
210 | for (idx = 0; idx < ARRAY_SIZE(decoder_ops); idx++) { | ||
211 | msk = 1 << idx; | ||
212 | if (ctxt->stale_mask & msk) continue; | ||
213 | if (decoder_ops[idx].check(ctxt)) { | ||
214 | ctxt->stale_mask |= msk; | ||
215 | } | ||
216 | } | ||
217 | return ctxt->stale_mask != 0; | ||
218 | } | ||
219 | |||
220 | |||
221 | static void decoder_update(struct pvr2_v4l_cx2584x *ctxt) | ||
222 | { | ||
223 | unsigned long msk; | ||
224 | unsigned int idx; | ||
225 | |||
226 | for (idx = 0; idx < ARRAY_SIZE(decoder_ops); idx++) { | ||
227 | msk = 1 << idx; | ||
228 | if (!(ctxt->stale_mask & msk)) continue; | ||
229 | ctxt->stale_mask &= ~msk; | ||
230 | decoder_ops[idx].update(ctxt); | ||
231 | } | ||
232 | } | ||
233 | |||
234 | |||
235 | static void decoder_enable(struct pvr2_v4l_cx2584x *ctxt,int fl) | ||
236 | { | ||
237 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c cx25840 decoder_enable(%d)",fl); | ||
238 | pvr2_v4l2_cmd_stream(ctxt->client,fl); | ||
239 | } | ||
240 | |||
241 | |||
242 | static int decoder_detect(struct pvr2_i2c_client *cp) | ||
243 | { | ||
244 | int ret; | ||
245 | /* Attempt to query the decoder - let's see if it will answer */ | ||
246 | struct v4l2_queryctrl qc; | ||
247 | |||
248 | memset(&qc,0,sizeof(qc)); | ||
249 | |||
250 | qc.id = V4L2_CID_BRIGHTNESS; | ||
251 | |||
252 | ret = pvr2_i2c_client_cmd(cp,VIDIOC_QUERYCTRL,&qc); | ||
253 | return ret == 0; /* Return true if it answered */ | ||
254 | } | ||
255 | |||
256 | |||
257 | static unsigned int decoder_describe(struct pvr2_v4l_cx2584x *ctxt, | ||
258 | char *buf,unsigned int cnt) | ||
259 | { | ||
260 | return scnprintf(buf,cnt,"handler: pvrusb2-cx2584x-v4l"); | ||
261 | } | ||
262 | |||
263 | |||
264 | static void decoder_reset(struct pvr2_v4l_cx2584x *ctxt) | ||
265 | { | ||
266 | int ret; | ||
267 | ret = pvr2_i2c_client_cmd(ctxt->client,VIDIOC_INT_RESET,NULL); | ||
268 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c cx25840 decoder_reset (ret=%d)",ret); | ||
269 | } | ||
270 | |||
271 | |||
272 | static const struct pvr2_i2c_handler_functions hfuncs = { | ||
273 | .detach = (void (*)(void *))decoder_detach, | ||
274 | .check = (int (*)(void *))decoder_check, | ||
275 | .update = (void (*)(void *))decoder_update, | ||
276 | .describe = (unsigned int (*)(void *,char *,unsigned int))decoder_describe, | ||
277 | }; | ||
278 | |||
279 | |||
280 | int pvr2_i2c_cx2584x_v4l_setup(struct pvr2_hdw *hdw, | ||
281 | struct pvr2_i2c_client *cp) | ||
282 | { | ||
283 | struct pvr2_v4l_cx2584x *ctxt; | ||
284 | |||
285 | if (hdw->decoder_ctrl) return 0; | ||
286 | if (cp->handler) return 0; | ||
287 | if (!decoder_detect(cp)) return 0; | ||
288 | |||
289 | ctxt = kzalloc(sizeof(*ctxt),GFP_KERNEL); | ||
290 | if (!ctxt) return 0; | ||
291 | |||
292 | ctxt->handler.func_data = ctxt; | ||
293 | ctxt->handler.func_table = &hfuncs; | ||
294 | ctxt->ctrl.ctxt = ctxt; | ||
295 | ctxt->ctrl.detach = (void (*)(void *))decoder_detach; | ||
296 | ctxt->ctrl.enable = (void (*)(void *,int))decoder_enable; | ||
297 | ctxt->ctrl.force_reset = (void (*)(void*))decoder_reset; | ||
298 | ctxt->client = cp; | ||
299 | ctxt->hdw = hdw; | ||
300 | ctxt->stale_mask = (1 << ARRAY_SIZE(decoder_ops)) - 1; | ||
301 | pvr2_hdw_set_decoder(hdw,&ctxt->ctrl); | ||
302 | cp->handler = &ctxt->handler; | ||
303 | { | ||
304 | /* | ||
305 | Mike Isely <isely@pobox.com> 19-Nov-2006 - This bit | ||
306 | of nuttiness for cx25840 causes that module to | ||
307 | correctly set up its video scaling. This is really | ||
308 | a problem in the cx25840 module itself, but we work | ||
309 | around it here. The problem has not been seen in | ||
310 | ivtv because there VBI is supported and set up. We | ||
311 | don't do VBI here (at least not yet) and thus we | ||
312 | never attempted to even set it up. | ||
313 | */ | ||
314 | struct v4l2_format fmt; | ||
315 | memset(&fmt,0,sizeof(fmt)); | ||
316 | fmt.type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE; | ||
317 | pvr2_i2c_client_cmd(ctxt->client,VIDIOC_S_FMT,&fmt); | ||
318 | } | ||
319 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c 0x%x cx2584x V4L2 handler set up", | ||
320 | cp->client->addr); | ||
321 | return !0; | ||
322 | } | ||
323 | |||
324 | |||
325 | void pvr2_cx25840_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd) | 104 | void pvr2_cx25840_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd) |
326 | { | 105 | { |
327 | pvr2_trace(PVR2_TRACE_CHIPS, "subdev cx2584x update..."); | 106 | pvr2_trace(PVR2_TRACE_CHIPS, "subdev cx2584x update..."); |