V4L/DVB (11194): pvrusb2: Implement mechanism to force a full sub-device update
[linux-2.6] / drivers / media / video / pvrusb2 / pvrusb2-video-v4l.c
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 /*
23
24    This source file is specifically designed to interface with the
25    saa711x support that is available in the v4l available starting
26    with linux 2.6.15.
27
28 */
29
30 #include "pvrusb2-video-v4l.h"
31
32
33 #include "pvrusb2-i2c-cmd-v4l2.h"
34
35 #include "pvrusb2-hdw-internal.h"
36 #include "pvrusb2-debug.h"
37 #include <linux/videodev2.h>
38 #include <media/v4l2-common.h>
39 #include <media/saa7115.h>
40 #include <linux/errno.h>
41 #include <linux/slab.h>
42
43 struct routing_scheme {
44         const int *def;
45         unsigned int cnt;
46 };
47
48
49 static const int routing_scheme0[] = {
50         [PVR2_CVAL_INPUT_TV] = SAA7115_COMPOSITE4,
51         /* In radio mode, we mute the video, but point at one
52            spot just to stay consistent */
53         [PVR2_CVAL_INPUT_RADIO] = SAA7115_COMPOSITE5,
54         [PVR2_CVAL_INPUT_COMPOSITE] = SAA7115_COMPOSITE5,
55         [PVR2_CVAL_INPUT_SVIDEO] =  SAA7115_SVIDEO2,
56 };
57
58 static const struct routing_scheme routing_schemes[] = {
59         [PVR2_ROUTING_SCHEME_HAUPPAUGE] = {
60                 .def = routing_scheme0,
61                 .cnt = ARRAY_SIZE(routing_scheme0),
62         },
63 };
64
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)
251 {
252         if (hdw->input_dirty || hdw->force_dirty) {
253                 struct v4l2_routing route;
254                 const struct routing_scheme *sp;
255                 unsigned int sid = hdw->hdw_desc->signal_routing_scheme;
256                 pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_input(%d)",
257                            hdw->input_val);
258                 if ((sid < ARRAY_SIZE(routing_schemes)) &&
259                     ((sp = routing_schemes + sid) != NULL) &&
260                     (hdw->input_val >= 0) &&
261                     (hdw->input_val < sp->cnt)) {
262                         route.input = sp->def[hdw->input_val];
263                 } else {
264                         pvr2_trace(PVR2_TRACE_ERROR_LEGS,
265                                    "*** WARNING *** subdev v4l2 set_input:"
266                                    " Invalid routing scheme (%u)"
267                                    " and/or input (%d)",
268                                    sid, hdw->input_val);
269                         return;
270                 }
271                 route.output = 0;
272                 sd->ops->video->s_routing(sd, &route);
273         }
274 }
275
276
277 /*
278   Stuff for Emacs to see, in order to encourage consistent editing style:
279   *** Local Variables: ***
280   *** mode: c ***
281   *** fill-column: 70 ***
282   *** tab-width: 8 ***
283   *** c-basic-offset: 8 ***
284   *** End: ***
285   */