]> pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/media/video/tvp5150.c
V4L/DVB (3099): Fixed device controls for em28xx on WinTV USB2 devices
[linux-2.6-omap-h63xx.git] / drivers / media / video / tvp5150.c
1 /*
2  * tvp5150 - Texas Instruments TVP5150A(M) video decoder driver
3  *
4  * Copyright (c) 2005 Mauro Carvalho Chehab (mchehab@brturbo.com.br)
5  * This code is placed under the terms of the GNU General Public License
6  */
7
8 #include <linux/i2c.h>
9 #include <linux/videodev.h>
10 #include <linux/delay.h>
11 #include <linux/video_decoder.h>
12
13 #include "tvp5150_reg.h"
14
15 MODULE_DESCRIPTION("Texas Instruments TVP5150A video decoder driver");  /* standard i2c insmod options */
16 MODULE_AUTHOR("Mauro Carvalho Chehab");
17 MODULE_LICENSE("GPL");
18
19 static unsigned short normal_i2c[] = {
20         0xb8 >> 1,
21         0xba >> 1,
22         I2C_CLIENT_END
23 };
24
25 I2C_CLIENT_INSMOD;
26
27 static int debug = 0;
28 module_param(debug, int, 0);
29 MODULE_PARM_DESC(debug, "Debug level (0-1)");
30
31 #define dprintk(num, format, args...) \
32         do { \
33                 if (debug >= num) \
34                         printk(format, ##args); \
35         } while (0)
36
37 /* supported controls */
38 static struct v4l2_queryctrl tvp5150_qctrl[] = {
39         {
40                 .id = V4L2_CID_BRIGHTNESS,
41                 .type = V4L2_CTRL_TYPE_INTEGER,
42                 .name = "Brightness",
43                 .minimum = 0,
44                 .maximum = 255,
45                 .step = 1,
46                 .default_value = 0,
47                 .flags = 0,
48         }, {
49                 .id = V4L2_CID_CONTRAST,
50                 .type = V4L2_CTRL_TYPE_INTEGER,
51                 .name = "Contrast",
52                 .minimum = 0,
53                 .maximum = 255,
54                 .step = 0x1,
55                 .default_value = 0x10,
56                 .flags = 0,
57         }, {
58                  .id = V4L2_CID_SATURATION,
59                  .type = V4L2_CTRL_TYPE_INTEGER,
60                  .name = "Saturation",
61                  .minimum = 0,
62                  .maximum = 255,
63                  .step = 0x1,
64                  .default_value = 0x10,
65                  .flags = 0,
66         }, {
67                 .id = V4L2_CID_HUE,
68                 .type = V4L2_CTRL_TYPE_INTEGER,
69                 .name = "Hue",
70                 .minimum = -128,
71                 .maximum = 127,
72                 .step = 0x1,
73                 .default_value = 0x10,
74                 .flags = 0,
75         }
76 };
77
78 struct tvp5150 {
79         struct i2c_client *client;
80
81         int norm;
82         int input;
83         int enable;
84         int bright;
85         int contrast;
86         int hue;
87         int sat;
88 };
89
90 static inline int tvp5150_read(struct i2c_client *c, unsigned char addr)
91 {
92         unsigned char buffer[1];
93         int rc;
94
95         buffer[0] = addr;
96         if (1 != (rc = i2c_master_send(c, buffer, 1)))
97                 dprintk(0, "i2c i/o error: rc == %d (should be 1)\n", rc);
98
99         msleep(10);
100
101         if (1 != (rc = i2c_master_recv(c, buffer, 1)))
102                 dprintk(0, "i2c i/o error: rc == %d (should be 1)\n", rc);
103
104         return (buffer[0]);
105 }
106
107 static inline void tvp5150_write(struct i2c_client *c, unsigned char addr,
108                                  unsigned char value)
109 {
110         unsigned char buffer[2];
111         int rc;
112 /*      struct tvp5150 *core = i2c_get_clientdata(c); */
113
114         buffer[0] = addr;
115         buffer[1] = value;
116         dprintk(1, "tvp5150: writing 0x%02x 0x%02x\n", buffer[0], buffer[1]);
117         if (2 != (rc = i2c_master_send(c, buffer, 2)))
118                 dprintk(0, "i2c i/o error: rc == %d (should be 2)\n", rc);
119 }
120
121 static void dump_reg(struct i2c_client *c)
122 {
123         printk("tvp5150: Video input source selection #1 = 0x%02x\n",
124                tvp5150_read(c, TVP5150_VD_IN_SRC_SEL_1));
125         printk("tvp5150: Analog channel controls = 0x%02x\n",
126                tvp5150_read(c, TVP5150_ANAL_CHL_CTL));
127         printk("tvp5150: Operation mode controls = 0x%02x\n",
128                tvp5150_read(c, TVP5150_OP_MODE_CTL));
129         printk("tvp5150: Miscellaneous controls = 0x%02x\n",
130                tvp5150_read(c, TVP5150_MISC_CTL));
131         printk("tvp5150: Autoswitch mask: TVP5150A / TVP5150AM = 0x%02x\n",
132                tvp5150_read(c, TVP5150_AUTOSW_MSK));
133         printk("tvp5150: Color killer threshold control = 0x%02x\n",
134                tvp5150_read(c, TVP5150_COLOR_KIL_THSH_CTL));
135         printk("tvp5150: Luminance processing control #1 = 0x%02x\n",
136                tvp5150_read(c, TVP5150_LUMA_PROC_CTL_1));
137         printk("tvp5150: Luminance processing control #2 = 0x%02x\n",
138                tvp5150_read(c, TVP5150_LUMA_PROC_CTL_2));
139         printk("tvp5150: Brightness control = 0x%02x\n",
140                tvp5150_read(c, TVP5150_BRIGHT_CTL));
141         printk("tvp5150: Color saturation control = 0x%02x\n",
142                tvp5150_read(c, TVP5150_SATURATION_CTL));
143         printk("tvp5150: Hue control = 0x%02x\n",
144                tvp5150_read(c, TVP5150_HUE_CTL));
145         printk("tvp5150: Contrast control = 0x%02x\n",
146                tvp5150_read(c, TVP5150_CONTRAST_CTL));
147         printk("tvp5150: Outputs and data rates select = 0x%02x\n",
148                tvp5150_read(c, TVP5150_DATA_RATE_SEL));
149         printk("tvp5150: Luminance processing control #3 = 0x%02x\n",
150                tvp5150_read(c, TVP5150_LUMA_PROC_CTL_3));
151         printk("tvp5150: Configuration shared pins = 0x%02x\n",
152                tvp5150_read(c, TVP5150_CONF_SHARED_PIN));
153         printk("tvp5150: Active video cropping start MSB = 0x%02x\n",
154                tvp5150_read(c, TVP5150_ACT_VD_CROP_ST_MSB));
155         printk("tvp5150: Active video cropping start LSB = 0x%02x\n",
156                tvp5150_read(c, TVP5150_ACT_VD_CROP_ST_LSB));
157         printk("tvp5150: Active video cropping stop MSB = 0x%02x\n",
158                tvp5150_read(c, TVP5150_ACT_VD_CROP_STP_MSB));
159         printk("tvp5150: Active video cropping stop LSB = 0x%02x\n",
160                tvp5150_read(c, TVP5150_ACT_VD_CROP_STP_LSB));
161         printk("tvp5150: Genlock/RTC = 0x%02x\n",
162                tvp5150_read(c, TVP5150_GENLOCK));
163         printk("tvp5150: Horizontal sync start = 0x%02x\n",
164                tvp5150_read(c, TVP5150_HORIZ_SYNC_START));
165         printk("tvp5150: Vertical blanking start = 0x%02x\n",
166                tvp5150_read(c, TVP5150_VERT_BLANKING_START));
167         printk("tvp5150: Vertical blanking stop = 0x%02x\n",
168                tvp5150_read(c, TVP5150_VERT_BLANKING_STOP));
169         printk("tvp5150: Chrominance processing control #1 = 0x%02x\n",
170                tvp5150_read(c, TVP5150_CHROMA_PROC_CTL_1));
171         printk("tvp5150: Chrominance processing control #2 = 0x%02x\n",
172                tvp5150_read(c, TVP5150_CHROMA_PROC_CTL_2));
173         printk("tvp5150: Interrupt reset register B = 0x%02x\n",
174                tvp5150_read(c, TVP5150_INT_RESET_REG_B));
175         printk("tvp5150: Interrupt enable register B = 0x%02x\n",
176                tvp5150_read(c, TVP5150_INT_ENABLE_REG_B));
177         printk("tvp5150: Interrupt configuration register B = 0x%02x\n",
178                tvp5150_read(c, TVP5150_INTT_CONFIG_REG_B));
179         printk("tvp5150: Video standard = 0x%02x\n",
180                tvp5150_read(c, TVP5150_VIDEO_STD));
181         printk("tvp5150: Cb gain factor = 0x%02x\n",
182                tvp5150_read(c, TVP5150_CB_GAIN_FACT));
183         printk("tvp5150: Cr gain factor = 0x%02x\n",
184                tvp5150_read(c, TVP5150_CR_GAIN_FACTOR));
185         printk("tvp5150: Macrovision on counter = 0x%02x\n",
186                tvp5150_read(c, TVP5150_MACROVISION_ON_CTR));
187         printk("tvp5150: Macrovision off counter = 0x%02x\n",
188                tvp5150_read(c, TVP5150_MACROVISION_OFF_CTR));
189         printk("tvp5150: revision select (TVP5150AM1 only) = 0x%02x\n",
190                tvp5150_read(c, TVP5150_REV_SELECT));
191         printk("tvp5150: MSB of device ID = 0x%02x\n",
192                tvp5150_read(c, TVP5150_MSB_DEV_ID));
193         printk("tvp5150: LSB of device ID = 0x%02x\n",
194                tvp5150_read(c, TVP5150_LSB_DEV_ID));
195         printk("tvp5150: ROM major version = 0x%02x\n",
196                tvp5150_read(c, TVP5150_ROM_MAJOR_VER));
197         printk("tvp5150: ROM minor version = 0x%02x\n",
198                tvp5150_read(c, TVP5150_ROM_MINOR_VER));
199         printk("tvp5150: Vertical line count MSB = 0x%02x\n",
200                tvp5150_read(c, TVP5150_VERT_LN_COUNT_MSB));
201         printk("tvp5150: Vertical line count LSB = 0x%02x\n",
202                tvp5150_read(c, TVP5150_VERT_LN_COUNT_LSB));
203         printk("tvp5150: Interrupt status register B = 0x%02x\n",
204                tvp5150_read(c, TVP5150_INT_STATUS_REG_B));
205         printk("tvp5150: Interrupt active register B = 0x%02x\n",
206                tvp5150_read(c, TVP5150_INT_ACTIVE_REG_B));
207         printk("tvp5150: Status register #1 = 0x%02x\n",
208                tvp5150_read(c, TVP5150_STATUS_REG_1));
209         printk("tvp5150: Status register #2 = 0x%02x\n",
210                tvp5150_read(c, TVP5150_STATUS_REG_2));
211         printk("tvp5150: Status register #3 = 0x%02x\n",
212                tvp5150_read(c, TVP5150_STATUS_REG_3));
213         printk("tvp5150: Status register #4 = 0x%02x\n",
214                tvp5150_read(c, TVP5150_STATUS_REG_4));
215         printk("tvp5150: Status register #5 = 0x%02x\n",
216                tvp5150_read(c, TVP5150_STATUS_REG_5));
217         printk("tvp5150: Closed caption data registers = 0x%02x\n",
218                tvp5150_read(c, TVP5150_CC_DATA_REG1));
219         printk("tvp5150: Closed caption data registers = 0x%02x\n",
220                tvp5150_read(c, TVP5150_CC_DATA_REG2));
221         printk("tvp5150: Closed caption data registers = 0x%02x\n",
222                tvp5150_read(c, TVP5150_CC_DATA_REG3));
223         printk("tvp5150: Closed caption data registers = 0x%02x\n",
224                tvp5150_read(c, TVP5150_CC_DATA_REG4));
225         printk("tvp5150: WSS data registers = 0x%02x\n",
226                tvp5150_read(c, TVP5150_WSS_DATA_REG1));
227         printk("tvp5150: WSS data registers = 0x%02x\n",
228                tvp5150_read(c, TVP5150_WSS_DATA_REG2));
229         printk("tvp5150: WSS data registers = 0x%02x\n",
230                tvp5150_read(c, TVP5150_WSS_DATA_REG3));
231         printk("tvp5150: WSS data registers = 0x%02x\n",
232                tvp5150_read(c, TVP5150_WSS_DATA_REG4));
233         printk("tvp5150: WSS data registers = 0x%02x\n",
234                tvp5150_read(c, TVP5150_WSS_DATA_REG5));
235         printk("tvp5150: WSS data registers = 0x%02x\n",
236                tvp5150_read(c, TVP5150_WSS_DATA_REG6));
237         printk("tvp5150: VPS data registers = 0x%02x\n",
238                tvp5150_read(c, TVP5150_VPS_DATA_REG1));
239         printk("tvp5150: VPS data registers = 0x%02x\n",
240                tvp5150_read(c, TVP5150_VPS_DATA_REG2));
241         printk("tvp5150: VPS data registers = 0x%02x\n",
242                tvp5150_read(c, TVP5150_VPS_DATA_REG3));
243         printk("tvp5150: VPS data registers = 0x%02x\n",
244                tvp5150_read(c, TVP5150_VPS_DATA_REG4));
245         printk("tvp5150: VPS data registers = 0x%02x\n",
246                tvp5150_read(c, TVP5150_VPS_DATA_REG5));
247         printk("tvp5150: VPS data registers = 0x%02x\n",
248                tvp5150_read(c, TVP5150_VPS_DATA_REG6));
249         printk("tvp5150: VPS data registers = 0x%02x\n",
250                tvp5150_read(c, TVP5150_VPS_DATA_REG7));
251         printk("tvp5150: VPS data registers = 0x%02x\n",
252                tvp5150_read(c, TVP5150_VPS_DATA_REG8));
253         printk("tvp5150: VPS data registers = 0x%02x\n",
254                tvp5150_read(c, TVP5150_VPS_DATA_REG9));
255         printk("tvp5150: VPS data registers = 0x%02x\n",
256                tvp5150_read(c, TVP5150_VPS_DATA_REG10));
257         printk("tvp5150: VPS data registers = 0x%02x\n",
258                tvp5150_read(c, TVP5150_VPS_DATA_REG11));
259         printk("tvp5150: VPS data registers = 0x%02x\n",
260                tvp5150_read(c, TVP5150_VPS_DATA_REG12));
261         printk("tvp5150: VPS data registers = 0x%02x\n",
262                tvp5150_read(c, TVP5150_VPS_DATA_REG13));
263         printk("tvp5150: VITC data registers = 0x%02x\n",
264                tvp5150_read(c, TVP5150_VITC_DATA_REG1));
265         printk("tvp5150: VITC data registers = 0x%02x\n",
266                tvp5150_read(c, TVP5150_VITC_DATA_REG2));
267         printk("tvp5150: VITC data registers = 0x%02x\n",
268                tvp5150_read(c, TVP5150_VITC_DATA_REG3));
269         printk("tvp5150: VITC data registers = 0x%02x\n",
270                tvp5150_read(c, TVP5150_VITC_DATA_REG4));
271         printk("tvp5150: VITC data registers = 0x%02x\n",
272                tvp5150_read(c, TVP5150_VITC_DATA_REG5));
273         printk("tvp5150: VITC data registers = 0x%02x\n",
274                tvp5150_read(c, TVP5150_VITC_DATA_REG6));
275         printk("tvp5150: VITC data registers = 0x%02x\n",
276                tvp5150_read(c, TVP5150_VITC_DATA_REG7));
277         printk("tvp5150: VITC data registers = 0x%02x\n",
278                tvp5150_read(c, TVP5150_VITC_DATA_REG8));
279         printk("tvp5150: VITC data registers = 0x%02x\n",
280                tvp5150_read(c, TVP5150_VITC_DATA_REG9));
281         printk("tvp5150: VBI FIFO read data = 0x%02x\n",
282                tvp5150_read(c, TVP5150_VBI_FIFO_READ_DATA));
283         printk("tvp5150: Teletext filter 1 = 0x%02x\n",
284                tvp5150_read(c, TVP5150_TELETEXT_FIL_1_1));
285         printk("tvp5150: Teletext filter 1 = 0x%02x\n",
286                tvp5150_read(c, TVP5150_TELETEXT_FIL_1_2));
287         printk("tvp5150: Teletext filter 1 = 0x%02x\n",
288                tvp5150_read(c, TVP5150_TELETEXT_FIL_1_3));
289         printk("tvp5150: Teletext filter 1 = 0x%02x\n",
290                tvp5150_read(c, TVP5150_TELETEXT_FIL_1_4));
291         printk("tvp5150: Teletext filter 1 = 0x%02x\n",
292                tvp5150_read(c, TVP5150_TELETEXT_FIL_1_5));
293         printk("tvp5150: Teletext filter 2 = 0x%02x\n",
294                tvp5150_read(c, TVP5150_TELETEXT_FIL_2_1));
295         printk("tvp5150: Teletext filter 2 = 0x%02x\n",
296                tvp5150_read(c, TVP5150_TELETEXT_FIL_2_2));
297         printk("tvp5150: Teletext filter 2 = 0x%02x\n",
298                tvp5150_read(c, TVP5150_TELETEXT_FIL_2_3));
299         printk("tvp5150: Teletext filter 2 = 0x%02x\n",
300                tvp5150_read(c, TVP5150_TELETEXT_FIL_2_4));
301         printk("tvp5150: Teletext filter 2 = 0x%02x\n",
302                tvp5150_read(c, TVP5150_TELETEXT_FIL_2_5));
303         printk("tvp5150: Teletext filter enable = 0x%02x\n",
304                tvp5150_read(c, TVP5150_TELETEXT_FIL_ENA));
305         printk("tvp5150: Interrupt status register A = 0x%02x\n",
306                tvp5150_read(c, TVP5150_INT_STATUS_REG_A));
307         printk("tvp5150: Interrupt enable register A = 0x%02x\n",
308                tvp5150_read(c, TVP5150_INT_ENABLE_REG_A));
309         printk("tvp5150: Interrupt configuration = 0x%02x\n",
310                tvp5150_read(c, TVP5150_INT_CONF));
311         printk("tvp5150: VDP configuration RAM data = 0x%02x\n",
312                tvp5150_read(c, TVP5150_VDP_CONF_RAM_DATA));
313         printk("tvp5150: Configuration RAM address low byte = 0x%02x\n",
314                tvp5150_read(c, TVP5150_CONF_RAM_ADDR_LOW));
315         printk("tvp5150: Configuration RAM address high byte = 0x%02x\n",
316                tvp5150_read(c, TVP5150_CONF_RAM_ADDR_HIGH));
317         printk("tvp5150: VDP status register = 0x%02x\n",
318                tvp5150_read(c, TVP5150_VDP_STATUS_REG));
319         printk("tvp5150: FIFO word count = 0x%02x\n",
320                tvp5150_read(c, TVP5150_FIFO_WORD_COUNT));
321         printk("tvp5150: FIFO interrupt threshold = 0x%02x\n",
322                tvp5150_read(c, TVP5150_FIFO_INT_THRESHOLD));
323         printk("tvp5150: FIFO reset = 0x%02x\n",
324                tvp5150_read(c, TVP5150_FIFO_RESET));
325         printk("tvp5150: Line number interrupt = 0x%02x\n",
326                tvp5150_read(c, TVP5150_LINE_NUMBER_INT));
327         printk("tvp5150: Pixel alignment register low byte = 0x%02x\n",
328                tvp5150_read(c, TVP5150_PIX_ALIGN_REG_LOW));
329         printk("tvp5150: Pixel alignment register high byte = 0x%02x\n",
330                tvp5150_read(c, TVP5150_PIX_ALIGN_REG_HIGH));
331         printk("tvp5150: FIFO output control = 0x%02x\n",
332                tvp5150_read(c, TVP5150_FIFO_OUT_CTRL));
333         printk("tvp5150: Full field enable 1 = 0x%02x\n",
334                tvp5150_read(c, TVP5150_FULL_FIELD_ENA_1));
335         printk("tvp5150: Full field enable 2 = 0x%02x\n",
336                tvp5150_read(c, TVP5150_FULL_FIELD_ENA_2));
337         printk("tvp5150: Line mode registers = 0x%02x\n",
338                tvp5150_read(c, TVP5150_LINE_MODE_REG_1));
339         printk("tvp5150: Line mode registers = 0x%02x\n",
340                tvp5150_read(c, TVP5150_LINE_MODE_REG_2));
341         printk("tvp5150: Line mode registers = 0x%02x\n",
342                tvp5150_read(c, TVP5150_LINE_MODE_REG_3));
343         printk("tvp5150: Line mode registers = 0x%02x\n",
344                tvp5150_read(c, TVP5150_LINE_MODE_REG_4));
345         printk("tvp5150: Line mode registers = 0x%02x\n",
346                tvp5150_read(c, TVP5150_LINE_MODE_REG_5));
347         printk("tvp5150: Line mode registers = 0x%02x\n",
348                tvp5150_read(c, TVP5150_LINE_MODE_REG_6));
349         printk("tvp5150: Line mode registers = 0x%02x\n",
350                tvp5150_read(c, TVP5150_LINE_MODE_REG_7));
351         printk("tvp5150: Line mode registers = 0x%02x\n",
352                tvp5150_read(c, TVP5150_LINE_MODE_REG_8));
353         printk("tvp5150: Line mode registers = 0x%02x\n",
354                tvp5150_read(c, TVP5150_LINE_MODE_REG_9));
355         printk("tvp5150: Line mode registers = 0x%02x\n",
356                tvp5150_read(c, TVP5150_LINE_MODE_REG_10));
357         printk("tvp5150: Line mode registers = 0x%02x\n",
358                tvp5150_read(c, TVP5150_LINE_MODE_REG_11));
359         printk("tvp5150: Line mode registers = 0x%02x\n",
360                tvp5150_read(c, TVP5150_LINE_MODE_REG_12));
361         printk("tvp5150: Line mode registers = 0x%02x\n",
362                tvp5150_read(c, TVP5150_LINE_MODE_REG_13));
363         printk("tvp5150: Line mode registers = 0x%02x\n",
364                tvp5150_read(c, TVP5150_LINE_MODE_REG_14));
365         printk("tvp5150: Line mode registers = 0x%02x\n",
366                tvp5150_read(c, TVP5150_LINE_MODE_REG_15));
367         printk("tvp5150: Line mode registers = 0x%02x\n",
368                tvp5150_read(c, TVP5150_LINE_MODE_REG_16));
369         printk("tvp5150: Line mode registers = 0x%02x\n",
370                tvp5150_read(c, TVP5150_LINE_MODE_REG_17));
371         printk("tvp5150: Line mode registers = 0x%02x\n",
372                tvp5150_read(c, TVP5150_LINE_MODE_REG_18));
373         printk("tvp5150: Line mode registers = 0x%02x\n",
374                tvp5150_read(c, TVP5150_LINE_MODE_REG_19));
375         printk("tvp5150: Line mode registers = 0x%02x\n",
376                tvp5150_read(c, TVP5150_LINE_MODE_REG_20));
377         printk("tvp5150: Line mode registers = 0x%02x\n",
378                tvp5150_read(c, TVP5150_LINE_MODE_REG_21));
379         printk("tvp5150: Line mode registers = 0x%02x\n",
380                tvp5150_read(c, TVP5150_LINE_MODE_REG_22));
381         printk("tvp5150: Line mode registers = 0x%02x\n",
382                tvp5150_read(c, TVP5150_LINE_MODE_REG_23));
383         printk("tvp5150: Line mode registers = 0x%02x\n",
384                tvp5150_read(c, TVP5150_LINE_MODE_REG_24));
385         printk("tvp5150: Line mode registers = 0x%02x\n",
386                tvp5150_read(c, TVP5150_LINE_MODE_REG_25));
387         printk("tvp5150: Line mode registers = 0x%02x\n",
388                tvp5150_read(c, TVP5150_LINE_MODE_REG_27));
389         printk("tvp5150: Line mode registers = 0x%02x\n",
390                tvp5150_read(c, TVP5150_LINE_MODE_REG_28));
391         printk("tvp5150: Line mode registers = 0x%02x\n",
392                tvp5150_read(c, TVP5150_LINE_MODE_REG_29));
393         printk("tvp5150: Line mode registers = 0x%02x\n",
394                tvp5150_read(c, TVP5150_LINE_MODE_REG_30));
395         printk("tvp5150: Line mode registers = 0x%02x\n",
396                tvp5150_read(c, TVP5150_LINE_MODE_REG_31));
397         printk("tvp5150: Line mode registers = 0x%02x\n",
398                tvp5150_read(c, TVP5150_LINE_MODE_REG_32));
399         printk("tvp5150: Line mode registers = 0x%02x\n",
400                tvp5150_read(c, TVP5150_LINE_MODE_REG_33));
401         printk("tvp5150: Line mode registers = 0x%02x\n",
402                tvp5150_read(c, TVP5150_LINE_MODE_REG_34));
403         printk("tvp5150: Line mode registers = 0x%02x\n",
404                tvp5150_read(c, TVP5150_LINE_MODE_REG_35));
405         printk("tvp5150: Line mode registers = 0x%02x\n",
406                tvp5150_read(c, TVP5150_LINE_MODE_REG_36));
407         printk("tvp5150: Line mode registers = 0x%02x\n",
408                tvp5150_read(c, TVP5150_LINE_MODE_REG_37));
409         printk("tvp5150: Line mode registers = 0x%02x\n",
410                tvp5150_read(c, TVP5150_LINE_MODE_REG_38));
411         printk("tvp5150: Line mode registers = 0x%02x\n",
412                tvp5150_read(c, TVP5150_LINE_MODE_REG_39));
413         printk("tvp5150: Line mode registers = 0x%02x\n",
414                tvp5150_read(c, TVP5150_LINE_MODE_REG_40));
415         printk("tvp5150: Line mode registers = 0x%02x\n",
416                tvp5150_read(c, TVP5150_LINE_MODE_REG_41));
417         printk("tvp5150: Line mode registers = 0x%02x\n",
418                tvp5150_read(c, TVP5150_LINE_MODE_REG_42));
419         printk("tvp5150: Line mode registers = 0x%02x\n",
420                tvp5150_read(c, TVP5150_LINE_MODE_REG_43));
421         printk("tvp5150: Line mode registers = 0x%02x\n",
422                tvp5150_read(c, TVP5150_LINE_MODE_REG_44));
423         printk("tvp5150: Full field mode register = 0x%02x\n",
424                tvp5150_read(c, TVP5150_FULL_FIELD_MODE_REG));
425 }
426
427 /****************************************************************************
428                         Basic functions
429  ****************************************************************************/
430 enum tvp5150_input {
431         TVP5150_ANALOG_CH0 = 0,
432         TVP5150_SVIDEO = 1,
433         TVP5150_ANALOG_CH1 = 2,
434         TVP5150_BLACK_SCREEN = 8
435 };
436
437 static inline void tvp5150_selmux(struct i2c_client *c,
438                                   enum tvp5150_input input)
439 {
440         int opmode=0;
441
442         struct tvp5150 *decoder = i2c_get_clientdata(c);
443
444         if (!decoder->enable)
445                 input |= TVP5150_BLACK_SCREEN;
446
447         switch (input) {
448         case TVP5150_ANALOG_CH0:
449         case TVP5150_ANALOG_CH1:
450                 opmode=0x30;            /* TV Mode */
451                 break;
452         default:
453                 opmode=0;               /* Auto Mode */
454                 break;
455         }
456
457         tvp5150_write(c, TVP5150_OP_MODE_CTL, opmode);
458         tvp5150_write(c, TVP5150_VD_IN_SRC_SEL_1, input);
459 };
460
461 static inline void tvp5150_reset(struct i2c_client *c)
462 {
463         struct tvp5150 *decoder = i2c_get_clientdata(c);
464
465         tvp5150_write(c, TVP5150_CONF_SHARED_PIN, 2);
466
467         /* Automatic offset and AGC enabled */
468         tvp5150_write(c, TVP5150_ANAL_CHL_CTL, 0x15);
469
470         /* Normal Operation */
471 //      tvp5150_write(c, TVP5150_OP_MODE_CTL, 0x00);
472
473         /* Activate YCrCb output 0x9 or 0xd ? */
474         tvp5150_write(c, TVP5150_MISC_CTL, 0x6f);
475
476         /* Activates video std autodetection for all standards */
477         tvp5150_write(c, TVP5150_AUTOSW_MSK, 0x0);
478
479         /* Default format: 0x47, 4:2:2: 0x40 */
480         tvp5150_write(c, TVP5150_DATA_RATE_SEL, 0x47);
481
482         tvp5150_selmux(c, decoder->input);
483
484         tvp5150_write(c, TVP5150_CHROMA_PROC_CTL_1, 0x0c);
485         tvp5150_write(c, TVP5150_CHROMA_PROC_CTL_2, 0x54);
486
487         tvp5150_write(c, 0x27, 0x20);   /* ?????????? */
488
489         tvp5150_write(c, TVP5150_VIDEO_STD, 0x0);       /* Auto switch */
490
491         tvp5150_write(c, TVP5150_BRIGHT_CTL, decoder->bright >> 8);
492         tvp5150_write(c, TVP5150_CONTRAST_CTL, decoder->contrast >> 8);
493         tvp5150_write(c, TVP5150_SATURATION_CTL, decoder->contrast >> 8);
494         tvp5150_write(c, TVP5150_HUE_CTL, (decoder->hue - 32768) >> 8);
495 };
496
497 static int tvp5150_get_ctrl(struct i2c_client *c, struct v4l2_control *ctrl)
498 {
499 /*      struct tvp5150 *decoder = i2c_get_clientdata(c); */
500
501         switch (ctrl->id) {
502         case V4L2_CID_BRIGHTNESS:
503                 ctrl->value = tvp5150_read(c, TVP5150_BRIGHT_CTL);
504                 return 0;
505         case V4L2_CID_CONTRAST:
506                 ctrl->value = tvp5150_read(c, TVP5150_CONTRAST_CTL);
507                 return 0;
508         case V4L2_CID_SATURATION:
509                 ctrl->value = tvp5150_read(c, TVP5150_SATURATION_CTL);
510                 return 0;
511         case V4L2_CID_HUE:
512                 ctrl->value = tvp5150_read(c, TVP5150_HUE_CTL);
513                 return 0;
514         }
515         return -EINVAL;
516 }
517
518 static int tvp5150_set_ctrl(struct i2c_client *c, struct v4l2_control *ctrl)
519 {
520 /*      struct tvp5150 *decoder = i2c_get_clientdata(c); */
521
522         switch (ctrl->id) {
523         case V4L2_CID_BRIGHTNESS:
524                 tvp5150_write(c, TVP5150_BRIGHT_CTL, ctrl->value);
525                 return 0;
526         case V4L2_CID_CONTRAST:
527                 tvp5150_write(c, TVP5150_CONTRAST_CTL, ctrl->value);
528                 return 0;
529         case V4L2_CID_SATURATION:
530                 tvp5150_write(c, TVP5150_SATURATION_CTL, ctrl->value);
531                 return 0;
532         case V4L2_CID_HUE:
533                 tvp5150_write(c, TVP5150_HUE_CTL, ctrl->value);
534                 return 0;
535         }
536         return -EINVAL;
537 }
538
539 /****************************************************************************
540                         I2C Command
541  ****************************************************************************/
542 static int tvp5150_command(struct i2c_client *client,
543                            unsigned int cmd, void *arg)
544 {
545         struct tvp5150 *decoder = i2c_get_clientdata(client);
546
547         switch (cmd) {
548
549         case 0:
550         case DECODER_INIT:
551                 tvp5150_reset(client);
552                 break;
553
554         case DECODER_DUMP:
555                 dump_reg(client);
556                 break;
557
558         case DECODER_GET_CAPABILITIES:
559                 {
560                         struct video_decoder_capability *cap = arg;
561
562                         cap->flags = VIDEO_DECODER_PAL |
563                             VIDEO_DECODER_NTSC |
564                             VIDEO_DECODER_SECAM |
565                             VIDEO_DECODER_AUTO | VIDEO_DECODER_CCIR;
566                         cap->inputs = 3;
567                         cap->outputs = 1;
568                         break;
569                 }
570         case DECODER_GET_STATUS:
571                 {
572                         break;
573                 }
574
575         case DECODER_SET_GPIO:
576                 break;
577
578         case DECODER_SET_VBI_BYPASS:
579                 break;
580
581         case DECODER_SET_NORM:
582                 {
583                         int *iarg = arg;
584
585                         switch (*iarg) {
586
587                         case VIDEO_MODE_NTSC:
588                                 break;
589
590                         case VIDEO_MODE_PAL:
591                                 break;
592
593                         case VIDEO_MODE_SECAM:
594                                 break;
595
596                         case VIDEO_MODE_AUTO:
597                                 break;
598
599                         default:
600                                 return -EINVAL;
601
602                         }
603                         decoder->norm = *iarg;
604                         break;
605                 }
606         case DECODER_SET_INPUT:
607                 {
608                         int *iarg = arg;
609                         if (*iarg < 0 || *iarg > 3) {
610                                 return -EINVAL;
611                         }
612
613                         decoder->input = *iarg;
614                         tvp5150_selmux(client, decoder->input);
615
616                         break;
617                 }
618         case DECODER_SET_OUTPUT:
619                 {
620                         int *iarg = arg;
621
622                         /* not much choice of outputs */
623                         if (*iarg != 0) {
624                                 return -EINVAL;
625                         }
626                         break;
627                 }
628         case DECODER_ENABLE_OUTPUT:
629                 {
630                         int *iarg = arg;
631
632                         decoder->enable = (*iarg != 0);
633
634                         tvp5150_selmux(client, decoder->input);
635
636                         break;
637                 }
638         case VIDIOC_QUERYCTRL:
639                 {
640                         struct v4l2_queryctrl *qc = arg;
641                         int i;
642
643                         dprintk(1, KERN_DEBUG "VIDIOC_QUERYCTRL");
644
645                         for (i = 0; i < ARRAY_SIZE(tvp5150_qctrl); i++)
646                                 if (qc->id && qc->id == tvp5150_qctrl[i].id) {
647                                         memcpy(qc, &(tvp5150_qctrl[i]),
648                                                sizeof(*qc));
649                                         return 0;
650                                 }
651
652                         return -EINVAL;
653                 }
654         case VIDIOC_G_CTRL:
655                 {
656                         struct v4l2_control *ctrl = arg;
657                         dprintk(1, KERN_DEBUG "VIDIOC_G_CTRL");
658
659                         return tvp5150_get_ctrl(client, ctrl);
660                 }
661         case VIDIOC_S_CTRL:
662                 {
663                         struct v4l2_control *ctrl = arg;
664                         u8 i, n;
665                         dprintk(1, KERN_DEBUG "VIDIOC_S_CTRL");
666                         n = sizeof(tvp5150_qctrl) / sizeof(tvp5150_qctrl[0]);
667                         for (i = 0; i < n; i++)
668                                 if (ctrl->id == tvp5150_qctrl[i].id) {
669                                         if (ctrl->value <
670                                             tvp5150_qctrl[i].minimum
671                                             || ctrl->value >
672                                             tvp5150_qctrl[i].maximum)
673                                                 return -ERANGE;
674                                         dprintk(1,
675                                                 KERN_DEBUG
676                                                 "VIDIOC_S_CTRL: id=%d, value=%d",
677                                                 ctrl->id, ctrl->value);
678                                         return tvp5150_set_ctrl(client, ctrl);
679                                 }
680                         return -EINVAL;
681                 }
682
683         case DECODER_SET_PICTURE:
684                 {
685                         struct video_picture *pic = arg;
686                         if (decoder->bright != pic->brightness) {
687                                 /* We want 0 to 255 we get 0-65535 */
688                                 decoder->bright = pic->brightness;
689                                 tvp5150_write(client, TVP5150_BRIGHT_CTL,
690                                               decoder->bright >> 8);
691                         }
692                         if (decoder->contrast != pic->contrast) {
693                                 /* We want 0 to 255 we get 0-65535 */
694                                 decoder->contrast = pic->contrast;
695                                 tvp5150_write(client, TVP5150_CONTRAST_CTL,
696                                               decoder->contrast >> 8);
697                         }
698                         if (decoder->sat != pic->colour) {
699                                 /* We want 0 to 255 we get 0-65535 */
700                                 decoder->sat = pic->colour;
701                                 tvp5150_write(client, TVP5150_SATURATION_CTL,
702                                               decoder->contrast >> 8);
703                         }
704                         if (decoder->hue != pic->hue) {
705                                 /* We want -128 to 127 we get 0-65535 */
706                                 decoder->hue = pic->hue;
707                                 tvp5150_write(client, TVP5150_HUE_CTL,
708                                               (decoder->hue - 32768) >> 8);
709                         }
710                         break;
711                 }
712         default:
713                 return -EINVAL;
714         }
715
716         return 0;
717 }
718
719 /****************************************************************************
720                         I2C Client & Driver
721  ****************************************************************************/
722 static struct i2c_driver driver;
723
724 static struct i2c_client client_template = {
725         .name = "(unset)",
726         .driver = &driver,
727 };
728
729 static int tvp5150_detect_client(struct i2c_adapter *adapter,
730                                  int address, int kind)
731 {
732         struct i2c_client *client;
733         struct tvp5150 *core;
734         int rv;
735
736         dprintk(1,
737                 KERN_INFO
738                 "tvp5150.c: detecting tvp5150 client on address 0x%x\n",
739                 address << 1);
740
741         client_template.adapter = adapter;
742         client_template.addr = address;
743
744         /* Check if the adapter supports the needed features */
745         if (!i2c_check_functionality
746             (adapter,
747              I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
748                 return 0;
749
750         client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
751         if (client == 0)
752                 return -ENOMEM;
753         memcpy(client, &client_template, sizeof(struct i2c_client));
754
755         core = kmalloc(sizeof(struct tvp5150), GFP_KERNEL);
756         if (core == 0) {
757                 kfree(client);
758                 return -ENOMEM;
759         }
760         memset(core, 0, sizeof(struct tvp5150));
761         i2c_set_clientdata(client, core);
762
763         rv = i2c_attach_client(client);
764
765         core->norm = VIDEO_MODE_AUTO;
766         core->input = 2;
767         core->enable = 1;
768         core->bright = 32768;
769         core->contrast = 32768;
770         core->hue = 32768;
771         core->sat = 32768;
772
773         if (rv) {
774                 kfree(client);
775                 kfree(core);
776                 return rv;
777         }
778
779         if (debug > 1)
780                 dump_reg(client);
781         return 0;
782 }
783
784 static int tvp5150_attach_adapter(struct i2c_adapter *adapter)
785 {
786         dprintk(1,
787                 KERN_INFO
788                 "tvp5150.c: starting probe for adapter %s (0x%x)\n",
789                 adapter->name, adapter->id);
790         return i2c_probe(adapter, &addr_data, &tvp5150_detect_client);
791 }
792
793 static int tvp5150_detach_client(struct i2c_client *client)
794 {
795         struct tvp5150 *decoder = i2c_get_clientdata(client);
796         int err;
797
798         err = i2c_detach_client(client);
799         if (err) {
800                 return err;
801         }
802
803         kfree(decoder);
804         kfree(client);
805
806         return 0;
807 }
808
809 /* ----------------------------------------------------------------------- */
810
811 static struct i2c_driver driver = {
812         .driver = {
813                 .name = "tvp5150",
814         },
815
816         /* FIXME */
817         .id = I2C_DRIVERID_SAA7110,
818
819         .attach_adapter = tvp5150_attach_adapter,
820         .detach_client = tvp5150_detach_client,
821
822         .command = tvp5150_command,
823 };
824
825 static int __init tvp5150_init(void)
826 {
827         return i2c_add_driver(&driver);
828 }
829
830 static void __exit tvp5150_exit(void)
831 {
832         i2c_del_driver(&driver);
833 }
834
835 module_init(tvp5150_init);
836 module_exit(tvp5150_exit);