Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / media / pci / cx18 / cx18-fileops.c
1 /*
2  *  cx18 file operation functions
3  *
4  *  Derived from ivtv-fileops.c
5  *
6  *  Copyright (C) 2007  Hans Verkuil <hverkuil@xs4all.nl>
7  *  Copyright (C) 2008  Andy Walls <awalls@md.metrocast.net>
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or
12  *  (at your option) any later version.
13  *
14  *  This program is distributed in the hope that it will be useful,
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *  GNU General Public License for more details.
18  *
19  *  You should have received a copy of the GNU General Public License
20  *  along with this program; if not, write to the Free Software
21  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
22  *  02111-1307  USA
23  */
24
25 #include "cx18-driver.h"
26 #include "cx18-fileops.h"
27 #include "cx18-i2c.h"
28 #include "cx18-queue.h"
29 #include "cx18-vbi.h"
30 #include "cx18-audio.h"
31 #include "cx18-mailbox.h"
32 #include "cx18-scb.h"
33 #include "cx18-streams.h"
34 #include "cx18-controls.h"
35 #include "cx18-ioctl.h"
36 #include "cx18-cards.h"
37 #include <media/v4l2-event.h>
38
39 /* This function tries to claim the stream for a specific file descriptor.
40    If no one else is using this stream then the stream is claimed and
41    associated VBI and IDX streams are also automatically claimed.
42    Possible error returns: -EBUSY if someone else has claimed
43    the stream or 0 on success. */
44 int cx18_claim_stream(struct cx18_open_id *id, int type)
45 {
46         struct cx18 *cx = id->cx;
47         struct cx18_stream *s = &cx->streams[type];
48         struct cx18_stream *s_assoc;
49
50         /* Nothing should ever try to directly claim the IDX stream */
51         if (type == CX18_ENC_STREAM_TYPE_IDX) {
52                 CX18_WARN("MPEG Index stream cannot be claimed "
53                           "directly, but something tried.\n");
54                 return -EINVAL;
55         }
56
57         if (test_and_set_bit(CX18_F_S_CLAIMED, &s->s_flags)) {
58                 /* someone already claimed this stream */
59                 if (s->id == id->open_id) {
60                         /* yes, this file descriptor did. So that's OK. */
61                         return 0;
62                 }
63                 if (s->id == -1 && type == CX18_ENC_STREAM_TYPE_VBI) {
64                         /* VBI is handled already internally, now also assign
65                            the file descriptor to this stream for external
66                            reading of the stream. */
67                         s->id = id->open_id;
68                         CX18_DEBUG_INFO("Start Read VBI\n");
69                         return 0;
70                 }
71                 /* someone else is using this stream already */
72                 CX18_DEBUG_INFO("Stream %d is busy\n", type);
73                 return -EBUSY;
74         }
75         s->id = id->open_id;
76
77         /*
78          * CX18_ENC_STREAM_TYPE_MPG needs to claim:
79          * CX18_ENC_STREAM_TYPE_VBI, if VBI insertion is on for sliced VBI, or
80          * CX18_ENC_STREAM_TYPE_IDX, if VBI insertion is off for sliced VBI
81          * (We don't yet fix up MPEG Index entries for our inserted packets).
82          *
83          * For all other streams we're done.
84          */
85         if (type != CX18_ENC_STREAM_TYPE_MPG)
86                 return 0;
87
88         s_assoc = &cx->streams[CX18_ENC_STREAM_TYPE_IDX];
89         if (cx->vbi.insert_mpeg && !cx18_raw_vbi(cx))
90                 s_assoc = &cx->streams[CX18_ENC_STREAM_TYPE_VBI];
91         else if (!cx18_stream_enabled(s_assoc))
92                 return 0;
93
94         set_bit(CX18_F_S_CLAIMED, &s_assoc->s_flags);
95
96         /* mark that it is used internally */
97         set_bit(CX18_F_S_INTERNAL_USE, &s_assoc->s_flags);
98         return 0;
99 }
100 EXPORT_SYMBOL(cx18_claim_stream);
101
102 /* This function releases a previously claimed stream. It will take into
103    account associated VBI streams. */
104 void cx18_release_stream(struct cx18_stream *s)
105 {
106         struct cx18 *cx = s->cx;
107         struct cx18_stream *s_assoc;
108
109         s->id = -1;
110         if (s->type == CX18_ENC_STREAM_TYPE_IDX) {
111                 /*
112                  * The IDX stream is only used internally, and can
113                  * only be indirectly unclaimed by unclaiming the MPG stream.
114                  */
115                 return;
116         }
117
118         if (s->type == CX18_ENC_STREAM_TYPE_VBI &&
119                 test_bit(CX18_F_S_INTERNAL_USE, &s->s_flags)) {
120                 /* this stream is still in use internally */
121                 return;
122         }
123         if (!test_and_clear_bit(CX18_F_S_CLAIMED, &s->s_flags)) {
124                 CX18_DEBUG_WARN("Release stream %s not in use!\n", s->name);
125                 return;
126         }
127
128         cx18_flush_queues(s);
129
130         /*
131          * CX18_ENC_STREAM_TYPE_MPG needs to release the
132          * CX18_ENC_STREAM_TYPE_VBI and/or CX18_ENC_STREAM_TYPE_IDX streams.
133          *
134          * For all other streams we're done.
135          */
136         if (s->type != CX18_ENC_STREAM_TYPE_MPG)
137                 return;
138
139         /* Unclaim the associated MPEG Index stream */
140         s_assoc = &cx->streams[CX18_ENC_STREAM_TYPE_IDX];
141         if (test_and_clear_bit(CX18_F_S_INTERNAL_USE, &s_assoc->s_flags)) {
142                 clear_bit(CX18_F_S_CLAIMED, &s_assoc->s_flags);
143                 cx18_flush_queues(s_assoc);
144         }
145
146         /* Unclaim the associated VBI stream */
147         s_assoc = &cx->streams[CX18_ENC_STREAM_TYPE_VBI];
148         if (test_and_clear_bit(CX18_F_S_INTERNAL_USE, &s_assoc->s_flags)) {
149                 if (s_assoc->id == -1) {
150                         /*
151                          * The VBI stream is not still claimed by a file
152                          * descriptor, so completely unclaim it.
153                          */
154                         clear_bit(CX18_F_S_CLAIMED, &s_assoc->s_flags);
155                         cx18_flush_queues(s_assoc);
156                 }
157         }
158 }
159 EXPORT_SYMBOL(cx18_release_stream);
160
161 static void cx18_dualwatch(struct cx18 *cx)
162 {
163         struct v4l2_tuner vt;
164         u32 new_stereo_mode;
165         const u32 dual = 0x0200;
166
167         new_stereo_mode = v4l2_ctrl_g_ctrl(cx->cxhdl.audio_mode);
168         memset(&vt, 0, sizeof(vt));
169         cx18_call_all(cx, tuner, g_tuner, &vt);
170         if (vt.audmode == V4L2_TUNER_MODE_LANG1_LANG2 &&
171                         (vt.rxsubchans & V4L2_TUNER_SUB_LANG2))
172                 new_stereo_mode = dual;
173
174         if (new_stereo_mode == cx->dualwatch_stereo_mode)
175                 return;
176
177         CX18_DEBUG_INFO("dualwatch: change stereo flag from 0x%x to 0x%x.\n",
178                            cx->dualwatch_stereo_mode, new_stereo_mode);
179         if (v4l2_ctrl_s_ctrl(cx->cxhdl.audio_mode, new_stereo_mode))
180                 CX18_DEBUG_INFO("dualwatch: changing stereo flag failed\n");
181 }
182
183
184 static struct cx18_mdl *cx18_get_mdl(struct cx18_stream *s, int non_block,
185                                      int *err)
186 {
187         struct cx18 *cx = s->cx;
188         struct cx18_stream *s_vbi = &cx->streams[CX18_ENC_STREAM_TYPE_VBI];
189         struct cx18_mdl *mdl;
190         DEFINE_WAIT(wait);
191
192         *err = 0;
193         while (1) {
194                 if (s->type == CX18_ENC_STREAM_TYPE_MPG) {
195                         /* Process pending program updates and VBI data */
196                         if (time_after(jiffies, cx->dualwatch_jiffies + msecs_to_jiffies(1000))) {
197                                 cx->dualwatch_jiffies = jiffies;
198                                 cx18_dualwatch(cx);
199                         }
200                         if (test_bit(CX18_F_S_INTERNAL_USE, &s_vbi->s_flags) &&
201                             !test_bit(CX18_F_S_APPL_IO, &s_vbi->s_flags)) {
202                                 while ((mdl = cx18_dequeue(s_vbi,
203                                                            &s_vbi->q_full))) {
204                                         /* byteswap and process VBI data */
205                                         cx18_process_vbi_data(cx, mdl,
206                                                               s_vbi->type);
207                                         cx18_stream_put_mdl_fw(s_vbi, mdl);
208                                 }
209                         }
210                         mdl = &cx->vbi.sliced_mpeg_mdl;
211                         if (mdl->readpos != mdl->bytesused)
212                                 return mdl;
213                 }
214
215                 /* do we have new data? */
216                 mdl = cx18_dequeue(s, &s->q_full);
217                 if (mdl) {
218                         if (!test_and_clear_bit(CX18_F_M_NEED_SWAP,
219                                                 &mdl->m_flags))
220                                 return mdl;
221                         if (s->type == CX18_ENC_STREAM_TYPE_MPG)
222                                 /* byteswap MPG data */
223                                 cx18_mdl_swap(mdl);
224                         else {
225                                 /* byteswap and process VBI data */
226                                 cx18_process_vbi_data(cx, mdl, s->type);
227                         }
228                         return mdl;
229                 }
230
231                 /* return if end of stream */
232                 if (!test_bit(CX18_F_S_STREAMING, &s->s_flags)) {
233                         CX18_DEBUG_INFO("EOS %s\n", s->name);
234                         return NULL;
235                 }
236
237                 /* return if file was opened with O_NONBLOCK */
238                 if (non_block) {
239                         *err = -EAGAIN;
240                         return NULL;
241                 }
242
243                 /* wait for more data to arrive */
244                 prepare_to_wait(&s->waitq, &wait, TASK_INTERRUPTIBLE);
245                 /* New buffers might have become available before we were added
246                    to the waitqueue */
247                 if (!atomic_read(&s->q_full.depth))
248                         schedule();
249                 finish_wait(&s->waitq, &wait);
250                 if (signal_pending(current)) {
251                         /* return if a signal was received */
252                         CX18_DEBUG_INFO("User stopped %s\n", s->name);
253                         *err = -EINTR;
254                         return NULL;
255                 }
256         }
257 }
258
259 static void cx18_setup_sliced_vbi_mdl(struct cx18 *cx)
260 {
261         struct cx18_mdl *mdl = &cx->vbi.sliced_mpeg_mdl;
262         struct cx18_buffer *buf = &cx->vbi.sliced_mpeg_buf;
263         int idx = cx->vbi.inserted_frame % CX18_VBI_FRAMES;
264
265         buf->buf = cx->vbi.sliced_mpeg_data[idx];
266         buf->bytesused = cx->vbi.sliced_mpeg_size[idx];
267         buf->readpos = 0;
268
269         mdl->curr_buf = NULL;
270         mdl->bytesused = cx->vbi.sliced_mpeg_size[idx];
271         mdl->readpos = 0;
272 }
273
274 static size_t cx18_copy_buf_to_user(struct cx18_stream *s,
275         struct cx18_buffer *buf, char __user *ubuf, size_t ucount, bool *stop)
276 {
277         struct cx18 *cx = s->cx;
278         size_t len = buf->bytesused - buf->readpos;
279
280         *stop = false;
281         if (len > ucount)
282                 len = ucount;
283         if (cx->vbi.insert_mpeg && s->type == CX18_ENC_STREAM_TYPE_MPG &&
284             !cx18_raw_vbi(cx) && buf != &cx->vbi.sliced_mpeg_buf) {
285                 /*
286                  * Try to find a good splice point in the PS, just before
287                  * an MPEG-2 Program Pack start code, and provide only
288                  * up to that point to the user, so it's easy to insert VBI data
289                  * the next time around.
290                  *
291                  * This will not work for an MPEG-2 TS and has only been
292                  * verified by analysis to work for an MPEG-2 PS.  Helen Buus
293                  * pointed out this works for the CX23416 MPEG-2 DVD compatible
294                  * stream, and research indicates both the MPEG 2 SVCD and DVD
295                  * stream types use an MPEG-2 PS container.
296                  */
297                 /*
298                  * An MPEG-2 Program Stream (PS) is a series of
299                  * MPEG-2 Program Packs terminated by an
300                  * MPEG Program End Code after the last Program Pack.
301                  * A Program Pack may hold a PS System Header packet and any
302                  * number of Program Elementary Stream (PES) Packets
303                  */
304                 const char *start = buf->buf + buf->readpos;
305                 const char *p = start + 1;
306                 const u8 *q;
307                 u8 ch = cx->search_pack_header ? 0xba : 0xe0;
308                 int stuffing, i;
309
310                 while (start + len > p) {
311                         /* Scan for a 0 to find a potential MPEG-2 start code */
312                         q = memchr(p, 0, start + len - p);
313                         if (q == NULL)
314                                 break;
315                         p = q + 1;
316                         /*
317                          * Keep looking if not a
318                          * MPEG-2 Pack header start code:  0x00 0x00 0x01 0xba
319                          * or MPEG-2 video PES start code: 0x00 0x00 0x01 0xe0
320                          */
321                         if ((char *)q + 15 >= buf->buf + buf->bytesused ||
322                             q[1] != 0 || q[2] != 1 || q[3] != ch)
323                                 continue;
324
325                         /* If expecting the primary video PES */
326                         if (!cx->search_pack_header) {
327                                 /* Continue if it couldn't be a PES packet */
328                                 if ((q[6] & 0xc0) != 0x80)
329                                         continue;
330                                 /* Check if a PTS or PTS & DTS follow */
331                                 if (((q[7] & 0xc0) == 0x80 &&  /* PTS only */
332                                      (q[9] & 0xf0) == 0x20) || /* PTS only */
333                                     ((q[7] & 0xc0) == 0xc0 &&  /* PTS & DTS */
334                                      (q[9] & 0xf0) == 0x30)) { /* DTS follows */
335                                         /* Assume we found the video PES hdr */
336                                         ch = 0xba; /* next want a Program Pack*/
337                                         cx->search_pack_header = 1;
338                                         p = q + 9; /* Skip this video PES hdr */
339                                 }
340                                 continue;
341                         }
342
343                         /* We may have found a Program Pack start code */
344
345                         /* Get the count of stuffing bytes & verify them */
346                         stuffing = q[13] & 7;
347                         /* all stuffing bytes must be 0xff */
348                         for (i = 0; i < stuffing; i++)
349                                 if (q[14 + i] != 0xff)
350                                         break;
351                         if (i == stuffing && /* right number of stuffing bytes*/
352                             (q[4] & 0xc4) == 0x44 && /* marker check */
353                             (q[12] & 3) == 3 &&  /* marker check */
354                             q[14 + stuffing] == 0 && /* PES Pack or Sys Hdr */
355                             q[15 + stuffing] == 0 &&
356                             q[16 + stuffing] == 1) {
357                                 /* We declare we actually found a Program Pack*/
358                                 cx->search_pack_header = 0; /* expect vid PES */
359                                 len = (char *)q - start;
360                                 cx18_setup_sliced_vbi_mdl(cx);
361                                 *stop = true;
362                                 break;
363                         }
364                 }
365         }
366         if (copy_to_user(ubuf, (u8 *)buf->buf + buf->readpos, len)) {
367                 CX18_DEBUG_WARN("copy %zd bytes to user failed for %s\n",
368                                 len, s->name);
369                 return -EFAULT;
370         }
371         buf->readpos += len;
372         if (s->type == CX18_ENC_STREAM_TYPE_MPG &&
373             buf != &cx->vbi.sliced_mpeg_buf)
374                 cx->mpg_data_received += len;
375         return len;
376 }
377
378 static size_t cx18_copy_mdl_to_user(struct cx18_stream *s,
379                 struct cx18_mdl *mdl, char __user *ubuf, size_t ucount)
380 {
381         size_t tot_written = 0;
382         int rc;
383         bool stop = false;
384
385         if (mdl->curr_buf == NULL)
386                 mdl->curr_buf = list_first_entry(&mdl->buf_list,
387                                                  struct cx18_buffer, list);
388
389         if (list_entry_is_past_end(mdl->curr_buf, &mdl->buf_list, list)) {
390                 /*
391                  * For some reason we've exhausted the buffers, but the MDL
392                  * object still said some data was unread.
393                  * Fix that and bail out.
394                  */
395                 mdl->readpos = mdl->bytesused;
396                 return 0;
397         }
398
399         list_for_each_entry_from(mdl->curr_buf, &mdl->buf_list, list) {
400
401                 if (mdl->curr_buf->readpos >= mdl->curr_buf->bytesused)
402                         continue;
403
404                 rc = cx18_copy_buf_to_user(s, mdl->curr_buf, ubuf + tot_written,
405                                            ucount - tot_written, &stop);
406                 if (rc < 0)
407                         return rc;
408                 mdl->readpos += rc;
409                 tot_written += rc;
410
411                 if (stop ||     /* Forced stopping point for VBI insertion */
412                     tot_written >= ucount ||    /* Reader request statisfied */
413                     mdl->curr_buf->readpos < mdl->curr_buf->bytesused ||
414                     mdl->readpos >= mdl->bytesused) /* MDL buffers drained */
415                         break;
416         }
417         return tot_written;
418 }
419
420 static ssize_t cx18_read(struct cx18_stream *s, char __user *ubuf,
421                 size_t tot_count, int non_block)
422 {
423         struct cx18 *cx = s->cx;
424         size_t tot_written = 0;
425         int single_frame = 0;
426
427         if (atomic_read(&cx->ana_capturing) == 0 && s->id == -1) {
428                 /* shouldn't happen */
429                 CX18_DEBUG_WARN("Stream %s not initialized before read\n",
430                                 s->name);
431                 return -EIO;
432         }
433
434         /* Each VBI buffer is one frame, the v4l2 API says that for VBI the
435            frames should arrive one-by-one, so make sure we never output more
436            than one VBI frame at a time */
437         if (s->type == CX18_ENC_STREAM_TYPE_VBI && !cx18_raw_vbi(cx))
438                 single_frame = 1;
439
440         for (;;) {
441                 struct cx18_mdl *mdl;
442                 int rc;
443
444                 mdl = cx18_get_mdl(s, non_block, &rc);
445                 /* if there is no data available... */
446                 if (mdl == NULL) {
447                         /* if we got data, then return that regardless */
448                         if (tot_written)
449                                 break;
450                         /* EOS condition */
451                         if (rc == 0) {
452                                 clear_bit(CX18_F_S_STREAMOFF, &s->s_flags);
453                                 clear_bit(CX18_F_S_APPL_IO, &s->s_flags);
454                                 cx18_release_stream(s);
455                         }
456                         /* set errno */
457                         return rc;
458                 }
459
460                 rc = cx18_copy_mdl_to_user(s, mdl, ubuf + tot_written,
461                                 tot_count - tot_written);
462
463                 if (mdl != &cx->vbi.sliced_mpeg_mdl) {
464                         if (mdl->readpos == mdl->bytesused)
465                                 cx18_stream_put_mdl_fw(s, mdl);
466                         else
467                                 cx18_push(s, mdl, &s->q_full);
468                 } else if (mdl->readpos == mdl->bytesused) {
469                         int idx = cx->vbi.inserted_frame % CX18_VBI_FRAMES;
470
471                         cx->vbi.sliced_mpeg_size[idx] = 0;
472                         cx->vbi.inserted_frame++;
473                         cx->vbi_data_inserted += mdl->bytesused;
474                 }
475                 if (rc < 0)
476                         return rc;
477                 tot_written += rc;
478
479                 if (tot_written == tot_count || single_frame)
480                         break;
481         }
482         return tot_written;
483 }
484
485 static ssize_t cx18_read_pos(struct cx18_stream *s, char __user *ubuf,
486                 size_t count, loff_t *pos, int non_block)
487 {
488         ssize_t rc = count ? cx18_read(s, ubuf, count, non_block) : 0;
489         struct cx18 *cx = s->cx;
490
491         CX18_DEBUG_HI_FILE("read %zd from %s, got %zd\n", count, s->name, rc);
492         if (rc > 0)
493                 pos += rc;
494         return rc;
495 }
496
497 int cx18_start_capture(struct cx18_open_id *id)
498 {
499         struct cx18 *cx = id->cx;
500         struct cx18_stream *s = &cx->streams[id->type];
501         struct cx18_stream *s_vbi;
502         struct cx18_stream *s_idx;
503
504         if (s->type == CX18_ENC_STREAM_TYPE_RAD) {
505                 /* you cannot read from these stream types. */
506                 return -EPERM;
507         }
508
509         /* Try to claim this stream. */
510         if (cx18_claim_stream(id, s->type))
511                 return -EBUSY;
512
513         /* If capture is already in progress, then we also have to
514            do nothing extra. */
515         if (test_bit(CX18_F_S_STREAMOFF, &s->s_flags) ||
516             test_and_set_bit(CX18_F_S_STREAMING, &s->s_flags)) {
517                 set_bit(CX18_F_S_APPL_IO, &s->s_flags);
518                 return 0;
519         }
520
521         /* Start associated VBI or IDX stream capture if required */
522         s_vbi = &cx->streams[CX18_ENC_STREAM_TYPE_VBI];
523         s_idx = &cx->streams[CX18_ENC_STREAM_TYPE_IDX];
524         if (s->type == CX18_ENC_STREAM_TYPE_MPG) {
525                 /*
526                  * The VBI and IDX streams should have been claimed
527                  * automatically, if for internal use, when the MPG stream was
528                  * claimed.  We only need to start these streams capturing.
529                  */
530                 if (test_bit(CX18_F_S_INTERNAL_USE, &s_idx->s_flags) &&
531                     !test_and_set_bit(CX18_F_S_STREAMING, &s_idx->s_flags)) {
532                         if (cx18_start_v4l2_encode_stream(s_idx)) {
533                                 CX18_DEBUG_WARN("IDX capture start failed\n");
534                                 clear_bit(CX18_F_S_STREAMING, &s_idx->s_flags);
535                                 goto start_failed;
536                         }
537                         CX18_DEBUG_INFO("IDX capture started\n");
538                 }
539                 if (test_bit(CX18_F_S_INTERNAL_USE, &s_vbi->s_flags) &&
540                     !test_and_set_bit(CX18_F_S_STREAMING, &s_vbi->s_flags)) {
541                         if (cx18_start_v4l2_encode_stream(s_vbi)) {
542                                 CX18_DEBUG_WARN("VBI capture start failed\n");
543                                 clear_bit(CX18_F_S_STREAMING, &s_vbi->s_flags);
544                                 goto start_failed;
545                         }
546                         CX18_DEBUG_INFO("VBI insertion started\n");
547                 }
548         }
549
550         /* Tell the card to start capturing */
551         if (!cx18_start_v4l2_encode_stream(s)) {
552                 /* We're done */
553                 set_bit(CX18_F_S_APPL_IO, &s->s_flags);
554                 /* Resume a possibly paused encoder */
555                 if (test_and_clear_bit(CX18_F_I_ENC_PAUSED, &cx->i_flags))
556                         cx18_vapi(cx, CX18_CPU_CAPTURE_PAUSE, 1, s->handle);
557                 return 0;
558         }
559
560 start_failed:
561         CX18_DEBUG_WARN("Failed to start capturing for stream %s\n", s->name);
562
563         /*
564          * The associated VBI and IDX streams for internal use are released
565          * automatically when the MPG stream is released.  We only need to stop
566          * the associated stream.
567          */
568         if (s->type == CX18_ENC_STREAM_TYPE_MPG) {
569                 /* Stop the IDX stream which is always for internal use */
570                 if (test_bit(CX18_F_S_STREAMING, &s_idx->s_flags)) {
571                         cx18_stop_v4l2_encode_stream(s_idx, 0);
572                         clear_bit(CX18_F_S_STREAMING, &s_idx->s_flags);
573                 }
574                 /* Stop the VBI stream, if only running for internal use */
575                 if (test_bit(CX18_F_S_STREAMING, &s_vbi->s_flags) &&
576                     !test_bit(CX18_F_S_APPL_IO, &s_vbi->s_flags)) {
577                         cx18_stop_v4l2_encode_stream(s_vbi, 0);
578                         clear_bit(CX18_F_S_STREAMING, &s_vbi->s_flags);
579                 }
580         }
581         clear_bit(CX18_F_S_STREAMING, &s->s_flags);
582         cx18_release_stream(s); /* Also releases associated streams */
583         return -EIO;
584 }
585
586 ssize_t cx18_v4l2_read(struct file *filp, char __user *buf, size_t count,
587                 loff_t *pos)
588 {
589         struct cx18_open_id *id = file2id(filp);
590         struct cx18 *cx = id->cx;
591         struct cx18_stream *s = &cx->streams[id->type];
592         int rc;
593
594         CX18_DEBUG_HI_FILE("read %zd bytes from %s\n", count, s->name);
595
596         mutex_lock(&cx->serialize_lock);
597         rc = cx18_start_capture(id);
598         mutex_unlock(&cx->serialize_lock);
599         if (rc)
600                 return rc;
601
602         if ((s->vb_type == V4L2_BUF_TYPE_VIDEO_CAPTURE) &&
603                 (id->type == CX18_ENC_STREAM_TYPE_YUV)) {
604                 return videobuf_read_stream(&s->vbuf_q, buf, count, pos, 0,
605                         filp->f_flags & O_NONBLOCK);
606         }
607
608         return cx18_read_pos(s, buf, count, pos, filp->f_flags & O_NONBLOCK);
609 }
610
611 unsigned int cx18_v4l2_enc_poll(struct file *filp, poll_table *wait)
612 {
613         unsigned long req_events = poll_requested_events(wait);
614         struct cx18_open_id *id = file2id(filp);
615         struct cx18 *cx = id->cx;
616         struct cx18_stream *s = &cx->streams[id->type];
617         int eof = test_bit(CX18_F_S_STREAMOFF, &s->s_flags);
618         unsigned res = 0;
619
620         /* Start a capture if there is none */
621         if (!eof && !test_bit(CX18_F_S_STREAMING, &s->s_flags) &&
622                         (req_events & (POLLIN | POLLRDNORM))) {
623                 int rc;
624
625                 mutex_lock(&cx->serialize_lock);
626                 rc = cx18_start_capture(id);
627                 mutex_unlock(&cx->serialize_lock);
628                 if (rc) {
629                         CX18_DEBUG_INFO("Could not start capture for %s (%d)\n",
630                                         s->name, rc);
631                         return POLLERR;
632                 }
633                 CX18_DEBUG_FILE("Encoder poll started capture\n");
634         }
635
636         if ((s->vb_type == V4L2_BUF_TYPE_VIDEO_CAPTURE) &&
637                 (id->type == CX18_ENC_STREAM_TYPE_YUV)) {
638                 int videobuf_poll = videobuf_poll_stream(filp, &s->vbuf_q, wait);
639
640                 if (v4l2_event_pending(&id->fh))
641                         res |= POLLPRI;
642                 if (eof && videobuf_poll == POLLERR)
643                         return res | POLLHUP;
644                 return res | videobuf_poll;
645         }
646
647         /* add stream's waitq to the poll list */
648         CX18_DEBUG_HI_FILE("Encoder poll\n");
649         if (v4l2_event_pending(&id->fh))
650                 res |= POLLPRI;
651         else
652                 poll_wait(filp, &s->waitq, wait);
653
654         if (atomic_read(&s->q_full.depth))
655                 return res | POLLIN | POLLRDNORM;
656         if (eof)
657                 return res | POLLHUP;
658         return res;
659 }
660
661 int cx18_v4l2_mmap(struct file *file, struct vm_area_struct *vma)
662 {
663         struct cx18_open_id *id = file->private_data;
664         struct cx18 *cx = id->cx;
665         struct cx18_stream *s = &cx->streams[id->type];
666         int eof = test_bit(CX18_F_S_STREAMOFF, &s->s_flags);
667
668         if ((s->vb_type == V4L2_BUF_TYPE_VIDEO_CAPTURE) &&
669                 (id->type == CX18_ENC_STREAM_TYPE_YUV)) {
670
671                 /* Start a capture if there is none */
672                 if (!eof && !test_bit(CX18_F_S_STREAMING, &s->s_flags)) {
673                         int rc;
674
675                         mutex_lock(&cx->serialize_lock);
676                         rc = cx18_start_capture(id);
677                         mutex_unlock(&cx->serialize_lock);
678                         if (rc) {
679                                 CX18_DEBUG_INFO(
680                                         "Could not start capture for %s (%d)\n",
681                                         s->name, rc);
682                                 return -EINVAL;
683                         }
684                         CX18_DEBUG_FILE("Encoder mmap started capture\n");
685                 }
686
687                 return videobuf_mmap_mapper(&s->vbuf_q, vma);
688         }
689
690         return -EINVAL;
691 }
692
693 void cx18_vb_timeout(unsigned long data)
694 {
695         struct cx18_stream *s = (struct cx18_stream *)data;
696         struct cx18_videobuf_buffer *buf;
697         unsigned long flags;
698
699         /* Return all of the buffers in error state, so the vbi/vid inode
700          * can return from blocking.
701          */
702         spin_lock_irqsave(&s->vb_lock, flags);
703         while (!list_empty(&s->vb_capture)) {
704                 buf = list_entry(s->vb_capture.next,
705                         struct cx18_videobuf_buffer, vb.queue);
706                 list_del(&buf->vb.queue);
707                 buf->vb.state = VIDEOBUF_ERROR;
708                 wake_up(&buf->vb.done);
709         }
710         spin_unlock_irqrestore(&s->vb_lock, flags);
711 }
712
713 void cx18_stop_capture(struct cx18_open_id *id, int gop_end)
714 {
715         struct cx18 *cx = id->cx;
716         struct cx18_stream *s = &cx->streams[id->type];
717         struct cx18_stream *s_vbi = &cx->streams[CX18_ENC_STREAM_TYPE_VBI];
718         struct cx18_stream *s_idx = &cx->streams[CX18_ENC_STREAM_TYPE_IDX];
719
720         CX18_DEBUG_IOCTL("close() of %s\n", s->name);
721
722         /* 'Unclaim' this stream */
723
724         /* Stop capturing */
725         if (test_bit(CX18_F_S_STREAMING, &s->s_flags)) {
726                 CX18_DEBUG_INFO("close stopping capture\n");
727                 if (id->type == CX18_ENC_STREAM_TYPE_MPG) {
728                         /* Stop internal use associated VBI and IDX streams */
729                         if (test_bit(CX18_F_S_STREAMING, &s_vbi->s_flags) &&
730                             !test_bit(CX18_F_S_APPL_IO, &s_vbi->s_flags)) {
731                                 CX18_DEBUG_INFO("close stopping embedded VBI "
732                                                 "capture\n");
733                                 cx18_stop_v4l2_encode_stream(s_vbi, 0);
734                         }
735                         if (test_bit(CX18_F_S_STREAMING, &s_idx->s_flags)) {
736                                 CX18_DEBUG_INFO("close stopping IDX capture\n");
737                                 cx18_stop_v4l2_encode_stream(s_idx, 0);
738                         }
739                 }
740                 if (id->type == CX18_ENC_STREAM_TYPE_VBI &&
741                     test_bit(CX18_F_S_INTERNAL_USE, &s->s_flags))
742                         /* Also used internally, don't stop capturing */
743                         s->id = -1;
744                 else
745                         cx18_stop_v4l2_encode_stream(s, gop_end);
746         }
747         if (!gop_end) {
748                 clear_bit(CX18_F_S_APPL_IO, &s->s_flags);
749                 clear_bit(CX18_F_S_STREAMOFF, &s->s_flags);
750                 cx18_release_stream(s);
751         }
752 }
753
754 int cx18_v4l2_close(struct file *filp)
755 {
756         struct v4l2_fh *fh = filp->private_data;
757         struct cx18_open_id *id = fh2id(fh);
758         struct cx18 *cx = id->cx;
759         struct cx18_stream *s = &cx->streams[id->type];
760
761         CX18_DEBUG_IOCTL("close() of %s\n", s->name);
762
763         mutex_lock(&cx->serialize_lock);
764         /* Stop radio */
765         if (id->type == CX18_ENC_STREAM_TYPE_RAD &&
766                         v4l2_fh_is_singular_file(filp)) {
767                 /* Closing radio device, return to TV mode */
768                 cx18_mute(cx);
769                 /* Mark that the radio is no longer in use */
770                 clear_bit(CX18_F_I_RADIO_USER, &cx->i_flags);
771                 /* Switch tuner to TV */
772                 cx18_call_all(cx, video, s_std, cx->std);
773                 /* Select correct audio input (i.e. TV tuner or Line in) */
774                 cx18_audio_set_io(cx);
775                 if (atomic_read(&cx->ana_capturing) > 0) {
776                         /* Undo video mute */
777                         cx18_vapi(cx, CX18_CPU_SET_VIDEO_MUTE, 2, s->handle,
778                             (v4l2_ctrl_g_ctrl(cx->cxhdl.video_mute) |
779                             (v4l2_ctrl_g_ctrl(cx->cxhdl.video_mute_yuv) << 8)));
780                 }
781                 /* Done! Unmute and continue. */
782                 cx18_unmute(cx);
783         }
784
785         v4l2_fh_del(fh);
786         v4l2_fh_exit(fh);
787
788         /* 'Unclaim' this stream */
789         if (s->id == id->open_id)
790                 cx18_stop_capture(id, 0);
791         kfree(id);
792         mutex_unlock(&cx->serialize_lock);
793         return 0;
794 }
795
796 static int cx18_serialized_open(struct cx18_stream *s, struct file *filp)
797 {
798         struct cx18 *cx = s->cx;
799         struct cx18_open_id *item;
800
801         CX18_DEBUG_FILE("open %s\n", s->name);
802
803         /* Allocate memory */
804         item = kzalloc(sizeof(struct cx18_open_id), GFP_KERNEL);
805         if (NULL == item) {
806                 CX18_DEBUG_WARN("nomem on v4l2 open\n");
807                 return -ENOMEM;
808         }
809         v4l2_fh_init(&item->fh, &s->video_dev);
810
811         item->cx = cx;
812         item->type = s->type;
813
814         item->open_id = cx->open_id++;
815         filp->private_data = &item->fh;
816         v4l2_fh_add(&item->fh);
817
818         if (item->type == CX18_ENC_STREAM_TYPE_RAD &&
819                         v4l2_fh_is_singular_file(filp)) {
820                 if (!test_bit(CX18_F_I_RADIO_USER, &cx->i_flags)) {
821                         if (atomic_read(&cx->ana_capturing) > 0) {
822                                 /* switching to radio while capture is
823                                    in progress is not polite */
824                                 v4l2_fh_del(&item->fh);
825                                 v4l2_fh_exit(&item->fh);
826                                 kfree(item);
827                                 return -EBUSY;
828                         }
829                 }
830
831                 /* Mark that the radio is being used. */
832                 set_bit(CX18_F_I_RADIO_USER, &cx->i_flags);
833                 /* We have the radio */
834                 cx18_mute(cx);
835                 /* Switch tuner to radio */
836                 cx18_call_all(cx, tuner, s_radio);
837                 /* Select the correct audio input (i.e. radio tuner) */
838                 cx18_audio_set_io(cx);
839                 /* Done! Unmute and continue. */
840                 cx18_unmute(cx);
841         }
842         return 0;
843 }
844
845 int cx18_v4l2_open(struct file *filp)
846 {
847         int res;
848         struct video_device *video_dev = video_devdata(filp);
849         struct cx18_stream *s = video_get_drvdata(video_dev);
850         struct cx18 *cx = s->cx;
851
852         mutex_lock(&cx->serialize_lock);
853         if (cx18_init_on_first_open(cx)) {
854                 CX18_ERR("Failed to initialize on %s\n",
855                          video_device_node_name(video_dev));
856                 mutex_unlock(&cx->serialize_lock);
857                 return -ENXIO;
858         }
859         res = cx18_serialized_open(s, filp);
860         mutex_unlock(&cx->serialize_lock);
861         return res;
862 }
863
864 void cx18_mute(struct cx18 *cx)
865 {
866         u32 h;
867         if (atomic_read(&cx->ana_capturing)) {
868                 h = cx18_find_handle(cx);
869                 if (h != CX18_INVALID_TASK_HANDLE)
870                         cx18_vapi(cx, CX18_CPU_SET_AUDIO_MUTE, 2, h, 1);
871                 else
872                         CX18_ERR("Can't find valid task handle for mute\n");
873         }
874         CX18_DEBUG_INFO("Mute\n");
875 }
876
877 void cx18_unmute(struct cx18 *cx)
878 {
879         u32 h;
880         if (atomic_read(&cx->ana_capturing)) {
881                 h = cx18_find_handle(cx);
882                 if (h != CX18_INVALID_TASK_HANDLE) {
883                         cx18_msleep_timeout(100, 0);
884                         cx18_vapi(cx, CX18_CPU_SET_MISC_PARAMETERS, 2, h, 12);
885                         cx18_vapi(cx, CX18_CPU_SET_AUDIO_MUTE, 2, h, 0);
886                 } else
887                         CX18_ERR("Can't find valid task handle for unmute\n");
888         }
889         CX18_DEBUG_INFO("Unmute\n");
890 }