include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[safe/jmp/linux-2.6] / drivers / media / video / vpx3220.c
1 /*
2  * vpx3220a, vpx3216b & vpx3214c video decoder driver version 0.0.1
3  *
4  * Copyright (C) 2001 Laurent Pinchart <lpinchart@freegates.be>
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  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19  */
20
21 #include <linux/module.h>
22 #include <linux/init.h>
23 #include <linux/delay.h>
24 #include <linux/types.h>
25 #include <linux/slab.h>
26 #include <asm/uaccess.h>
27 #include <linux/i2c.h>
28 #include <linux/videodev2.h>
29 #include <media/v4l2-device.h>
30 #include <media/v4l2-chip-ident.h>
31 #include <media/v4l2-i2c-drv.h>
32
33 MODULE_DESCRIPTION("vpx3220a/vpx3216b/vpx3214c video decoder driver");
34 MODULE_AUTHOR("Laurent Pinchart");
35 MODULE_LICENSE("GPL");
36
37 static int debug;
38 module_param(debug, int, 0);
39 MODULE_PARM_DESC(debug, "Debug level (0-1)");
40
41
42 #define VPX_TIMEOUT_COUNT  10
43
44 /* ----------------------------------------------------------------------- */
45
46 struct vpx3220 {
47         struct v4l2_subdev sd;
48         unsigned char reg[255];
49
50         v4l2_std_id norm;
51         int ident;
52         int input;
53         int enable;
54         int bright;
55         int contrast;
56         int hue;
57         int sat;
58 };
59
60 static inline struct vpx3220 *to_vpx3220(struct v4l2_subdev *sd)
61 {
62         return container_of(sd, struct vpx3220, sd);
63 }
64
65 static char *inputs[] = { "internal", "composite", "svideo" };
66
67 /* ----------------------------------------------------------------------- */
68
69 static inline int vpx3220_write(struct v4l2_subdev *sd, u8 reg, u8 value)
70 {
71         struct i2c_client *client = v4l2_get_subdevdata(sd);
72         struct vpx3220 *decoder = i2c_get_clientdata(client);
73
74         decoder->reg[reg] = value;
75         return i2c_smbus_write_byte_data(client, reg, value);
76 }
77
78 static inline int vpx3220_read(struct v4l2_subdev *sd, u8 reg)
79 {
80         struct i2c_client *client = v4l2_get_subdevdata(sd);
81
82         return i2c_smbus_read_byte_data(client, reg);
83 }
84
85 static int vpx3220_fp_status(struct v4l2_subdev *sd)
86 {
87         unsigned char status;
88         unsigned int i;
89
90         for (i = 0; i < VPX_TIMEOUT_COUNT; i++) {
91                 status = vpx3220_read(sd, 0x29);
92
93                 if (!(status & 4))
94                         return 0;
95
96                 udelay(10);
97
98                 if (need_resched())
99                         cond_resched();
100         }
101
102         return -1;
103 }
104
105 static int vpx3220_fp_write(struct v4l2_subdev *sd, u8 fpaddr, u16 data)
106 {
107         struct i2c_client *client = v4l2_get_subdevdata(sd);
108
109         /* Write the 16-bit address to the FPWR register */
110         if (i2c_smbus_write_word_data(client, 0x27, swab16(fpaddr)) == -1) {
111                 v4l2_dbg(1, debug, sd, "%s: failed\n", __func__);
112                 return -1;
113         }
114
115         if (vpx3220_fp_status(sd) < 0)
116                 return -1;
117
118         /* Write the 16-bit data to the FPDAT register */
119         if (i2c_smbus_write_word_data(client, 0x28, swab16(data)) == -1) {
120                 v4l2_dbg(1, debug, sd, "%s: failed\n", __func__);
121                 return -1;
122         }
123
124         return 0;
125 }
126
127 static u16 vpx3220_fp_read(struct v4l2_subdev *sd, u16 fpaddr)
128 {
129         struct i2c_client *client = v4l2_get_subdevdata(sd);
130         s16 data;
131
132         /* Write the 16-bit address to the FPRD register */
133         if (i2c_smbus_write_word_data(client, 0x26, swab16(fpaddr)) == -1) {
134                 v4l2_dbg(1, debug, sd, "%s: failed\n", __func__);
135                 return -1;
136         }
137
138         if (vpx3220_fp_status(sd) < 0)
139                 return -1;
140
141         /* Read the 16-bit data from the FPDAT register */
142         data = i2c_smbus_read_word_data(client, 0x28);
143         if (data == -1) {
144                 v4l2_dbg(1, debug, sd, "%s: failed\n", __func__);
145                 return -1;
146         }
147
148         return swab16(data);
149 }
150
151 static int vpx3220_write_block(struct v4l2_subdev *sd, const u8 *data, unsigned int len)
152 {
153         u8 reg;
154         int ret = -1;
155
156         while (len >= 2) {
157                 reg = *data++;
158                 ret = vpx3220_write(sd, reg, *data++);
159                 if (ret < 0)
160                         break;
161                 len -= 2;
162         }
163
164         return ret;
165 }
166
167 static int vpx3220_write_fp_block(struct v4l2_subdev *sd,
168                 const u16 *data, unsigned int len)
169 {
170         u8 reg;
171         int ret = 0;
172
173         while (len > 1) {
174                 reg = *data++;
175                 ret |= vpx3220_fp_write(sd, reg, *data++);
176                 len -= 2;
177         }
178
179         return ret;
180 }
181
182 /* ---------------------------------------------------------------------- */
183
184 static const unsigned short init_ntsc[] = {
185         0x1c, 0x00,             /* NTSC tint angle */
186         0x88, 17,               /* Window 1 vertical */
187         0x89, 240,              /* Vertical lines in */
188         0x8a, 240,              /* Vertical lines out */
189         0x8b, 000,              /* Horizontal begin */
190         0x8c, 640,              /* Horizontal length */
191         0x8d, 640,              /* Number of pixels */
192         0x8f, 0xc00,            /* Disable window 2 */
193         0xf0, 0x73,             /* 13.5 MHz transport, Forced
194                                  * mode, latch windows */
195         0xf2, 0x13,             /* NTSC M, composite input */
196         0xe7, 0x1e1,            /* Enable vertical standard
197                                  * locking @ 240 lines */
198 };
199
200 static const unsigned short init_pal[] = {
201         0x88, 23,               /* Window 1 vertical begin */
202         0x89, 288,              /* Vertical lines in (16 lines
203                                  * skipped by the VFE) */
204         0x8a, 288,              /* Vertical lines out (16 lines
205                                  * skipped by the VFE) */
206         0x8b, 16,               /* Horizontal begin */
207         0x8c, 768,              /* Horizontal length */
208         0x8d, 784,              /* Number of pixels
209                                  * Must be >= Horizontal begin + Horizontal length */
210         0x8f, 0xc00,            /* Disable window 2 */
211         0xf0, 0x77,             /* 13.5 MHz transport, Forced
212                                  * mode, latch windows */
213         0xf2, 0x3d1,            /* PAL B,G,H,I, composite input */
214         0xe7, 0x241,            /* PAL/SECAM set to 288 lines */
215 };
216
217 static const unsigned short init_secam[] = {
218         0x88, 23,               /* Window 1 vertical begin */
219         0x89, 288,              /* Vertical lines in (16 lines
220                                  * skipped by the VFE) */
221         0x8a, 288,              /* Vertical lines out (16 lines
222                                  * skipped by the VFE) */
223         0x8b, 16,               /* Horizontal begin */
224         0x8c, 768,              /* Horizontal length */
225         0x8d, 784,              /* Number of pixels
226                                  * Must be >= Horizontal begin + Horizontal length */
227         0x8f, 0xc00,            /* Disable window 2 */
228         0xf0, 0x77,             /* 13.5 MHz transport, Forced
229                                  * mode, latch windows */
230         0xf2, 0x3d5,            /* SECAM, composite input */
231         0xe7, 0x241,            /* PAL/SECAM set to 288 lines */
232 };
233
234 static const unsigned char init_common[] = {
235         0xf2, 0x00,             /* Disable all outputs */
236         0x33, 0x0d,             /* Luma : VIN2, Chroma : CIN
237                                  * (clamp off) */
238         0xd8, 0xa8,             /* HREF/VREF active high, VREF
239                                  * pulse = 2, Odd/Even flag */
240         0x20, 0x03,             /* IF compensation 0dB/oct */
241         0xe0, 0xff,             /* Open up all comparators */
242         0xe1, 0x00,
243         0xe2, 0x7f,
244         0xe3, 0x80,
245         0xe4, 0x7f,
246         0xe5, 0x80,
247         0xe6, 0x00,             /* Brightness set to 0 */
248         0xe7, 0xe0,             /* Contrast to 1.0, noise shaping
249                                  * 10 to 8 2-bit error diffusion */
250         0xe8, 0xf8,             /* YUV422, CbCr binary offset,
251                                  * ... (p.32) */
252         0xea, 0x18,             /* LLC2 connected, output FIFO
253                                  * reset with VACTintern */
254         0xf0, 0x8a,             /* Half full level to 10, bus
255                                  * shuffler [7:0, 23:16, 15:8] */
256         0xf1, 0x18,             /* Single clock, sync mode, no
257                                  * FE delay, no HLEN counter */
258         0xf8, 0x12,             /* Port A, PIXCLK, HF# & FE#
259                                  * strength to 2 */
260         0xf9, 0x24,             /* Port B, HREF, VREF, PREF &
261                                  * ALPHA strength to 4 */
262 };
263
264 static const unsigned short init_fp[] = {
265         0x59, 0,
266         0xa0, 2070,             /* ACC reference */
267         0xa3, 0,
268         0xa4, 0,
269         0xa8, 30,
270         0xb2, 768,
271         0xbe, 27,
272         0x58, 0,
273         0x26, 0,
274         0x4b, 0x298,            /* PLL gain */
275 };
276
277
278 static int vpx3220_init(struct v4l2_subdev *sd, u32 val)
279 {
280         struct vpx3220 *decoder = to_vpx3220(sd);
281
282         vpx3220_write_block(sd, init_common, sizeof(init_common));
283         vpx3220_write_fp_block(sd, init_fp, sizeof(init_fp) >> 1);
284         if (decoder->norm & V4L2_STD_NTSC)
285                 vpx3220_write_fp_block(sd, init_ntsc, sizeof(init_ntsc) >> 1);
286         else if (decoder->norm & V4L2_STD_PAL)
287                 vpx3220_write_fp_block(sd, init_pal, sizeof(init_pal) >> 1);
288         else if (decoder->norm & V4L2_STD_SECAM)
289                 vpx3220_write_fp_block(sd, init_secam, sizeof(init_secam) >> 1);
290         else
291                 vpx3220_write_fp_block(sd, init_pal, sizeof(init_pal) >> 1);
292         return 0;
293 }
294
295 static int vpx3220_status(struct v4l2_subdev *sd, u32 *pstatus, v4l2_std_id *pstd)
296 {
297         int res = V4L2_IN_ST_NO_SIGNAL, status;
298         v4l2_std_id std = 0;
299
300         status = vpx3220_fp_read(sd, 0x0f3);
301
302         v4l2_dbg(1, debug, sd, "status: 0x%04x\n", status);
303
304         if (status < 0)
305                 return status;
306
307         if ((status & 0x20) == 0) {
308                 res = 0;
309
310                 switch (status & 0x18) {
311                 case 0x00:
312                 case 0x10:
313                 case 0x14:
314                 case 0x18:
315                         std = V4L2_STD_PAL;
316                         break;
317
318                 case 0x08:
319                         std = V4L2_STD_SECAM;
320                         break;
321
322                 case 0x04:
323                 case 0x0c:
324                 case 0x1c:
325                         std = V4L2_STD_NTSC;
326                         break;
327                 }
328         }
329         if (pstd)
330                 *pstd = std;
331         if (pstatus)
332                 *pstatus = status;
333         return 0;
334 }
335
336 static int vpx3220_querystd(struct v4l2_subdev *sd, v4l2_std_id *std)
337 {
338         v4l2_dbg(1, debug, sd, "querystd\n");
339         return vpx3220_status(sd, NULL, std);
340 }
341
342 static int vpx3220_g_input_status(struct v4l2_subdev *sd, u32 *status)
343 {
344         v4l2_dbg(1, debug, sd, "g_input_status\n");
345         return vpx3220_status(sd, status, NULL);
346 }
347
348 static int vpx3220_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
349 {
350         struct vpx3220 *decoder = to_vpx3220(sd);
351         int temp_input;
352
353         /* Here we back up the input selection because it gets
354            overwritten when we fill the registers with the
355            choosen video norm */
356         temp_input = vpx3220_fp_read(sd, 0xf2);
357
358         v4l2_dbg(1, debug, sd, "s_std %llx\n", (unsigned long long)std);
359         if (std & V4L2_STD_NTSC) {
360                 vpx3220_write_fp_block(sd, init_ntsc, sizeof(init_ntsc) >> 1);
361                 v4l2_dbg(1, debug, sd, "norm switched to NTSC\n");
362         } else if (std & V4L2_STD_PAL) {
363                 vpx3220_write_fp_block(sd, init_pal, sizeof(init_pal) >> 1);
364                 v4l2_dbg(1, debug, sd, "norm switched to PAL\n");
365         } else if (std & V4L2_STD_SECAM) {
366                 vpx3220_write_fp_block(sd, init_secam, sizeof(init_secam) >> 1);
367                 v4l2_dbg(1, debug, sd, "norm switched to SECAM\n");
368         } else {
369                 return -EINVAL;
370         }
371
372         decoder->norm = std;
373
374         /* And here we set the backed up video input again */
375         vpx3220_fp_write(sd, 0xf2, temp_input | 0x0010);
376         udelay(10);
377         return 0;
378 }
379
380 static int vpx3220_s_routing(struct v4l2_subdev *sd,
381                              u32 input, u32 output, u32 config)
382 {
383         int data;
384
385         /* RJ:   input = 0: ST8 (PCTV) input
386                  input = 1: COMPOSITE  input
387                  input = 2: SVHS       input  */
388
389         const int input_vals[3][2] = {
390                 {0x0c, 0},
391                 {0x0d, 0},
392                 {0x0e, 1}
393         };
394
395         if (input > 2)
396                 return -EINVAL;
397
398         v4l2_dbg(1, debug, sd, "input switched to %s\n", inputs[input]);
399
400         vpx3220_write(sd, 0x33, input_vals[input][0]);
401
402         data = vpx3220_fp_read(sd, 0xf2) & ~(0x0020);
403         if (data < 0)
404                 return data;
405         /* 0x0010 is required to latch the setting */
406         vpx3220_fp_write(sd, 0xf2,
407                         data | (input_vals[input][1] << 5) | 0x0010);
408
409         udelay(10);
410         return 0;
411 }
412
413 static int vpx3220_s_stream(struct v4l2_subdev *sd, int enable)
414 {
415         v4l2_dbg(1, debug, sd, "s_stream %s\n", enable ? "on" : "off");
416
417         vpx3220_write(sd, 0xf2, (enable ? 0x1b : 0x00));
418         return 0;
419 }
420
421 static int vpx3220_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
422 {
423         switch (qc->id) {
424         case V4L2_CID_BRIGHTNESS:
425                 v4l2_ctrl_query_fill(qc, -128, 127, 1, 0);
426                 break;
427
428         case V4L2_CID_CONTRAST:
429                 v4l2_ctrl_query_fill(qc, 0, 63, 1, 32);
430                 break;
431
432         case V4L2_CID_SATURATION:
433                 v4l2_ctrl_query_fill(qc, 0, 4095, 1, 2048);
434                 break;
435
436         case V4L2_CID_HUE:
437                 v4l2_ctrl_query_fill(qc, -512, 511, 1, 0);
438                 break;
439
440         default:
441                 return -EINVAL;
442         }
443         return 0;
444 }
445
446 static int vpx3220_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
447 {
448         struct vpx3220 *decoder = to_vpx3220(sd);
449
450         switch (ctrl->id) {
451         case V4L2_CID_BRIGHTNESS:
452                 ctrl->value = decoder->bright;
453                 break;
454         case V4L2_CID_CONTRAST:
455                 ctrl->value = decoder->contrast;
456                 break;
457         case V4L2_CID_SATURATION:
458                 ctrl->value = decoder->sat;
459                 break;
460         case V4L2_CID_HUE:
461                 ctrl->value = decoder->hue;
462                 break;
463         default:
464                 return -EINVAL;
465         }
466         return 0;
467 }
468
469 static int vpx3220_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
470 {
471         struct vpx3220 *decoder = to_vpx3220(sd);
472
473         switch (ctrl->id) {
474         case V4L2_CID_BRIGHTNESS:
475                 if (decoder->bright != ctrl->value) {
476                         decoder->bright = ctrl->value;
477                         vpx3220_write(sd, 0xe6, decoder->bright);
478                 }
479                 break;
480         case V4L2_CID_CONTRAST:
481                 if (decoder->contrast != ctrl->value) {
482                         /* Bit 7 and 8 is for noise shaping */
483                         decoder->contrast = ctrl->value;
484                         vpx3220_write(sd, 0xe7, decoder->contrast + 192);
485                 }
486                 break;
487         case V4L2_CID_SATURATION:
488                 if (decoder->sat != ctrl->value) {
489                         decoder->sat = ctrl->value;
490                         vpx3220_fp_write(sd, 0xa0, decoder->sat);
491                 }
492                 break;
493         case V4L2_CID_HUE:
494                 if (decoder->hue != ctrl->value) {
495                         decoder->hue = ctrl->value;
496                         vpx3220_fp_write(sd, 0x1c, decoder->hue);
497                 }
498                 break;
499         default:
500                 return -EINVAL;
501         }
502         return 0;
503 }
504
505 static int vpx3220_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip)
506 {
507         struct vpx3220 *decoder = to_vpx3220(sd);
508         struct i2c_client *client = v4l2_get_subdevdata(sd);
509
510         return v4l2_chip_ident_i2c_client(client, chip, decoder->ident, 0);
511 }
512
513 /* ----------------------------------------------------------------------- */
514
515 static const struct v4l2_subdev_core_ops vpx3220_core_ops = {
516         .g_chip_ident = vpx3220_g_chip_ident,
517         .init = vpx3220_init,
518         .g_ctrl = vpx3220_g_ctrl,
519         .s_ctrl = vpx3220_s_ctrl,
520         .queryctrl = vpx3220_queryctrl,
521         .s_std = vpx3220_s_std,
522 };
523
524 static const struct v4l2_subdev_video_ops vpx3220_video_ops = {
525         .s_routing = vpx3220_s_routing,
526         .s_stream = vpx3220_s_stream,
527         .querystd = vpx3220_querystd,
528         .g_input_status = vpx3220_g_input_status,
529 };
530
531 static const struct v4l2_subdev_ops vpx3220_ops = {
532         .core = &vpx3220_core_ops,
533         .video = &vpx3220_video_ops,
534 };
535
536 /* -----------------------------------------------------------------------
537  * Client management code
538  */
539
540 static int vpx3220_probe(struct i2c_client *client,
541                         const struct i2c_device_id *id)
542 {
543         struct vpx3220 *decoder;
544         struct v4l2_subdev *sd;
545         const char *name = NULL;
546         u8 ver;
547         u16 pn;
548
549         /* Check if the adapter supports the needed features */
550         if (!i2c_check_functionality(client->adapter,
551                 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA))
552                 return -ENODEV;
553
554         decoder = kzalloc(sizeof(struct vpx3220), GFP_KERNEL);
555         if (decoder == NULL)
556                 return -ENOMEM;
557         sd = &decoder->sd;
558         v4l2_i2c_subdev_init(sd, client, &vpx3220_ops);
559         decoder->norm = V4L2_STD_PAL;
560         decoder->input = 0;
561         decoder->enable = 1;
562         decoder->bright = 32768;
563         decoder->contrast = 32768;
564         decoder->hue = 32768;
565         decoder->sat = 32768;
566
567         ver = i2c_smbus_read_byte_data(client, 0x00);
568         pn = (i2c_smbus_read_byte_data(client, 0x02) << 8) +
569                 i2c_smbus_read_byte_data(client, 0x01);
570         decoder->ident = V4L2_IDENT_VPX3220A;
571         if (ver == 0xec) {
572                 switch (pn) {
573                 case 0x4680:
574                         name = "vpx3220a";
575                         break;
576                 case 0x4260:
577                         name = "vpx3216b";
578                         decoder->ident = V4L2_IDENT_VPX3216B;
579                         break;
580                 case 0x4280:
581                         name = "vpx3214c";
582                         decoder->ident = V4L2_IDENT_VPX3214C;
583                         break;
584                 }
585         }
586         if (name)
587                 v4l2_info(sd, "%s found @ 0x%x (%s)\n", name,
588                         client->addr << 1, client->adapter->name);
589         else
590                 v4l2_info(sd, "chip (%02x:%04x) found @ 0x%x (%s)\n",
591                         ver, pn, client->addr << 1, client->adapter->name);
592
593         vpx3220_write_block(sd, init_common, sizeof(init_common));
594         vpx3220_write_fp_block(sd, init_fp, sizeof(init_fp) >> 1);
595         /* Default to PAL */
596         vpx3220_write_fp_block(sd, init_pal, sizeof(init_pal) >> 1);
597         return 0;
598 }
599
600 static int vpx3220_remove(struct i2c_client *client)
601 {
602         struct v4l2_subdev *sd = i2c_get_clientdata(client);
603
604         v4l2_device_unregister_subdev(sd);
605         kfree(to_vpx3220(sd));
606         return 0;
607 }
608
609 static const struct i2c_device_id vpx3220_id[] = {
610         { "vpx3220a", 0 },
611         { "vpx3216b", 0 },
612         { "vpx3214c", 0 },
613         { }
614 };
615 MODULE_DEVICE_TABLE(i2c, vpx3220_id);
616
617 static struct v4l2_i2c_driver_data v4l2_i2c_data = {
618         .name = "vpx3220",
619         .probe = vpx3220_probe,
620         .remove = vpx3220_remove,
621         .id_table = vpx3220_id,
622 };