Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
[linux-2.6] / drivers / media / video / adv7175.c
1 /*
2  *  adv7175 - adv7175a video encoder driver version 0.0.3
3  *
4  * Copyright (C) 1998 Dave Perks <dperks@ibm.net>
5  * Copyright (C) 1999 Wolfgang Scherr <scherr@net4you.net>
6  * Copyright (C) 2000 Serguei Miridonov <mirsev@cicese.mx>
7  *    - some corrections for Pinnacle Systems Inc. DC10plus card.
8  *
9  * Changes by Ronald Bultje <rbultje@ronald.bitfreak.net>
10  *    - moved over to linux>=2.4.x i2c protocol (9/9/2002)
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 2 of the License, or
15  * (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25  */
26
27 #include <linux/module.h>
28 #include <linux/types.h>
29 #include <linux/ioctl.h>
30 #include <asm/uaccess.h>
31 #include <linux/i2c.h>
32 #include <linux/i2c-id.h>
33 #include <linux/videodev2.h>
34 #include <media/v4l2-device.h>
35 #include <media/v4l2-chip-ident.h>
36 #include <media/v4l2-i2c-drv.h>
37
38 MODULE_DESCRIPTION("Analog Devices ADV7175 video encoder driver");
39 MODULE_AUTHOR("Dave Perks");
40 MODULE_LICENSE("GPL");
41
42 #define   I2C_ADV7175        0xd4
43 #define   I2C_ADV7176        0x54
44
45
46 static int debug;
47 module_param(debug, int, 0);
48 MODULE_PARM_DESC(debug, "Debug level (0-1)");
49
50 /* ----------------------------------------------------------------------- */
51
52 struct adv7175 {
53         struct v4l2_subdev sd;
54         v4l2_std_id norm;
55         int input;
56 };
57
58 static inline struct adv7175 *to_adv7175(struct v4l2_subdev *sd)
59 {
60         return container_of(sd, struct adv7175, sd);
61 }
62
63 static char *inputs[] = { "pass_through", "play_back", "color_bar" };
64
65 /* ----------------------------------------------------------------------- */
66
67 static inline int adv7175_write(struct v4l2_subdev *sd, u8 reg, u8 value)
68 {
69         struct i2c_client *client = v4l2_get_subdevdata(sd);
70
71         return i2c_smbus_write_byte_data(client, reg, value);
72 }
73
74 static inline int adv7175_read(struct v4l2_subdev *sd, u8 reg)
75 {
76         struct i2c_client *client = v4l2_get_subdevdata(sd);
77
78         return i2c_smbus_read_byte_data(client, reg);
79 }
80
81 static int adv7175_write_block(struct v4l2_subdev *sd,
82                      const u8 *data, unsigned int len)
83 {
84         struct i2c_client *client = v4l2_get_subdevdata(sd);
85         int ret = -1;
86         u8 reg;
87
88         /* the adv7175 has an autoincrement function, use it if
89          * the adapter understands raw I2C */
90         if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
91                 /* do raw I2C, not smbus compatible */
92                 u8 block_data[32];
93                 int block_len;
94
95                 while (len >= 2) {
96                         block_len = 0;
97                         block_data[block_len++] = reg = data[0];
98                         do {
99                                 block_data[block_len++] = data[1];
100                                 reg++;
101                                 len -= 2;
102                                 data += 2;
103                         } while (len >= 2 && data[0] == reg && block_len < 32);
104                         ret = i2c_master_send(client, block_data, block_len);
105                         if (ret < 0)
106                                 break;
107                 }
108         } else {
109                 /* do some slow I2C emulation kind of thing */
110                 while (len >= 2) {
111                         reg = *data++;
112                         ret = adv7175_write(sd, reg, *data++);
113                         if (ret < 0)
114                                 break;
115                         len -= 2;
116                 }
117         }
118
119         return ret;
120 }
121
122 static void set_subcarrier_freq(struct v4l2_subdev *sd, int pass_through)
123 {
124         /* for some reason pass_through NTSC needs
125          * a different sub-carrier freq to remain stable. */
126         if (pass_through)
127                 adv7175_write(sd, 0x02, 0x00);
128         else
129                 adv7175_write(sd, 0x02, 0x55);
130
131         adv7175_write(sd, 0x03, 0x55);
132         adv7175_write(sd, 0x04, 0x55);
133         adv7175_write(sd, 0x05, 0x25);
134 }
135
136 /* ----------------------------------------------------------------------- */
137 /* Output filter:  S-Video  Composite */
138
139 #define MR050       0x11        /* 0x09 */
140 #define MR060       0x14        /* 0x0c */
141
142 /* ----------------------------------------------------------------------- */
143
144 #define TR0MODE     0x46
145 #define TR0RST      0x80
146
147 #define TR1CAPT     0x80
148 #define TR1PLAY     0x00
149
150 static const unsigned char init_common[] = {
151
152         0x00, MR050,            /* MR0, PAL enabled */
153         0x01, 0x00,             /* MR1 */
154         0x02, 0x0c,             /* subc. freq. */
155         0x03, 0x8c,             /* subc. freq. */
156         0x04, 0x79,             /* subc. freq. */
157         0x05, 0x26,             /* subc. freq. */
158         0x06, 0x40,             /* subc. phase */
159
160         0x07, TR0MODE,          /* TR0, 16bit */
161         0x08, 0x21,             /*  */
162         0x09, 0x00,             /*  */
163         0x0a, 0x00,             /*  */
164         0x0b, 0x00,             /*  */
165         0x0c, TR1CAPT,          /* TR1 */
166         0x0d, 0x4f,             /* MR2 */
167         0x0e, 0x00,             /*  */
168         0x0f, 0x00,             /*  */
169         0x10, 0x00,             /*  */
170         0x11, 0x00,             /*  */
171 };
172
173 static const unsigned char init_pal[] = {
174         0x00, MR050,            /* MR0, PAL enabled */
175         0x01, 0x00,             /* MR1 */
176         0x02, 0x0c,             /* subc. freq. */
177         0x03, 0x8c,             /* subc. freq. */
178         0x04, 0x79,             /* subc. freq. */
179         0x05, 0x26,             /* subc. freq. */
180         0x06, 0x40,             /* subc. phase */
181 };
182
183 static const unsigned char init_ntsc[] = {
184         0x00, MR060,            /* MR0, NTSC enabled */
185         0x01, 0x00,             /* MR1 */
186         0x02, 0x55,             /* subc. freq. */
187         0x03, 0x55,             /* subc. freq. */
188         0x04, 0x55,             /* subc. freq. */
189         0x05, 0x25,             /* subc. freq. */
190         0x06, 0x1a,             /* subc. phase */
191 };
192
193 static int adv7175_init(struct v4l2_subdev *sd, u32 val)
194 {
195         /* This is just for testing!!! */
196         adv7175_write_block(sd, init_common, sizeof(init_common));
197         adv7175_write(sd, 0x07, TR0MODE | TR0RST);
198         adv7175_write(sd, 0x07, TR0MODE);
199         return 0;
200 }
201
202 static int adv7175_s_std_output(struct v4l2_subdev *sd, v4l2_std_id std)
203 {
204         struct adv7175 *encoder = to_adv7175(sd);
205
206         if (std & V4L2_STD_NTSC) {
207                 adv7175_write_block(sd, init_ntsc, sizeof(init_ntsc));
208                 if (encoder->input == 0)
209                         adv7175_write(sd, 0x0d, 0x4f);  /* Enable genlock */
210                 adv7175_write(sd, 0x07, TR0MODE | TR0RST);
211                 adv7175_write(sd, 0x07, TR0MODE);
212         } else if (std & V4L2_STD_PAL) {
213                 adv7175_write_block(sd, init_pal, sizeof(init_pal));
214                 if (encoder->input == 0)
215                         adv7175_write(sd, 0x0d, 0x4f);  /* Enable genlock */
216                 adv7175_write(sd, 0x07, TR0MODE | TR0RST);
217                 adv7175_write(sd, 0x07, TR0MODE);
218         } else if (std & V4L2_STD_SECAM) {
219                 /* This is an attempt to convert
220                  * SECAM->PAL (typically it does not work
221                  * due to genlock: when decoder is in SECAM
222                  * and encoder in in PAL the subcarrier can
223                  * not be syncronized with horizontal
224                  * quency) */
225                 adv7175_write_block(sd, init_pal, sizeof(init_pal));
226                 if (encoder->input == 0)
227                         adv7175_write(sd, 0x0d, 0x49);  /* Disable genlock */
228                 adv7175_write(sd, 0x07, TR0MODE | TR0RST);
229                 adv7175_write(sd, 0x07, TR0MODE);
230         } else {
231                 v4l2_dbg(1, debug, sd, "illegal norm: %llx\n",
232                                 (unsigned long long)std);
233                 return -EINVAL;
234         }
235         v4l2_dbg(1, debug, sd, "switched to %llx\n", (unsigned long long)std);
236         encoder->norm = std;
237         return 0;
238 }
239
240 static int adv7175_s_routing(struct v4l2_subdev *sd,
241                              u32 input, u32 output, u32 config)
242 {
243         struct adv7175 *encoder = to_adv7175(sd);
244
245         /* RJ: input = 0: input is from decoder
246            input = 1: input is from ZR36060
247            input = 2: color bar */
248
249         switch (input) {
250         case 0:
251                 adv7175_write(sd, 0x01, 0x00);
252
253                 if (encoder->norm & V4L2_STD_NTSC)
254                         set_subcarrier_freq(sd, 1);
255
256                 adv7175_write(sd, 0x0c, TR1CAPT);       /* TR1 */
257                 if (encoder->norm & V4L2_STD_SECAM)
258                         adv7175_write(sd, 0x0d, 0x49);  /* Disable genlock */
259                 else
260                         adv7175_write(sd, 0x0d, 0x4f);  /* Enable genlock */
261                 adv7175_write(sd, 0x07, TR0MODE | TR0RST);
262                 adv7175_write(sd, 0x07, TR0MODE);
263                 /*udelay(10);*/
264                 break;
265
266         case 1:
267                 adv7175_write(sd, 0x01, 0x00);
268
269                 if (encoder->norm & V4L2_STD_NTSC)
270                         set_subcarrier_freq(sd, 0);
271
272                 adv7175_write(sd, 0x0c, TR1PLAY);       /* TR1 */
273                 adv7175_write(sd, 0x0d, 0x49);
274                 adv7175_write(sd, 0x07, TR0MODE | TR0RST);
275                 adv7175_write(sd, 0x07, TR0MODE);
276                 /* udelay(10); */
277                 break;
278
279         case 2:
280                 adv7175_write(sd, 0x01, 0x80);
281
282                 if (encoder->norm & V4L2_STD_NTSC)
283                         set_subcarrier_freq(sd, 0);
284
285                 adv7175_write(sd, 0x0d, 0x49);
286                 adv7175_write(sd, 0x07, TR0MODE | TR0RST);
287                 adv7175_write(sd, 0x07, TR0MODE);
288                 /* udelay(10); */
289                 break;
290
291         default:
292                 v4l2_dbg(1, debug, sd, "illegal input: %d\n", input);
293                 return -EINVAL;
294         }
295         v4l2_dbg(1, debug, sd, "switched to %s\n", inputs[input]);
296         encoder->input = input;
297         return 0;
298 }
299
300 static int adv7175_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip)
301 {
302         struct i2c_client *client = v4l2_get_subdevdata(sd);
303
304         return v4l2_chip_ident_i2c_client(client, chip, V4L2_IDENT_ADV7175, 0);
305 }
306
307 /* ----------------------------------------------------------------------- */
308
309 static const struct v4l2_subdev_core_ops adv7175_core_ops = {
310         .g_chip_ident = adv7175_g_chip_ident,
311         .init = adv7175_init,
312 };
313
314 static const struct v4l2_subdev_video_ops adv7175_video_ops = {
315         .s_std_output = adv7175_s_std_output,
316         .s_routing = adv7175_s_routing,
317 };
318
319 static const struct v4l2_subdev_ops adv7175_ops = {
320         .core = &adv7175_core_ops,
321         .video = &adv7175_video_ops,
322 };
323
324 /* ----------------------------------------------------------------------- */
325
326 static int adv7175_probe(struct i2c_client *client,
327                         const struct i2c_device_id *id)
328 {
329         int i;
330         struct adv7175 *encoder;
331         struct v4l2_subdev *sd;
332
333         /* Check if the adapter supports the needed features */
334         if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
335                 return -ENODEV;
336
337         v4l_info(client, "chip found @ 0x%x (%s)\n",
338                         client->addr << 1, client->adapter->name);
339
340         encoder = kzalloc(sizeof(struct adv7175), GFP_KERNEL);
341         if (encoder == NULL)
342                 return -ENOMEM;
343         sd = &encoder->sd;
344         v4l2_i2c_subdev_init(sd, client, &adv7175_ops);
345         encoder->norm = V4L2_STD_NTSC;
346         encoder->input = 0;
347
348         i = adv7175_write_block(sd, init_common, sizeof(init_common));
349         if (i >= 0) {
350                 i = adv7175_write(sd, 0x07, TR0MODE | TR0RST);
351                 i = adv7175_write(sd, 0x07, TR0MODE);
352                 i = adv7175_read(sd, 0x12);
353                 v4l2_dbg(1, debug, sd, "revision %d\n", i & 1);
354         }
355         if (i < 0)
356                 v4l2_dbg(1, debug, sd, "init error 0x%x\n", i);
357         return 0;
358 }
359
360 static int adv7175_remove(struct i2c_client *client)
361 {
362         struct v4l2_subdev *sd = i2c_get_clientdata(client);
363
364         v4l2_device_unregister_subdev(sd);
365         kfree(to_adv7175(sd));
366         return 0;
367 }
368
369 /* ----------------------------------------------------------------------- */
370
371 static const struct i2c_device_id adv7175_id[] = {
372         { "adv7175", 0 },
373         { "adv7176", 0 },
374         { }
375 };
376 MODULE_DEVICE_TABLE(i2c, adv7175_id);
377
378 static struct v4l2_i2c_driver_data v4l2_i2c_data = {
379         .name = "adv7175",
380         .probe = adv7175_probe,
381         .remove = adv7175_remove,
382         .id_table = adv7175_id,
383 };