diff options
Diffstat (limited to 'drivers/media/video/pvrusb2/pvrusb2-video-v4l.c')
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-video-v4l.c | 186 |
1 files changed, 0 insertions, 186 deletions
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) { |