diff options
20 files changed, 3 insertions, 2074 deletions
diff --git a/drivers/media/video/pvrusb2/Makefile b/drivers/media/video/pvrusb2/Makefile index 931d9d1a0b4b..a4478618a7fc 100644 --- a/drivers/media/video/pvrusb2/Makefile +++ b/drivers/media/video/pvrusb2/Makefile | |||
@@ -2,11 +2,10 @@ obj-pvrusb2-sysfs-$(CONFIG_VIDEO_PVRUSB2_SYSFS) := pvrusb2-sysfs.o | |||
2 | obj-pvrusb2-debugifc-$(CONFIG_VIDEO_PVRUSB2_DEBUGIFC) := pvrusb2-debugifc.o | 2 | obj-pvrusb2-debugifc-$(CONFIG_VIDEO_PVRUSB2_DEBUGIFC) := pvrusb2-debugifc.o |
3 | obj-pvrusb2-dvb-$(CONFIG_VIDEO_PVRUSB2_DVB) := pvrusb2-dvb.o | 3 | obj-pvrusb2-dvb-$(CONFIG_VIDEO_PVRUSB2_DVB) := pvrusb2-dvb.o |
4 | 4 | ||
5 | pvrusb2-objs := pvrusb2-i2c-core.o pvrusb2-i2c-cmd-v4l2.o \ | 5 | pvrusb2-objs := pvrusb2-i2c-core.o \ |
6 | pvrusb2-i2c-track.o \ | 6 | pvrusb2-audio.o \ |
7 | pvrusb2-audio.o pvrusb2-i2c-chips-v4l2.o \ | ||
8 | pvrusb2-encoder.o pvrusb2-video-v4l.o \ | 7 | pvrusb2-encoder.o pvrusb2-video-v4l.o \ |
9 | pvrusb2-eeprom.o pvrusb2-tuner.o \ | 8 | pvrusb2-eeprom.o \ |
10 | pvrusb2-main.o pvrusb2-hdw.o pvrusb2-v4l2.o \ | 9 | pvrusb2-main.o pvrusb2-hdw.o pvrusb2-v4l2.o \ |
11 | pvrusb2-ctrl.o pvrusb2-std.o pvrusb2-devattr.o \ | 10 | pvrusb2-ctrl.o pvrusb2-std.o pvrusb2-devattr.o \ |
12 | pvrusb2-context.o pvrusb2-io.o pvrusb2-ioread.o \ | 11 | pvrusb2-context.o pvrusb2-io.o pvrusb2-ioread.o \ |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-audio.c b/drivers/media/video/pvrusb2/pvrusb2-audio.c index aca6b1d1561a..ccf2a3c7ad06 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-audio.c +++ b/drivers/media/video/pvrusb2/pvrusb2-audio.c | |||
@@ -55,133 +55,6 @@ static const struct routing_scheme routing_schemes[] = { | |||
55 | }, | 55 | }, |
56 | }; | 56 | }; |
57 | 57 | ||
58 | |||
59 | struct pvr2_msp3400_handler { | ||
60 | struct pvr2_hdw *hdw; | ||
61 | struct pvr2_i2c_client *client; | ||
62 | struct pvr2_i2c_handler i2c_handler; | ||
63 | unsigned long stale_mask; | ||
64 | }; | ||
65 | |||
66 | |||
67 | |||
68 | |||
69 | /* This function selects the correct audio input source */ | ||
70 | static void set_stereo(struct pvr2_msp3400_handler *ctxt) | ||
71 | { | ||
72 | struct pvr2_hdw *hdw = ctxt->hdw; | ||
73 | struct v4l2_routing route; | ||
74 | const struct routing_scheme *sp; | ||
75 | unsigned int sid = hdw->hdw_desc->signal_routing_scheme; | ||
76 | |||
77 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c msp3400 v4l2 set_stereo"); | ||
78 | |||
79 | if ((sid < ARRAY_SIZE(routing_schemes)) && | ||
80 | ((sp = routing_schemes + sid) != NULL) && | ||
81 | (hdw->input_val >= 0) && | ||
82 | (hdw->input_val < sp->cnt)) { | ||
83 | route.input = sp->def[hdw->input_val]; | ||
84 | } else { | ||
85 | pvr2_trace(PVR2_TRACE_ERROR_LEGS, | ||
86 | "*** WARNING *** i2c msp3400 v4l2 set_stereo:" | ||
87 | " Invalid routing scheme (%u) and/or input (%d)", | ||
88 | sid,hdw->input_val); | ||
89 | return; | ||
90 | } | ||
91 | route.output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1); | ||
92 | pvr2_i2c_client_cmd(ctxt->client,VIDIOC_INT_S_AUDIO_ROUTING,&route); | ||
93 | } | ||
94 | |||
95 | |||
96 | static int check_stereo(struct pvr2_msp3400_handler *ctxt) | ||
97 | { | ||
98 | struct pvr2_hdw *hdw = ctxt->hdw; | ||
99 | return hdw->input_dirty; | ||
100 | } | ||
101 | |||
102 | |||
103 | struct pvr2_msp3400_ops { | ||
104 | void (*update)(struct pvr2_msp3400_handler *); | ||
105 | int (*check)(struct pvr2_msp3400_handler *); | ||
106 | }; | ||
107 | |||
108 | |||
109 | static const struct pvr2_msp3400_ops msp3400_ops[] = { | ||
110 | { .update = set_stereo, .check = check_stereo}, | ||
111 | }; | ||
112 | |||
113 | |||
114 | static int msp3400_check(struct pvr2_msp3400_handler *ctxt) | ||
115 | { | ||
116 | unsigned long msk; | ||
117 | unsigned int idx; | ||
118 | |||
119 | for (idx = 0; idx < ARRAY_SIZE(msp3400_ops); idx++) { | ||
120 | msk = 1 << idx; | ||
121 | if (ctxt->stale_mask & msk) continue; | ||
122 | if (msp3400_ops[idx].check(ctxt)) { | ||
123 | ctxt->stale_mask |= msk; | ||
124 | } | ||
125 | } | ||
126 | return ctxt->stale_mask != 0; | ||
127 | } | ||
128 | |||
129 | |||
130 | static void msp3400_update(struct pvr2_msp3400_handler *ctxt) | ||
131 | { | ||
132 | unsigned long msk; | ||
133 | unsigned int idx; | ||
134 | |||
135 | for (idx = 0; idx < ARRAY_SIZE(msp3400_ops); idx++) { | ||
136 | msk = 1 << idx; | ||
137 | if (!(ctxt->stale_mask & msk)) continue; | ||
138 | ctxt->stale_mask &= ~msk; | ||
139 | msp3400_ops[idx].update(ctxt); | ||
140 | } | ||
141 | } | ||
142 | |||
143 | |||
144 | static void pvr2_msp3400_detach(struct pvr2_msp3400_handler *ctxt) | ||
145 | { | ||
146 | ctxt->client->handler = NULL; | ||
147 | kfree(ctxt); | ||
148 | } | ||
149 | |||
150 | |||
151 | static unsigned int pvr2_msp3400_describe(struct pvr2_msp3400_handler *ctxt, | ||
152 | char *buf,unsigned int cnt) | ||
153 | { | ||
154 | return scnprintf(buf,cnt,"handler: pvrusb2-audio v4l2"); | ||
155 | } | ||
156 | |||
157 | |||
158 | static const struct pvr2_i2c_handler_functions msp3400_funcs = { | ||
159 | .detach = (void (*)(void *))pvr2_msp3400_detach, | ||
160 | .check = (int (*)(void *))msp3400_check, | ||
161 | .update = (void (*)(void *))msp3400_update, | ||
162 | .describe = (unsigned int (*)(void *,char *,unsigned int))pvr2_msp3400_describe, | ||
163 | }; | ||
164 | |||
165 | |||
166 | int pvr2_i2c_msp3400_setup(struct pvr2_hdw *hdw,struct pvr2_i2c_client *cp) | ||
167 | { | ||
168 | struct pvr2_msp3400_handler *ctxt; | ||
169 | if (cp->handler) return 0; | ||
170 | |||
171 | ctxt = kzalloc(sizeof(*ctxt),GFP_KERNEL); | ||
172 | if (!ctxt) return 0; | ||
173 | |||
174 | ctxt->i2c_handler.func_data = ctxt; | ||
175 | ctxt->i2c_handler.func_table = &msp3400_funcs; | ||
176 | ctxt->client = cp; | ||
177 | ctxt->hdw = hdw; | ||
178 | ctxt->stale_mask = (1 << ARRAY_SIZE(msp3400_ops)) - 1; | ||
179 | cp->handler = &ctxt->i2c_handler; | ||
180 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c 0x%x msp3400 V4L2 handler set up", | ||
181 | cp->client->addr); | ||
182 | return !0; | ||
183 | } | ||
184 | |||
185 | void pvr2_msp3400_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd) | 58 | void pvr2_msp3400_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd) |
186 | { | 59 | { |
187 | if (hdw->input_dirty || hdw->force_dirty) { | 60 | if (hdw->input_dirty || hdw->force_dirty) { |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-audio.h b/drivers/media/video/pvrusb2/pvrusb2-audio.h index c47c8de3ba06..e3e63d750891 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-audio.h +++ b/drivers/media/video/pvrusb2/pvrusb2-audio.h | |||
@@ -22,10 +22,6 @@ | |||
22 | #ifndef __PVRUSB2_AUDIO_H | 22 | #ifndef __PVRUSB2_AUDIO_H |
23 | #define __PVRUSB2_AUDIO_H | 23 | #define __PVRUSB2_AUDIO_H |
24 | 24 | ||
25 | #include "pvrusb2-i2c-track.h" | ||
26 | |||
27 | int pvr2_i2c_msp3400_setup(struct pvr2_hdw *,struct pvr2_i2c_client *); | ||
28 | |||
29 | #include "pvrusb2-hdw-internal.h" | 25 | #include "pvrusb2-hdw-internal.h" |
30 | void pvr2_msp3400_subdev_update(struct pvr2_hdw *, struct v4l2_subdev *); | 26 | void pvr2_msp3400_subdev_update(struct pvr2_hdw *, struct v4l2_subdev *); |
31 | #endif /* __PVRUSB2_AUDIO_H */ | 27 | #endif /* __PVRUSB2_AUDIO_H */ |
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..."); |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.h b/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.h index e48ce808bfe5..e35c2322a08c 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.h +++ b/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.h | |||
@@ -34,11 +34,6 @@ | |||
34 | 34 | ||
35 | 35 | ||
36 | 36 | ||
37 | #include "pvrusb2-i2c-track.h" | ||
38 | |||
39 | int pvr2_i2c_cx2584x_v4l_setup(struct pvr2_hdw *,struct pvr2_i2c_client *); | ||
40 | |||
41 | |||
42 | #include "pvrusb2-hdw-internal.h" | 37 | #include "pvrusb2-hdw-internal.h" |
43 | 38 | ||
44 | void pvr2_cx25840_subdev_update(struct pvr2_hdw *, struct v4l2_subdev *sd); | 39 | void pvr2_cx25840_subdev_update(struct pvr2_hdw *, struct v4l2_subdev *sd); |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-debugifc.c b/drivers/media/video/pvrusb2/pvrusb2-debugifc.c index 2074ce05c76a..fbe3856bdca6 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-debugifc.c +++ b/drivers/media/video/pvrusb2/pvrusb2-debugifc.c | |||
@@ -23,7 +23,6 @@ | |||
23 | #include "pvrusb2-debugifc.h" | 23 | #include "pvrusb2-debugifc.h" |
24 | #include "pvrusb2-hdw.h" | 24 | #include "pvrusb2-hdw.h" |
25 | #include "pvrusb2-debug.h" | 25 | #include "pvrusb2-debug.h" |
26 | #include "pvrusb2-i2c-track.h" | ||
27 | 26 | ||
28 | struct debugifc_mask_item { | 27 | struct debugifc_mask_item { |
29 | const char *name; | 28 | const char *name; |
@@ -147,10 +146,6 @@ int pvr2_debugifc_print_info(struct pvr2_hdw *hdw,char *buf,unsigned int acnt) | |||
147 | bcnt += ccnt; acnt -= ccnt; buf += ccnt; | 146 | bcnt += ccnt; acnt -= ccnt; buf += ccnt; |
148 | ccnt = pvr2_hdw_state_report(hdw,buf,acnt); | 147 | ccnt = pvr2_hdw_state_report(hdw,buf,acnt); |
149 | bcnt += ccnt; acnt -= ccnt; buf += ccnt; | 148 | bcnt += ccnt; acnt -= ccnt; buf += ccnt; |
150 | ccnt = scnprintf(buf, acnt, "Attached old-style I2C modules:\n"); | ||
151 | bcnt += ccnt; acnt -= ccnt; buf += ccnt; | ||
152 | ccnt = pvr2_i2c_report(hdw,buf,acnt); | ||
153 | bcnt += ccnt; acnt -= ccnt; buf += ccnt; | ||
154 | 149 | ||
155 | return bcnt; | 150 | return bcnt; |
156 | } | 151 | } |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h b/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h index 2afbd9bcedd3..5d75eb5211b1 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h | |||
@@ -138,22 +138,6 @@ struct pvr2_ctrl { | |||
138 | }; | 138 | }; |
139 | 139 | ||
140 | 140 | ||
141 | struct pvr2_decoder_ctrl { | ||
142 | void *ctxt; | ||
143 | void (*detach)(void *); | ||
144 | void (*enable)(void *,int); | ||
145 | void (*force_reset)(void *); | ||
146 | }; | ||
147 | |||
148 | #define PVR2_I2C_PEND_DETECT 0x01 /* Need to detect a client type */ | ||
149 | #define PVR2_I2C_PEND_CLIENT 0x02 /* Client needs a specific update */ | ||
150 | #define PVR2_I2C_PEND_REFRESH 0x04 /* Client has specific pending bits */ | ||
151 | #define PVR2_I2C_PEND_STALE 0x08 /* Broadcast pending bits */ | ||
152 | |||
153 | #define PVR2_I2C_PEND_ALL (PVR2_I2C_PEND_DETECT |\ | ||
154 | PVR2_I2C_PEND_CLIENT |\ | ||
155 | PVR2_I2C_PEND_REFRESH |\ | ||
156 | PVR2_I2C_PEND_STALE) | ||
157 | 141 | ||
158 | /* Disposition of firmware1 loading situation */ | 142 | /* Disposition of firmware1 loading situation */ |
159 | #define FW1_STATE_UNKNOWN 0 | 143 | #define FW1_STATE_UNKNOWN 0 |
@@ -187,7 +171,6 @@ struct pvr2_hdw { | |||
187 | /* Kernel worker thread handling */ | 171 | /* Kernel worker thread handling */ |
188 | struct workqueue_struct *workqueue; | 172 | struct workqueue_struct *workqueue; |
189 | struct work_struct workpoll; /* Update driver state */ | 173 | struct work_struct workpoll; /* Update driver state */ |
190 | struct work_struct worki2csync; /* Update i2c clients */ | ||
191 | 174 | ||
192 | /* Video spigot */ | 175 | /* Video spigot */ |
193 | struct pvr2_stream *vid_stream; | 176 | struct pvr2_stream *vid_stream; |
@@ -216,12 +199,6 @@ struct pvr2_hdw { | |||
216 | pvr2_i2c_func i2c_func[PVR2_I2C_FUNC_CNT]; | 199 | pvr2_i2c_func i2c_func[PVR2_I2C_FUNC_CNT]; |
217 | int i2c_cx25840_hack_state; | 200 | int i2c_cx25840_hack_state; |
218 | int i2c_linked; | 201 | int i2c_linked; |
219 | unsigned int i2c_pend_types; /* Which types of update are needed */ | ||
220 | unsigned long i2c_pend_mask; /* Change bits we need to scan */ | ||
221 | unsigned long i2c_stale_mask; /* Pending broadcast change bits */ | ||
222 | unsigned long i2c_active_mask; /* All change bits currently in use */ | ||
223 | struct list_head i2c_clients; | ||
224 | struct mutex i2c_list_lock; | ||
225 | 202 | ||
226 | /* Frequency table */ | 203 | /* Frequency table */ |
227 | unsigned int freqTable[FREQTABLE_SIZE]; | 204 | unsigned int freqTable[FREQTABLE_SIZE]; |
@@ -297,7 +274,6 @@ struct pvr2_hdw { | |||
297 | int flag_decoder_missed;/* We've noticed missing decoder */ | 274 | int flag_decoder_missed;/* We've noticed missing decoder */ |
298 | int flag_tripped; /* Indicates overall failure to start */ | 275 | int flag_tripped; /* Indicates overall failure to start */ |
299 | 276 | ||
300 | struct pvr2_decoder_ctrl *decoder_ctrl; | ||
301 | unsigned int decoder_client_id; | 277 | unsigned int decoder_client_id; |
302 | 278 | ||
303 | // CPU firmware info (used to help find / save firmware data) | 279 | // CPU firmware info (used to help find / save firmware data) |
@@ -305,10 +281,6 @@ struct pvr2_hdw { | |||
305 | unsigned int fw_size; | 281 | unsigned int fw_size; |
306 | int fw_cpu_flag; /* True if we are dealing with the CPU */ | 282 | int fw_cpu_flag; /* True if we are dealing with the CPU */ |
307 | 283 | ||
308 | // True if there is a request to trigger logging of state in each | ||
309 | // module. | ||
310 | int log_requested; | ||
311 | |||
312 | /* Tuner / frequency control stuff */ | 284 | /* Tuner / frequency control stuff */ |
313 | unsigned int tuner_type; | 285 | unsigned int tuner_type; |
314 | int tuner_updated; | 286 | int tuner_updated; |
@@ -406,7 +378,6 @@ struct pvr2_hdw { | |||
406 | 378 | ||
407 | /* This function gets the current frequency */ | 379 | /* This function gets the current frequency */ |
408 | unsigned long pvr2_hdw_get_cur_freq(struct pvr2_hdw *); | 380 | unsigned long pvr2_hdw_get_cur_freq(struct pvr2_hdw *); |
409 | void pvr2_hdw_set_decoder(struct pvr2_hdw *,struct pvr2_decoder_ctrl *); | ||
410 | 381 | ||
411 | void pvr2_hdw_status_poll(struct pvr2_hdw *); | 382 | void pvr2_hdw_status_poll(struct pvr2_hdw *); |
412 | 383 | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c index b0383153e3ce..7c66779b1f42 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c | |||
@@ -30,8 +30,6 @@ | |||
30 | #include "pvrusb2-util.h" | 30 | #include "pvrusb2-util.h" |
31 | #include "pvrusb2-hdw.h" | 31 | #include "pvrusb2-hdw.h" |
32 | #include "pvrusb2-i2c-core.h" | 32 | #include "pvrusb2-i2c-core.h" |
33 | #include "pvrusb2-i2c-track.h" | ||
34 | #include "pvrusb2-tuner.h" | ||
35 | #include "pvrusb2-eeprom.h" | 33 | #include "pvrusb2-eeprom.h" |
36 | #include "pvrusb2-hdw-internal.h" | 34 | #include "pvrusb2-hdw-internal.h" |
37 | #include "pvrusb2-encoder.h" | 35 | #include "pvrusb2-encoder.h" |
@@ -313,7 +311,6 @@ static int pvr2_hdw_set_input(struct pvr2_hdw *hdw,int v); | |||
313 | static void pvr2_hdw_state_sched(struct pvr2_hdw *); | 311 | static void pvr2_hdw_state_sched(struct pvr2_hdw *); |
314 | static int pvr2_hdw_state_eval(struct pvr2_hdw *); | 312 | static int pvr2_hdw_state_eval(struct pvr2_hdw *); |
315 | static void pvr2_hdw_set_cur_freq(struct pvr2_hdw *,unsigned long); | 313 | static void pvr2_hdw_set_cur_freq(struct pvr2_hdw *,unsigned long); |
316 | static void pvr2_hdw_worker_i2c(struct work_struct *work); | ||
317 | static void pvr2_hdw_worker_poll(struct work_struct *work); | 314 | static void pvr2_hdw_worker_poll(struct work_struct *work); |
318 | static int pvr2_hdw_wait(struct pvr2_hdw *,int state); | 315 | static int pvr2_hdw_wait(struct pvr2_hdw *,int state); |
319 | static int pvr2_hdw_untrip_unlocked(struct pvr2_hdw *); | 316 | static int pvr2_hdw_untrip_unlocked(struct pvr2_hdw *); |
@@ -1676,10 +1673,6 @@ static const char *pvr2_get_state_name(unsigned int st) | |||
1676 | 1673 | ||
1677 | static int pvr2_decoder_enable(struct pvr2_hdw *hdw,int enablefl) | 1674 | static int pvr2_decoder_enable(struct pvr2_hdw *hdw,int enablefl) |
1678 | { | 1675 | { |
1679 | if (hdw->decoder_ctrl) { | ||
1680 | hdw->decoder_ctrl->enable(hdw->decoder_ctrl->ctxt, enablefl); | ||
1681 | return 0; | ||
1682 | } | ||
1683 | /* Even though we really only care about the video decoder chip at | 1676 | /* Even though we really only care about the video decoder chip at |
1684 | this point, we'll broadcast stream on/off to all sub-devices | 1677 | this point, we'll broadcast stream on/off to all sub-devices |
1685 | anyway, just in case somebody else wants to hear the | 1678 | anyway, just in case somebody else wants to hear the |
@@ -1704,21 +1697,6 @@ static int pvr2_decoder_enable(struct pvr2_hdw *hdw,int enablefl) | |||
1704 | } | 1697 | } |
1705 | 1698 | ||
1706 | 1699 | ||
1707 | void pvr2_hdw_set_decoder(struct pvr2_hdw *hdw,struct pvr2_decoder_ctrl *ptr) | ||
1708 | { | ||
1709 | if (hdw->decoder_ctrl == ptr) return; | ||
1710 | hdw->decoder_ctrl = ptr; | ||
1711 | if (hdw->decoder_ctrl && hdw->flag_decoder_missed) { | ||
1712 | hdw->flag_decoder_missed = 0; | ||
1713 | trace_stbit("flag_decoder_missed", | ||
1714 | hdw->flag_decoder_missed); | ||
1715 | pvr2_trace(PVR2_TRACE_ERROR_LEGS, | ||
1716 | "Decoder has appeared"); | ||
1717 | pvr2_hdw_state_sched(hdw); | ||
1718 | } | ||
1719 | } | ||
1720 | |||
1721 | |||
1722 | int pvr2_hdw_get_state(struct pvr2_hdw *hdw) | 1700 | int pvr2_hdw_get_state(struct pvr2_hdw *hdw) |
1723 | { | 1701 | { |
1724 | return hdw->master_state; | 1702 | return hdw->master_state; |
@@ -2052,7 +2030,6 @@ static int pvr2_hdw_load_subdev(struct pvr2_hdw *hdw, | |||
2052 | * and every other place where I can find examples of this, the | 2030 | * and every other place where I can find examples of this, the |
2053 | * "chipid" appears to just be the module name again. So here we | 2031 | * "chipid" appears to just be the module name again. So here we |
2054 | * just do the same thing. */ | 2032 | * just do the same thing. */ |
2055 | hdw->i2c_adap.class = 0; | ||
2056 | if (i2ccnt == 1) { | 2033 | if (i2ccnt == 1) { |
2057 | pvr2_trace(PVR2_TRACE_INIT, | 2034 | pvr2_trace(PVR2_TRACE_INIT, |
2058 | "Module ID %u:" | 2035 | "Module ID %u:" |
@@ -2070,7 +2047,6 @@ static int pvr2_hdw_load_subdev(struct pvr2_hdw *hdw, | |||
2070 | fname, fname, | 2047 | fname, fname, |
2071 | i2caddr); | 2048 | i2caddr); |
2072 | } | 2049 | } |
2073 | hdw->i2c_adap.class = I2C_CLASS_TV_ANALOG; | ||
2074 | 2050 | ||
2075 | if (!sd) { | 2051 | if (!sd) { |
2076 | pvr2_trace(PVR2_TRACE_ERROR_LEGS, | 2052 | pvr2_trace(PVR2_TRACE_ERROR_LEGS, |
@@ -2084,11 +2060,6 @@ static int pvr2_hdw_load_subdev(struct pvr2_hdw *hdw, | |||
2084 | requires special handling. */ | 2060 | requires special handling. */ |
2085 | sd->grp_id = mid; | 2061 | sd->grp_id = mid; |
2086 | 2062 | ||
2087 | /* If we have both old and new i2c layers enabled, make sure that | ||
2088 | old layer isn't also tracking this module. This is a debugging | ||
2089 | aid, in normal situations there's no reason for both mechanisms | ||
2090 | to be enabled. */ | ||
2091 | pvr2_i2c_untrack_subdev(hdw, sd); | ||
2092 | pvr2_trace(PVR2_TRACE_INFO, "Attached sub-driver %s", fname); | 2063 | pvr2_trace(PVR2_TRACE_INFO, "Attached sub-driver %s", fname); |
2093 | 2064 | ||
2094 | 2065 | ||
@@ -2204,7 +2175,6 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw) | |||
2204 | } | 2175 | } |
2205 | 2176 | ||
2206 | // This step MUST happen after the earlier powerup step. | 2177 | // This step MUST happen after the earlier powerup step. |
2207 | pvr2_i2c_track_init(hdw); | ||
2208 | pvr2_i2c_core_init(hdw); | 2178 | pvr2_i2c_core_init(hdw); |
2209 | if (!pvr2_hdw_dev_ok(hdw)) return; | 2179 | if (!pvr2_hdw_dev_ok(hdw)) return; |
2210 | 2180 | ||
@@ -2271,7 +2241,6 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw) | |||
2271 | hdw->tuner_type); | 2241 | hdw->tuner_type); |
2272 | } | 2242 | } |
2273 | 2243 | ||
2274 | pvr2_i2c_core_check_stale(hdw); | ||
2275 | 2244 | ||
2276 | if (!pvr2_hdw_dev_ok(hdw)) return; | 2245 | if (!pvr2_hdw_dev_ok(hdw)) return; |
2277 | 2246 | ||
@@ -2628,7 +2597,6 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf, | |||
2628 | 2597 | ||
2629 | hdw->workqueue = create_singlethread_workqueue(hdw->name); | 2598 | hdw->workqueue = create_singlethread_workqueue(hdw->name); |
2630 | INIT_WORK(&hdw->workpoll,pvr2_hdw_worker_poll); | 2599 | INIT_WORK(&hdw->workpoll,pvr2_hdw_worker_poll); |
2631 | INIT_WORK(&hdw->worki2csync,pvr2_hdw_worker_i2c); | ||
2632 | 2600 | ||
2633 | pvr2_trace(PVR2_TRACE_INIT,"Driver unit number is %d, name is %s", | 2601 | pvr2_trace(PVR2_TRACE_INIT,"Driver unit number is %d, name is %s", |
2634 | hdw->unit_number,hdw->name); | 2602 | hdw->unit_number,hdw->name); |
@@ -2731,11 +2699,7 @@ void pvr2_hdw_destroy(struct pvr2_hdw *hdw) | |||
2731 | pvr2_stream_destroy(hdw->vid_stream); | 2699 | pvr2_stream_destroy(hdw->vid_stream); |
2732 | hdw->vid_stream = NULL; | 2700 | hdw->vid_stream = NULL; |
2733 | } | 2701 | } |
2734 | if (hdw->decoder_ctrl) { | ||
2735 | hdw->decoder_ctrl->detach(hdw->decoder_ctrl->ctxt); | ||
2736 | } | ||
2737 | pvr2_i2c_core_done(hdw); | 2702 | pvr2_i2c_core_done(hdw); |
2738 | pvr2_i2c_track_done(hdw); | ||
2739 | v4l2_device_unregister(&hdw->v4l2_dev); | 2703 | v4l2_device_unregister(&hdw->v4l2_dev); |
2740 | pvr2_hdw_remove_usb_stuff(hdw); | 2704 | pvr2_hdw_remove_usb_stuff(hdw); |
2741 | mutex_lock(&pvr2_unit_mtx); do { | 2705 | mutex_lock(&pvr2_unit_mtx); do { |
@@ -3238,12 +3202,6 @@ static int pvr2_hdw_commit_execute(struct pvr2_hdw *hdw) | |||
3238 | cx2341x_ext_ctrls(&hdw->enc_ctl_state, 0, &cs,VIDIOC_S_EXT_CTRLS); | 3202 | cx2341x_ext_ctrls(&hdw->enc_ctl_state, 0, &cs,VIDIOC_S_EXT_CTRLS); |
3239 | } | 3203 | } |
3240 | 3204 | ||
3241 | /* Scan i2c core at this point - before we clear all the dirty | ||
3242 | bits. Various parts of the i2c core will notice dirty bits as | ||
3243 | appropriate and arrange to broadcast or directly send updates to | ||
3244 | the client drivers in order to keep everything in sync */ | ||
3245 | pvr2_i2c_core_check_stale(hdw); | ||
3246 | |||
3247 | if (hdw->active_stream_type != hdw->desired_stream_type) { | 3205 | if (hdw->active_stream_type != hdw->desired_stream_type) { |
3248 | /* Handle any side effects of stream config here */ | 3206 | /* Handle any side effects of stream config here */ |
3249 | hdw->active_stream_type = hdw->desired_stream_type; | 3207 | hdw->active_stream_type = hdw->desired_stream_type; |
@@ -3274,9 +3232,6 @@ static int pvr2_hdw_commit_execute(struct pvr2_hdw *hdw) | |||
3274 | cptr->info->clear_dirty(cptr); | 3232 | cptr->info->clear_dirty(cptr); |
3275 | } | 3233 | } |
3276 | 3234 | ||
3277 | /* Now execute i2c core update */ | ||
3278 | pvr2_i2c_core_sync(hdw); | ||
3279 | |||
3280 | if ((hdw->pathway_state == PVR2_PATHWAY_ANALOG) && | 3235 | if ((hdw->pathway_state == PVR2_PATHWAY_ANALOG) && |
3281 | hdw->state_encoder_run) { | 3236 | hdw->state_encoder_run) { |
3282 | /* If encoder isn't running or it can't be touched, then | 3237 | /* If encoder isn't running or it can't be touched, then |
@@ -3305,15 +3260,6 @@ int pvr2_hdw_commit_ctl(struct pvr2_hdw *hdw) | |||
3305 | } | 3260 | } |
3306 | 3261 | ||
3307 | 3262 | ||
3308 | static void pvr2_hdw_worker_i2c(struct work_struct *work) | ||
3309 | { | ||
3310 | struct pvr2_hdw *hdw = container_of(work,struct pvr2_hdw,worki2csync); | ||
3311 | LOCK_TAKE(hdw->big_lock); do { | ||
3312 | pvr2_i2c_core_sync(hdw); | ||
3313 | } while (0); LOCK_GIVE(hdw->big_lock); | ||
3314 | } | ||
3315 | |||
3316 | |||
3317 | static void pvr2_hdw_worker_poll(struct work_struct *work) | 3263 | static void pvr2_hdw_worker_poll(struct work_struct *work) |
3318 | { | 3264 | { |
3319 | int fl = 0; | 3265 | int fl = 0; |
@@ -3431,10 +3377,6 @@ void pvr2_hdw_trigger_module_log(struct pvr2_hdw *hdw) | |||
3431 | int nr = pvr2_hdw_get_unit_number(hdw); | 3377 | int nr = pvr2_hdw_get_unit_number(hdw); |
3432 | LOCK_TAKE(hdw->big_lock); do { | 3378 | LOCK_TAKE(hdw->big_lock); do { |
3433 | printk(KERN_INFO "pvrusb2: ================= START STATUS CARD #%d =================\n", nr); | 3379 | printk(KERN_INFO "pvrusb2: ================= START STATUS CARD #%d =================\n", nr); |
3434 | hdw->log_requested = !0; | ||
3435 | pvr2_i2c_core_check_stale(hdw); | ||
3436 | pvr2_i2c_core_sync(hdw); | ||
3437 | hdw->log_requested = 0; | ||
3438 | v4l2_device_call_all(&hdw->v4l2_dev, 0, core, log_status); | 3380 | v4l2_device_call_all(&hdw->v4l2_dev, 0, core, log_status); |
3439 | pvr2_trace(PVR2_TRACE_INFO,"cx2341x config:"); | 3381 | pvr2_trace(PVR2_TRACE_INFO,"cx2341x config:"); |
3440 | cx2341x_log_status(&hdw->enc_ctl_state, "pvrusb2"); | 3382 | cx2341x_log_status(&hdw->enc_ctl_state, "pvrusb2"); |
@@ -4120,16 +4062,6 @@ int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw) | |||
4120 | { | 4062 | { |
4121 | pvr2_trace(PVR2_TRACE_INIT, | 4063 | pvr2_trace(PVR2_TRACE_INIT, |
4122 | "Requesting decoder reset"); | 4064 | "Requesting decoder reset"); |
4123 | if (hdw->decoder_ctrl) { | ||
4124 | if (!hdw->decoder_ctrl->force_reset) { | ||
4125 | pvr2_trace(PVR2_TRACE_INIT, | ||
4126 | "Unable to reset decoder: not implemented"); | ||
4127 | return -ENOTTY; | ||
4128 | } | ||
4129 | hdw->decoder_ctrl->force_reset(hdw->decoder_ctrl->ctxt); | ||
4130 | return 0; | ||
4131 | } else { | ||
4132 | } | ||
4133 | if (hdw->decoder_client_id) { | 4065 | if (hdw->decoder_client_id) { |
4134 | v4l2_device_call_all(&hdw->v4l2_dev, hdw->decoder_client_id, | 4066 | v4l2_device_call_all(&hdw->v4l2_dev, hdw->decoder_client_id, |
4135 | core, reset, 0); | 4067 | core, reset, 0); |
@@ -5138,7 +5070,6 @@ void pvr2_hdw_status_poll(struct pvr2_hdw *hdw) | |||
5138 | struct v4l2_tuner *vtp = &hdw->tuner_signal_info; | 5070 | struct v4l2_tuner *vtp = &hdw->tuner_signal_info; |
5139 | memset(vtp, 0, sizeof(*vtp)); | 5071 | memset(vtp, 0, sizeof(*vtp)); |
5140 | hdw->tuner_signal_stale = 0; | 5072 | hdw->tuner_signal_stale = 0; |
5141 | pvr2_i2c_core_status_poll(hdw); | ||
5142 | /* Note: There apparently is no replacement for VIDIOC_CROPCAP | 5073 | /* Note: There apparently is no replacement for VIDIOC_CROPCAP |
5143 | using v4l2-subdev - therefore we can't support that AT ALL right | 5074 | using v4l2-subdev - therefore we can't support that AT ALL right |
5144 | now. (Of course, no sub-drivers seem to implement it either. | 5075 | now. (Of course, no sub-drivers seem to implement it either. |
@@ -5253,7 +5184,6 @@ int pvr2_hdw_register_access(struct pvr2_hdw *hdw, | |||
5253 | int setFl, u64 *val_ptr) | 5184 | int setFl, u64 *val_ptr) |
5254 | { | 5185 | { |
5255 | #ifdef CONFIG_VIDEO_ADV_DEBUG | 5186 | #ifdef CONFIG_VIDEO_ADV_DEBUG |
5256 | struct pvr2_i2c_client *cp; | ||
5257 | struct v4l2_dbg_register req; | 5187 | struct v4l2_dbg_register req; |
5258 | int stat = 0; | 5188 | int stat = 0; |
5259 | int okFl = 0; | 5189 | int okFl = 0; |
@@ -5266,21 +5196,6 @@ int pvr2_hdw_register_access(struct pvr2_hdw *hdw, | |||
5266 | /* It would be nice to know if a sub-device answered the request */ | 5196 | /* It would be nice to know if a sub-device answered the request */ |
5267 | v4l2_device_call_all(&hdw->v4l2_dev, 0, core, g_register, &req); | 5197 | v4l2_device_call_all(&hdw->v4l2_dev, 0, core, g_register, &req); |
5268 | if (!setFl) *val_ptr = req.val; | 5198 | if (!setFl) *val_ptr = req.val; |
5269 | if (!okFl) mutex_lock(&hdw->i2c_list_lock); do { | ||
5270 | list_for_each_entry(cp, &hdw->i2c_clients, list) { | ||
5271 | if (!v4l2_chip_match_i2c_client( | ||
5272 | cp->client, | ||
5273 | &req.match)) { | ||
5274 | continue; | ||
5275 | } | ||
5276 | stat = pvr2_i2c_client_cmd( | ||
5277 | cp,(setFl ? VIDIOC_DBG_S_REGISTER : | ||
5278 | VIDIOC_DBG_G_REGISTER),&req); | ||
5279 | if (!setFl) *val_ptr = req.val; | ||
5280 | okFl = !0; | ||
5281 | break; | ||
5282 | } | ||
5283 | } while (0); mutex_unlock(&hdw->i2c_list_lock); | ||
5284 | if (okFl) { | 5199 | if (okFl) { |
5285 | return stat; | 5200 | return stat; |
5286 | } | 5201 | } |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-i2c-chips-v4l2.c b/drivers/media/video/pvrusb2/pvrusb2-i2c-chips-v4l2.c deleted file mode 100644 index 7e0628b988cc..000000000000 --- a/drivers/media/video/pvrusb2/pvrusb2-i2c-chips-v4l2.c +++ /dev/null | |||
@@ -1,118 +0,0 @@ | |||
1 | /* | ||
2 | * | ||
3 | * | ||
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/kernel.h> | ||
22 | #include "pvrusb2-i2c-track.h" | ||
23 | #include "pvrusb2-hdw-internal.h" | ||
24 | #include "pvrusb2-debug.h" | ||
25 | #include "pvrusb2-i2c-cmd-v4l2.h" | ||
26 | #include "pvrusb2-audio.h" | ||
27 | #include "pvrusb2-tuner.h" | ||
28 | #include "pvrusb2-video-v4l.h" | ||
29 | #include "pvrusb2-cx2584x-v4l.h" | ||
30 | #include "pvrusb2-wm8775.h" | ||
31 | |||
32 | |||
33 | #define trace_i2c(...) pvr2_trace(PVR2_TRACE_I2C,__VA_ARGS__) | ||
34 | |||
35 | #define OP_INIT 0 /* MUST come first so it is run first */ | ||
36 | #define OP_STANDARD 1 | ||
37 | #define OP_AUDIOMODE 2 | ||
38 | #define OP_BCSH 3 | ||
39 | #define OP_VOLUME 4 | ||
40 | #define OP_FREQ 5 | ||
41 | #define OP_AUDIORATE 6 | ||
42 | #define OP_CROP 7 | ||
43 | #define OP_SIZE 8 | ||
44 | #define OP_LOG 9 | ||
45 | |||
46 | static const struct pvr2_i2c_op * const ops[] = { | ||
47 | [OP_INIT] = &pvr2_i2c_op_v4l2_init, | ||
48 | [OP_STANDARD] = &pvr2_i2c_op_v4l2_standard, | ||
49 | [OP_AUDIOMODE] = &pvr2_i2c_op_v4l2_audiomode, | ||
50 | [OP_BCSH] = &pvr2_i2c_op_v4l2_bcsh, | ||
51 | [OP_VOLUME] = &pvr2_i2c_op_v4l2_volume, | ||
52 | [OP_FREQ] = &pvr2_i2c_op_v4l2_frequency, | ||
53 | [OP_CROP] = &pvr2_i2c_op_v4l2_crop, | ||
54 | [OP_SIZE] = &pvr2_i2c_op_v4l2_size, | ||
55 | [OP_LOG] = &pvr2_i2c_op_v4l2_log, | ||
56 | }; | ||
57 | |||
58 | void pvr2_i2c_probe(struct pvr2_hdw *hdw,struct pvr2_i2c_client *cp) | ||
59 | { | ||
60 | int id; | ||
61 | id = cp->client->driver->id; | ||
62 | cp->ctl_mask = ((1 << OP_INIT) | | ||
63 | (1 << OP_STANDARD) | | ||
64 | (1 << OP_AUDIOMODE) | | ||
65 | (1 << OP_BCSH) | | ||
66 | (1 << OP_VOLUME) | | ||
67 | (1 << OP_FREQ) | | ||
68 | (1 << OP_CROP) | | ||
69 | (1 << OP_SIZE) | | ||
70 | (1 << OP_LOG)); | ||
71 | cp->status_poll = pvr2_v4l2_cmd_status_poll; | ||
72 | |||
73 | if (id == I2C_DRIVERID_MSP3400) { | ||
74 | if (pvr2_i2c_msp3400_setup(hdw,cp)) { | ||
75 | return; | ||
76 | } | ||
77 | } | ||
78 | if (id == I2C_DRIVERID_TUNER) { | ||
79 | if (pvr2_i2c_tuner_setup(hdw,cp)) { | ||
80 | return; | ||
81 | } | ||
82 | } | ||
83 | if (id == I2C_DRIVERID_CX25840) { | ||
84 | if (pvr2_i2c_cx2584x_v4l_setup(hdw,cp)) { | ||
85 | return; | ||
86 | } | ||
87 | } | ||
88 | if (id == I2C_DRIVERID_WM8775) { | ||
89 | if (pvr2_i2c_wm8775_setup(hdw,cp)) { | ||
90 | return; | ||
91 | } | ||
92 | } | ||
93 | if (id == I2C_DRIVERID_SAA711X) { | ||
94 | if (pvr2_i2c_decoder_v4l_setup(hdw,cp)) { | ||
95 | return; | ||
96 | } | ||
97 | } | ||
98 | } | ||
99 | |||
100 | |||
101 | const struct pvr2_i2c_op *pvr2_i2c_get_op(unsigned int idx) | ||
102 | { | ||
103 | if (idx >= ARRAY_SIZE(ops)) | ||
104 | return NULL; | ||
105 | return ops[idx]; | ||
106 | } | ||
107 | |||
108 | |||
109 | |||
110 | /* | ||
111 | Stuff for Emacs to see, in order to encourage consistent editing style: | ||
112 | *** Local Variables: *** | ||
113 | *** mode: c *** | ||
114 | *** fill-column: 75 *** | ||
115 | *** tab-width: 8 *** | ||
116 | *** c-basic-offset: 8 *** | ||
117 | *** End: *** | ||
118 | */ | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-i2c-cmd-v4l2.c b/drivers/media/video/pvrusb2/pvrusb2-i2c-cmd-v4l2.c deleted file mode 100644 index 7afe513bebf9..000000000000 --- a/drivers/media/video/pvrusb2/pvrusb2-i2c-cmd-v4l2.c +++ /dev/null | |||
@@ -1,338 +0,0 @@ | |||
1 | /* | ||
2 | * | ||
3 | * | ||
4 | * Copyright (C) 2005 Mike Isely <isely@pobox.com> | ||
5 | * Copyright (C) 2004 Aurelien Alleaume <slts@free.fr> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #include "pvrusb2-i2c-cmd-v4l2.h" | ||
23 | #include "pvrusb2-hdw-internal.h" | ||
24 | #include "pvrusb2-debug.h" | ||
25 | #include <linux/videodev2.h> | ||
26 | #include <media/v4l2-common.h> | ||
27 | |||
28 | |||
29 | static void execute_init(struct pvr2_hdw *hdw) | ||
30 | { | ||
31 | u32 dummy = 0; | ||
32 | pvr2_trace(PVR2_TRACE_CHIPS, "i2c v4l2 init"); | ||
33 | pvr2_i2c_core_cmd(hdw, VIDIOC_INT_INIT, &dummy); | ||
34 | } | ||
35 | |||
36 | |||
37 | const struct pvr2_i2c_op pvr2_i2c_op_v4l2_init = { | ||
38 | .update = execute_init, | ||
39 | .name = "v4l2_init", | ||
40 | }; | ||
41 | |||
42 | |||
43 | static void set_standard(struct pvr2_hdw *hdw) | ||
44 | { | ||
45 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c v4l2 set_standard"); | ||
46 | |||
47 | if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) { | ||
48 | pvr2_i2c_core_cmd(hdw,AUDC_SET_RADIO,NULL); | ||
49 | } else { | ||
50 | v4l2_std_id vs; | ||
51 | vs = hdw->std_mask_cur; | ||
52 | pvr2_i2c_core_cmd(hdw,VIDIOC_S_STD,&vs); | ||
53 | } | ||
54 | hdw->tuner_signal_stale = !0; | ||
55 | hdw->cropcap_stale = !0; | ||
56 | } | ||
57 | |||
58 | |||
59 | static int check_standard(struct pvr2_hdw *hdw) | ||
60 | { | ||
61 | return (hdw->input_dirty != 0) || (hdw->std_dirty != 0); | ||
62 | } | ||
63 | |||
64 | |||
65 | const struct pvr2_i2c_op pvr2_i2c_op_v4l2_standard = { | ||
66 | .check = check_standard, | ||
67 | .update = set_standard, | ||
68 | .name = "v4l2_standard", | ||
69 | }; | ||
70 | |||
71 | |||
72 | static void set_bcsh(struct pvr2_hdw *hdw) | ||
73 | { | ||
74 | struct v4l2_control ctrl; | ||
75 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c v4l2 set_bcsh" | ||
76 | " b=%d c=%d s=%d h=%d", | ||
77 | hdw->brightness_val,hdw->contrast_val, | ||
78 | hdw->saturation_val,hdw->hue_val); | ||
79 | memset(&ctrl,0,sizeof(ctrl)); | ||
80 | ctrl.id = V4L2_CID_BRIGHTNESS; | ||
81 | ctrl.value = hdw->brightness_val; | ||
82 | pvr2_i2c_core_cmd(hdw,VIDIOC_S_CTRL,&ctrl); | ||
83 | ctrl.id = V4L2_CID_CONTRAST; | ||
84 | ctrl.value = hdw->contrast_val; | ||
85 | pvr2_i2c_core_cmd(hdw,VIDIOC_S_CTRL,&ctrl); | ||
86 | ctrl.id = V4L2_CID_SATURATION; | ||
87 | ctrl.value = hdw->saturation_val; | ||
88 | pvr2_i2c_core_cmd(hdw,VIDIOC_S_CTRL,&ctrl); | ||
89 | ctrl.id = V4L2_CID_HUE; | ||
90 | ctrl.value = hdw->hue_val; | ||
91 | pvr2_i2c_core_cmd(hdw,VIDIOC_S_CTRL,&ctrl); | ||
92 | } | ||
93 | |||
94 | |||
95 | static int check_bcsh(struct pvr2_hdw *hdw) | ||
96 | { | ||
97 | return (hdw->brightness_dirty || | ||
98 | hdw->contrast_dirty || | ||
99 | hdw->saturation_dirty || | ||
100 | hdw->hue_dirty); | ||
101 | } | ||
102 | |||
103 | |||
104 | const struct pvr2_i2c_op pvr2_i2c_op_v4l2_bcsh = { | ||
105 | .check = check_bcsh, | ||
106 | .update = set_bcsh, | ||
107 | .name = "v4l2_bcsh", | ||
108 | }; | ||
109 | |||
110 | |||
111 | static void set_volume(struct pvr2_hdw *hdw) | ||
112 | { | ||
113 | struct v4l2_control ctrl; | ||
114 | pvr2_trace(PVR2_TRACE_CHIPS, | ||
115 | "i2c v4l2 set_volume" | ||
116 | "(vol=%d bal=%d bas=%d treb=%d mute=%d)", | ||
117 | hdw->volume_val, | ||
118 | hdw->balance_val, | ||
119 | hdw->bass_val, | ||
120 | hdw->treble_val, | ||
121 | hdw->mute_val); | ||
122 | memset(&ctrl,0,sizeof(ctrl)); | ||
123 | ctrl.id = V4L2_CID_AUDIO_MUTE; | ||
124 | ctrl.value = hdw->mute_val ? 1 : 0; | ||
125 | pvr2_i2c_core_cmd(hdw,VIDIOC_S_CTRL,&ctrl); | ||
126 | ctrl.id = V4L2_CID_AUDIO_VOLUME; | ||
127 | ctrl.value = hdw->volume_val; | ||
128 | pvr2_i2c_core_cmd(hdw,VIDIOC_S_CTRL,&ctrl); | ||
129 | ctrl.id = V4L2_CID_AUDIO_BALANCE; | ||
130 | ctrl.value = hdw->balance_val; | ||
131 | pvr2_i2c_core_cmd(hdw,VIDIOC_S_CTRL,&ctrl); | ||
132 | ctrl.id = V4L2_CID_AUDIO_BASS; | ||
133 | ctrl.value = hdw->bass_val; | ||
134 | pvr2_i2c_core_cmd(hdw,VIDIOC_S_CTRL,&ctrl); | ||
135 | ctrl.id = V4L2_CID_AUDIO_TREBLE; | ||
136 | ctrl.value = hdw->treble_val; | ||
137 | pvr2_i2c_core_cmd(hdw,VIDIOC_S_CTRL,&ctrl); | ||
138 | } | ||
139 | |||
140 | |||
141 | static int check_volume(struct pvr2_hdw *hdw) | ||
142 | { | ||
143 | return (hdw->volume_dirty || | ||
144 | hdw->balance_dirty || | ||
145 | hdw->bass_dirty || | ||
146 | hdw->treble_dirty || | ||
147 | hdw->mute_dirty); | ||
148 | } | ||
149 | |||
150 | |||
151 | const struct pvr2_i2c_op pvr2_i2c_op_v4l2_volume = { | ||
152 | .check = check_volume, | ||
153 | .update = set_volume, | ||
154 | .name = "v4l2_volume", | ||
155 | }; | ||
156 | |||
157 | |||
158 | static void set_audiomode(struct pvr2_hdw *hdw) | ||
159 | { | ||
160 | struct v4l2_tuner vt; | ||
161 | memset(&vt,0,sizeof(vt)); | ||
162 | vt.audmode = hdw->audiomode_val; | ||
163 | pvr2_i2c_core_cmd(hdw,VIDIOC_S_TUNER,&vt); | ||
164 | } | ||
165 | |||
166 | |||
167 | static int check_audiomode(struct pvr2_hdw *hdw) | ||
168 | { | ||
169 | return (hdw->input_dirty || | ||
170 | hdw->audiomode_dirty); | ||
171 | } | ||
172 | |||
173 | |||
174 | const struct pvr2_i2c_op pvr2_i2c_op_v4l2_audiomode = { | ||
175 | .check = check_audiomode, | ||
176 | .update = set_audiomode, | ||
177 | .name = "v4l2_audiomode", | ||
178 | }; | ||
179 | |||
180 | |||
181 | static void set_frequency(struct pvr2_hdw *hdw) | ||
182 | { | ||
183 | unsigned long fv; | ||
184 | struct v4l2_frequency freq; | ||
185 | fv = pvr2_hdw_get_cur_freq(hdw); | ||
186 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c v4l2 set_freq(%lu)",fv); | ||
187 | if (hdw->tuner_signal_stale) { | ||
188 | pvr2_hdw_status_poll(hdw); | ||
189 | } | ||
190 | memset(&freq,0,sizeof(freq)); | ||
191 | if (hdw->tuner_signal_info.capability & V4L2_TUNER_CAP_LOW) { | ||
192 | // ((fv * 1000) / 62500) | ||
193 | freq.frequency = (fv * 2) / 125; | ||
194 | } else { | ||
195 | freq.frequency = fv / 62500; | ||
196 | } | ||
197 | /* tuner-core currently doesn't seem to care about this, but | ||
198 | let's set it anyway for completeness. */ | ||
199 | if (hdw->input_val == PVR2_CVAL_INPUT_RADIO) { | ||
200 | freq.type = V4L2_TUNER_RADIO; | ||
201 | } else { | ||
202 | freq.type = V4L2_TUNER_ANALOG_TV; | ||
203 | } | ||
204 | freq.tuner = 0; | ||
205 | pvr2_i2c_core_cmd(hdw,VIDIOC_S_FREQUENCY,&freq); | ||
206 | } | ||
207 | |||
208 | |||
209 | static int check_frequency(struct pvr2_hdw *hdw) | ||
210 | { | ||
211 | return hdw->freqDirty != 0; | ||
212 | } | ||
213 | |||
214 | |||
215 | const struct pvr2_i2c_op pvr2_i2c_op_v4l2_frequency = { | ||
216 | .check = check_frequency, | ||
217 | .update = set_frequency, | ||
218 | .name = "v4l2_freq", | ||
219 | }; | ||
220 | |||
221 | |||
222 | static void set_size(struct pvr2_hdw *hdw) | ||
223 | { | ||
224 | struct v4l2_format fmt; | ||
225 | |||
226 | memset(&fmt,0,sizeof(fmt)); | ||
227 | |||
228 | fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; | ||
229 | fmt.fmt.pix.width = hdw->res_hor_val; | ||
230 | fmt.fmt.pix.height = hdw->res_ver_val; | ||
231 | |||
232 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c v4l2 set_size(%dx%d)", | ||
233 | fmt.fmt.pix.width,fmt.fmt.pix.height); | ||
234 | |||
235 | pvr2_i2c_core_cmd(hdw,VIDIOC_S_FMT,&fmt); | ||
236 | } | ||
237 | |||
238 | |||
239 | static int check_size(struct pvr2_hdw *hdw) | ||
240 | { | ||
241 | return (hdw->res_hor_dirty || hdw->res_ver_dirty); | ||
242 | } | ||
243 | |||
244 | |||
245 | const struct pvr2_i2c_op pvr2_i2c_op_v4l2_size = { | ||
246 | .check = check_size, | ||
247 | .update = set_size, | ||
248 | .name = "v4l2_size", | ||
249 | }; | ||
250 | |||
251 | |||
252 | static void set_crop(struct pvr2_hdw *hdw) | ||
253 | { | ||
254 | struct v4l2_crop crop; | ||
255 | |||
256 | memset(&crop, 0, sizeof crop); | ||
257 | crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; | ||
258 | crop.c.left = hdw->cropl_val; | ||
259 | crop.c.top = hdw->cropt_val; | ||
260 | crop.c.height = hdw->croph_val; | ||
261 | crop.c.width = hdw->cropw_val; | ||
262 | |||
263 | pvr2_trace(PVR2_TRACE_CHIPS, | ||
264 | "i2c v4l2 set_crop crop=%d:%d:%d:%d", | ||
265 | crop.c.width, crop.c.height, crop.c.left, crop.c.top); | ||
266 | |||
267 | pvr2_i2c_core_cmd(hdw, VIDIOC_S_CROP, &crop); | ||
268 | } | ||
269 | |||
270 | static int check_crop(struct pvr2_hdw *hdw) | ||
271 | { | ||
272 | return (hdw->cropl_dirty || hdw->cropt_dirty || | ||
273 | hdw->cropw_dirty || hdw->croph_dirty); | ||
274 | } | ||
275 | |||
276 | const struct pvr2_i2c_op pvr2_i2c_op_v4l2_crop = { | ||
277 | .check = check_crop, | ||
278 | .update = set_crop, | ||
279 | .name = "v4l2_crop", | ||
280 | }; | ||
281 | |||
282 | |||
283 | static void do_log(struct pvr2_hdw *hdw) | ||
284 | { | ||
285 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c v4l2 do_log()"); | ||
286 | pvr2_i2c_core_cmd(hdw,VIDIOC_LOG_STATUS,NULL); | ||
287 | |||
288 | } | ||
289 | |||
290 | |||
291 | static int check_log(struct pvr2_hdw *hdw) | ||
292 | { | ||
293 | return hdw->log_requested != 0; | ||
294 | } | ||
295 | |||
296 | |||
297 | const struct pvr2_i2c_op pvr2_i2c_op_v4l2_log = { | ||
298 | .check = check_log, | ||
299 | .update = do_log, | ||
300 | .name = "v4l2_log", | ||
301 | }; | ||
302 | |||
303 | |||
304 | void pvr2_v4l2_cmd_stream(struct pvr2_i2c_client *cp,int fl) | ||
305 | { | ||
306 | pvr2_i2c_client_cmd(cp, | ||
307 | (fl ? VIDIOC_STREAMON : VIDIOC_STREAMOFF),NULL); | ||
308 | } | ||
309 | |||
310 | |||
311 | void pvr2_v4l2_cmd_status_poll(struct pvr2_i2c_client *cp) | ||
312 | { | ||
313 | int stat; | ||
314 | struct pvr2_hdw *hdw = cp->hdw; | ||
315 | if (hdw->cropcap_stale) { | ||
316 | hdw->cropcap_info.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; | ||
317 | stat = pvr2_i2c_client_cmd(cp, VIDIOC_CROPCAP, | ||
318 | &hdw->cropcap_info); | ||
319 | if (stat == 0) { | ||
320 | /* Check was successful, so the data is no | ||
321 | longer considered stale. */ | ||
322 | hdw->cropcap_stale = 0; | ||
323 | } | ||
324 | } | ||
325 | pvr2_i2c_client_cmd(cp, VIDIOC_G_TUNER, &hdw->tuner_signal_info); | ||
326 | } | ||
327 | |||
328 | |||
329 | |||
330 | /* | ||
331 | Stuff for Emacs to see, in order to encourage consistent editing style: | ||
332 | *** Local Variables: *** | ||
333 | *** mode: c *** | ||
334 | *** fill-column: 70 *** | ||
335 | *** tab-width: 8 *** | ||
336 | *** c-basic-offset: 8 *** | ||
337 | *** End: *** | ||
338 | */ | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-i2c-cmd-v4l2.h b/drivers/media/video/pvrusb2/pvrusb2-i2c-cmd-v4l2.h deleted file mode 100644 index fa42497b40b5..000000000000 --- a/drivers/media/video/pvrusb2/pvrusb2-i2c-cmd-v4l2.h +++ /dev/null | |||
@@ -1,53 +0,0 @@ | |||
1 | /* | ||
2 | * | ||
3 | * | ||
4 | * Copyright (C) 2005 Mike Isely <isely@pobox.com> | ||
5 | * Copyright (C) 2004 Aurelien Alleaume <slts@free.fr> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #ifndef __PVRUSB2_CMD_V4L2_H | ||
23 | #define __PVRUSB2_CMD_V4L2_H | ||
24 | |||
25 | #include "pvrusb2-i2c-track.h" | ||
26 | |||
27 | |||
28 | extern const struct pvr2_i2c_op pvr2_i2c_op_v4l2_init; | ||
29 | extern const struct pvr2_i2c_op pvr2_i2c_op_v4l2_standard; | ||
30 | extern const struct pvr2_i2c_op pvr2_i2c_op_v4l2_radio; | ||
31 | extern const struct pvr2_i2c_op pvr2_i2c_op_v4l2_bcsh; | ||
32 | extern const struct pvr2_i2c_op pvr2_i2c_op_v4l2_volume; | ||
33 | extern const struct pvr2_i2c_op pvr2_i2c_op_v4l2_frequency; | ||
34 | extern const struct pvr2_i2c_op pvr2_i2c_op_v4l2_crop; | ||
35 | extern const struct pvr2_i2c_op pvr2_i2c_op_v4l2_size; | ||
36 | extern const struct pvr2_i2c_op pvr2_i2c_op_v4l2_audiomode; | ||
37 | extern const struct pvr2_i2c_op pvr2_i2c_op_v4l2_log; | ||
38 | |||
39 | void pvr2_v4l2_cmd_stream(struct pvr2_i2c_client *,int); | ||
40 | void pvr2_v4l2_cmd_status_poll(struct pvr2_i2c_client *); | ||
41 | |||
42 | |||
43 | #endif /* __PVRUSB2_CMD_V4L2_H */ | ||
44 | |||
45 | /* | ||
46 | Stuff for Emacs to see, in order to encourage consistent editing style: | ||
47 | *** Local Variables: *** | ||
48 | *** mode: c *** | ||
49 | *** fill-column: 70 *** | ||
50 | *** tab-width: 8 *** | ||
51 | *** c-basic-offset: 8 *** | ||
52 | *** End: *** | ||
53 | */ | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c b/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c index 13d016efc0d1..9464862745fa 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c +++ b/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c | |||
@@ -20,7 +20,6 @@ | |||
20 | 20 | ||
21 | #include <linux/i2c.h> | 21 | #include <linux/i2c.h> |
22 | #include "pvrusb2-i2c-core.h" | 22 | #include "pvrusb2-i2c-core.h" |
23 | #include "pvrusb2-i2c-track.h" | ||
24 | #include "pvrusb2-hdw-internal.h" | 23 | #include "pvrusb2-hdw-internal.h" |
25 | #include "pvrusb2-debug.h" | 24 | #include "pvrusb2-debug.h" |
26 | #include "pvrusb2-fx2-cmd.h" | 25 | #include "pvrusb2-fx2-cmd.h" |
@@ -523,13 +522,11 @@ static u32 pvr2_i2c_functionality(struct i2c_adapter *adap) | |||
523 | 522 | ||
524 | static int pvr2_i2c_attach_inform(struct i2c_client *client) | 523 | static int pvr2_i2c_attach_inform(struct i2c_client *client) |
525 | { | 524 | { |
526 | pvr2_i2c_track_attach_inform(client); | ||
527 | return 0; | 525 | return 0; |
528 | } | 526 | } |
529 | 527 | ||
530 | static int pvr2_i2c_detach_inform(struct i2c_client *client) | 528 | static int pvr2_i2c_detach_inform(struct i2c_client *client) |
531 | { | 529 | { |
532 | pvr2_i2c_track_detach_inform(client); | ||
533 | return 0; | 530 | return 0; |
534 | } | 531 | } |
535 | 532 | ||
@@ -607,7 +604,6 @@ void pvr2_i2c_core_init(struct pvr2_hdw *hdw) | |||
607 | hdw->i2c_adap.dev.parent = &hdw->usb_dev->dev; | 604 | hdw->i2c_adap.dev.parent = &hdw->usb_dev->dev; |
608 | hdw->i2c_adap.algo = &hdw->i2c_algo; | 605 | hdw->i2c_adap.algo = &hdw->i2c_algo; |
609 | hdw->i2c_adap.algo_data = hdw; | 606 | hdw->i2c_adap.algo_data = hdw; |
610 | hdw->i2c_adap.class = I2C_CLASS_TV_ANALOG; | ||
611 | hdw->i2c_linked = !0; | 607 | hdw->i2c_linked = !0; |
612 | i2c_set_adapdata(&hdw->i2c_adap, &hdw->v4l2_dev); | 608 | i2c_set_adapdata(&hdw->i2c_adap, &hdw->v4l2_dev); |
613 | i2c_add_adapter(&hdw->i2c_adap); | 609 | i2c_add_adapter(&hdw->i2c_adap); |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-i2c-track.c b/drivers/media/video/pvrusb2/pvrusb2-i2c-track.c deleted file mode 100644 index d0682c13b02a..000000000000 --- a/drivers/media/video/pvrusb2/pvrusb2-i2c-track.c +++ /dev/null | |||
@@ -1,503 +0,0 @@ | |||
1 | /* | ||
2 | * | ||
3 | * | ||
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 "pvrusb2-i2c-track.h" | ||
22 | #include "pvrusb2-hdw-internal.h" | ||
23 | #include "pvrusb2-debug.h" | ||
24 | #include "pvrusb2-fx2-cmd.h" | ||
25 | #include "pvrusb2.h" | ||
26 | |||
27 | #define trace_i2c(...) pvr2_trace(PVR2_TRACE_I2C,__VA_ARGS__) | ||
28 | |||
29 | |||
30 | /* | ||
31 | |||
32 | This module implements the foundation of a rather large architecture for | ||
33 | tracking state in all the various V4L I2C modules. This is obsolete with | ||
34 | kernels later than roughly 2.6.24, but it is still present in the | ||
35 | standalone pvrusb2 driver to allow continued operation with older | ||
36 | kernel. | ||
37 | |||
38 | */ | ||
39 | |||
40 | static unsigned int pvr2_i2c_client_describe(struct pvr2_i2c_client *cp, | ||
41 | unsigned int detail, | ||
42 | char *buf,unsigned int maxlen); | ||
43 | |||
44 | static int pvr2_i2c_core_singleton(struct i2c_client *cp, | ||
45 | unsigned int cmd,void *arg) | ||
46 | { | ||
47 | int stat; | ||
48 | if (!cp) return -EINVAL; | ||
49 | if (!(cp->driver)) return -EINVAL; | ||
50 | if (!(cp->driver->command)) return -EINVAL; | ||
51 | if (!try_module_get(cp->driver->driver.owner)) return -EAGAIN; | ||
52 | stat = cp->driver->command(cp,cmd,arg); | ||
53 | module_put(cp->driver->driver.owner); | ||
54 | return stat; | ||
55 | } | ||
56 | |||
57 | int pvr2_i2c_client_cmd(struct pvr2_i2c_client *cp,unsigned int cmd,void *arg) | ||
58 | { | ||
59 | int stat; | ||
60 | if (pvrusb2_debug & PVR2_TRACE_I2C_CMD) { | ||
61 | char buf[100]; | ||
62 | unsigned int cnt; | ||
63 | cnt = pvr2_i2c_client_describe(cp,PVR2_I2C_DETAIL_DEBUG, | ||
64 | buf,sizeof(buf)); | ||
65 | pvr2_trace(PVR2_TRACE_I2C_CMD, | ||
66 | "i2c COMMAND (code=%u 0x%x) to %.*s", | ||
67 | cmd,cmd,cnt,buf); | ||
68 | } | ||
69 | stat = pvr2_i2c_core_singleton(cp->client,cmd,arg); | ||
70 | if (pvrusb2_debug & PVR2_TRACE_I2C_CMD) { | ||
71 | char buf[100]; | ||
72 | unsigned int cnt; | ||
73 | cnt = pvr2_i2c_client_describe(cp,PVR2_I2C_DETAIL_DEBUG, | ||
74 | buf,sizeof(buf)); | ||
75 | pvr2_trace(PVR2_TRACE_I2C_CMD, | ||
76 | "i2c COMMAND to %.*s (ret=%d)",cnt,buf,stat); | ||
77 | } | ||
78 | return stat; | ||
79 | } | ||
80 | |||
81 | int pvr2_i2c_core_cmd(struct pvr2_hdw *hdw,unsigned int cmd,void *arg) | ||
82 | { | ||
83 | struct pvr2_i2c_client *cp, *ncp; | ||
84 | int stat = -EINVAL; | ||
85 | |||
86 | if (!hdw) return stat; | ||
87 | |||
88 | mutex_lock(&hdw->i2c_list_lock); | ||
89 | list_for_each_entry_safe(cp, ncp, &hdw->i2c_clients, list) { | ||
90 | if (!cp->recv_enable) continue; | ||
91 | mutex_unlock(&hdw->i2c_list_lock); | ||
92 | stat = pvr2_i2c_client_cmd(cp,cmd,arg); | ||
93 | mutex_lock(&hdw->i2c_list_lock); | ||
94 | } | ||
95 | mutex_unlock(&hdw->i2c_list_lock); | ||
96 | return stat; | ||
97 | } | ||
98 | |||
99 | |||
100 | static int handler_check(struct pvr2_i2c_client *cp) | ||
101 | { | ||
102 | struct pvr2_i2c_handler *hp = cp->handler; | ||
103 | if (!hp) return 0; | ||
104 | if (!hp->func_table->check) return 0; | ||
105 | return hp->func_table->check(hp->func_data) != 0; | ||
106 | } | ||
107 | |||
108 | #define BUFSIZE 500 | ||
109 | |||
110 | |||
111 | void pvr2_i2c_core_status_poll(struct pvr2_hdw *hdw) | ||
112 | { | ||
113 | struct pvr2_i2c_client *cp; | ||
114 | mutex_lock(&hdw->i2c_list_lock); do { | ||
115 | list_for_each_entry(cp, &hdw->i2c_clients, list) { | ||
116 | if (!cp->detected_flag) continue; | ||
117 | if (!cp->status_poll) continue; | ||
118 | cp->status_poll(cp); | ||
119 | } | ||
120 | } while (0); mutex_unlock(&hdw->i2c_list_lock); | ||
121 | } | ||
122 | |||
123 | |||
124 | /* Issue various I2C operations to bring chip-level drivers into sync with | ||
125 | state stored in this driver. */ | ||
126 | void pvr2_i2c_core_sync(struct pvr2_hdw *hdw) | ||
127 | { | ||
128 | unsigned long msk; | ||
129 | unsigned int idx; | ||
130 | struct pvr2_i2c_client *cp, *ncp; | ||
131 | |||
132 | if (!hdw->i2c_linked) return; | ||
133 | if (!(hdw->i2c_pend_types & PVR2_I2C_PEND_ALL)) { | ||
134 | return; | ||
135 | } | ||
136 | mutex_lock(&hdw->i2c_list_lock); do { | ||
137 | pvr2_trace(PVR2_TRACE_I2C_CORE,"i2c: core_sync BEGIN"); | ||
138 | if (hdw->i2c_pend_types & PVR2_I2C_PEND_DETECT) { | ||
139 | /* One or more I2C clients have attached since we | ||
140 | last synced. So scan the list and identify the | ||
141 | new clients. */ | ||
142 | char *buf; | ||
143 | unsigned int cnt; | ||
144 | unsigned long amask = 0; | ||
145 | buf = kmalloc(BUFSIZE,GFP_KERNEL); | ||
146 | pvr2_trace(PVR2_TRACE_I2C_CORE,"i2c: PEND_DETECT"); | ||
147 | hdw->i2c_pend_types &= ~PVR2_I2C_PEND_DETECT; | ||
148 | list_for_each_entry(cp, &hdw->i2c_clients, list) { | ||
149 | if (!cp->detected_flag) { | ||
150 | cp->ctl_mask = 0; | ||
151 | pvr2_i2c_probe(hdw,cp); | ||
152 | cp->detected_flag = !0; | ||
153 | msk = cp->ctl_mask; | ||
154 | cnt = 0; | ||
155 | if (buf) { | ||
156 | cnt = pvr2_i2c_client_describe( | ||
157 | cp, | ||
158 | PVR2_I2C_DETAIL_ALL, | ||
159 | buf,BUFSIZE); | ||
160 | } | ||
161 | trace_i2c("Probed: %.*s",cnt,buf); | ||
162 | if (handler_check(cp)) { | ||
163 | hdw->i2c_pend_types |= | ||
164 | PVR2_I2C_PEND_CLIENT; | ||
165 | } | ||
166 | cp->pend_mask = msk; | ||
167 | hdw->i2c_pend_mask |= msk; | ||
168 | hdw->i2c_pend_types |= | ||
169 | PVR2_I2C_PEND_REFRESH; | ||
170 | } | ||
171 | amask |= cp->ctl_mask; | ||
172 | } | ||
173 | hdw->i2c_active_mask = amask; | ||
174 | if (buf) kfree(buf); | ||
175 | } | ||
176 | if (hdw->i2c_pend_types & PVR2_I2C_PEND_STALE) { | ||
177 | /* Need to do one or more global updates. Arrange | ||
178 | for this to happen. */ | ||
179 | unsigned long m2; | ||
180 | pvr2_trace(PVR2_TRACE_I2C_CORE, | ||
181 | "i2c: PEND_STALE (0x%lx)", | ||
182 | hdw->i2c_stale_mask); | ||
183 | hdw->i2c_pend_types &= ~PVR2_I2C_PEND_STALE; | ||
184 | list_for_each_entry(cp, &hdw->i2c_clients, list) { | ||
185 | m2 = hdw->i2c_stale_mask; | ||
186 | m2 &= cp->ctl_mask; | ||
187 | m2 &= ~cp->pend_mask; | ||
188 | if (m2) { | ||
189 | pvr2_trace(PVR2_TRACE_I2C_CORE, | ||
190 | "i2c: cp=%p setting 0x%lx", | ||
191 | cp,m2); | ||
192 | cp->pend_mask |= m2; | ||
193 | } | ||
194 | } | ||
195 | hdw->i2c_pend_mask |= hdw->i2c_stale_mask; | ||
196 | hdw->i2c_stale_mask = 0; | ||
197 | hdw->i2c_pend_types |= PVR2_I2C_PEND_REFRESH; | ||
198 | } | ||
199 | if (hdw->i2c_pend_types & PVR2_I2C_PEND_CLIENT) { | ||
200 | /* One or more client handlers are asking for an | ||
201 | update. Run through the list of known clients | ||
202 | and update each one. */ | ||
203 | pvr2_trace(PVR2_TRACE_I2C_CORE,"i2c: PEND_CLIENT"); | ||
204 | hdw->i2c_pend_types &= ~PVR2_I2C_PEND_CLIENT; | ||
205 | list_for_each_entry_safe(cp, ncp, &hdw->i2c_clients, | ||
206 | list) { | ||
207 | if (!cp->handler) continue; | ||
208 | if (!cp->handler->func_table->update) continue; | ||
209 | pvr2_trace(PVR2_TRACE_I2C_CORE, | ||
210 | "i2c: cp=%p update",cp); | ||
211 | mutex_unlock(&hdw->i2c_list_lock); | ||
212 | cp->handler->func_table->update( | ||
213 | cp->handler->func_data); | ||
214 | mutex_lock(&hdw->i2c_list_lock); | ||
215 | /* If client's update function set some | ||
216 | additional pending bits, account for that | ||
217 | here. */ | ||
218 | if (cp->pend_mask & ~hdw->i2c_pend_mask) { | ||
219 | hdw->i2c_pend_mask |= cp->pend_mask; | ||
220 | hdw->i2c_pend_types |= | ||
221 | PVR2_I2C_PEND_REFRESH; | ||
222 | } | ||
223 | } | ||
224 | } | ||
225 | if (hdw->i2c_pend_types & PVR2_I2C_PEND_REFRESH) { | ||
226 | const struct pvr2_i2c_op *opf; | ||
227 | unsigned long pm; | ||
228 | /* Some actual updates are pending. Walk through | ||
229 | each update type and perform it. */ | ||
230 | pvr2_trace(PVR2_TRACE_I2C_CORE,"i2c: PEND_REFRESH" | ||
231 | " (0x%lx)",hdw->i2c_pend_mask); | ||
232 | hdw->i2c_pend_types &= ~PVR2_I2C_PEND_REFRESH; | ||
233 | pm = hdw->i2c_pend_mask; | ||
234 | hdw->i2c_pend_mask = 0; | ||
235 | for (idx = 0, msk = 1; pm; idx++, msk <<= 1) { | ||
236 | if (!(pm & msk)) continue; | ||
237 | pm &= ~msk; | ||
238 | list_for_each_entry(cp, &hdw->i2c_clients, | ||
239 | list) { | ||
240 | if (cp->pend_mask & msk) { | ||
241 | cp->pend_mask &= ~msk; | ||
242 | cp->recv_enable = !0; | ||
243 | } else { | ||
244 | cp->recv_enable = 0; | ||
245 | } | ||
246 | } | ||
247 | opf = pvr2_i2c_get_op(idx); | ||
248 | if (!opf) continue; | ||
249 | mutex_unlock(&hdw->i2c_list_lock); | ||
250 | opf->update(hdw); | ||
251 | mutex_lock(&hdw->i2c_list_lock); | ||
252 | } | ||
253 | } | ||
254 | pvr2_trace(PVR2_TRACE_I2C_CORE,"i2c: core_sync END"); | ||
255 | } while (0); mutex_unlock(&hdw->i2c_list_lock); | ||
256 | } | ||
257 | |||
258 | int pvr2_i2c_core_check_stale(struct pvr2_hdw *hdw) | ||
259 | { | ||
260 | unsigned long msk,sm,pm; | ||
261 | unsigned int idx; | ||
262 | const struct pvr2_i2c_op *opf; | ||
263 | struct pvr2_i2c_client *cp; | ||
264 | unsigned int pt = 0; | ||
265 | |||
266 | pvr2_trace(PVR2_TRACE_I2C_CORE,"pvr2_i2c_core_check_stale BEGIN"); | ||
267 | |||
268 | pm = hdw->i2c_active_mask; | ||
269 | sm = 0; | ||
270 | for (idx = 0, msk = 1; pm; idx++, msk <<= 1) { | ||
271 | if (!(msk & pm)) continue; | ||
272 | pm &= ~msk; | ||
273 | opf = pvr2_i2c_get_op(idx); | ||
274 | if (!(opf && opf->check)) continue; | ||
275 | if (opf->check(hdw)) { | ||
276 | sm |= msk; | ||
277 | } | ||
278 | } | ||
279 | if (sm) pt |= PVR2_I2C_PEND_STALE; | ||
280 | |||
281 | list_for_each_entry(cp, &hdw->i2c_clients, list) | ||
282 | if (handler_check(cp)) | ||
283 | pt |= PVR2_I2C_PEND_CLIENT; | ||
284 | |||
285 | if (pt) { | ||
286 | mutex_lock(&hdw->i2c_list_lock); do { | ||
287 | hdw->i2c_pend_types |= pt; | ||
288 | hdw->i2c_stale_mask |= sm; | ||
289 | hdw->i2c_pend_mask |= hdw->i2c_stale_mask; | ||
290 | } while (0); mutex_unlock(&hdw->i2c_list_lock); | ||
291 | } | ||
292 | |||
293 | pvr2_trace(PVR2_TRACE_I2C_CORE, | ||
294 | "i2c: types=0x%x stale=0x%lx pend=0x%lx", | ||
295 | hdw->i2c_pend_types, | ||
296 | hdw->i2c_stale_mask, | ||
297 | hdw->i2c_pend_mask); | ||
298 | pvr2_trace(PVR2_TRACE_I2C_CORE,"pvr2_i2c_core_check_stale END"); | ||
299 | |||
300 | return (hdw->i2c_pend_types & PVR2_I2C_PEND_ALL) != 0; | ||
301 | } | ||
302 | |||
303 | static unsigned int pvr2_i2c_client_describe(struct pvr2_i2c_client *cp, | ||
304 | unsigned int detail, | ||
305 | char *buf,unsigned int maxlen) | ||
306 | { | ||
307 | unsigned int ccnt,bcnt; | ||
308 | int spcfl = 0; | ||
309 | const struct pvr2_i2c_op *opf; | ||
310 | |||
311 | ccnt = 0; | ||
312 | if (detail & PVR2_I2C_DETAIL_DEBUG) { | ||
313 | bcnt = scnprintf(buf,maxlen, | ||
314 | "ctxt=%p ctl_mask=0x%lx", | ||
315 | cp,cp->ctl_mask); | ||
316 | ccnt += bcnt; buf += bcnt; maxlen -= bcnt; | ||
317 | spcfl = !0; | ||
318 | } | ||
319 | bcnt = scnprintf(buf,maxlen, | ||
320 | "%s%s @ 0x%x", | ||
321 | (spcfl ? " " : ""), | ||
322 | cp->client->name, | ||
323 | cp->client->addr); | ||
324 | ccnt += bcnt; buf += bcnt; maxlen -= bcnt; | ||
325 | if ((detail & PVR2_I2C_DETAIL_HANDLER) && | ||
326 | cp->handler && cp->handler->func_table->describe) { | ||
327 | bcnt = scnprintf(buf,maxlen," ("); | ||
328 | ccnt += bcnt; buf += bcnt; maxlen -= bcnt; | ||
329 | bcnt = cp->handler->func_table->describe( | ||
330 | cp->handler->func_data,buf,maxlen); | ||
331 | ccnt += bcnt; buf += bcnt; maxlen -= bcnt; | ||
332 | bcnt = scnprintf(buf,maxlen,")"); | ||
333 | ccnt += bcnt; buf += bcnt; maxlen -= bcnt; | ||
334 | } | ||
335 | if ((detail & PVR2_I2C_DETAIL_CTLMASK) && cp->ctl_mask) { | ||
336 | unsigned int idx; | ||
337 | unsigned long msk,sm; | ||
338 | |||
339 | bcnt = scnprintf(buf,maxlen," ["); | ||
340 | ccnt += bcnt; buf += bcnt; maxlen -= bcnt; | ||
341 | sm = 0; | ||
342 | spcfl = 0; | ||
343 | for (idx = 0, msk = 1; msk; idx++, msk <<= 1) { | ||
344 | if (!(cp->ctl_mask & msk)) continue; | ||
345 | opf = pvr2_i2c_get_op(idx); | ||
346 | if (opf) { | ||
347 | bcnt = scnprintf(buf,maxlen,"%s%s", | ||
348 | spcfl ? " " : "", | ||
349 | opf->name); | ||
350 | ccnt += bcnt; buf += bcnt; maxlen -= bcnt; | ||
351 | spcfl = !0; | ||
352 | } else { | ||
353 | sm |= msk; | ||
354 | } | ||
355 | } | ||
356 | if (sm) { | ||
357 | bcnt = scnprintf(buf,maxlen,"%s%lx", | ||
358 | idx != 0 ? " " : "",sm); | ||
359 | ccnt += bcnt; buf += bcnt; maxlen -= bcnt; | ||
360 | } | ||
361 | bcnt = scnprintf(buf,maxlen,"]"); | ||
362 | ccnt += bcnt; buf += bcnt; maxlen -= bcnt; | ||
363 | } | ||
364 | return ccnt; | ||
365 | } | ||
366 | |||
367 | unsigned int pvr2_i2c_report(struct pvr2_hdw *hdw, | ||
368 | char *buf,unsigned int maxlen) | ||
369 | { | ||
370 | unsigned int ccnt,bcnt; | ||
371 | struct pvr2_i2c_client *cp; | ||
372 | ccnt = 0; | ||
373 | mutex_lock(&hdw->i2c_list_lock); do { | ||
374 | list_for_each_entry(cp, &hdw->i2c_clients, list) { | ||
375 | bcnt = pvr2_i2c_client_describe( | ||
376 | cp, | ||
377 | (PVR2_I2C_DETAIL_HANDLER| | ||
378 | PVR2_I2C_DETAIL_CTLMASK), | ||
379 | buf,maxlen); | ||
380 | ccnt += bcnt; buf += bcnt; maxlen -= bcnt; | ||
381 | bcnt = scnprintf(buf,maxlen,"\n"); | ||
382 | ccnt += bcnt; buf += bcnt; maxlen -= bcnt; | ||
383 | } | ||
384 | } while (0); mutex_unlock(&hdw->i2c_list_lock); | ||
385 | return ccnt; | ||
386 | } | ||
387 | |||
388 | void pvr2_i2c_track_attach_inform(struct i2c_client *client) | ||
389 | { | ||
390 | struct pvr2_hdw *hdw = (struct pvr2_hdw *)(client->adapter->algo_data); | ||
391 | struct pvr2_i2c_client *cp; | ||
392 | int fl = !(hdw->i2c_pend_types & PVR2_I2C_PEND_ALL); | ||
393 | cp = kzalloc(sizeof(*cp),GFP_KERNEL); | ||
394 | trace_i2c("i2c_attach [client=%s @ 0x%x ctxt=%p]", | ||
395 | client->name, | ||
396 | client->addr,cp); | ||
397 | if (!cp) { | ||
398 | pvr2_trace(PVR2_TRACE_ERROR_LEGS, | ||
399 | "Unable to allocate tracking memory for incoming" | ||
400 | " i2c module; ignoring module. This is likely" | ||
401 | " going to be a problem."); | ||
402 | return; | ||
403 | } | ||
404 | cp->hdw = hdw; | ||
405 | INIT_LIST_HEAD(&cp->list); | ||
406 | cp->client = client; | ||
407 | mutex_lock(&hdw->i2c_list_lock); do { | ||
408 | hdw->cropcap_stale = !0; | ||
409 | list_add_tail(&cp->list,&hdw->i2c_clients); | ||
410 | hdw->i2c_pend_types |= PVR2_I2C_PEND_DETECT; | ||
411 | } while (0); mutex_unlock(&hdw->i2c_list_lock); | ||
412 | if (fl) queue_work(hdw->workqueue,&hdw->worki2csync); | ||
413 | } | ||
414 | |||
415 | static void pvr2_i2c_client_disconnect(struct pvr2_i2c_client *cp) | ||
416 | { | ||
417 | if (cp->handler && cp->handler->func_table->detach) { | ||
418 | cp->handler->func_table->detach(cp->handler->func_data); | ||
419 | } | ||
420 | list_del(&cp->list); | ||
421 | kfree(cp); | ||
422 | } | ||
423 | |||
424 | void pvr2_i2c_track_detach_inform(struct i2c_client *client) | ||
425 | { | ||
426 | struct pvr2_hdw *hdw = (struct pvr2_hdw *)(client->adapter->algo_data); | ||
427 | struct pvr2_i2c_client *cp, *ncp; | ||
428 | unsigned long amask = 0; | ||
429 | int foundfl = 0; | ||
430 | mutex_lock(&hdw->i2c_list_lock); | ||
431 | hdw->cropcap_stale = !0; | ||
432 | list_for_each_entry_safe(cp, ncp, &hdw->i2c_clients, list) { | ||
433 | if (cp->client == client) { | ||
434 | trace_i2c("pvr2_i2c_detach" | ||
435 | " [client=%s @ 0x%x ctxt=%p]", | ||
436 | client->name, | ||
437 | client->addr, cp); | ||
438 | pvr2_i2c_client_disconnect(cp); | ||
439 | foundfl = !0; | ||
440 | continue; | ||
441 | } | ||
442 | amask |= cp->ctl_mask; | ||
443 | } | ||
444 | hdw->i2c_active_mask = amask; | ||
445 | mutex_unlock(&hdw->i2c_list_lock); | ||
446 | if (!foundfl) { | ||
447 | trace_i2c("pvr2_i2c_detach [client=%s @ 0x%x ctxt=<unknown>]", | ||
448 | client->name, client->addr); | ||
449 | } | ||
450 | } | ||
451 | |||
452 | /* This function is used to remove an i2c client from our tracking | ||
453 | structure if the client happens to be the specified v4l2 sub-device. | ||
454 | The idea here is to ensure that sub-devices are not also tracked with | ||
455 | the old tracking mechanism - it's one or the other not both. This is | ||
456 | only for debugging. In a "real" environment, only one of these two | ||
457 | mechanisms should even be compiled in. But by enabling both we can | ||
458 | incrementally test control of each sub-device. */ | ||
459 | void pvr2_i2c_untrack_subdev(struct pvr2_hdw *hdw, struct v4l2_subdev *sd) | ||
460 | { | ||
461 | struct i2c_client *client; | ||
462 | struct pvr2_i2c_client *cp, *ncp; | ||
463 | unsigned long amask = 0; | ||
464 | mutex_lock(&hdw->i2c_list_lock); | ||
465 | list_for_each_entry_safe(cp, ncp, &hdw->i2c_clients, list) { | ||
466 | client = cp->client; | ||
467 | if (i2c_get_clientdata(client) == sd) { | ||
468 | trace_i2c("pvr2_i2c_detach (subdev active)" | ||
469 | " [client=%s @ 0x%x ctxt=%p]", | ||
470 | client->name, client->addr, cp); | ||
471 | pvr2_i2c_client_disconnect(cp); | ||
472 | continue; | ||
473 | } | ||
474 | amask |= cp->ctl_mask; | ||
475 | } | ||
476 | hdw->i2c_active_mask = amask; | ||
477 | mutex_unlock(&hdw->i2c_list_lock); | ||
478 | } | ||
479 | |||
480 | void pvr2_i2c_track_init(struct pvr2_hdw *hdw) | ||
481 | { | ||
482 | hdw->i2c_pend_mask = 0; | ||
483 | hdw->i2c_stale_mask = 0; | ||
484 | hdw->i2c_active_mask = 0; | ||
485 | INIT_LIST_HEAD(&hdw->i2c_clients); | ||
486 | mutex_init(&hdw->i2c_list_lock); | ||
487 | } | ||
488 | |||
489 | void pvr2_i2c_track_done(struct pvr2_hdw *hdw) | ||
490 | { | ||
491 | /* Empty for now */ | ||
492 | } | ||
493 | |||
494 | |||
495 | /* | ||
496 | Stuff for Emacs to see, in order to encourage consistent editing style: | ||
497 | *** Local Variables: *** | ||
498 | *** mode: c *** | ||
499 | *** fill-column: 75 *** | ||
500 | *** tab-width: 8 *** | ||
501 | *** c-basic-offset: 8 *** | ||
502 | *** End: *** | ||
503 | */ | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-i2c-track.h b/drivers/media/video/pvrusb2/pvrusb2-i2c-track.h deleted file mode 100644 index eba48e4c9585..000000000000 --- a/drivers/media/video/pvrusb2/pvrusb2-i2c-track.h +++ /dev/null | |||
@@ -1,102 +0,0 @@ | |||
1 | /* | ||
2 | * | ||
3 | * | ||
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 | #ifndef __PVRUSB2_I2C_TRACK_H | ||
21 | #define __PVRUSB2_I2C_TRACK_H | ||
22 | |||
23 | #include <linux/list.h> | ||
24 | #include <linux/i2c.h> | ||
25 | #include <media/v4l2-device.h> | ||
26 | |||
27 | |||
28 | struct pvr2_hdw; | ||
29 | struct pvr2_i2c_client; | ||
30 | struct pvr2_i2c_handler; | ||
31 | struct pvr2_i2c_handler_functions; | ||
32 | struct pvr2_i2c_op; | ||
33 | struct pvr2_i2c_op_functions; | ||
34 | |||
35 | struct pvr2_i2c_client { | ||
36 | struct i2c_client *client; | ||
37 | struct pvr2_i2c_handler *handler; | ||
38 | struct list_head list; | ||
39 | struct pvr2_hdw *hdw; | ||
40 | int detected_flag; | ||
41 | int recv_enable; | ||
42 | unsigned long pend_mask; | ||
43 | unsigned long ctl_mask; | ||
44 | void (*status_poll)(struct pvr2_i2c_client *); | ||
45 | }; | ||
46 | |||
47 | struct pvr2_i2c_handler { | ||
48 | void *func_data; | ||
49 | const struct pvr2_i2c_handler_functions *func_table; | ||
50 | }; | ||
51 | |||
52 | struct pvr2_i2c_handler_functions { | ||
53 | void (*detach)(void *); | ||
54 | int (*check)(void *); | ||
55 | void (*update)(void *); | ||
56 | unsigned int (*describe)(void *,char *,unsigned int); | ||
57 | }; | ||
58 | |||
59 | struct pvr2_i2c_op { | ||
60 | int (*check)(struct pvr2_hdw *); | ||
61 | void (*update)(struct pvr2_hdw *); | ||
62 | const char *name; | ||
63 | }; | ||
64 | |||
65 | void pvr2_i2c_track_init(struct pvr2_hdw *); | ||
66 | void pvr2_i2c_track_done(struct pvr2_hdw *); | ||
67 | void pvr2_i2c_track_attach_inform(struct i2c_client *); | ||
68 | void pvr2_i2c_track_detach_inform(struct i2c_client *); | ||
69 | |||
70 | int pvr2_i2c_client_cmd(struct pvr2_i2c_client *,unsigned int cmd,void *arg); | ||
71 | int pvr2_i2c_core_cmd(struct pvr2_hdw *,unsigned int cmd,void *arg); | ||
72 | |||
73 | int pvr2_i2c_core_check_stale(struct pvr2_hdw *); | ||
74 | void pvr2_i2c_core_sync(struct pvr2_hdw *); | ||
75 | void pvr2_i2c_core_status_poll(struct pvr2_hdw *); | ||
76 | unsigned int pvr2_i2c_report(struct pvr2_hdw *,char *buf,unsigned int maxlen); | ||
77 | #define PVR2_I2C_DETAIL_DEBUG 0x0001 | ||
78 | #define PVR2_I2C_DETAIL_HANDLER 0x0002 | ||
79 | #define PVR2_I2C_DETAIL_CTLMASK 0x0004 | ||
80 | #define PVR2_I2C_DETAIL_ALL (\ | ||
81 | PVR2_I2C_DETAIL_DEBUG |\ | ||
82 | PVR2_I2C_DETAIL_HANDLER |\ | ||
83 | PVR2_I2C_DETAIL_CTLMASK) | ||
84 | |||
85 | void pvr2_i2c_probe(struct pvr2_hdw *,struct pvr2_i2c_client *); | ||
86 | const struct pvr2_i2c_op *pvr2_i2c_get_op(unsigned int idx); | ||
87 | |||
88 | void pvr2_i2c_untrack_subdev(struct pvr2_hdw *, struct v4l2_subdev *sd); | ||
89 | |||
90 | |||
91 | #endif /* __PVRUSB2_I2C_CORE_H */ | ||
92 | |||
93 | |||
94 | /* | ||
95 | Stuff for Emacs to see, in order to encourage consistent editing style: | ||
96 | *** Local Variables: *** | ||
97 | *** mode: c *** | ||
98 | *** fill-column: 75 *** | ||
99 | *** tab-width: 8 *** | ||
100 | *** c-basic-offset: 8 *** | ||
101 | *** End: *** | ||
102 | */ | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-tuner.c b/drivers/media/video/pvrusb2/pvrusb2-tuner.c deleted file mode 100644 index ee9c9c139a85..000000000000 --- a/drivers/media/video/pvrusb2/pvrusb2-tuner.c +++ /dev/null | |||
@@ -1,121 +0,0 @@ | |||
1 | /* | ||
2 | * | ||
3 | * | ||
4 | * Copyright (C) 2005 Mike Isely <isely@pobox.com> | ||
5 | * Copyright (C) 2004 Aurelien Alleaume <slts@free.fr> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #include "pvrusb2.h" | ||
23 | #include "pvrusb2-util.h" | ||
24 | #include "pvrusb2-tuner.h" | ||
25 | #include "pvrusb2-hdw-internal.h" | ||
26 | #include "pvrusb2-debug.h" | ||
27 | #include <linux/videodev2.h> | ||
28 | #include <media/tuner.h> | ||
29 | #include <media/v4l2-common.h> | ||
30 | |||
31 | |||
32 | struct pvr2_tuner_handler { | ||
33 | struct pvr2_hdw *hdw; | ||
34 | struct pvr2_i2c_client *client; | ||
35 | struct pvr2_i2c_handler i2c_handler; | ||
36 | int type_update_fl; | ||
37 | }; | ||
38 | |||
39 | |||
40 | static void set_type(struct pvr2_tuner_handler *ctxt) | ||
41 | { | ||
42 | struct pvr2_hdw *hdw = ctxt->hdw; | ||
43 | struct tuner_setup setup; | ||
44 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c tuner set_type(%d)",hdw->tuner_type); | ||
45 | if (((int)(hdw->tuner_type)) < 0) return; | ||
46 | |||
47 | setup.addr = ADDR_UNSET; | ||
48 | setup.type = hdw->tuner_type; | ||
49 | setup.mode_mask = T_RADIO | T_ANALOG_TV; | ||
50 | /* We may really want mode_mask to be T_ANALOG_TV for now */ | ||
51 | pvr2_i2c_client_cmd(ctxt->client,TUNER_SET_TYPE_ADDR,&setup); | ||
52 | ctxt->type_update_fl = 0; | ||
53 | } | ||
54 | |||
55 | |||
56 | static int tuner_check(struct pvr2_tuner_handler *ctxt) | ||
57 | { | ||
58 | struct pvr2_hdw *hdw = ctxt->hdw; | ||
59 | if (hdw->tuner_updated) ctxt->type_update_fl = !0; | ||
60 | return ctxt->type_update_fl != 0; | ||
61 | } | ||
62 | |||
63 | |||
64 | static void tuner_update(struct pvr2_tuner_handler *ctxt) | ||
65 | { | ||
66 | if (ctxt->type_update_fl) set_type(ctxt); | ||
67 | } | ||
68 | |||
69 | |||
70 | static void pvr2_tuner_detach(struct pvr2_tuner_handler *ctxt) | ||
71 | { | ||
72 | ctxt->client->handler = NULL; | ||
73 | kfree(ctxt); | ||
74 | } | ||
75 | |||
76 | |||
77 | static unsigned int pvr2_tuner_describe(struct pvr2_tuner_handler *ctxt,char *buf,unsigned int cnt) | ||
78 | { | ||
79 | return scnprintf(buf,cnt,"handler: pvrusb2-tuner"); | ||
80 | } | ||
81 | |||
82 | |||
83 | static const struct pvr2_i2c_handler_functions tuner_funcs = { | ||
84 | .detach = (void (*)(void *))pvr2_tuner_detach, | ||
85 | .check = (int (*)(void *))tuner_check, | ||
86 | .update = (void (*)(void *))tuner_update, | ||
87 | .describe = (unsigned int (*)(void *,char *,unsigned int))pvr2_tuner_describe, | ||
88 | }; | ||
89 | |||
90 | |||
91 | int pvr2_i2c_tuner_setup(struct pvr2_hdw *hdw,struct pvr2_i2c_client *cp) | ||
92 | { | ||
93 | struct pvr2_tuner_handler *ctxt; | ||
94 | if (cp->handler) return 0; | ||
95 | |||
96 | ctxt = kzalloc(sizeof(*ctxt),GFP_KERNEL); | ||
97 | if (!ctxt) return 0; | ||
98 | |||
99 | ctxt->i2c_handler.func_data = ctxt; | ||
100 | ctxt->i2c_handler.func_table = &tuner_funcs; | ||
101 | ctxt->type_update_fl = !0; | ||
102 | ctxt->client = cp; | ||
103 | ctxt->hdw = hdw; | ||
104 | cp->handler = &ctxt->i2c_handler; | ||
105 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c 0x%x tuner handler set up", | ||
106 | cp->client->addr); | ||
107 | return !0; | ||
108 | } | ||
109 | |||
110 | |||
111 | |||
112 | |||
113 | /* | ||
114 | Stuff for Emacs to see, in order to encourage consistent editing style: | ||
115 | *** Local Variables: *** | ||
116 | *** mode: c *** | ||
117 | *** fill-column: 70 *** | ||
118 | *** tab-width: 8 *** | ||
119 | *** c-basic-offset: 8 *** | ||
120 | *** End: *** | ||
121 | */ | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-tuner.h b/drivers/media/video/pvrusb2/pvrusb2-tuner.h deleted file mode 100644 index 3643e2c7880f..000000000000 --- a/drivers/media/video/pvrusb2/pvrusb2-tuner.h +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | /* | ||
2 | * | ||
3 | * | ||
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 | #ifndef __PVRUSB2_TUNER_H | ||
21 | #define __PVRUSB2_TUNER_H | ||
22 | |||
23 | #include "pvrusb2-i2c-track.h" | ||
24 | |||
25 | int pvr2_i2c_tuner_setup(struct pvr2_hdw *,struct pvr2_i2c_client *); | ||
26 | |||
27 | #endif /* __PVRUSB2_TUNER_H */ | ||
28 | |||
29 | /* | ||
30 | Stuff for Emacs to see, in order to encourage consistent editing style: | ||
31 | *** Local Variables: *** | ||
32 | *** mode: c *** | ||
33 | *** fill-column: 70 *** | ||
34 | *** tab-width: 8 *** | ||
35 | *** c-basic-offset: 8 *** | ||
36 | *** End: *** | ||
37 | */ | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-video-v4l.c b/drivers/media/video/pvrusb2/pvrusb2-video-v4l.c index 4e0c0881b7b1..ce8332dd9cc9 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-video-v4l.c +++ b/drivers/media/video/pvrusb2/pvrusb2-video-v4l.c | |||
@@ -30,7 +30,6 @@ | |||
30 | #include "pvrusb2-video-v4l.h" | 30 | #include "pvrusb2-video-v4l.h" |
31 | 31 | ||
32 | 32 | ||
33 | #include "pvrusb2-i2c-cmd-v4l2.h" | ||
34 | 33 | ||
35 | #include "pvrusb2-hdw-internal.h" | 34 | #include "pvrusb2-hdw-internal.h" |
36 | #include "pvrusb2-debug.h" | 35 | #include "pvrusb2-debug.h" |
@@ -62,191 +61,6 @@ static const struct routing_scheme routing_schemes[] = { | |||
62 | }, | 61 | }, |
63 | }; | 62 | }; |
64 | 63 | ||
65 | struct pvr2_v4l_decoder { | ||
66 | struct pvr2_i2c_handler handler; | ||
67 | struct pvr2_decoder_ctrl ctrl; | ||
68 | struct pvr2_i2c_client *client; | ||
69 | struct pvr2_hdw *hdw; | ||
70 | unsigned long stale_mask; | ||
71 | }; | ||
72 | |||
73 | |||
74 | |||
75 | static void set_input(struct pvr2_v4l_decoder *ctxt) | ||
76 | { | ||
77 | struct pvr2_hdw *hdw = ctxt->hdw; | ||
78 | struct v4l2_routing route; | ||
79 | const struct routing_scheme *sp; | ||
80 | unsigned int sid = hdw->hdw_desc->signal_routing_scheme; | ||
81 | |||
82 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c v4l2 set_input(%d)",hdw->input_val); | ||
83 | |||
84 | if ((sid < ARRAY_SIZE(routing_schemes)) && | ||
85 | ((sp = routing_schemes + sid) != NULL) && | ||
86 | (hdw->input_val >= 0) && | ||
87 | (hdw->input_val < sp->cnt)) { | ||
88 | route.input = sp->def[hdw->input_val]; | ||
89 | } else { | ||
90 | pvr2_trace(PVR2_TRACE_ERROR_LEGS, | ||
91 | "*** WARNING *** i2c v4l2 set_input:" | ||
92 | " Invalid routing scheme (%u) and/or input (%d)", | ||
93 | sid,hdw->input_val); | ||
94 | return; | ||
95 | } | ||
96 | |||
97 | route.output = 0; | ||
98 | pvr2_i2c_client_cmd(ctxt->client,VIDIOC_INT_S_VIDEO_ROUTING,&route); | ||
99 | } | ||
100 | |||
101 | |||
102 | static int check_input(struct pvr2_v4l_decoder *ctxt) | ||
103 | { | ||
104 | struct pvr2_hdw *hdw = ctxt->hdw; | ||
105 | return hdw->input_dirty != 0; | ||
106 | } | ||
107 | |||
108 | |||
109 | static void set_audio(struct pvr2_v4l_decoder *ctxt) | ||
110 | { | ||
111 | u32 val; | ||
112 | struct pvr2_hdw *hdw = ctxt->hdw; | ||
113 | |||
114 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c v4l2 set_audio %d", | ||
115 | hdw->srate_val); | ||
116 | switch (hdw->srate_val) { | ||
117 | default: | ||
118 | case V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000: | ||
119 | val = 48000; | ||
120 | break; | ||
121 | case V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100: | ||
122 | val = 44100; | ||
123 | break; | ||
124 | case V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000: | ||
125 | val = 32000; | ||
126 | break; | ||
127 | } | ||
128 | pvr2_i2c_client_cmd(ctxt->client,VIDIOC_INT_AUDIO_CLOCK_FREQ,&val); | ||
129 | } | ||
130 | |||
131 | |||
132 | static int check_audio(struct pvr2_v4l_decoder *ctxt) | ||
133 | { | ||
134 | struct pvr2_hdw *hdw = ctxt->hdw; | ||
135 | return hdw->srate_dirty != 0; | ||
136 | } | ||
137 | |||
138 | |||
139 | struct pvr2_v4l_decoder_ops { | ||
140 | void (*update)(struct pvr2_v4l_decoder *); | ||
141 | int (*check)(struct pvr2_v4l_decoder *); | ||
142 | }; | ||
143 | |||
144 | |||
145 | static const struct pvr2_v4l_decoder_ops decoder_ops[] = { | ||
146 | { .update = set_input, .check = check_input}, | ||
147 | { .update = set_audio, .check = check_audio}, | ||
148 | }; | ||
149 | |||
150 | |||
151 | static void decoder_detach(struct pvr2_v4l_decoder *ctxt) | ||
152 | { | ||
153 | ctxt->client->handler = NULL; | ||
154 | pvr2_hdw_set_decoder(ctxt->hdw,NULL); | ||
155 | kfree(ctxt); | ||
156 | } | ||
157 | |||
158 | |||
159 | static int decoder_check(struct pvr2_v4l_decoder *ctxt) | ||
160 | { | ||
161 | unsigned long msk; | ||
162 | unsigned int idx; | ||
163 | |||
164 | for (idx = 0; idx < ARRAY_SIZE(decoder_ops); idx++) { | ||
165 | msk = 1 << idx; | ||
166 | if (ctxt->stale_mask & msk) continue; | ||
167 | if (decoder_ops[idx].check(ctxt)) { | ||
168 | ctxt->stale_mask |= msk; | ||
169 | } | ||
170 | } | ||
171 | return ctxt->stale_mask != 0; | ||
172 | } | ||
173 | |||
174 | |||
175 | static void decoder_update(struct pvr2_v4l_decoder *ctxt) | ||
176 | { | ||
177 | unsigned long msk; | ||
178 | unsigned int idx; | ||
179 | |||
180 | for (idx = 0; idx < ARRAY_SIZE(decoder_ops); idx++) { | ||
181 | msk = 1 << idx; | ||
182 | if (!(ctxt->stale_mask & msk)) continue; | ||
183 | ctxt->stale_mask &= ~msk; | ||
184 | decoder_ops[idx].update(ctxt); | ||
185 | } | ||
186 | } | ||
187 | |||
188 | |||
189 | static int decoder_detect(struct pvr2_i2c_client *cp) | ||
190 | { | ||
191 | /* Attempt to query the decoder - let's see if it will answer */ | ||
192 | struct v4l2_tuner vt; | ||
193 | int ret; | ||
194 | |||
195 | memset(&vt,0,sizeof(vt)); | ||
196 | ret = pvr2_i2c_client_cmd(cp,VIDIOC_G_TUNER,&vt); | ||
197 | return ret == 0; /* Return true if it answered */ | ||
198 | } | ||
199 | |||
200 | |||
201 | static void decoder_enable(struct pvr2_v4l_decoder *ctxt,int fl) | ||
202 | { | ||
203 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c v4l2 decoder_enable(%d)",fl); | ||
204 | pvr2_v4l2_cmd_stream(ctxt->client,fl); | ||
205 | } | ||
206 | |||
207 | |||
208 | static unsigned int decoder_describe(struct pvr2_v4l_decoder *ctxt,char *buf,unsigned int cnt) | ||
209 | { | ||
210 | return scnprintf(buf,cnt,"handler: pvrusb2-video-v4l"); | ||
211 | } | ||
212 | |||
213 | |||
214 | static const struct pvr2_i2c_handler_functions hfuncs = { | ||
215 | .detach = (void (*)(void *))decoder_detach, | ||
216 | .check = (int (*)(void *))decoder_check, | ||
217 | .update = (void (*)(void *))decoder_update, | ||
218 | .describe = (unsigned int (*)(void *,char *,unsigned int))decoder_describe, | ||
219 | }; | ||
220 | |||
221 | |||
222 | int pvr2_i2c_decoder_v4l_setup(struct pvr2_hdw *hdw, | ||
223 | struct pvr2_i2c_client *cp) | ||
224 | { | ||
225 | struct pvr2_v4l_decoder *ctxt; | ||
226 | |||
227 | if (hdw->decoder_ctrl) return 0; | ||
228 | if (cp->handler) return 0; | ||
229 | if (!decoder_detect(cp)) return 0; | ||
230 | |||
231 | ctxt = kzalloc(sizeof(*ctxt),GFP_KERNEL); | ||
232 | if (!ctxt) return 0; | ||
233 | |||
234 | ctxt->handler.func_data = ctxt; | ||
235 | ctxt->handler.func_table = &hfuncs; | ||
236 | ctxt->ctrl.ctxt = ctxt; | ||
237 | ctxt->ctrl.detach = (void (*)(void *))decoder_detach; | ||
238 | ctxt->ctrl.enable = (void (*)(void *,int))decoder_enable; | ||
239 | ctxt->client = cp; | ||
240 | ctxt->hdw = hdw; | ||
241 | ctxt->stale_mask = (1 << ARRAY_SIZE(decoder_ops)) - 1; | ||
242 | pvr2_hdw_set_decoder(hdw,&ctxt->ctrl); | ||
243 | cp->handler = &ctxt->handler; | ||
244 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c 0x%x saa711x V4L2 handler set up", | ||
245 | cp->client->addr); | ||
246 | return !0; | ||
247 | } | ||
248 | |||
249 | |||
250 | void pvr2_saa7115_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd) | 64 | void pvr2_saa7115_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd) |
251 | { | 65 | { |
252 | if (hdw->input_dirty || hdw->force_dirty) { | 66 | if (hdw->input_dirty || hdw->force_dirty) { |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-video-v4l.h b/drivers/media/video/pvrusb2/pvrusb2-video-v4l.h index dac4b1ad3664..3b0bd5db602b 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-video-v4l.h +++ b/drivers/media/video/pvrusb2/pvrusb2-video-v4l.h | |||
@@ -32,11 +32,6 @@ | |||
32 | */ | 32 | */ |
33 | 33 | ||
34 | 34 | ||
35 | |||
36 | #include "pvrusb2-i2c-track.h" | ||
37 | |||
38 | int pvr2_i2c_decoder_v4l_setup(struct pvr2_hdw *,struct pvr2_i2c_client *); | ||
39 | |||
40 | #include "pvrusb2-hdw-internal.h" | 35 | #include "pvrusb2-hdw-internal.h" |
41 | void pvr2_saa7115_subdev_update(struct pvr2_hdw *, struct v4l2_subdev *); | 36 | void pvr2_saa7115_subdev_update(struct pvr2_hdw *, struct v4l2_subdev *); |
42 | 37 | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-wm8775.c b/drivers/media/video/pvrusb2/pvrusb2-wm8775.c index 0068566876ec..1670aa4051ce 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-wm8775.c +++ b/drivers/media/video/pvrusb2/pvrusb2-wm8775.c | |||
@@ -27,7 +27,6 @@ | |||
27 | */ | 27 | */ |
28 | 28 | ||
29 | #include "pvrusb2-wm8775.h" | 29 | #include "pvrusb2-wm8775.h" |
30 | #include "pvrusb2-i2c-cmd-v4l2.h" | ||
31 | 30 | ||
32 | 31 | ||
33 | #include "pvrusb2-hdw-internal.h" | 32 | #include "pvrusb2-hdw-internal.h" |
@@ -37,129 +36,6 @@ | |||
37 | #include <linux/errno.h> | 36 | #include <linux/errno.h> |
38 | #include <linux/slab.h> | 37 | #include <linux/slab.h> |
39 | 38 | ||
40 | |||
41 | |||
42 | struct pvr2_v4l_wm8775 { | ||
43 | struct pvr2_i2c_handler handler; | ||
44 | struct pvr2_i2c_client *client; | ||
45 | struct pvr2_hdw *hdw; | ||
46 | unsigned long stale_mask; | ||
47 | }; | ||
48 | |||
49 | |||
50 | static void set_input(struct pvr2_v4l_wm8775 *ctxt) | ||
51 | { | ||
52 | struct v4l2_routing route; | ||
53 | struct pvr2_hdw *hdw = ctxt->hdw; | ||
54 | |||
55 | memset(&route,0,sizeof(route)); | ||
56 | |||
57 | switch(hdw->input_val) { | ||
58 | case PVR2_CVAL_INPUT_RADIO: | ||
59 | route.input = 1; | ||
60 | break; | ||
61 | default: | ||
62 | /* All other cases just use the second input */ | ||
63 | route.input = 2; | ||
64 | break; | ||
65 | } | ||
66 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c wm8775 set_input(val=%d route=0x%x)", | ||
67 | hdw->input_val,route.input); | ||
68 | |||
69 | pvr2_i2c_client_cmd(ctxt->client,VIDIOC_INT_S_AUDIO_ROUTING,&route); | ||
70 | } | ||
71 | |||
72 | static int check_input(struct pvr2_v4l_wm8775 *ctxt) | ||
73 | { | ||
74 | struct pvr2_hdw *hdw = ctxt->hdw; | ||
75 | return hdw->input_dirty != 0; | ||
76 | } | ||
77 | |||
78 | |||
79 | struct pvr2_v4l_wm8775_ops { | ||
80 | void (*update)(struct pvr2_v4l_wm8775 *); | ||
81 | int (*check)(struct pvr2_v4l_wm8775 *); | ||
82 | }; | ||
83 | |||
84 | |||
85 | static const struct pvr2_v4l_wm8775_ops wm8775_ops[] = { | ||
86 | { .update = set_input, .check = check_input}, | ||
87 | }; | ||
88 | |||
89 | |||
90 | static unsigned int wm8775_describe(struct pvr2_v4l_wm8775 *ctxt, | ||
91 | char *buf,unsigned int cnt) | ||
92 | { | ||
93 | return scnprintf(buf,cnt,"handler: pvrusb2-wm8775"); | ||
94 | } | ||
95 | |||
96 | |||
97 | static void wm8775_detach(struct pvr2_v4l_wm8775 *ctxt) | ||
98 | { | ||
99 | ctxt->client->handler = NULL; | ||
100 | kfree(ctxt); | ||
101 | } | ||
102 | |||
103 | |||
104 | static int wm8775_check(struct pvr2_v4l_wm8775 *ctxt) | ||
105 | { | ||
106 | unsigned long msk; | ||
107 | unsigned int idx; | ||
108 | |||
109 | for (idx = 0; idx < ARRAY_SIZE(wm8775_ops); idx++) { | ||
110 | msk = 1 << idx; | ||
111 | if (ctxt->stale_mask & msk) continue; | ||
112 | if (wm8775_ops[idx].check(ctxt)) { | ||
113 | ctxt->stale_mask |= msk; | ||
114 | } | ||
115 | } | ||
116 | return ctxt->stale_mask != 0; | ||
117 | } | ||
118 | |||
119 | |||
120 | static void wm8775_update(struct pvr2_v4l_wm8775 *ctxt) | ||
121 | { | ||
122 | unsigned long msk; | ||
123 | unsigned int idx; | ||
124 | |||
125 | for (idx = 0; idx < ARRAY_SIZE(wm8775_ops); idx++) { | ||
126 | msk = 1 << idx; | ||
127 | if (!(ctxt->stale_mask & msk)) continue; | ||
128 | ctxt->stale_mask &= ~msk; | ||
129 | wm8775_ops[idx].update(ctxt); | ||
130 | } | ||
131 | } | ||
132 | |||
133 | |||
134 | static const struct pvr2_i2c_handler_functions hfuncs = { | ||
135 | .detach = (void (*)(void *))wm8775_detach, | ||
136 | .check = (int (*)(void *))wm8775_check, | ||
137 | .update = (void (*)(void *))wm8775_update, | ||
138 | .describe = (unsigned int (*)(void *,char *,unsigned int))wm8775_describe, | ||
139 | }; | ||
140 | |||
141 | |||
142 | int pvr2_i2c_wm8775_setup(struct pvr2_hdw *hdw,struct pvr2_i2c_client *cp) | ||
143 | { | ||
144 | struct pvr2_v4l_wm8775 *ctxt; | ||
145 | |||
146 | if (cp->handler) return 0; | ||
147 | |||
148 | ctxt = kzalloc(sizeof(*ctxt),GFP_KERNEL); | ||
149 | if (!ctxt) return 0; | ||
150 | |||
151 | ctxt->handler.func_data = ctxt; | ||
152 | ctxt->handler.func_table = &hfuncs; | ||
153 | ctxt->client = cp; | ||
154 | ctxt->hdw = hdw; | ||
155 | ctxt->stale_mask = (1 << ARRAY_SIZE(wm8775_ops)) - 1; | ||
156 | cp->handler = &ctxt->handler; | ||
157 | pvr2_trace(PVR2_TRACE_CHIPS,"i2c 0x%x wm8775 V4L2 handler set up", | ||
158 | cp->client->addr); | ||
159 | return !0; | ||
160 | } | ||
161 | |||
162 | |||
163 | void pvr2_wm8775_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd) | 39 | void pvr2_wm8775_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd) |
164 | { | 40 | { |
165 | if (hdw->input_dirty || hdw->force_dirty) { | 41 | if (hdw->input_dirty || hdw->force_dirty) { |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-wm8775.h b/drivers/media/video/pvrusb2/pvrusb2-wm8775.h index a304988b1e79..0577bc7246fb 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-wm8775.h +++ b/drivers/media/video/pvrusb2/pvrusb2-wm8775.h | |||
@@ -34,9 +34,6 @@ | |||
34 | 34 | ||
35 | 35 | ||
36 | 36 | ||
37 | #include "pvrusb2-i2c-track.h" | ||
38 | |||
39 | int pvr2_i2c_wm8775_setup(struct pvr2_hdw *,struct pvr2_i2c_client *); | ||
40 | #include "pvrusb2-hdw-internal.h" | 37 | #include "pvrusb2-hdw-internal.h" |
41 | 38 | ||
42 | void pvr2_wm8775_subdev_update(struct pvr2_hdw *, struct v4l2_subdev *sd); | 39 | void pvr2_wm8775_subdev_update(struct pvr2_hdw *, struct v4l2_subdev *sd); |