]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/media/pci/tw5864/tw5864-video.c
Merge tag 'samsung-fixes-4.12' of git://git.kernel.org/pub/scm/linux/kernel/git/krzk...
[karo-tx-linux.git] / drivers / media / pci / tw5864 / tw5864-video.c
1 /*
2  *  TW5864 driver - video encoding functions
3  *
4  *  Copyright (C) 2016 Bluecherry, LLC <maintainers@bluecherrydvr.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, or
9  *  (at your option) any later version.
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
17 #include <linux/module.h>
18 #include <media/v4l2-common.h>
19 #include <media/v4l2-event.h>
20 #include <media/videobuf2-dma-contig.h>
21
22 #include "tw5864.h"
23 #include "tw5864-reg.h"
24
25 #define QUANTIZATION_TABLE_LEN 96
26 #define VLC_LOOKUP_TABLE_LEN 1024
27
28 static const u16 forward_quantization_table[QUANTIZATION_TABLE_LEN] = {
29         0x3333, 0x1f82, 0x3333, 0x1f82, 0x1f82, 0x147b, 0x1f82, 0x147b,
30         0x3333, 0x1f82, 0x3333, 0x1f82, 0x1f82, 0x147b, 0x1f82, 0x147b,
31         0x2e8c, 0x1d42, 0x2e8c, 0x1d42, 0x1d42, 0x1234, 0x1d42, 0x1234,
32         0x2e8c, 0x1d42, 0x2e8c, 0x1d42, 0x1d42, 0x1234, 0x1d42, 0x1234,
33         0x2762, 0x199a, 0x2762, 0x199a, 0x199a, 0x1062, 0x199a, 0x1062,
34         0x2762, 0x199a, 0x2762, 0x199a, 0x199a, 0x1062, 0x199a, 0x1062,
35         0x2492, 0x16c1, 0x2492, 0x16c1, 0x16c1, 0x0e3f, 0x16c1, 0x0e3f,
36         0x2492, 0x16c1, 0x2492, 0x16c1, 0x16c1, 0x0e3f, 0x16c1, 0x0e3f,
37         0x2000, 0x147b, 0x2000, 0x147b, 0x147b, 0x0d1b, 0x147b, 0x0d1b,
38         0x2000, 0x147b, 0x2000, 0x147b, 0x147b, 0x0d1b, 0x147b, 0x0d1b,
39         0x1c72, 0x11cf, 0x1c72, 0x11cf, 0x11cf, 0x0b4d, 0x11cf, 0x0b4d,
40         0x1c72, 0x11cf, 0x1c72, 0x11cf, 0x11cf, 0x0b4d, 0x11cf, 0x0b4d
41 };
42
43 static const u16 inverse_quantization_table[QUANTIZATION_TABLE_LEN] = {
44         0x800a, 0x800d, 0x800a, 0x800d, 0x800d, 0x8010, 0x800d, 0x8010,
45         0x800a, 0x800d, 0x800a, 0x800d, 0x800d, 0x8010, 0x800d, 0x8010,
46         0x800b, 0x800e, 0x800b, 0x800e, 0x800e, 0x8012, 0x800e, 0x8012,
47         0x800b, 0x800e, 0x800b, 0x800e, 0x800e, 0x8012, 0x800e, 0x8012,
48         0x800d, 0x8010, 0x800d, 0x8010, 0x8010, 0x8014, 0x8010, 0x8014,
49         0x800d, 0x8010, 0x800d, 0x8010, 0x8010, 0x8014, 0x8010, 0x8014,
50         0x800e, 0x8012, 0x800e, 0x8012, 0x8012, 0x8017, 0x8012, 0x8017,
51         0x800e, 0x8012, 0x800e, 0x8012, 0x8012, 0x8017, 0x8012, 0x8017,
52         0x8010, 0x8014, 0x8010, 0x8014, 0x8014, 0x8019, 0x8014, 0x8019,
53         0x8010, 0x8014, 0x8010, 0x8014, 0x8014, 0x8019, 0x8014, 0x8019,
54         0x8012, 0x8017, 0x8012, 0x8017, 0x8017, 0x801d, 0x8017, 0x801d,
55         0x8012, 0x8017, 0x8012, 0x8017, 0x8017, 0x801d, 0x8017, 0x801d
56 };
57
58 static const u16 encoder_vlc_lookup_table[VLC_LOOKUP_TABLE_LEN] = {
59         0x011, 0x000, 0x000, 0x000, 0x065, 0x021, 0x000, 0x000, 0x087, 0x064,
60         0x031, 0x000, 0x097, 0x086, 0x075, 0x053, 0x0a7, 0x096, 0x085, 0x063,
61         0x0b7, 0x0a6, 0x095, 0x074, 0x0df, 0x0b6, 0x0a5, 0x084, 0x0db, 0x0de,
62         0x0b5, 0x094, 0x0d8, 0x0da, 0x0dd, 0x0a4, 0x0ef, 0x0ee, 0x0d9, 0x0b4,
63         0x0eb, 0x0ea, 0x0ed, 0x0dc, 0x0ff, 0x0fe, 0x0e9, 0x0ec, 0x0fb, 0x0fa,
64         0x0fd, 0x0e8, 0x10f, 0x0f1, 0x0f9, 0x0fc, 0x10b, 0x10e, 0x10d, 0x0f8,
65         0x107, 0x10a, 0x109, 0x10c, 0x104, 0x106, 0x105, 0x108, 0x023, 0x000,
66         0x000, 0x000, 0x06b, 0x022, 0x000, 0x000, 0x067, 0x057, 0x033, 0x000,
67         0x077, 0x06a, 0x069, 0x045, 0x087, 0x066, 0x065, 0x044, 0x084, 0x076,
68         0x075, 0x056, 0x097, 0x086, 0x085, 0x068, 0x0bf, 0x096, 0x095, 0x064,
69         0x0bb, 0x0be, 0x0bd, 0x074, 0x0cf, 0x0ba, 0x0b9, 0x094, 0x0cb, 0x0ce,
70         0x0cd, 0x0bc, 0x0c8, 0x0ca, 0x0c9, 0x0b8, 0x0df, 0x0de, 0x0dd, 0x0cc,
71         0x0db, 0x0da, 0x0d9, 0x0dc, 0x0d7, 0x0eb, 0x0d6, 0x0d8, 0x0e9, 0x0e8,
72         0x0ea, 0x0d1, 0x0e7, 0x0e6, 0x0e5, 0x0e4, 0x04f, 0x000, 0x000, 0x000,
73         0x06f, 0x04e, 0x000, 0x000, 0x06b, 0x05f, 0x04d, 0x000, 0x068, 0x05c,
74         0x05e, 0x04c, 0x07f, 0x05a, 0x05b, 0x04b, 0x07b, 0x058, 0x059, 0x04a,
75         0x079, 0x06e, 0x06d, 0x049, 0x078, 0x06a, 0x069, 0x048, 0x08f, 0x07e,
76         0x07d, 0x05d, 0x08b, 0x08e, 0x07a, 0x06c, 0x09f, 0x08a, 0x08d, 0x07c,
77         0x09b, 0x09e, 0x089, 0x08c, 0x098, 0x09a, 0x09d, 0x088, 0x0ad, 0x097,
78         0x099, 0x09c, 0x0a9, 0x0ac, 0x0ab, 0x0aa, 0x0a5, 0x0a8, 0x0a7, 0x0a6,
79         0x0a1, 0x0a4, 0x0a3, 0x0a2, 0x021, 0x000, 0x000, 0x000, 0x067, 0x011,
80         0x000, 0x000, 0x064, 0x066, 0x031, 0x000, 0x063, 0x073, 0x072, 0x065,
81         0x062, 0x083, 0x082, 0x070, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
82         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
83         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
84         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
85         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
86         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
87         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
88         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
89         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
90         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
91         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
92         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
93         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
94         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
95         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
96         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
97         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
98         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
99         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
100         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
101         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
102         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
103         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
104         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
105         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
106         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
107         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
108         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
109         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
110         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
111         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x011, 0x010,
112         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
113         0x000, 0x000, 0x000, 0x000, 0x011, 0x021, 0x020, 0x000, 0x000, 0x000,
114         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
115         0x023, 0x022, 0x021, 0x020, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
116         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x023, 0x022, 0x021, 0x031,
117         0x030, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
118         0x000, 0x000, 0x023, 0x022, 0x033, 0x032, 0x031, 0x030, 0x000, 0x000,
119         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x023, 0x030,
120         0x031, 0x033, 0x032, 0x035, 0x034, 0x000, 0x000, 0x000, 0x000, 0x000,
121         0x000, 0x000, 0x000, 0x000, 0x037, 0x036, 0x035, 0x034, 0x033, 0x032,
122         0x031, 0x041, 0x051, 0x061, 0x071, 0x081, 0x091, 0x0a1, 0x0b1, 0x000,
123         0x002, 0x000, 0x0e4, 0x011, 0x0f4, 0x002, 0x024, 0x003, 0x005, 0x012,
124         0x034, 0x013, 0x065, 0x024, 0x013, 0x063, 0x015, 0x022, 0x075, 0x034,
125         0x044, 0x023, 0x023, 0x073, 0x054, 0x033, 0x033, 0x004, 0x043, 0x014,
126         0x011, 0x043, 0x014, 0x001, 0x025, 0x015, 0x035, 0x025, 0x064, 0x055,
127         0x045, 0x035, 0x074, 0x065, 0x085, 0x0d5, 0x012, 0x095, 0x055, 0x045,
128         0x095, 0x0e5, 0x084, 0x075, 0x022, 0x0a5, 0x094, 0x085, 0x032, 0x0b5,
129         0x003, 0x0c5, 0x001, 0x044, 0x0a5, 0x032, 0x0b5, 0x094, 0x0c5, 0x0a4,
130         0x0a4, 0x054, 0x0d5, 0x0b4, 0x0b4, 0x064, 0x0f5, 0x0f5, 0x053, 0x0d4,
131         0x0e5, 0x0c4, 0x105, 0x105, 0x0c4, 0x074, 0x063, 0x0e4, 0x0d4, 0x084,
132         0x073, 0x0f4, 0x004, 0x005, 0x000, 0x053, 0x000, 0x000, 0x000, 0x000,
133         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
134         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
135         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
136         0x000, 0x000, 0x011, 0x021, 0x031, 0x030, 0x011, 0x021, 0x020, 0x000,
137         0x011, 0x010, 0x000, 0x000, 0x011, 0x033, 0x032, 0x043, 0x042, 0x053,
138         0x052, 0x063, 0x062, 0x073, 0x072, 0x083, 0x082, 0x093, 0x092, 0x091,
139         0x037, 0x036, 0x035, 0x034, 0x033, 0x045, 0x044, 0x043, 0x042, 0x053,
140         0x052, 0x063, 0x062, 0x061, 0x060, 0x000, 0x045, 0x037, 0x036, 0x035,
141         0x044, 0x043, 0x034, 0x033, 0x042, 0x053, 0x052, 0x061, 0x051, 0x060,
142         0x000, 0x000, 0x053, 0x037, 0x045, 0x044, 0x036, 0x035, 0x034, 0x043,
143         0x033, 0x042, 0x052, 0x051, 0x050, 0x000, 0x000, 0x000, 0x045, 0x044,
144         0x043, 0x037, 0x036, 0x035, 0x034, 0x033, 0x042, 0x051, 0x041, 0x050,
145         0x000, 0x000, 0x000, 0x000, 0x061, 0x051, 0x037, 0x036, 0x035, 0x034,
146         0x033, 0x032, 0x041, 0x031, 0x060, 0x000, 0x000, 0x000, 0x000, 0x000,
147         0x061, 0x051, 0x035, 0x034, 0x033, 0x023, 0x032, 0x041, 0x031, 0x060,
148         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x061, 0x041, 0x051, 0x033,
149         0x023, 0x022, 0x032, 0x031, 0x060, 0x000, 0x000, 0x000, 0x000, 0x000,
150         0x000, 0x000, 0x061, 0x060, 0x041, 0x023, 0x022, 0x031, 0x021, 0x051,
151         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x051, 0x050,
152         0x031, 0x023, 0x022, 0x021, 0x041, 0x000, 0x000, 0x000, 0x000, 0x000,
153         0x000, 0x000, 0x000, 0x000, 0x040, 0x041, 0x031, 0x032, 0x011, 0x033,
154         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
155         0x040, 0x041, 0x021, 0x011, 0x031, 0x000, 0x000, 0x000, 0x000, 0x000,
156         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x031, 0x011, 0x021,
157         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
158         0x000, 0x000, 0x020, 0x021, 0x011, 0x000, 0x000, 0x000, 0x000, 0x000,
159         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, 0x011,
160         0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
161         0x000, 0x000, 0x000, 0x000
162 };
163
164 static const unsigned int lambda_lookup_table[] = {
165         0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020,
166         0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020,
167         0x0040, 0x0040, 0x0040, 0x0040, 0x0060, 0x0060, 0x0060, 0x0080,
168         0x0080, 0x0080, 0x00a0, 0x00c0, 0x00c0, 0x00e0, 0x0100, 0x0120,
169         0x0140, 0x0160, 0x01a0, 0x01c0, 0x0200, 0x0240, 0x0280, 0x02e0,
170         0x0320, 0x03a0, 0x0400, 0x0480, 0x0500, 0x05a0, 0x0660, 0x0720,
171         0x0800, 0x0900, 0x0a20, 0x0b60
172 };
173
174 static const unsigned int intra4x4_lambda3[] = {
175         1, 1, 1, 1, 1, 1, 1, 1,
176         1, 1, 1, 1, 1, 1, 1, 1,
177         2, 2, 2, 2, 3, 3, 3, 4,
178         4, 4, 5, 6, 6, 7, 8, 9,
179         10, 11, 13, 14, 16, 18, 20, 23,
180         25, 29, 32, 36, 40, 45, 51, 57,
181         64, 72, 81, 91
182 };
183
184 static v4l2_std_id tw5864_get_v4l2_std(enum tw5864_vid_std std);
185 static enum tw5864_vid_std tw5864_from_v4l2_std(v4l2_std_id v4l2_std);
186
187 static void tw5864_handle_frame_task(unsigned long data);
188 static void tw5864_handle_frame(struct tw5864_h264_frame *frame);
189 static void tw5864_frame_interval_set(struct tw5864_input *input);
190
191 static int tw5864_queue_setup(struct vb2_queue *q, unsigned int *num_buffers,
192                               unsigned int *num_planes, unsigned int sizes[],
193                               struct device *alloc_ctxs[])
194 {
195         if (*num_planes)
196                 return sizes[0] < H264_VLC_BUF_SIZE ? -EINVAL : 0;
197
198         sizes[0] = H264_VLC_BUF_SIZE;
199         *num_planes = 1;
200
201         return 0;
202 }
203
204 static void tw5864_buf_queue(struct vb2_buffer *vb)
205 {
206         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
207         struct vb2_queue *vq = vb->vb2_queue;
208         struct tw5864_input *dev = vb2_get_drv_priv(vq);
209         struct tw5864_buf *buf = container_of(vbuf, struct tw5864_buf, vb);
210         unsigned long flags;
211
212         spin_lock_irqsave(&dev->slock, flags);
213         list_add_tail(&buf->list, &dev->active);
214         spin_unlock_irqrestore(&dev->slock, flags);
215 }
216
217 static int tw5864_input_std_get(struct tw5864_input *input,
218                                 enum tw5864_vid_std *std)
219 {
220         struct tw5864_dev *dev = input->root;
221         u8 std_reg = tw_indir_readb(TW5864_INDIR_VIN_E(input->nr));
222
223         *std = (std_reg & 0x70) >> 4;
224
225         if (std_reg & 0x80) {
226                 dev_dbg(&dev->pci->dev,
227                         "Video format detection is in progress, please wait\n");
228                 return -EAGAIN;
229         }
230
231         return 0;
232 }
233
234 static int tw5864_enable_input(struct tw5864_input *input)
235 {
236         struct tw5864_dev *dev = input->root;
237         int nr = input->nr;
238         unsigned long flags;
239         int d1_width = 720;
240         int d1_height;
241         int frame_width_bus_value = 0;
242         int frame_height_bus_value = 0;
243         int reg_frame_bus = 0x1c;
244         int fmt_reg_value = 0;
245         int downscale_enabled = 0;
246
247         dev_dbg(&dev->pci->dev, "Enabling channel %d\n", nr);
248
249         input->frame_seqno = 0;
250         input->frame_gop_seqno = 0;
251         input->h264_idr_pic_id = 0;
252
253         input->reg_dsp_qp = input->qp;
254         input->reg_dsp_ref_mvp_lambda = lambda_lookup_table[input->qp];
255         input->reg_dsp_i4x4_weight = intra4x4_lambda3[input->qp];
256         input->reg_emu = TW5864_EMU_EN_LPF | TW5864_EMU_EN_BHOST
257                 | TW5864_EMU_EN_SEN | TW5864_EMU_EN_ME | TW5864_EMU_EN_DDR;
258         input->reg_dsp = nr /* channel id */
259                 | TW5864_DSP_CHROM_SW
260                 | ((0xa << 8) & TW5864_DSP_MB_DELAY)
261                 ;
262
263         input->resolution = D1;
264
265         d1_height = (input->std == STD_NTSC) ? 480 : 576;
266
267         input->width = d1_width;
268         input->height = d1_height;
269
270         input->reg_interlacing = 0x4;
271
272         switch (input->resolution) {
273         case D1:
274                 frame_width_bus_value = 0x2cf;
275                 frame_height_bus_value = input->height - 1;
276                 reg_frame_bus = 0x1c;
277                 fmt_reg_value = 0;
278                 downscale_enabled = 0;
279                 input->reg_dsp_codec |= TW5864_CIF_MAP_MD | TW5864_HD1_MAP_MD;
280                 input->reg_emu |= TW5864_DSP_FRAME_TYPE_D1;
281                 input->reg_interlacing = TW5864_DI_EN | TW5864_DSP_INTER_ST;
282
283                 tw_setl(TW5864_FULL_HALF_FLAG, 1 << nr);
284                 break;
285         case HD1:
286                 input->height /= 2;
287                 input->width /= 2;
288                 frame_width_bus_value = 0x2cf;
289                 frame_height_bus_value = input->height * 2 - 1;
290                 reg_frame_bus = 0x1c;
291                 fmt_reg_value = 0;
292                 downscale_enabled = 0;
293                 input->reg_dsp_codec |= TW5864_HD1_MAP_MD;
294                 input->reg_emu |= TW5864_DSP_FRAME_TYPE_D1;
295
296                 tw_clearl(TW5864_FULL_HALF_FLAG, 1 << nr);
297
298                 break;
299         case CIF:
300                 input->height /= 4;
301                 input->width /= 2;
302                 frame_width_bus_value = 0x15f;
303                 frame_height_bus_value = input->height * 2 - 1;
304                 reg_frame_bus = 0x07;
305                 fmt_reg_value = 1;
306                 downscale_enabled = 1;
307                 input->reg_dsp_codec |= TW5864_CIF_MAP_MD;
308
309                 tw_clearl(TW5864_FULL_HALF_FLAG, 1 << nr);
310                 break;
311         case QCIF:
312                 input->height /= 4;
313                 input->width /= 4;
314                 frame_width_bus_value = 0x15f;
315                 frame_height_bus_value = input->height * 2 - 1;
316                 reg_frame_bus = 0x07;
317                 fmt_reg_value = 1;
318                 downscale_enabled = 1;
319                 input->reg_dsp_codec |= TW5864_CIF_MAP_MD;
320
321                 tw_clearl(TW5864_FULL_HALF_FLAG, 1 << nr);
322                 break;
323         }
324
325         /* analog input width / 4 */
326         tw_indir_writeb(TW5864_INDIR_IN_PIC_WIDTH(nr), d1_width / 4);
327         tw_indir_writeb(TW5864_INDIR_IN_PIC_HEIGHT(nr), d1_height / 4);
328
329         /* output width / 4 */
330         tw_indir_writeb(TW5864_INDIR_OUT_PIC_WIDTH(nr), input->width / 4);
331         tw_indir_writeb(TW5864_INDIR_OUT_PIC_HEIGHT(nr), input->height / 4);
332
333         /*
334          * Crop width from 720 to 704.
335          * Above register settings need value 720 involved.
336          */
337         input->width = 704;
338         tw_indir_writeb(TW5864_INDIR_CROP_ETC,
339                         tw_indir_readb(TW5864_INDIR_CROP_ETC) |
340                         TW5864_INDIR_CROP_ETC_CROP_EN);
341
342         tw_writel(TW5864_DSP_PIC_MAX_MB,
343                   ((input->width / 16) << 8) | (input->height / 16));
344
345         tw_writel(TW5864_FRAME_WIDTH_BUS_A(nr),
346                   frame_width_bus_value);
347         tw_writel(TW5864_FRAME_WIDTH_BUS_B(nr),
348                   frame_width_bus_value);
349         tw_writel(TW5864_FRAME_HEIGHT_BUS_A(nr),
350                   frame_height_bus_value);
351         tw_writel(TW5864_FRAME_HEIGHT_BUS_B(nr),
352                   (frame_height_bus_value + 1) / 2 - 1);
353
354         tw5864_frame_interval_set(input);
355
356         if (downscale_enabled)
357                 tw_setl(TW5864_H264EN_CH_DNS, 1 << nr);
358
359         tw_mask_shift_writel(TW5864_H264EN_CH_FMT_REG1, 0x3, 2 * nr,
360                              fmt_reg_value);
361
362         tw_mask_shift_writel((nr < 2
363                               ? TW5864_H264EN_RATE_MAX_LINE_REG1
364                               : TW5864_H264EN_RATE_MAX_LINE_REG2),
365                              0x1f, 5 * (nr % 2),
366                              input->std == STD_NTSC ? 29 : 24);
367
368         tw_mask_shift_writel((nr < 2) ? TW5864_FRAME_BUS1 :
369                              TW5864_FRAME_BUS2, 0xff, (nr % 2) * 8,
370                              reg_frame_bus);
371
372         spin_lock_irqsave(&dev->slock, flags);
373         input->enabled = 1;
374         spin_unlock_irqrestore(&dev->slock, flags);
375
376         return 0;
377 }
378
379 void tw5864_request_encoded_frame(struct tw5864_input *input)
380 {
381         struct tw5864_dev *dev = input->root;
382         u32 enc_buf_id_new;
383
384         tw_setl(TW5864_DSP_CODEC, TW5864_CIF_MAP_MD | TW5864_HD1_MAP_MD);
385         tw_writel(TW5864_EMU, input->reg_emu);
386         tw_writel(TW5864_INTERLACING, input->reg_interlacing);
387         tw_writel(TW5864_DSP, input->reg_dsp);
388
389         tw_writel(TW5864_DSP_QP, input->reg_dsp_qp);
390         tw_writel(TW5864_DSP_REF_MVP_LAMBDA, input->reg_dsp_ref_mvp_lambda);
391         tw_writel(TW5864_DSP_I4x4_WEIGHT, input->reg_dsp_i4x4_weight);
392         tw_mask_shift_writel(TW5864_DSP_INTRA_MODE, TW5864_DSP_INTRA_MODE_MASK,
393                              TW5864_DSP_INTRA_MODE_SHIFT,
394                              TW5864_DSP_INTRA_MODE_16x16);
395
396         if (input->frame_gop_seqno == 0) {
397                 /* Produce I-frame */
398                 tw_writel(TW5864_MOTION_SEARCH_ETC, TW5864_INTRA_EN);
399                 input->h264_idr_pic_id++;
400                 input->h264_idr_pic_id &= TW5864_DSP_REF_FRM;
401         } else {
402                 /* Produce P-frame */
403                 tw_writel(TW5864_MOTION_SEARCH_ETC, TW5864_INTRA_EN |
404                           TW5864_ME_EN | BIT(5) /* SRCH_OPT default */);
405         }
406         tw5864_prepare_frame_headers(input);
407         tw_writel(TW5864_VLC,
408                   TW5864_VLC_PCI_SEL |
409                   ((input->tail_nb_bits + 24) << TW5864_VLC_BIT_ALIGN_SHIFT) |
410                   input->reg_dsp_qp);
411
412         enc_buf_id_new = tw_mask_shift_readl(TW5864_ENC_BUF_PTR_REC1, 0x3,
413                                              2 * input->nr);
414         tw_writel(TW5864_DSP_ENC_ORG_PTR_REG,
415                   enc_buf_id_new << TW5864_DSP_ENC_ORG_PTR_SHIFT);
416         tw_writel(TW5864_DSP_ENC_REC,
417                   enc_buf_id_new << 12 | ((enc_buf_id_new + 3) & 3));
418
419         tw_writel(TW5864_SLICE, TW5864_START_NSLICE);
420         tw_writel(TW5864_SLICE, 0);
421 }
422
423 static int tw5864_disable_input(struct tw5864_input *input)
424 {
425         struct tw5864_dev *dev = input->root;
426         unsigned long flags;
427
428         dev_dbg(&dev->pci->dev, "Disabling channel %d\n", input->nr);
429
430         spin_lock_irqsave(&dev->slock, flags);
431         input->enabled = 0;
432         spin_unlock_irqrestore(&dev->slock, flags);
433         return 0;
434 }
435
436 static int tw5864_start_streaming(struct vb2_queue *q, unsigned int count)
437 {
438         struct tw5864_input *input = vb2_get_drv_priv(q);
439         int ret;
440
441         ret = tw5864_enable_input(input);
442         if (!ret)
443                 return 0;
444
445         while (!list_empty(&input->active)) {
446                 struct tw5864_buf *buf = list_entry(input->active.next,
447                                                     struct tw5864_buf, list);
448
449                 list_del(&buf->list);
450                 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_QUEUED);
451         }
452         return ret;
453 }
454
455 static void tw5864_stop_streaming(struct vb2_queue *q)
456 {
457         unsigned long flags;
458         struct tw5864_input *input = vb2_get_drv_priv(q);
459
460         tw5864_disable_input(input);
461
462         spin_lock_irqsave(&input->slock, flags);
463         if (input->vb) {
464                 vb2_buffer_done(&input->vb->vb.vb2_buf, VB2_BUF_STATE_ERROR);
465                 input->vb = NULL;
466         }
467         while (!list_empty(&input->active)) {
468                 struct tw5864_buf *buf = list_entry(input->active.next,
469                                                     struct tw5864_buf, list);
470
471                 list_del(&buf->list);
472                 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
473         }
474         spin_unlock_irqrestore(&input->slock, flags);
475 }
476
477 static const struct vb2_ops tw5864_video_qops = {
478         .queue_setup = tw5864_queue_setup,
479         .buf_queue = tw5864_buf_queue,
480         .start_streaming = tw5864_start_streaming,
481         .stop_streaming = tw5864_stop_streaming,
482         .wait_prepare = vb2_ops_wait_prepare,
483         .wait_finish = vb2_ops_wait_finish,
484 };
485
486 static int tw5864_s_ctrl(struct v4l2_ctrl *ctrl)
487 {
488         struct tw5864_input *input =
489                 container_of(ctrl->handler, struct tw5864_input, hdl);
490         struct tw5864_dev *dev = input->root;
491         unsigned long flags;
492
493         switch (ctrl->id) {
494         case V4L2_CID_BRIGHTNESS:
495                 tw_indir_writeb(TW5864_INDIR_VIN_A_BRIGHT(input->nr),
496                                 (u8)ctrl->val);
497                 break;
498         case V4L2_CID_HUE:
499                 tw_indir_writeb(TW5864_INDIR_VIN_7_HUE(input->nr),
500                                 (u8)ctrl->val);
501                 break;
502         case V4L2_CID_CONTRAST:
503                 tw_indir_writeb(TW5864_INDIR_VIN_9_CNTRST(input->nr),
504                                 (u8)ctrl->val);
505                 break;
506         case V4L2_CID_SATURATION:
507                 tw_indir_writeb(TW5864_INDIR_VIN_B_SAT_U(input->nr),
508                                 (u8)ctrl->val);
509                 tw_indir_writeb(TW5864_INDIR_VIN_C_SAT_V(input->nr),
510                                 (u8)ctrl->val);
511                 break;
512         case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
513                 input->gop = ctrl->val;
514                 return 0;
515         case V4L2_CID_MPEG_VIDEO_H264_MIN_QP:
516                 spin_lock_irqsave(&input->slock, flags);
517                 input->qp = ctrl->val;
518                 input->reg_dsp_qp = input->qp;
519                 input->reg_dsp_ref_mvp_lambda = lambda_lookup_table[input->qp];
520                 input->reg_dsp_i4x4_weight = intra4x4_lambda3[input->qp];
521                 spin_unlock_irqrestore(&input->slock, flags);
522                 return 0;
523         case V4L2_CID_DETECT_MD_GLOBAL_THRESHOLD:
524                 memset(input->md_threshold_grid_values, ctrl->val,
525                        sizeof(input->md_threshold_grid_values));
526                 return 0;
527         case V4L2_CID_DETECT_MD_MODE:
528                 return 0;
529         case V4L2_CID_DETECT_MD_THRESHOLD_GRID:
530                 /* input->md_threshold_grid_ctrl->p_new.p_u16 contains data */
531                 memcpy(input->md_threshold_grid_values,
532                        input->md_threshold_grid_ctrl->p_new.p_u16,
533                        sizeof(input->md_threshold_grid_values));
534                 return 0;
535         }
536         return 0;
537 }
538
539 static int tw5864_fmt_vid_cap(struct file *file, void *priv,
540                               struct v4l2_format *f)
541 {
542         struct tw5864_input *input = video_drvdata(file);
543
544         f->fmt.pix.width = 704;
545         switch (input->std) {
546         default:
547                 WARN_ON_ONCE(1);
548         case STD_NTSC:
549                 f->fmt.pix.height = 480;
550                 break;
551         case STD_PAL:
552         case STD_SECAM:
553                 f->fmt.pix.height = 576;
554                 break;
555         }
556         f->fmt.pix.field = V4L2_FIELD_INTERLACED;
557         f->fmt.pix.pixelformat = V4L2_PIX_FMT_H264;
558         f->fmt.pix.sizeimage = H264_VLC_BUF_SIZE;
559         f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
560         return 0;
561 }
562
563 static int tw5864_enum_input(struct file *file, void *priv,
564                              struct v4l2_input *i)
565 {
566         struct tw5864_input *input = video_drvdata(file);
567         struct tw5864_dev *dev = input->root;
568
569         u8 indir_0x000 = tw_indir_readb(TW5864_INDIR_VIN_0(input->nr));
570         u8 indir_0x00d = tw_indir_readb(TW5864_INDIR_VIN_D(input->nr));
571         u8 v1 = indir_0x000;
572         u8 v2 = indir_0x00d;
573
574         if (i->index)
575                 return -EINVAL;
576
577         i->type = V4L2_INPUT_TYPE_CAMERA;
578         snprintf(i->name, sizeof(i->name), "Encoder %d", input->nr);
579         i->std = TW5864_NORMS;
580         if (v1 & (1 << 7))
581                 i->status |= V4L2_IN_ST_NO_SYNC;
582         if (!(v1 & (1 << 6)))
583                 i->status |= V4L2_IN_ST_NO_H_LOCK;
584         if (v1 & (1 << 2))
585                 i->status |= V4L2_IN_ST_NO_SIGNAL;
586         if (v1 & (1 << 1))
587                 i->status |= V4L2_IN_ST_NO_COLOR;
588         if (v2 & (1 << 2))
589                 i->status |= V4L2_IN_ST_MACROVISION;
590
591         return 0;
592 }
593
594 static int tw5864_g_input(struct file *file, void *priv, unsigned int *i)
595 {
596         *i = 0;
597         return 0;
598 }
599
600 static int tw5864_s_input(struct file *file, void *priv, unsigned int i)
601 {
602         if (i)
603                 return -EINVAL;
604         return 0;
605 }
606
607 static int tw5864_querycap(struct file *file, void *priv,
608                            struct v4l2_capability *cap)
609 {
610         struct tw5864_input *input = video_drvdata(file);
611
612         strcpy(cap->driver, "tw5864");
613         snprintf(cap->card, sizeof(cap->card), "TW5864 Encoder %d",
614                  input->nr);
615         sprintf(cap->bus_info, "PCI:%s", pci_name(input->root->pci));
616         return 0;
617 }
618
619 static int tw5864_querystd(struct file *file, void *priv, v4l2_std_id *std)
620 {
621         struct tw5864_input *input = video_drvdata(file);
622         enum tw5864_vid_std tw_std;
623         int ret;
624
625         ret = tw5864_input_std_get(input, &tw_std);
626         if (ret)
627                 return ret;
628         *std = tw5864_get_v4l2_std(tw_std);
629
630         return 0;
631 }
632
633 static int tw5864_g_std(struct file *file, void *priv, v4l2_std_id *std)
634 {
635         struct tw5864_input *input = video_drvdata(file);
636
637         *std = input->v4l2_std;
638         return 0;
639 }
640
641 static int tw5864_s_std(struct file *file, void *priv, v4l2_std_id std)
642 {
643         struct tw5864_input *input = video_drvdata(file);
644         struct tw5864_dev *dev = input->root;
645
646         input->v4l2_std = std;
647         input->std = tw5864_from_v4l2_std(std);
648         tw_indir_writeb(TW5864_INDIR_VIN_E(input->nr), input->std);
649         return 0;
650 }
651
652 static int tw5864_enum_fmt_vid_cap(struct file *file, void *priv,
653                                    struct v4l2_fmtdesc *f)
654 {
655         if (f->index)
656                 return -EINVAL;
657
658         f->pixelformat = V4L2_PIX_FMT_H264;
659
660         return 0;
661 }
662
663 static int tw5864_subscribe_event(struct v4l2_fh *fh,
664                                   const struct v4l2_event_subscription *sub)
665 {
666         switch (sub->type) {
667         case V4L2_EVENT_MOTION_DET:
668                 /*
669                  * Allow for up to 30 events (1 second for NTSC) to be stored.
670                  */
671                 return v4l2_event_subscribe(fh, sub, 30, NULL);
672         default:
673                 return v4l2_ctrl_subscribe_event(fh, sub);
674         }
675 }
676
677 static void tw5864_frame_interval_set(struct tw5864_input *input)
678 {
679         /*
680          * This register value seems to follow such approach: In each second
681          * interval, when processing Nth frame, it checks Nth bit of register
682          * value and, if the bit is 1, it processes the frame, otherwise the
683          * frame is discarded.
684          * So unary representation would work, but more or less equal gaps
685          * between the frames should be preserved.
686          *
687          * For 1 FPS - 0x00000001
688          * 00000000 00000000 00000000 00000001
689          *
690          * For max FPS - set all 25/30 lower bits:
691          * 00111111 11111111 11111111 11111111 (NTSC)
692          * 00000001 11111111 11111111 11111111 (PAL)
693          *
694          * For half of max FPS - use such pattern:
695          * 00010101 01010101 01010101 01010101 (NTSC)
696          * 00000001 01010101 01010101 01010101 (PAL)
697          *
698          * Et cetera.
699          *
700          * The value supplied to hardware is capped by mask of 25/30 lower bits.
701          */
702         struct tw5864_dev *dev = input->root;
703         u32 unary_framerate = 0;
704         int shift = 0;
705         int std_max_fps = input->std == STD_NTSC ? 30 : 25;
706
707         for (shift = 0; shift < std_max_fps; shift += input->frame_interval)
708                 unary_framerate |= 0x00000001 << shift;
709
710         tw_writel(TW5864_H264EN_RATE_CNTL_LO_WORD(input->nr, 0),
711                   unary_framerate >> 16);
712         tw_writel(TW5864_H264EN_RATE_CNTL_HI_WORD(input->nr, 0),
713                   unary_framerate & 0xffff);
714 }
715
716 static int tw5864_frameinterval_get(struct tw5864_input *input,
717                                     struct v4l2_fract *frameinterval)
718 {
719         struct tw5864_dev *dev = input->root;
720
721         switch (input->std) {
722         case STD_NTSC:
723                 frameinterval->numerator = 1001;
724                 frameinterval->denominator = 30000;
725                 break;
726         case STD_PAL:
727         case STD_SECAM:
728                 frameinterval->numerator = 1;
729                 frameinterval->denominator = 25;
730                 break;
731         default:
732                 dev_warn(&dev->pci->dev, "tw5864_frameinterval_get requested for unknown std %d\n",
733                          input->std);
734                 return -EINVAL;
735         }
736
737         return 0;
738 }
739
740 static int tw5864_enum_framesizes(struct file *file, void *priv,
741                                   struct v4l2_frmsizeenum *fsize)
742 {
743         struct tw5864_input *input = video_drvdata(file);
744
745         if (fsize->index > 0)
746                 return -EINVAL;
747         if (fsize->pixel_format != V4L2_PIX_FMT_H264)
748                 return -EINVAL;
749
750         fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
751         fsize->discrete.width = 704;
752         fsize->discrete.height = input->std == STD_NTSC ? 480 : 576;
753
754         return 0;
755 }
756
757 static int tw5864_enum_frameintervals(struct file *file, void *priv,
758                                       struct v4l2_frmivalenum *fintv)
759 {
760         struct tw5864_input *input = video_drvdata(file);
761         struct v4l2_fract frameinterval;
762         int std_max_fps = input->std == STD_NTSC ? 30 : 25;
763         struct v4l2_frmsizeenum fsize = { .index = fintv->index,
764                 .pixel_format = fintv->pixel_format };
765         int ret;
766
767         ret = tw5864_enum_framesizes(file, priv, &fsize);
768         if (ret)
769                 return ret;
770
771         if (fintv->width != fsize.discrete.width ||
772             fintv->height != fsize.discrete.height)
773                 return -EINVAL;
774
775         fintv->type = V4L2_FRMIVAL_TYPE_STEPWISE;
776
777         ret = tw5864_frameinterval_get(input, &frameinterval);
778         fintv->stepwise.step = frameinterval;
779         fintv->stepwise.min = frameinterval;
780         fintv->stepwise.max = frameinterval;
781         fintv->stepwise.max.numerator *= std_max_fps;
782
783         return ret;
784 }
785
786 static int tw5864_g_parm(struct file *file, void *priv,
787                          struct v4l2_streamparm *sp)
788 {
789         struct tw5864_input *input = video_drvdata(file);
790         struct v4l2_captureparm *cp = &sp->parm.capture;
791         int ret;
792
793         cp->capability = V4L2_CAP_TIMEPERFRAME;
794
795         ret = tw5864_frameinterval_get(input, &cp->timeperframe);
796         cp->timeperframe.numerator *= input->frame_interval;
797         cp->capturemode = 0;
798         cp->readbuffers = 2;
799
800         return ret;
801 }
802
803 static int tw5864_s_parm(struct file *file, void *priv,
804                          struct v4l2_streamparm *sp)
805 {
806         struct tw5864_input *input = video_drvdata(file);
807         struct v4l2_fract *t = &sp->parm.capture.timeperframe;
808         struct v4l2_fract time_base;
809         int ret;
810
811         ret = tw5864_frameinterval_get(input, &time_base);
812         if (ret)
813                 return ret;
814
815         if (!t->numerator || !t->denominator) {
816                 t->numerator = time_base.numerator * input->frame_interval;
817                 t->denominator = time_base.denominator;
818         } else if (t->denominator != time_base.denominator) {
819                 t->numerator = t->numerator * time_base.denominator /
820                         t->denominator;
821                 t->denominator = time_base.denominator;
822         }
823
824         input->frame_interval = t->numerator / time_base.numerator;
825         if (input->frame_interval < 1)
826                 input->frame_interval = 1;
827         tw5864_frame_interval_set(input);
828         return tw5864_g_parm(file, priv, sp);
829 }
830
831 static const struct v4l2_ctrl_ops tw5864_ctrl_ops = {
832         .s_ctrl = tw5864_s_ctrl,
833 };
834
835 static const struct v4l2_file_operations video_fops = {
836         .owner = THIS_MODULE,
837         .open = v4l2_fh_open,
838         .release = vb2_fop_release,
839         .read = vb2_fop_read,
840         .poll = vb2_fop_poll,
841         .mmap = vb2_fop_mmap,
842         .unlocked_ioctl = video_ioctl2,
843 };
844
845 #ifdef CONFIG_VIDEO_ADV_DEBUG
846
847 #define INDIR_SPACE_MAP_SHIFT 0x100000
848
849 static int tw5864_g_reg(struct file *file, void *fh,
850                         struct v4l2_dbg_register *reg)
851 {
852         struct tw5864_input *input = video_drvdata(file);
853         struct tw5864_dev *dev = input->root;
854
855         if (reg->reg < INDIR_SPACE_MAP_SHIFT) {
856                 if (reg->reg > 0x87fff)
857                         return -EINVAL;
858                 reg->size = 4;
859                 reg->val = tw_readl(reg->reg);
860         } else {
861                 __u64 indir_addr = reg->reg - INDIR_SPACE_MAP_SHIFT;
862
863                 if (indir_addr > 0xefe)
864                         return -EINVAL;
865                 reg->size = 1;
866                 reg->val = tw_indir_readb(reg->reg);
867         }
868         return 0;
869 }
870
871 static int tw5864_s_reg(struct file *file, void *fh,
872                         const struct v4l2_dbg_register *reg)
873 {
874         struct tw5864_input *input = video_drvdata(file);
875         struct tw5864_dev *dev = input->root;
876
877         if (reg->reg < INDIR_SPACE_MAP_SHIFT) {
878                 if (reg->reg > 0x87fff)
879                         return -EINVAL;
880                 tw_writel(reg->reg, reg->val);
881         } else {
882                 __u64 indir_addr = reg->reg - INDIR_SPACE_MAP_SHIFT;
883
884                 if (indir_addr > 0xefe)
885                         return -EINVAL;
886                 tw_indir_writeb(reg->reg, reg->val);
887         }
888         return 0;
889 }
890 #endif
891
892 static const struct v4l2_ioctl_ops video_ioctl_ops = {
893         .vidioc_querycap = tw5864_querycap,
894         .vidioc_enum_fmt_vid_cap = tw5864_enum_fmt_vid_cap,
895         .vidioc_reqbufs = vb2_ioctl_reqbufs,
896         .vidioc_create_bufs = vb2_ioctl_create_bufs,
897         .vidioc_querybuf = vb2_ioctl_querybuf,
898         .vidioc_qbuf = vb2_ioctl_qbuf,
899         .vidioc_dqbuf = vb2_ioctl_dqbuf,
900         .vidioc_expbuf = vb2_ioctl_expbuf,
901         .vidioc_querystd = tw5864_querystd,
902         .vidioc_s_std = tw5864_s_std,
903         .vidioc_g_std = tw5864_g_std,
904         .vidioc_enum_input = tw5864_enum_input,
905         .vidioc_g_input = tw5864_g_input,
906         .vidioc_s_input = tw5864_s_input,
907         .vidioc_streamon = vb2_ioctl_streamon,
908         .vidioc_streamoff = vb2_ioctl_streamoff,
909         .vidioc_try_fmt_vid_cap = tw5864_fmt_vid_cap,
910         .vidioc_s_fmt_vid_cap = tw5864_fmt_vid_cap,
911         .vidioc_g_fmt_vid_cap = tw5864_fmt_vid_cap,
912         .vidioc_log_status = v4l2_ctrl_log_status,
913         .vidioc_subscribe_event = tw5864_subscribe_event,
914         .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
915         .vidioc_enum_framesizes = tw5864_enum_framesizes,
916         .vidioc_enum_frameintervals = tw5864_enum_frameintervals,
917         .vidioc_s_parm = tw5864_s_parm,
918         .vidioc_g_parm = tw5864_g_parm,
919 #ifdef CONFIG_VIDEO_ADV_DEBUG
920         .vidioc_g_register = tw5864_g_reg,
921         .vidioc_s_register = tw5864_s_reg,
922 #endif
923 };
924
925 static const struct video_device tw5864_video_template = {
926         .name = "tw5864_video",
927         .fops = &video_fops,
928         .ioctl_ops = &video_ioctl_ops,
929         .release = video_device_release_empty,
930         .tvnorms = TW5864_NORMS,
931         .device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
932                 V4L2_CAP_STREAMING,
933 };
934
935 /* Motion Detection Threshold matrix */
936 static const struct v4l2_ctrl_config tw5864_md_thresholds = {
937         .ops = &tw5864_ctrl_ops,
938         .id = V4L2_CID_DETECT_MD_THRESHOLD_GRID,
939         .dims = {MD_CELLS_HOR, MD_CELLS_VERT},
940         .def = 14,
941         /* See tw5864_md_metric_from_mvd() */
942         .max = 2 * 0x0f,
943         .step = 1,
944 };
945
946 static int tw5864_video_input_init(struct tw5864_input *dev, int video_nr);
947 static void tw5864_video_input_fini(struct tw5864_input *dev);
948 static void tw5864_encoder_tables_upload(struct tw5864_dev *dev);
949
950 int tw5864_video_init(struct tw5864_dev *dev, int *video_nr)
951 {
952         int i;
953         int ret;
954         unsigned long flags;
955         int last_dma_allocated = -1;
956         int last_input_nr_registered = -1;
957
958         for (i = 0; i < H264_BUF_CNT; i++) {
959                 struct tw5864_h264_frame *frame = &dev->h264_buf[i];
960
961                 frame->vlc.addr = dma_alloc_coherent(&dev->pci->dev,
962                                                      H264_VLC_BUF_SIZE,
963                                                      &frame->vlc.dma_addr,
964                                                      GFP_KERNEL | GFP_DMA32);
965                 if (!frame->vlc.addr) {
966                         dev_err(&dev->pci->dev, "dma alloc fail\n");
967                         ret = -ENOMEM;
968                         goto free_dma;
969                 }
970                 frame->mv.addr = dma_alloc_coherent(&dev->pci->dev,
971                                                     H264_MV_BUF_SIZE,
972                                                     &frame->mv.dma_addr,
973                                                     GFP_KERNEL | GFP_DMA32);
974                 if (!frame->mv.addr) {
975                         dev_err(&dev->pci->dev, "dma alloc fail\n");
976                         ret = -ENOMEM;
977                         dma_free_coherent(&dev->pci->dev, H264_VLC_BUF_SIZE,
978                                           frame->vlc.addr, frame->vlc.dma_addr);
979                         goto free_dma;
980                 }
981                 last_dma_allocated = i;
982         }
983
984         tw5864_encoder_tables_upload(dev);
985
986         /* Picture is distorted without this block */
987         /* use falling edge to sample 54M to 108M */
988         tw_indir_writeb(TW5864_INDIR_VD_108_POL, TW5864_INDIR_VD_108_POL_BOTH);
989         tw_indir_writeb(TW5864_INDIR_CLK0_SEL, 0x00);
990
991         tw_indir_writeb(TW5864_INDIR_DDRA_DLL_DQS_SEL0, 0x02);
992         tw_indir_writeb(TW5864_INDIR_DDRA_DLL_DQS_SEL1, 0x02);
993         tw_indir_writeb(TW5864_INDIR_DDRA_DLL_CLK90_SEL, 0x02);
994         tw_indir_writeb(TW5864_INDIR_DDRB_DLL_DQS_SEL0, 0x02);
995         tw_indir_writeb(TW5864_INDIR_DDRB_DLL_DQS_SEL1, 0x02);
996         tw_indir_writeb(TW5864_INDIR_DDRB_DLL_CLK90_SEL, 0x02);
997
998         /* video input reset */
999         tw_indir_writeb(TW5864_INDIR_RESET, 0);
1000         tw_indir_writeb(TW5864_INDIR_RESET, TW5864_INDIR_RESET_VD |
1001                         TW5864_INDIR_RESET_DLL | TW5864_INDIR_RESET_MUX_CORE);
1002         msleep(20);
1003
1004         /*
1005          * Select Part A mode for all channels.
1006          * tw_setl instead of tw_clearl for Part B mode.
1007          *
1008          * I guess "Part B" is primarily for downscaled version of same channel
1009          * which goes in Part A of same bus
1010          */
1011         tw_writel(TW5864_FULL_HALF_MODE_SEL, 0);
1012
1013         tw_indir_writeb(TW5864_INDIR_PV_VD_CK_POL,
1014                         TW5864_INDIR_PV_VD_CK_POL_VD(0) |
1015                         TW5864_INDIR_PV_VD_CK_POL_VD(1) |
1016                         TW5864_INDIR_PV_VD_CK_POL_VD(2) |
1017                         TW5864_INDIR_PV_VD_CK_POL_VD(3));
1018
1019         spin_lock_irqsave(&dev->slock, flags);
1020         dev->encoder_busy = 0;
1021         dev->h264_buf_r_index = 0;
1022         dev->h264_buf_w_index = 0;
1023         tw_writel(TW5864_VLC_STREAM_BASE_ADDR,
1024                   dev->h264_buf[dev->h264_buf_w_index].vlc.dma_addr);
1025         tw_writel(TW5864_MV_STREAM_BASE_ADDR,
1026                   dev->h264_buf[dev->h264_buf_w_index].mv.dma_addr);
1027         spin_unlock_irqrestore(&dev->slock, flags);
1028
1029         tw_writel(TW5864_SEN_EN_CH, 0x000f);
1030         tw_writel(TW5864_H264EN_CH_EN, 0x000f);
1031
1032         tw_writel(TW5864_H264EN_BUS0_MAP, 0x00000000);
1033         tw_writel(TW5864_H264EN_BUS1_MAP, 0x00001111);
1034         tw_writel(TW5864_H264EN_BUS2_MAP, 0x00002222);
1035         tw_writel(TW5864_H264EN_BUS3_MAP, 0x00003333);
1036
1037         /*
1038          * Quote from Intersil (manufacturer):
1039          * 0x0038 is managed by HW, and by default it won't pass the pointer set
1040          * at 0x0010. So if you don't do encoding, 0x0038 should stay at '3'
1041          * (with 4 frames in buffer). If you encode one frame and then move
1042          * 0x0010 to '1' for example, HW will take one more frame and set it to
1043          * buffer #0, and then you should see 0x0038 is set to '0'.  There is
1044          * only one HW encoder engine, so 4 channels cannot get encoded
1045          * simultaneously. But each channel does have its own buffer (for
1046          * original frames and reconstructed frames). So there is no problem to
1047          * manage encoding for 4 channels at same time and no need to force
1048          * I-frames in switching channels.
1049          * End of quote.
1050          *
1051          * If we set 0x0010 (TW5864_ENC_BUF_PTR_REC1) to 0 (for any channel), we
1052          * have no "rolling" (until we change this value).
1053          * If we set 0x0010 (TW5864_ENC_BUF_PTR_REC1) to 0x3, it starts to roll
1054          * continuously together with 0x0038.
1055          */
1056         tw_writel(TW5864_ENC_BUF_PTR_REC1, 0x00ff);
1057         tw_writel(TW5864_PCI_INTTM_SCALE, 0);
1058
1059         tw_writel(TW5864_INTERLACING, TW5864_DI_EN);
1060         tw_writel(TW5864_MASTER_ENB_REG, TW5864_PCI_VLC_INTR_ENB);
1061         tw_writel(TW5864_PCI_INTR_CTL,
1062                   TW5864_TIMER_INTR_ENB | TW5864_PCI_MAST_ENB |
1063                   TW5864_MVD_VLC_MAST_ENB);
1064
1065         dev->irqmask |= TW5864_INTR_VLC_DONE | TW5864_INTR_TIMER;
1066         tw5864_irqmask_apply(dev);
1067
1068         tasklet_init(&dev->tasklet, tw5864_handle_frame_task,
1069                      (unsigned long)dev);
1070
1071         for (i = 0; i < TW5864_INPUTS; i++) {
1072                 dev->inputs[i].root = dev;
1073                 dev->inputs[i].nr = i;
1074                 ret = tw5864_video_input_init(&dev->inputs[i], video_nr[i]);
1075                 if (ret)
1076                         goto fini_video_inputs;
1077                 last_input_nr_registered = i;
1078         }
1079
1080         return 0;
1081
1082 fini_video_inputs:
1083         for (i = last_input_nr_registered; i >= 0; i--)
1084                 tw5864_video_input_fini(&dev->inputs[i]);
1085
1086         tasklet_kill(&dev->tasklet);
1087
1088 free_dma:
1089         for (i = last_dma_allocated; i >= 0; i--) {
1090                 dma_free_coherent(&dev->pci->dev, H264_VLC_BUF_SIZE,
1091                                   dev->h264_buf[i].vlc.addr,
1092                                   dev->h264_buf[i].vlc.dma_addr);
1093                 dma_free_coherent(&dev->pci->dev, H264_MV_BUF_SIZE,
1094                                   dev->h264_buf[i].mv.addr,
1095                                   dev->h264_buf[i].mv.dma_addr);
1096         }
1097
1098         return ret;
1099 }
1100
1101 static int tw5864_video_input_init(struct tw5864_input *input, int video_nr)
1102 {
1103         struct tw5864_dev *dev = input->root;
1104         int ret;
1105         struct v4l2_ctrl_handler *hdl = &input->hdl;
1106
1107         mutex_init(&input->lock);
1108         spin_lock_init(&input->slock);
1109
1110         /* setup video buffers queue */
1111         INIT_LIST_HEAD(&input->active);
1112         input->vidq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1113         input->vidq.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1114         input->vidq.io_modes = VB2_MMAP | VB2_READ | VB2_DMABUF;
1115         input->vidq.ops = &tw5864_video_qops;
1116         input->vidq.mem_ops = &vb2_dma_contig_memops;
1117         input->vidq.drv_priv = input;
1118         input->vidq.gfp_flags = 0;
1119         input->vidq.buf_struct_size = sizeof(struct tw5864_buf);
1120         input->vidq.lock = &input->lock;
1121         input->vidq.min_buffers_needed = 2;
1122         input->vidq.dev = &input->root->pci->dev;
1123         ret = vb2_queue_init(&input->vidq);
1124         if (ret)
1125                 goto free_mutex;
1126
1127         input->vdev = tw5864_video_template;
1128         input->vdev.v4l2_dev = &input->root->v4l2_dev;
1129         input->vdev.lock = &input->lock;
1130         input->vdev.queue = &input->vidq;
1131         video_set_drvdata(&input->vdev, input);
1132
1133         /* Initialize the device control structures */
1134         v4l2_ctrl_handler_init(hdl, 6);
1135         v4l2_ctrl_new_std(hdl, &tw5864_ctrl_ops,
1136                           V4L2_CID_BRIGHTNESS, -128, 127, 1, 0);
1137         v4l2_ctrl_new_std(hdl, &tw5864_ctrl_ops,
1138                           V4L2_CID_CONTRAST, 0, 255, 1, 100);
1139         v4l2_ctrl_new_std(hdl, &tw5864_ctrl_ops,
1140                           V4L2_CID_SATURATION, 0, 255, 1, 128);
1141         v4l2_ctrl_new_std(hdl, &tw5864_ctrl_ops, V4L2_CID_HUE, -128, 127, 1, 0);
1142         v4l2_ctrl_new_std(hdl, &tw5864_ctrl_ops, V4L2_CID_MPEG_VIDEO_GOP_SIZE,
1143                           1, MAX_GOP_SIZE, 1, GOP_SIZE);
1144         v4l2_ctrl_new_std(hdl, &tw5864_ctrl_ops,
1145                           V4L2_CID_MPEG_VIDEO_H264_MIN_QP, 28, 51, 1, QP_VALUE);
1146         v4l2_ctrl_new_std_menu(hdl, &tw5864_ctrl_ops,
1147                                V4L2_CID_DETECT_MD_MODE,
1148                                V4L2_DETECT_MD_MODE_THRESHOLD_GRID, 0,
1149                                V4L2_DETECT_MD_MODE_DISABLED);
1150         v4l2_ctrl_new_std(hdl, &tw5864_ctrl_ops,
1151                           V4L2_CID_DETECT_MD_GLOBAL_THRESHOLD,
1152                           tw5864_md_thresholds.min, tw5864_md_thresholds.max,
1153                           tw5864_md_thresholds.step, tw5864_md_thresholds.def);
1154         input->md_threshold_grid_ctrl =
1155                 v4l2_ctrl_new_custom(hdl, &tw5864_md_thresholds, NULL);
1156         if (hdl->error) {
1157                 ret = hdl->error;
1158                 goto free_v4l2_hdl;
1159         }
1160         input->vdev.ctrl_handler = hdl;
1161         v4l2_ctrl_handler_setup(hdl);
1162
1163         input->qp = QP_VALUE;
1164         input->gop = GOP_SIZE;
1165         input->frame_interval = 1;
1166
1167         ret = video_register_device(&input->vdev, VFL_TYPE_GRABBER, video_nr);
1168         if (ret)
1169                 goto free_v4l2_hdl;
1170
1171         dev_info(&input->root->pci->dev, "Registered video device %s\n",
1172                  video_device_node_name(&input->vdev));
1173
1174         /*
1175          * Set default video standard. Doesn't matter which, the detected value
1176          * will be found out by VIDIOC_QUERYSTD handler.
1177          */
1178         input->v4l2_std = V4L2_STD_NTSC_M;
1179         input->std = STD_NTSC;
1180
1181         tw_indir_writeb(TW5864_INDIR_VIN_E(video_nr), 0x07);
1182         /* to initiate auto format recognition */
1183         tw_indir_writeb(TW5864_INDIR_VIN_F(video_nr), 0xff);
1184
1185         return 0;
1186
1187 free_v4l2_hdl:
1188         v4l2_ctrl_handler_free(hdl);
1189         vb2_queue_release(&input->vidq);
1190 free_mutex:
1191         mutex_destroy(&input->lock);
1192
1193         return ret;
1194 }
1195
1196 static void tw5864_video_input_fini(struct tw5864_input *dev)
1197 {
1198         video_unregister_device(&dev->vdev);
1199         v4l2_ctrl_handler_free(&dev->hdl);
1200         vb2_queue_release(&dev->vidq);
1201 }
1202
1203 void tw5864_video_fini(struct tw5864_dev *dev)
1204 {
1205         int i;
1206
1207         tasklet_kill(&dev->tasklet);
1208
1209         for (i = 0; i < TW5864_INPUTS; i++)
1210                 tw5864_video_input_fini(&dev->inputs[i]);
1211
1212         for (i = 0; i < H264_BUF_CNT; i++) {
1213                 dma_free_coherent(&dev->pci->dev, H264_VLC_BUF_SIZE,
1214                                   dev->h264_buf[i].vlc.addr,
1215                                   dev->h264_buf[i].vlc.dma_addr);
1216                 dma_free_coherent(&dev->pci->dev, H264_MV_BUF_SIZE,
1217                                   dev->h264_buf[i].mv.addr,
1218                                   dev->h264_buf[i].mv.dma_addr);
1219         }
1220 }
1221
1222 void tw5864_prepare_frame_headers(struct tw5864_input *input)
1223 {
1224         struct tw5864_buf *vb = input->vb;
1225         u8 *dst;
1226         size_t dst_space;
1227         unsigned long flags;
1228
1229         if (!vb) {
1230                 spin_lock_irqsave(&input->slock, flags);
1231                 if (list_empty(&input->active)) {
1232                         spin_unlock_irqrestore(&input->slock, flags);
1233                         input->vb = NULL;
1234                         return;
1235                 }
1236                 vb = list_first_entry(&input->active, struct tw5864_buf, list);
1237                 list_del(&vb->list);
1238                 spin_unlock_irqrestore(&input->slock, flags);
1239         }
1240
1241         dst = vb2_plane_vaddr(&vb->vb.vb2_buf, 0);
1242         dst_space = vb2_plane_size(&vb->vb.vb2_buf, 0);
1243
1244         /*
1245          * Low-level bitstream writing functions don't have a fine way to say
1246          * correctly that supplied buffer is too small. So we just check there
1247          * and warn, and don't care at lower level.
1248          * Currently all headers take below 32 bytes.
1249          * The buffer is supposed to have plenty of free space at this point,
1250          * anyway.
1251          */
1252         if (WARN_ON_ONCE(dst_space < 128))
1253                 return;
1254
1255         /*
1256          * Generate H264 headers:
1257          * If this is first frame, put SPS and PPS
1258          */
1259         if (input->frame_gop_seqno == 0)
1260                 tw5864_h264_put_stream_header(&dst, &dst_space, input->qp,
1261                                               input->width, input->height);
1262
1263         /* Put slice header */
1264         tw5864_h264_put_slice_header(&dst, &dst_space, input->h264_idr_pic_id,
1265                                      input->frame_gop_seqno,
1266                                      &input->tail_nb_bits, &input->tail);
1267         input->vb = vb;
1268         input->buf_cur_ptr = dst;
1269         input->buf_cur_space_left = dst_space;
1270 }
1271
1272 /*
1273  * Returns heuristic motion detection metric value from known components of
1274  * hardware-provided Motion Vector Data.
1275  */
1276 static unsigned int tw5864_md_metric_from_mvd(u32 mvd)
1277 {
1278         /*
1279          * Format of motion vector data exposed by tw5864, according to
1280          * manufacturer:
1281          * mv_x 10 bits
1282          * mv_y 10 bits
1283          * non_zero_members 8 bits
1284          * mb_type 3 bits
1285          * reserved 1 bit
1286          *
1287          * non_zero_members: number of non-zero residuals in each macro block
1288          * after quantization
1289          *
1290          * unsigned int reserved = mvd >> 31;
1291          * unsigned int mb_type = (mvd >> 28) & 0x7;
1292          * unsigned int non_zero_members = (mvd >> 20) & 0xff;
1293          */
1294         unsigned int mv_y = (mvd >> 10) & 0x3ff;
1295         unsigned int mv_x = mvd & 0x3ff;
1296
1297         /* heuristic: */
1298         mv_x &= 0x0f;
1299         mv_y &= 0x0f;
1300
1301         return mv_y + mv_x;
1302 }
1303
1304 static int tw5864_is_motion_triggered(struct tw5864_h264_frame *frame)
1305 {
1306         struct tw5864_input *input = frame->input;
1307         u32 *mv = (u32 *)frame->mv.addr;
1308         int i;
1309         int detected = 0;
1310
1311         for (i = 0; i < MD_CELLS; i++) {
1312                 const u16 thresh = input->md_threshold_grid_values[i];
1313                 const unsigned int metric = tw5864_md_metric_from_mvd(mv[i]);
1314
1315                 if (metric > thresh)
1316                         detected = 1;
1317
1318                 if (detected)
1319                         break;
1320         }
1321         return detected;
1322 }
1323
1324 static void tw5864_handle_frame_task(unsigned long data)
1325 {
1326         struct tw5864_dev *dev = (struct tw5864_dev *)data;
1327         unsigned long flags;
1328         int batch_size = H264_BUF_CNT;
1329
1330         spin_lock_irqsave(&dev->slock, flags);
1331         while (dev->h264_buf_r_index != dev->h264_buf_w_index && batch_size--) {
1332                 struct tw5864_h264_frame *frame =
1333                         &dev->h264_buf[dev->h264_buf_r_index];
1334
1335                 spin_unlock_irqrestore(&dev->slock, flags);
1336                 dma_sync_single_for_cpu(&dev->pci->dev, frame->vlc.dma_addr,
1337                                         H264_VLC_BUF_SIZE, DMA_FROM_DEVICE);
1338                 dma_sync_single_for_cpu(&dev->pci->dev, frame->mv.dma_addr,
1339                                         H264_MV_BUF_SIZE, DMA_FROM_DEVICE);
1340                 tw5864_handle_frame(frame);
1341                 dma_sync_single_for_device(&dev->pci->dev, frame->vlc.dma_addr,
1342                                            H264_VLC_BUF_SIZE, DMA_FROM_DEVICE);
1343                 dma_sync_single_for_device(&dev->pci->dev, frame->mv.dma_addr,
1344                                            H264_MV_BUF_SIZE, DMA_FROM_DEVICE);
1345                 spin_lock_irqsave(&dev->slock, flags);
1346
1347                 dev->h264_buf_r_index++;
1348                 dev->h264_buf_r_index %= H264_BUF_CNT;
1349         }
1350         spin_unlock_irqrestore(&dev->slock, flags);
1351 }
1352
1353 #ifdef DEBUG
1354 static u32 tw5864_vlc_checksum(u32 *data, int len)
1355 {
1356         u32 val, count_len = len;
1357
1358         val = *data++;
1359         while (((count_len >> 2) - 1) > 0) {
1360                 val ^= *data++;
1361                 count_len -= 4;
1362         }
1363         val ^= htonl((len >> 2));
1364         return val;
1365 }
1366 #endif
1367
1368 static void tw5864_handle_frame(struct tw5864_h264_frame *frame)
1369 {
1370 #define SKIP_VLCBUF_BYTES 3
1371         struct tw5864_input *input = frame->input;
1372         struct tw5864_dev *dev = input->root;
1373         struct tw5864_buf *vb;
1374         struct vb2_v4l2_buffer *v4l2_buf;
1375         int frame_len = frame->vlc_len - SKIP_VLCBUF_BYTES;
1376         u8 *dst = input->buf_cur_ptr;
1377         u8 tail_mask, vlc_mask = 0;
1378         int i;
1379         u8 vlc_first_byte = ((u8 *)(frame->vlc.addr + SKIP_VLCBUF_BYTES))[0];
1380         unsigned long flags;
1381         int zero_run;
1382         u8 *src;
1383         u8 *src_end;
1384
1385 #ifdef DEBUG
1386         if (frame->checksum !=
1387             tw5864_vlc_checksum((u32 *)frame->vlc.addr, frame_len))
1388                 dev_err(&dev->pci->dev,
1389                         "Checksum of encoded frame doesn't match!\n");
1390 #endif
1391
1392         spin_lock_irqsave(&input->slock, flags);
1393         vb = input->vb;
1394         input->vb = NULL;
1395         spin_unlock_irqrestore(&input->slock, flags);
1396
1397         v4l2_buf = to_vb2_v4l2_buffer(&vb->vb.vb2_buf);
1398
1399         if (!vb) { /* Gone because of disabling */
1400                 dev_dbg(&dev->pci->dev, "vb is empty, dropping frame\n");
1401                 return;
1402         }
1403
1404         /*
1405          * Check for space.
1406          * Mind the overhead of startcode emulation prevention.
1407          */
1408         if (input->buf_cur_space_left < frame_len * 5 / 4) {
1409                 dev_err_once(&dev->pci->dev,
1410                              "Left space in vb2 buffer, %d bytes, is less than considered safely enough to put frame of length %d. Dropping this frame.\n",
1411                              input->buf_cur_space_left, frame_len);
1412                 return;
1413         }
1414
1415         for (i = 0; i < 8 - input->tail_nb_bits; i++)
1416                 vlc_mask |= 1 << i;
1417         tail_mask = (~vlc_mask) & 0xff;
1418
1419         dst[0] = (input->tail & tail_mask) | (vlc_first_byte & vlc_mask);
1420         frame_len--;
1421         dst++;
1422
1423         /* H.264 startcode emulation prevention */
1424         src = frame->vlc.addr + SKIP_VLCBUF_BYTES + 1;
1425         src_end = src + frame_len;
1426         zero_run = 0;
1427         for (; src < src_end; src++) {
1428                 if (zero_run < 2) {
1429                         if (*src == 0)
1430                                 ++zero_run;
1431                         else
1432                                 zero_run = 0;
1433                 } else {
1434                         if ((*src & ~0x03) == 0)
1435                                 *dst++ = 0x03;
1436                         zero_run = *src == 0;
1437                 }
1438                 *dst++ = *src;
1439         }
1440
1441         vb2_set_plane_payload(&vb->vb.vb2_buf, 0,
1442                               dst - (u8 *)vb2_plane_vaddr(&vb->vb.vb2_buf, 0));
1443
1444         vb->vb.vb2_buf.timestamp = frame->timestamp;
1445         v4l2_buf->field = V4L2_FIELD_INTERLACED;
1446         v4l2_buf->sequence = frame->seqno;
1447
1448         /* Check for motion flags */
1449         if (frame->gop_seqno /* P-frame */ &&
1450             tw5864_is_motion_triggered(frame)) {
1451                 struct v4l2_event ev = {
1452                         .type = V4L2_EVENT_MOTION_DET,
1453                         .u.motion_det = {
1454                                 .flags = V4L2_EVENT_MD_FL_HAVE_FRAME_SEQ,
1455                                 .frame_sequence = v4l2_buf->sequence,
1456                         },
1457                 };
1458
1459                 v4l2_event_queue(&input->vdev, &ev);
1460         }
1461
1462         vb2_buffer_done(&vb->vb.vb2_buf, VB2_BUF_STATE_DONE);
1463 }
1464
1465 static v4l2_std_id tw5864_get_v4l2_std(enum tw5864_vid_std std)
1466 {
1467         switch (std) {
1468         case STD_NTSC:    return V4L2_STD_NTSC_M;
1469         case STD_PAL:     return V4L2_STD_PAL_B;
1470         case STD_SECAM:   return V4L2_STD_SECAM_B;
1471         case STD_NTSC443: return V4L2_STD_NTSC_443;
1472         case STD_PAL_M:   return V4L2_STD_PAL_M;
1473         case STD_PAL_CN:  return V4L2_STD_PAL_Nc;
1474         case STD_PAL_60:  return V4L2_STD_PAL_60;
1475         case STD_INVALID: return V4L2_STD_UNKNOWN;
1476         }
1477         return 0;
1478 }
1479
1480 static enum tw5864_vid_std tw5864_from_v4l2_std(v4l2_std_id v4l2_std)
1481 {
1482         if (v4l2_std & V4L2_STD_NTSC_M)
1483                 return STD_NTSC;
1484         if (v4l2_std & V4L2_STD_PAL_B)
1485                 return STD_PAL;
1486         if (v4l2_std & V4L2_STD_SECAM_B)
1487                 return STD_SECAM;
1488         if (v4l2_std & V4L2_STD_NTSC_443)
1489                 return STD_NTSC443;
1490         if (v4l2_std & V4L2_STD_PAL_M)
1491                 return STD_PAL_M;
1492         if (v4l2_std & V4L2_STD_PAL_Nc)
1493                 return STD_PAL_CN;
1494         if (v4l2_std & V4L2_STD_PAL_60)
1495                 return STD_PAL_60;
1496
1497         return STD_INVALID;
1498 }
1499
1500 static void tw5864_encoder_tables_upload(struct tw5864_dev *dev)
1501 {
1502         int i;
1503
1504         tw_writel(TW5864_VLC_RD, 0x1);
1505         for (i = 0; i < VLC_LOOKUP_TABLE_LEN; i++) {
1506                 tw_writel((TW5864_VLC_STREAM_MEM_START + i * 4),
1507                           encoder_vlc_lookup_table[i]);
1508         }
1509         tw_writel(TW5864_VLC_RD, 0x0);
1510
1511         for (i = 0; i < QUANTIZATION_TABLE_LEN; i++) {
1512                 tw_writel((TW5864_QUAN_TAB + i * 4),
1513                           forward_quantization_table[i]);
1514         }
1515
1516         for (i = 0; i < QUANTIZATION_TABLE_LEN; i++) {
1517                 tw_writel((TW5864_QUAN_TAB + i * 4),
1518                           inverse_quantization_table[i]);
1519         }
1520 }