Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
saa7115.c
Go to the documentation of this file.
1 /* saa711x - Philips SAA711x video decoder driver
2  * This driver can work with saa7111, saa7111a, saa7113, saa7114,
3  * saa7115 and saa7118.
4  *
5  * Based on saa7114 driver by Maxim Yevtyushkin, which is based on
6  * the saa7111 driver by Dave Perks.
7  *
8  * Copyright (C) 1998 Dave Perks <[email protected]>
9  * Copyright (C) 2002 Maxim Yevtyushkin <[email protected]>
10  *
11  * Slight changes for video timing and attachment output by
12  * Wolfgang Scherr <[email protected]>
13  *
14  * Moved over to the linux >= 2.4.x i2c protocol (1/1/2003)
15  * by Ronald Bultje <[email protected]>
16  *
17  * Added saa7115 support by Kevin Thayer <nufan_wfk at yahoo.com>
18  * (2/17/2003)
19  *
20  * VBI support (2004) and cleanups (2005) by Hans Verkuil <[email protected]>
21  *
22  * Copyright (c) 2005-2006 Mauro Carvalho Chehab <[email protected]>
23  * SAA7111, SAA7113 and SAA7118 support
24  *
25  * This program is free software; you can redistribute it and/or
26  * modify it under the terms of the GNU General Public License
27  * as published by the Free Software Foundation; either version 2
28  * of the License, or (at your option) any later version.
29  *
30  * This program is distributed in the hope that it will be useful,
31  * but WITHOUT ANY WARRANTY; without even the implied warranty of
32  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
33  * GNU General Public License for more details.
34  *
35  * You should have received a copy of the GNU General Public License
36  * along with this program; if not, write to the Free Software
37  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
38  */
39 
40 #include "saa711x_regs.h"
41 
42 #include <linux/kernel.h>
43 #include <linux/module.h>
44 #include <linux/slab.h>
45 #include <linux/i2c.h>
46 #include <linux/videodev2.h>
47 #include <media/v4l2-device.h>
48 #include <media/v4l2-ctrls.h>
49 #include <media/v4l2-chip-ident.h>
50 #include <media/saa7115.h>
51 #include <asm/div64.h>
52 
53 #define VRES_60HZ (480+16)
54 
55 MODULE_DESCRIPTION("Philips SAA7111/SAA7113/SAA7114/SAA7115/SAA7118 video decoder driver");
56 MODULE_AUTHOR( "Maxim Yevtyushkin, Kevin Thayer, Chris Kennedy, "
57  "Hans Verkuil, Mauro Carvalho Chehab");
58 MODULE_LICENSE("GPL");
59 
60 static bool debug;
61 module_param(debug, bool, 0644);
62 
63 MODULE_PARM_DESC(debug, "Debug level (0-1)");
64 
65 
66 struct saa711x_state {
67  struct v4l2_subdev sd;
69 
70  struct {
71  /* chroma gain control cluster */
72  struct v4l2_ctrl *agc;
73  struct v4l2_ctrl *gain;
74  };
75 
77  int input;
78  int output;
79  int enable;
80  int radio;
81  int width;
82  int height;
89 };
90 
91 static inline struct saa711x_state *to_state(struct v4l2_subdev *sd)
92 {
93  return container_of(sd, struct saa711x_state, sd);
94 }
95 
96 static inline struct v4l2_subdev *to_sd(struct v4l2_ctrl *ctrl)
97 {
98  return &container_of(ctrl->handler, struct saa711x_state, hdl)->sd;
99 }
100 
101 /* ----------------------------------------------------------------------- */
102 
103 static inline int saa711x_write(struct v4l2_subdev *sd, u8 reg, u8 value)
104 {
105  struct i2c_client *client = v4l2_get_subdevdata(sd);
106 
107  return i2c_smbus_write_byte_data(client, reg, value);
108 }
109 
110 /* Sanity routine to check if a register is present */
111 static int saa711x_has_reg(const int id, const u8 reg)
112 {
113  if (id == V4L2_IDENT_SAA7111)
114  return reg < 0x20 && reg != 0x01 && reg != 0x0f &&
115  (reg < 0x13 || reg > 0x19) && reg != 0x1d && reg != 0x1e;
116  if (id == V4L2_IDENT_SAA7111A)
117  return reg < 0x20 && reg != 0x01 && reg != 0x0f &&
118  reg != 0x14 && reg != 0x18 && reg != 0x19 &&
119  reg != 0x1d && reg != 0x1e;
120 
121  /* common for saa7113/4/5/8 */
122  if (unlikely((reg >= 0x3b && reg <= 0x3f) || reg == 0x5c || reg == 0x5f ||
123  reg == 0xa3 || reg == 0xa7 || reg == 0xab || reg == 0xaf || (reg >= 0xb5 && reg <= 0xb7) ||
124  reg == 0xd3 || reg == 0xd7 || reg == 0xdb || reg == 0xdf || (reg >= 0xe5 && reg <= 0xe7) ||
125  reg == 0x82 || (reg >= 0x89 && reg <= 0x8e)))
126  return 0;
127 
128  switch (id) {
129  case V4L2_IDENT_SAA7113:
130  return reg != 0x14 && (reg < 0x18 || reg > 0x1e) && (reg < 0x20 || reg > 0x3f) &&
131  reg != 0x5d && reg < 0x63;
132  case V4L2_IDENT_SAA7114:
133  return (reg < 0x1a || reg > 0x1e) && (reg < 0x20 || reg > 0x2f) &&
134  (reg < 0x63 || reg > 0x7f) && reg != 0x33 && reg != 0x37 &&
135  reg != 0x81 && reg < 0xf0;
136  case V4L2_IDENT_SAA7115:
137  return (reg < 0x20 || reg > 0x2f) && reg != 0x65 && (reg < 0xfc || reg > 0xfe);
138  case V4L2_IDENT_SAA7118:
139  return (reg < 0x1a || reg > 0x1d) && (reg < 0x20 || reg > 0x22) &&
140  (reg < 0x26 || reg > 0x28) && reg != 0x33 && reg != 0x37 &&
141  (reg < 0x63 || reg > 0x7f) && reg != 0x81 && reg < 0xf0;
142  }
143  return 1;
144 }
145 
146 static int saa711x_writeregs(struct v4l2_subdev *sd, const unsigned char *regs)
147 {
148  struct saa711x_state *state = to_state(sd);
149  unsigned char reg, data;
150 
151  while (*regs != 0x00) {
152  reg = *(regs++);
153  data = *(regs++);
154 
155  /* According with datasheets, reserved regs should be
156  filled with 0 - seems better not to touch on they */
157  if (saa711x_has_reg(state->ident, reg)) {
158  if (saa711x_write(sd, reg, data) < 0)
159  return -1;
160  } else {
161  v4l2_dbg(1, debug, sd, "tried to access reserved reg 0x%02x\n", reg);
162  }
163  }
164  return 0;
165 }
166 
167 static inline int saa711x_read(struct v4l2_subdev *sd, u8 reg)
168 {
169  struct i2c_client *client = v4l2_get_subdevdata(sd);
170 
171  return i2c_smbus_read_byte_data(client, reg);
172 }
173 
174 /* ----------------------------------------------------------------------- */
175 
176 /* SAA7111 initialization table */
177 static const unsigned char saa7111_init[] = {
178  R_01_INC_DELAY, 0x00, /* reserved */
179 
180  /*front end */
181  R_02_INPUT_CNTL_1, 0xd0, /* FUSE=3, GUDL=2, MODE=0 */
182  R_03_INPUT_CNTL_2, 0x23, /* HLNRS=0, VBSL=1, WPOFF=0, HOLDG=0,
183  * GAFIX=0, GAI1=256, GAI2=256 */
184  R_04_INPUT_CNTL_3, 0x00, /* GAI1=256 */
185  R_05_INPUT_CNTL_4, 0x00, /* GAI2=256 */
186 
187  /* decoder */
188  R_06_H_SYNC_START, 0xf3, /* HSB at 13(50Hz) / 17(60Hz)
189  * pixels after end of last line */
190  R_07_H_SYNC_STOP, 0xe8, /* HSS seems to be needed to
191  * work with NTSC, too */
192  R_08_SYNC_CNTL, 0xc8, /* AUFD=1, FSEL=1, EXFIL=0,
193  * VTRC=1, HPLL=0, VNOI=0 */
194  R_09_LUMA_CNTL, 0x01, /* BYPS=0, PREF=0, BPSS=0,
195  * VBLB=0, UPTCV=0, APER=1 */
196  R_0A_LUMA_BRIGHT_CNTL, 0x80,
197  R_0B_LUMA_CONTRAST_CNTL, 0x47, /* 0b - CONT=1.109 */
198  R_0C_CHROMA_SAT_CNTL, 0x40,
199  R_0D_CHROMA_HUE_CNTL, 0x00,
200  R_0E_CHROMA_CNTL_1, 0x01, /* 0e - CDTO=0, CSTD=0, DCCF=0,
201  * FCTC=0, CHBW=1 */
202  R_0F_CHROMA_GAIN_CNTL, 0x00, /* reserved */
203  R_10_CHROMA_CNTL_2, 0x48, /* 10 - OFTS=1, HDEL=0, VRLN=1, YDEL=0 */
204  R_11_MODE_DELAY_CNTL, 0x1c, /* 11 - GPSW=0, CM99=0, FECO=0, COMPO=1,
205  * OEYC=1, OEHV=1, VIPB=0, COLO=0 */
206  R_12_RT_SIGNAL_CNTL, 0x00, /* 12 - output control 2 */
207  R_13_RT_X_PORT_OUT_CNTL, 0x00, /* 13 - output control 3 */
210  R_16_VGATE_STOP, 0x00,
212 
213  0x00, 0x00
214 };
215 
216 /* SAA7113 init codes */
217 static const unsigned char saa7113_init[] = {
218  R_01_INC_DELAY, 0x08,
219  R_02_INPUT_CNTL_1, 0xc2,
220  R_03_INPUT_CNTL_2, 0x30,
221  R_04_INPUT_CNTL_3, 0x00,
222  R_05_INPUT_CNTL_4, 0x00,
223  R_06_H_SYNC_START, 0x89,
224  R_07_H_SYNC_STOP, 0x0d,
225  R_08_SYNC_CNTL, 0x88,
226  R_09_LUMA_CNTL, 0x01,
227  R_0A_LUMA_BRIGHT_CNTL, 0x80,
229  R_0C_CHROMA_SAT_CNTL, 0x40,
230  R_0D_CHROMA_HUE_CNTL, 0x00,
231  R_0E_CHROMA_CNTL_1, 0x01,
232  R_0F_CHROMA_GAIN_CNTL, 0x2a,
233  R_10_CHROMA_CNTL_2, 0x08,
234  R_11_MODE_DELAY_CNTL, 0x0c,
235  R_12_RT_SIGNAL_CNTL, 0x07,
239  R_16_VGATE_STOP, 0x00,
241 
242  0x00, 0x00
243 };
244 
245 /* If a value differs from the Hauppauge driver values, then the comment starts with
246  'was 0xXX' to denote the Hauppauge value. Otherwise the value is identical to what the
247  Hauppauge driver sets. */
248 
249 /* SAA7114 and SAA7115 initialization table */
250 static const unsigned char saa7115_init_auto_input[] = {
251  /* Front-End Part */
252  R_01_INC_DELAY, 0x48, /* white peak control disabled */
253  R_03_INPUT_CNTL_2, 0x20, /* was 0x30. 0x20: long vertical blanking */
254  R_04_INPUT_CNTL_3, 0x90, /* analog gain set to 0 */
255  R_05_INPUT_CNTL_4, 0x90, /* analog gain set to 0 */
256  /* Decoder Part */
257  R_06_H_SYNC_START, 0xeb, /* horiz sync begin = -21 */
258  R_07_H_SYNC_STOP, 0xe0, /* horiz sync stop = -17 */
259  R_09_LUMA_CNTL, 0x53, /* 0x53, was 0x56 for 60hz. luminance control */
260  R_0A_LUMA_BRIGHT_CNTL, 0x80, /* was 0x88. decoder brightness, 0x80 is itu standard */
261  R_0B_LUMA_CONTRAST_CNTL, 0x44, /* was 0x48. decoder contrast, 0x44 is itu standard */
262  R_0C_CHROMA_SAT_CNTL, 0x40, /* was 0x47. decoder saturation, 0x40 is itu standard */
263  R_0D_CHROMA_HUE_CNTL, 0x00,
264  R_0F_CHROMA_GAIN_CNTL, 0x00, /* use automatic gain */
265  R_10_CHROMA_CNTL_2, 0x06, /* chroma: active adaptive combfilter */
266  R_11_MODE_DELAY_CNTL, 0x00,
267  R_12_RT_SIGNAL_CNTL, 0x9d, /* RTS0 output control: VGATE */
268  R_13_RT_X_PORT_OUT_CNTL, 0x80, /* ITU656 standard mode, RTCO output enable RTCE */
270  R_18_RAW_DATA_GAIN_CNTL, 0x40, /* gain 0x00 = nominal */
272  R_1A_COLOR_KILL_LVL_CNTL, 0x77, /* recommended value */
273  R_1B_MISC_TVVCRDET, 0x42, /* recommended value */
274  R_1C_ENHAN_COMB_CTRL1, 0xa9, /* recommended value */
275  R_1D_ENHAN_COMB_CTRL2, 0x01, /* recommended value */
276 
277 
278  R_80_GLOBAL_CNTL_1, 0x0, /* No tasks enabled at init */
279 
280  /* Power Device Control */
281  R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0, /* reset device */
282  R_88_POWER_SAVE_ADC_PORT_CNTL, 0xf0, /* set device programmed, all in operational mode */
283  0x00, 0x00
284 };
285 
286 /* Used to reset saa7113, saa7114 and saa7115 */
287 static const unsigned char saa7115_cfg_reset_scaler[] = {
288  R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED, 0x00, /* disable I-port output */
289  R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0, /* reset scaler */
290  R_88_POWER_SAVE_ADC_PORT_CNTL, 0xf0, /* activate scaler */
291  R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED, 0x01, /* enable I-port output */
292  0x00, 0x00
293 };
294 
295 /* ============== SAA7715 VIDEO templates ============= */
296 
297 static const unsigned char saa7115_cfg_60hz_video[] = {
298  R_80_GLOBAL_CNTL_1, 0x00, /* reset tasks */
299  R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0, /* reset scaler */
300 
302  R_16_VGATE_STOP, 0x11,
304 
305  R_08_SYNC_CNTL, 0x68, /* 0xBO: auto detection, 0x68 = NTSC */
306  R_0E_CHROMA_CNTL_1, 0x07, /* video autodetection is on */
307 
308  R_5A_V_OFF_FOR_SLICER, 0x06, /* standard 60hz value for ITU656 line counting */
309 
310  /* Task A */
315 
316  /* hoffset low (input), 0x0002 is minimum */
319 
320  /* hsize low (input), 0x02d0 = 720 */
323 
326 
329 
332 
335 
336  /* Task B */
341 
342  /* 0x0002 is minimum */
345 
346  /* 0x02d0 = 720 */
349 
350  /* vwindow start 0x12 = 18 */
353 
354  /* vwindow length 0xf8 = 248 */
357 
358  /* hwindow 0x02d0 = 720 */
361 
362  R_F0_LFCO_PER_LINE, 0xad, /* Set PLL Register. 60hz 525 lines per frame, 27 MHz */
363  R_F1_P_I_PARAM_SELECT, 0x05, /* low bit with 0xF0 */
366 
367  0x00, 0x00
368 };
369 
370 static const unsigned char saa7115_cfg_50hz_video[] = {
371  R_80_GLOBAL_CNTL_1, 0x00,
372  R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0, /* reset scaler */
373 
374  R_15_VGATE_START_FID_CHG, 0x37, /* VGATE start */
375  R_16_VGATE_STOP, 0x16,
377 
378  R_08_SYNC_CNTL, 0x28, /* 0x28 = PAL */
379  R_0E_CHROMA_CNTL_1, 0x07,
380 
381  R_5A_V_OFF_FOR_SLICER, 0x03, /* standard 50hz value */
382 
383  /* Task A */
388 
389  /* This is weird: the datasheet says that you should use 2 as the minimum value, */
390  /* but Hauppauge uses 0, and changing that to 2 causes indeed problems (for 50hz) */
391  /* hoffset low (input), 0x0002 is minimum */
394 
395  /* hsize low (input), 0x02d0 = 720 */
398 
401 
402  /* vsize 0x12 = 18 */
405 
406  /* hsize 0x05a0 = 1440 */
408  R_9D_A_HORIZ_OUTPUT_WINDOW_LENGTH_MSB, 0x05, /* hsize hi (output) */
409  R_9E_A_VERT_OUTPUT_WINDOW_LENGTH, 0x12, /* vsize low (output), 0x12 = 18 */
410  R_9F_A_VERT_OUTPUT_WINDOW_LENGTH_MSB, 0x00, /* vsize hi (output) */
411 
412  /* Task B */
417 
418  /* This is weird: the datasheet says that you should use 2 as the minimum value, */
419  /* but Hauppauge uses 0, and changing that to 2 causes indeed problems (for 50hz) */
420  /* hoffset low (input), 0x0002 is minimum. See comment above. */
423 
424  /* hsize 0x02d0 = 720 */
427 
428  /* voffset 0x16 = 22 */
431 
432  /* vsize 0x0120 = 288 */
435 
436  /* hsize 0x02d0 = 720 */
439 
440  R_F0_LFCO_PER_LINE, 0xb0, /* Set PLL Register. 50hz 625 lines per frame, 27 MHz */
441  R_F1_P_I_PARAM_SELECT, 0x05, /* low bit with 0xF0, (was 0x05) */
444 
445  0x00, 0x00
446 };
447 
448 /* ============== SAA7715 VIDEO templates (end) ======= */
449 
450 static const unsigned char saa7115_cfg_vbi_on[] = {
451  R_80_GLOBAL_CNTL_1, 0x00, /* reset tasks */
452  R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0, /* reset scaler */
453  R_80_GLOBAL_CNTL_1, 0x30, /* Activate both tasks */
454  R_88_POWER_SAVE_ADC_PORT_CNTL, 0xf0, /* activate scaler */
455  R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED, 0x01, /* Enable I-port output */
456 
457  0x00, 0x00
458 };
459 
460 static const unsigned char saa7115_cfg_vbi_off[] = {
461  R_80_GLOBAL_CNTL_1, 0x00, /* reset tasks */
462  R_88_POWER_SAVE_ADC_PORT_CNTL, 0xd0, /* reset scaler */
463  R_80_GLOBAL_CNTL_1, 0x20, /* Activate only task "B" */
464  R_88_POWER_SAVE_ADC_PORT_CNTL, 0xf0, /* activate scaler */
465  R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED, 0x01, /* Enable I-port output */
466 
467  0x00, 0x00
468 };
469 
470 
471 static const unsigned char saa7115_init_misc[] = {
478 
479  /* Task A */
483 
484  /* Configure controls at nominal value*/
488 
489  /* note: 2 x zoom ensures that VBI lines have same length as video lines. */
492 
494 
495  /* must be horiz lum scaling / 2 */
498 
499  /* must be offset luma / 2 */
501 
504 
507 
509 
514 
519 
520  /* Task B */
524 
525  /* Configure controls at nominal value*/
529 
530  /* hor lum scaling 0x0400 = 1 */
533 
535 
536  /* must be hor lum scaling / 2 */
539 
540  /* must be offset luma / 2 */
542 
545 
548 
550 
555 
560 
561  R_F2_NOMINAL_PLL2_DTO, 0x50, /* crystal clock = 24.576 MHz, target = 27MHz */
562  R_F3_PLL_INCREMENT, 0x46,
563  R_F4_PLL2_STATUS, 0x00,
564  R_F7_PULSE_A_POS_MSB, 0x4b, /* not the recommended settings! */
565  R_F8_PULSE_B_POS, 0x00,
566  R_F9_PULSE_B_POS_MSB, 0x4b,
567  R_FA_PULSE_C_POS, 0x00,
568  R_FB_PULSE_C_POS_MSB, 0x4b,
569 
570  /* PLL2 lock detection settings: 71 lines 50% phase error */
572 
573  /* Turn off VBI */
574  R_40_SLICER_CNTL_1, 0x20, /* No framing code errors allowed. */
575  R_41_LCR_BASE, 0xff,
576  R_41_LCR_BASE+1, 0xff,
577  R_41_LCR_BASE+2, 0xff,
578  R_41_LCR_BASE+3, 0xff,
579  R_41_LCR_BASE+4, 0xff,
580  R_41_LCR_BASE+5, 0xff,
581  R_41_LCR_BASE+6, 0xff,
582  R_41_LCR_BASE+7, 0xff,
583  R_41_LCR_BASE+8, 0xff,
584  R_41_LCR_BASE+9, 0xff,
585  R_41_LCR_BASE+10, 0xff,
586  R_41_LCR_BASE+11, 0xff,
587  R_41_LCR_BASE+12, 0xff,
588  R_41_LCR_BASE+13, 0xff,
589  R_41_LCR_BASE+14, 0xff,
590  R_41_LCR_BASE+15, 0xff,
591  R_41_LCR_BASE+16, 0xff,
592  R_41_LCR_BASE+17, 0xff,
593  R_41_LCR_BASE+18, 0xff,
594  R_41_LCR_BASE+19, 0xff,
595  R_41_LCR_BASE+20, 0xff,
596  R_41_LCR_BASE+21, 0xff,
597  R_41_LCR_BASE+22, 0xff,
599  R_59_H_OFF_FOR_SLICER, 0x47,
601  R_5D_DID, 0xbd,
602  R_5E_SDID, 0x35,
603 
604  R_02_INPUT_CNTL_1, 0xc4, /* input tuner -> input 4, amplifier active */
605 
606  R_80_GLOBAL_CNTL_1, 0x20, /* enable task B */
609  0x00, 0x00
610 };
611 
612 static int saa711x_odd_parity(u8 c)
613 {
614  c ^= (c >> 4);
615  c ^= (c >> 2);
616  c ^= (c >> 1);
617 
618  return c & 1;
619 }
620 
621 static int saa711x_decode_vps(u8 *dst, u8 *p)
622 {
623  static const u8 biphase_tbl[] = {
624  0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
625  0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
626  0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,
627  0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,
628  0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,
629  0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,
630  0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
631  0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
632  0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,
633  0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,
634  0xc3, 0x4b, 0x43, 0xc3, 0x87, 0x0f, 0x07, 0x87,
635  0x83, 0x0b, 0x03, 0x83, 0xc3, 0x4b, 0x43, 0xc3,
636  0xc1, 0x49, 0x41, 0xc1, 0x85, 0x0d, 0x05, 0x85,
637  0x81, 0x09, 0x01, 0x81, 0xc1, 0x49, 0x41, 0xc1,
638  0xe1, 0x69, 0x61, 0xe1, 0xa5, 0x2d, 0x25, 0xa5,
639  0xa1, 0x29, 0x21, 0xa1, 0xe1, 0x69, 0x61, 0xe1,
640  0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,
641  0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,
642  0xc2, 0x4a, 0x42, 0xc2, 0x86, 0x0e, 0x06, 0x86,
643  0x82, 0x0a, 0x02, 0x82, 0xc2, 0x4a, 0x42, 0xc2,
644  0xc0, 0x48, 0x40, 0xc0, 0x84, 0x0c, 0x04, 0x84,
645  0x80, 0x08, 0x00, 0x80, 0xc0, 0x48, 0x40, 0xc0,
646  0xe0, 0x68, 0x60, 0xe0, 0xa4, 0x2c, 0x24, 0xa4,
647  0xa0, 0x28, 0x20, 0xa0, 0xe0, 0x68, 0x60, 0xe0,
648  0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
649  0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
650  0xd2, 0x5a, 0x52, 0xd2, 0x96, 0x1e, 0x16, 0x96,
651  0x92, 0x1a, 0x12, 0x92, 0xd2, 0x5a, 0x52, 0xd2,
652  0xd0, 0x58, 0x50, 0xd0, 0x94, 0x1c, 0x14, 0x94,
653  0x90, 0x18, 0x10, 0x90, 0xd0, 0x58, 0x50, 0xd0,
654  0xf0, 0x78, 0x70, 0xf0, 0xb4, 0x3c, 0x34, 0xb4,
655  0xb0, 0x38, 0x30, 0xb0, 0xf0, 0x78, 0x70, 0xf0,
656  };
657  int i;
658  u8 c, err = 0;
659 
660  for (i = 0; i < 2 * 13; i += 2) {
661  err |= biphase_tbl[p[i]] | biphase_tbl[p[i + 1]];
662  c = (biphase_tbl[p[i + 1]] & 0xf) | ((biphase_tbl[p[i]] & 0xf) << 4);
663  dst[i / 2] = c;
664  }
665  return err & 0xf0;
666 }
667 
668 static int saa711x_decode_wss(u8 *p)
669 {
670  static const int wss_bits[8] = {
671  0, 0, 0, 1, 0, 1, 1, 1
672  };
673  unsigned char parity;
674  int wss = 0;
675  int i;
676 
677  for (i = 0; i < 16; i++) {
678  int b1 = wss_bits[p[i] & 7];
679  int b2 = wss_bits[(p[i] >> 3) & 7];
680 
681  if (b1 == b2)
682  return -1;
683  wss |= b2 << i;
684  }
685  parity = wss & 15;
686  parity ^= parity >> 2;
687  parity ^= parity >> 1;
688 
689  if (!(parity & 1))
690  return -1;
691 
692  return wss;
693 }
694 
695 static int saa711x_s_clock_freq(struct v4l2_subdev *sd, u32 freq)
696 {
697  struct saa711x_state *state = to_state(sd);
698  u32 acpf;
699  u32 acni;
700  u32 hz;
701  u64 f;
702  u8 acc = 0; /* reg 0x3a, audio clock control */
703 
704  /* Checks for chips that don't have audio clock (saa7111, saa7113) */
705  if (!saa711x_has_reg(state->ident, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD))
706  return 0;
707 
708  v4l2_dbg(1, debug, sd, "set audio clock freq: %d\n", freq);
709 
710  /* sanity check */
711  if (freq < 32000 || freq > 48000)
712  return -EINVAL;
713 
714  /* hz is the refresh rate times 100 */
715  hz = (state->std & V4L2_STD_525_60) ? 5994 : 5000;
716  /* acpf = (256 * freq) / field_frequency == (256 * 100 * freq) / hz */
717  acpf = (25600 * freq) / hz;
718  /* acni = (256 * freq * 2^23) / crystal_frequency =
719  (freq * 2^(8+23)) / crystal_frequency =
720  (freq << 31) / crystal_frequency */
721  f = freq;
722  f = f << 31;
723  do_div(f, state->crystal_freq);
724  acni = f;
725  if (state->ucgc) {
726  acpf = acpf * state->cgcdiv / 16;
727  acni = acni * state->cgcdiv / 16;
728  acc = 0x80;
729  if (state->cgcdiv == 3)
730  acc |= 0x40;
731  }
732  if (state->apll)
733  acc |= 0x08;
734 
735  saa711x_write(sd, R_38_CLK_RATIO_AMXCLK_TO_ASCLK, 0x03);
736  saa711x_write(sd, R_39_CLK_RATIO_ASCLK_TO_ALRCLK, 0x10);
737  saa711x_write(sd, R_3A_AUD_CLK_GEN_BASIC_SETUP, acc);
738 
739  saa711x_write(sd, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD, acpf & 0xff);
740  saa711x_write(sd, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD+1,
741  (acpf >> 8) & 0xff);
742  saa711x_write(sd, R_30_AUD_MAST_CLK_CYCLES_PER_FIELD+2,
743  (acpf >> 16) & 0x03);
744 
745  saa711x_write(sd, R_34_AUD_MAST_CLK_NOMINAL_INC, acni & 0xff);
746  saa711x_write(sd, R_34_AUD_MAST_CLK_NOMINAL_INC+1, (acni >> 8) & 0xff);
747  saa711x_write(sd, R_34_AUD_MAST_CLK_NOMINAL_INC+2, (acni >> 16) & 0x3f);
748  state->audclk_freq = freq;
749  return 0;
750 }
751 
752 static int saa711x_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
753 {
754  struct v4l2_subdev *sd = to_sd(ctrl);
755  struct saa711x_state *state = to_state(sd);
756 
757  switch (ctrl->id) {
758  case V4L2_CID_CHROMA_AGC:
759  /* chroma gain cluster */
760  if (state->agc->val)
761  state->gain->val =
762  saa711x_read(sd, R_0F_CHROMA_GAIN_CNTL) & 0x7f;
763  break;
764  }
765  return 0;
766 }
767 
768 static int saa711x_s_ctrl(struct v4l2_ctrl *ctrl)
769 {
770  struct v4l2_subdev *sd = to_sd(ctrl);
771  struct saa711x_state *state = to_state(sd);
772 
773  switch (ctrl->id) {
774  case V4L2_CID_BRIGHTNESS:
775  saa711x_write(sd, R_0A_LUMA_BRIGHT_CNTL, ctrl->val);
776  break;
777 
778  case V4L2_CID_CONTRAST:
779  saa711x_write(sd, R_0B_LUMA_CONTRAST_CNTL, ctrl->val);
780  break;
781 
782  case V4L2_CID_SATURATION:
783  saa711x_write(sd, R_0C_CHROMA_SAT_CNTL, ctrl->val);
784  break;
785 
786  case V4L2_CID_HUE:
787  saa711x_write(sd, R_0D_CHROMA_HUE_CNTL, ctrl->val);
788  break;
789 
790  case V4L2_CID_CHROMA_AGC:
791  /* chroma gain cluster */
792  if (state->agc->val)
793  saa711x_write(sd, R_0F_CHROMA_GAIN_CNTL, state->gain->val);
794  else
795  saa711x_write(sd, R_0F_CHROMA_GAIN_CNTL, state->gain->val | 0x80);
796  break;
797 
798  default:
799  return -EINVAL;
800  }
801 
802  return 0;
803 }
804 
805 static int saa711x_set_size(struct v4l2_subdev *sd, int width, int height)
806 {
807  struct saa711x_state *state = to_state(sd);
808  int HPSC, HFSC;
809  int VSCY;
810  int res;
811  int is_50hz = state->std & V4L2_STD_625_50;
812  int Vsrc = is_50hz ? 576 : 480;
813 
814  v4l2_dbg(1, debug, sd, "decoder set size to %ix%i\n", width, height);
815 
816  /* FIXME need better bounds checking here */
817  if ((width < 1) || (width > 1440))
818  return -EINVAL;
819  if ((height < 1) || (height > Vsrc))
820  return -EINVAL;
821 
822  if (!saa711x_has_reg(state->ident, R_D0_B_HORIZ_PRESCALING)) {
823  /* Decoder only supports 720 columns and 480 or 576 lines */
824  if (width != 720)
825  return -EINVAL;
826  if (height != Vsrc)
827  return -EINVAL;
828  }
829 
830  state->width = width;
831  state->height = height;
832 
833  if (!saa711x_has_reg(state->ident, R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH))
834  return 0;
835 
836  /* probably have a valid size, let's set it */
837  /* Set output width/height */
838  /* width */
839 
840  saa711x_write(sd, R_CC_B_HORIZ_OUTPUT_WINDOW_LENGTH,
841  (u8) (width & 0xff));
842  saa711x_write(sd, R_CD_B_HORIZ_OUTPUT_WINDOW_LENGTH_MSB,
843  (u8) ((width >> 8) & 0xff));
844 
845  /* Vertical Scaling uses height/2 */
846  res = height / 2;
847 
848  /* On 60Hz, it is using a higher Vertical Output Size */
849  if (!is_50hz)
850  res += (VRES_60HZ - 480) >> 1;
851 
852  /* height */
853  saa711x_write(sd, R_CE_B_VERT_OUTPUT_WINDOW_LENGTH,
854  (u8) (res & 0xff));
855  saa711x_write(sd, R_CF_B_VERT_OUTPUT_WINDOW_LENGTH_MSB,
856  (u8) ((res >> 8) & 0xff));
857 
858  /* Scaling settings */
859  /* Hprescaler is floor(inres/outres) */
860  HPSC = (int)(720 / width);
861  /* 0 is not allowed (div. by zero) */
862  HPSC = HPSC ? HPSC : 1;
863  HFSC = (int)((1024 * 720) / (HPSC * width));
864  /* FIXME hardcodes to "Task B"
865  * write H prescaler integer */
866  saa711x_write(sd, R_D0_B_HORIZ_PRESCALING,
867  (u8) (HPSC & 0x3f));
868 
869  v4l2_dbg(1, debug, sd, "Hpsc: 0x%05x, Hfsc: 0x%05x\n", HPSC, HFSC);
870  /* write H fine-scaling (luminance) */
871  saa711x_write(sd, R_D8_B_HORIZ_LUMA_SCALING_INC,
872  (u8) (HFSC & 0xff));
873  saa711x_write(sd, R_D9_B_HORIZ_LUMA_SCALING_INC_MSB,
874  (u8) ((HFSC >> 8) & 0xff));
875  /* write H fine-scaling (chrominance)
876  * must be lum/2, so i'll just bitshift :) */
877  saa711x_write(sd, R_DC_B_HORIZ_CHROMA_SCALING,
878  (u8) ((HFSC >> 1) & 0xff));
879  saa711x_write(sd, R_DD_B_HORIZ_CHROMA_SCALING_MSB,
880  (u8) ((HFSC >> 9) & 0xff));
881 
882  VSCY = (int)((1024 * Vsrc) / height);
883  v4l2_dbg(1, debug, sd, "Vsrc: %d, Vscy: 0x%05x\n", Vsrc, VSCY);
884 
885  /* Correct Contrast and Luminance */
886  saa711x_write(sd, R_D5_B_LUMA_CONTRAST_CNTL,
887  (u8) (64 * 1024 / VSCY));
888  saa711x_write(sd, R_D6_B_CHROMA_SATURATION_CNTL,
889  (u8) (64 * 1024 / VSCY));
890 
891  /* write V fine-scaling (luminance) */
892  saa711x_write(sd, R_E0_B_VERT_LUMA_SCALING_INC,
893  (u8) (VSCY & 0xff));
894  saa711x_write(sd, R_E1_B_VERT_LUMA_SCALING_INC_MSB,
895  (u8) ((VSCY >> 8) & 0xff));
896  /* write V fine-scaling (chrominance) */
897  saa711x_write(sd, R_E2_B_VERT_CHROMA_SCALING_INC,
898  (u8) (VSCY & 0xff));
899  saa711x_write(sd, R_E3_B_VERT_CHROMA_SCALING_INC_MSB,
900  (u8) ((VSCY >> 8) & 0xff));
901 
902  saa711x_writeregs(sd, saa7115_cfg_reset_scaler);
903 
904  /* Activates task "B" */
905  saa711x_write(sd, R_80_GLOBAL_CNTL_1,
906  saa711x_read(sd, R_80_GLOBAL_CNTL_1) | 0x20);
907 
908  return 0;
909 }
910 
911 static void saa711x_set_v4lstd(struct v4l2_subdev *sd, v4l2_std_id std)
912 {
913  struct saa711x_state *state = to_state(sd);
914 
915  /* Prevent unnecessary standard changes. During a standard
916  change the I-Port is temporarily disabled. Any devices
917  reading from that port can get confused.
918  Note that s_std is also used to switch from
919  radio to TV mode, so if a s_std is broadcast to
920  all I2C devices then you do not want to have an unwanted
921  side-effect here. */
922  if (std == state->std)
923  return;
924 
925  state->std = std;
926 
927  // This works for NTSC-M, SECAM-L and the 50Hz PAL variants.
928  if (std & V4L2_STD_525_60) {
929  v4l2_dbg(1, debug, sd, "decoder set standard 60 Hz\n");
930  saa711x_writeregs(sd, saa7115_cfg_60hz_video);
931  saa711x_set_size(sd, 720, 480);
932  } else {
933  v4l2_dbg(1, debug, sd, "decoder set standard 50 Hz\n");
934  saa711x_writeregs(sd, saa7115_cfg_50hz_video);
935  saa711x_set_size(sd, 720, 576);
936  }
937 
938  /* Register 0E - Bits D6-D4 on NO-AUTO mode
939  (SAA7111 and SAA7113 doesn't have auto mode)
940  50 Hz / 625 lines 60 Hz / 525 lines
941  000 PAL BGDHI (4.43Mhz) NTSC M (3.58MHz)
942  001 NTSC 4.43 (50 Hz) PAL 4.43 (60 Hz)
943  010 Combination-PAL N (3.58MHz) NTSC 4.43 (60 Hz)
944  011 NTSC N (3.58MHz) PAL M (3.58MHz)
945  100 reserved NTSC-Japan (3.58MHz)
946  */
947  if (state->ident <= V4L2_IDENT_SAA7113) {
948  u8 reg = saa711x_read(sd, R_0E_CHROMA_CNTL_1) & 0x8f;
949 
950  if (std == V4L2_STD_PAL_M) {
951  reg |= 0x30;
952  } else if (std == V4L2_STD_PAL_Nc) {
953  reg |= 0x20;
954  } else if (std == V4L2_STD_PAL_60) {
955  reg |= 0x10;
956  } else if (std == V4L2_STD_NTSC_M_JP) {
957  reg |= 0x40;
958  } else if (std & V4L2_STD_SECAM) {
959  reg |= 0x50;
960  }
961  saa711x_write(sd, R_0E_CHROMA_CNTL_1, reg);
962  } else {
963  /* restart task B if needed */
964  int taskb = saa711x_read(sd, R_80_GLOBAL_CNTL_1) & 0x10;
965 
966  if (taskb && state->ident == V4L2_IDENT_SAA7114) {
967  saa711x_writeregs(sd, saa7115_cfg_vbi_on);
968  }
969 
970  /* switch audio mode too! */
971  saa711x_s_clock_freq(sd, state->audclk_freq);
972  }
973 }
974 
975 /* setup the sliced VBI lcr registers according to the sliced VBI format */
976 static void saa711x_set_lcr(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt)
977 {
978  struct saa711x_state *state = to_state(sd);
979  int is_50hz = (state->std & V4L2_STD_625_50);
980  u8 lcr[24];
981  int i, x;
982 
983 #if 1
984  /* saa7113/7114/7118 VBI support are experimental */
985  if (!saa711x_has_reg(state->ident, R_41_LCR_BASE))
986  return;
987 
988 #else
989  /* SAA7113 and SAA7118 also should support VBI - Need testing */
990  if (state->ident != V4L2_IDENT_SAA7115)
991  return;
992 #endif
993 
994  for (i = 0; i <= 23; i++)
995  lcr[i] = 0xff;
996 
997  if (fmt == NULL) {
998  /* raw VBI */
999  if (is_50hz)
1000  for (i = 6; i <= 23; i++)
1001  lcr[i] = 0xdd;
1002  else
1003  for (i = 10; i <= 21; i++)
1004  lcr[i] = 0xdd;
1005  } else {
1006  /* sliced VBI */
1007  /* first clear lines that cannot be captured */
1008  if (is_50hz) {
1009  for (i = 0; i <= 5; i++)
1010  fmt->service_lines[0][i] =
1011  fmt->service_lines[1][i] = 0;
1012  }
1013  else {
1014  for (i = 0; i <= 9; i++)
1015  fmt->service_lines[0][i] =
1016  fmt->service_lines[1][i] = 0;
1017  for (i = 22; i <= 23; i++)
1018  fmt->service_lines[0][i] =
1019  fmt->service_lines[1][i] = 0;
1020  }
1021 
1022  /* Now set the lcr values according to the specified service */
1023  for (i = 6; i <= 23; i++) {
1024  lcr[i] = 0;
1025  for (x = 0; x <= 1; x++) {
1026  switch (fmt->service_lines[1-x][i]) {
1027  case 0:
1028  lcr[i] |= 0xf << (4 * x);
1029  break;
1031  lcr[i] |= 1 << (4 * x);
1032  break;
1034  lcr[i] |= 4 << (4 * x);
1035  break;
1036  case V4L2_SLICED_WSS_625:
1037  lcr[i] |= 5 << (4 * x);
1038  break;
1039  case V4L2_SLICED_VPS:
1040  lcr[i] |= 7 << (4 * x);
1041  break;
1042  }
1043  }
1044  }
1045  }
1046 
1047  /* write the lcr registers */
1048  for (i = 2; i <= 23; i++) {
1049  saa711x_write(sd, i - 2 + R_41_LCR_BASE, lcr[i]);
1050  }
1051 
1052  /* enable/disable raw VBI capturing */
1053  saa711x_writeregs(sd, fmt == NULL ?
1054  saa7115_cfg_vbi_on :
1055  saa7115_cfg_vbi_off);
1056 }
1057 
1058 static int saa711x_g_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *sliced)
1059 {
1060  static u16 lcr2vbi[] = {
1061  0, V4L2_SLICED_TELETEXT_B, 0, /* 1 */
1062  0, V4L2_SLICED_CAPTION_525, /* 4 */
1063  V4L2_SLICED_WSS_625, 0, /* 5 */
1064  V4L2_SLICED_VPS, 0, 0, 0, 0, /* 7 */
1065  0, 0, 0, 0
1066  };
1067  int i;
1068 
1069  memset(sliced->service_lines, 0, sizeof(sliced->service_lines));
1070  sliced->service_set = 0;
1071  /* done if using raw VBI */
1072  if (saa711x_read(sd, R_80_GLOBAL_CNTL_1) & 0x10)
1073  return 0;
1074  for (i = 2; i <= 23; i++) {
1075  u8 v = saa711x_read(sd, i - 2 + R_41_LCR_BASE);
1076 
1077  sliced->service_lines[0][i] = lcr2vbi[v >> 4];
1078  sliced->service_lines[1][i] = lcr2vbi[v & 0xf];
1079  sliced->service_set |=
1080  sliced->service_lines[0][i] | sliced->service_lines[1][i];
1081  }
1082  return 0;
1083 }
1084 
1085 static int saa711x_s_raw_fmt(struct v4l2_subdev *sd, struct v4l2_vbi_format *fmt)
1086 {
1087  saa711x_set_lcr(sd, NULL);
1088  return 0;
1089 }
1090 
1091 static int saa711x_s_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt)
1092 {
1093  saa711x_set_lcr(sd, fmt);
1094  return 0;
1095 }
1096 
1097 static int saa711x_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *fmt)
1098 {
1099  if (fmt->code != V4L2_MBUS_FMT_FIXED)
1100  return -EINVAL;
1101  fmt->field = V4L2_FIELD_INTERLACED;
1102  fmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
1103  return saa711x_set_size(sd, fmt->width, fmt->height);
1104 }
1105 
1106 /* Decode the sliced VBI data stream as created by the saa7115.
1107  The format is described in the saa7115 datasheet in Tables 25 and 26
1108  and in Figure 33.
1109  The current implementation uses SAV/EAV codes and not the ancillary data
1110  headers. The vbi->p pointer points to the R_5E_SDID byte right after the SAV
1111  code. */
1112 static int saa711x_decode_vbi_line(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi)
1113 {
1114  struct saa711x_state *state = to_state(sd);
1115  static const char vbi_no_data_pattern[] = {
1116  0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0
1117  };
1118  u8 *p = vbi->p;
1119  u32 wss;
1120  int id1, id2; /* the ID1 and ID2 bytes from the internal header */
1121 
1122  vbi->type = 0; /* mark result as a failure */
1123  id1 = p[2];
1124  id2 = p[3];
1125  /* Note: the field bit is inverted for 60 Hz video */
1126  if (state->std & V4L2_STD_525_60)
1127  id1 ^= 0x40;
1128 
1129  /* Skip internal header, p now points to the start of the payload */
1130  p += 4;
1131  vbi->p = p;
1132 
1133  /* calculate field and line number of the VBI packet (1-23) */
1134  vbi->is_second_field = ((id1 & 0x40) != 0);
1135  vbi->line = (id1 & 0x3f) << 3;
1136  vbi->line |= (id2 & 0x70) >> 4;
1137 
1138  /* Obtain data type */
1139  id2 &= 0xf;
1140 
1141  /* If the VBI slicer does not detect any signal it will fill up
1142  the payload buffer with 0xa0 bytes. */
1143  if (!memcmp(p, vbi_no_data_pattern, sizeof(vbi_no_data_pattern)))
1144  return 0;
1145 
1146  /* decode payloads */
1147  switch (id2) {
1148  case 1:
1150  break;
1151  case 4:
1152  if (!saa711x_odd_parity(p[0]) || !saa711x_odd_parity(p[1]))
1153  return 0;
1155  break;
1156  case 5:
1157  wss = saa711x_decode_wss(p);
1158  if (wss == -1)
1159  return 0;
1160  p[0] = wss & 0xff;
1161  p[1] = wss >> 8;
1162  vbi->type = V4L2_SLICED_WSS_625;
1163  break;
1164  case 7:
1165  if (saa711x_decode_vps(p, p) != 0)
1166  return 0;
1167  vbi->type = V4L2_SLICED_VPS;
1168  break;
1169  default:
1170  break;
1171  }
1172  return 0;
1173 }
1174 
1175 /* ============ SAA7115 AUDIO settings (end) ============= */
1176 
1177 static int saa711x_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
1178 {
1179  struct saa711x_state *state = to_state(sd);
1180  int status;
1181 
1182  if (state->radio)
1183  return 0;
1184  status = saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC);
1185 
1186  v4l2_dbg(1, debug, sd, "status: 0x%02x\n", status);
1187  vt->signal = ((status & (1 << 6)) == 0) ? 0xffff : 0x0;
1188  return 0;
1189 }
1190 
1191 static int saa711x_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
1192 {
1193  struct saa711x_state *state = to_state(sd);
1194 
1195  state->radio = 0;
1196  saa711x_set_v4lstd(sd, std);
1197  return 0;
1198 }
1199 
1200 static int saa711x_s_radio(struct v4l2_subdev *sd)
1201 {
1202  struct saa711x_state *state = to_state(sd);
1203 
1204  state->radio = 1;
1205  return 0;
1206 }
1207 
1208 static int saa711x_s_routing(struct v4l2_subdev *sd,
1210 {
1211  struct saa711x_state *state = to_state(sd);
1212  u8 mask = (state->ident <= V4L2_IDENT_SAA7111A) ? 0xf8 : 0xf0;
1213 
1214  v4l2_dbg(1, debug, sd, "decoder set input %d output %d\n",
1215  input, output);
1216 
1217  /* saa7111/3 does not have these inputs */
1218  if (state->ident <= V4L2_IDENT_SAA7113 &&
1219  (input == SAA7115_COMPOSITE4 ||
1220  input == SAA7115_COMPOSITE5)) {
1221  return -EINVAL;
1222  }
1223  if (input > SAA7115_SVIDEO3)
1224  return -EINVAL;
1225  if (state->input == input && state->output == output)
1226  return 0;
1227  v4l2_dbg(1, debug, sd, "now setting %s input %s output\n",
1228  (input >= SAA7115_SVIDEO0) ? "S-Video" : "Composite",
1229  (output == SAA7115_IPORT_ON) ? "iport on" : "iport off");
1230  state->input = input;
1231 
1232  /* saa7111 has slightly different input numbering */
1233  if (state->ident <= V4L2_IDENT_SAA7111A) {
1234  if (input >= SAA7115_COMPOSITE4)
1235  input -= 2;
1236  /* saa7111 specific */
1237  saa711x_write(sd, R_10_CHROMA_CNTL_2,
1238  (saa711x_read(sd, R_10_CHROMA_CNTL_2) & 0x3f) |
1239  ((output & 0xc0) ^ 0x40));
1240  saa711x_write(sd, R_13_RT_X_PORT_OUT_CNTL,
1241  (saa711x_read(sd, R_13_RT_X_PORT_OUT_CNTL) & 0xf0) |
1242  ((output & 2) ? 0x0a : 0));
1243  }
1244 
1245  /* select mode */
1246  saa711x_write(sd, R_02_INPUT_CNTL_1,
1247  (saa711x_read(sd, R_02_INPUT_CNTL_1) & mask) |
1248  input);
1249 
1250  /* bypass chrominance trap for S-Video modes */
1251  saa711x_write(sd, R_09_LUMA_CNTL,
1252  (saa711x_read(sd, R_09_LUMA_CNTL) & 0x7f) |
1253  (state->input >= SAA7115_SVIDEO0 ? 0x80 : 0x0));
1254 
1255  state->output = output;
1256  if (state->ident == V4L2_IDENT_SAA7114 ||
1257  state->ident == V4L2_IDENT_SAA7115) {
1258  saa711x_write(sd, R_83_X_PORT_I_O_ENA_AND_OUT_CLK,
1259  (saa711x_read(sd, R_83_X_PORT_I_O_ENA_AND_OUT_CLK) & 0xfe) |
1260  (state->output & 0x01));
1261  }
1262  return 0;
1263 }
1264 
1265 static int saa711x_s_gpio(struct v4l2_subdev *sd, u32 val)
1266 {
1267  struct saa711x_state *state = to_state(sd);
1268 
1269  if (state->ident > V4L2_IDENT_SAA7111A)
1270  return -EINVAL;
1271  saa711x_write(sd, 0x11, (saa711x_read(sd, 0x11) & 0x7f) |
1272  (val ? 0x80 : 0));
1273  return 0;
1274 }
1275 
1276 static int saa711x_s_stream(struct v4l2_subdev *sd, int enable)
1277 {
1278  struct saa711x_state *state = to_state(sd);
1279 
1280  v4l2_dbg(1, debug, sd, "%s output\n",
1281  enable ? "enable" : "disable");
1282 
1283  if (state->enable == enable)
1284  return 0;
1285  state->enable = enable;
1286  if (!saa711x_has_reg(state->ident, R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED))
1287  return 0;
1288  saa711x_write(sd, R_87_I_PORT_I_O_ENA_OUT_CLK_AND_GATED, state->enable);
1289  return 0;
1290 }
1291 
1292 static int saa711x_s_crystal_freq(struct v4l2_subdev *sd, u32 freq, u32 flags)
1293 {
1294  struct saa711x_state *state = to_state(sd);
1295 
1296  if (freq != SAA7115_FREQ_32_11_MHZ && freq != SAA7115_FREQ_24_576_MHZ)
1297  return -EINVAL;
1298  state->crystal_freq = freq;
1299  state->cgcdiv = (flags & SAA7115_FREQ_FL_CGCDIV) ? 3 : 4;
1300  state->ucgc = (flags & SAA7115_FREQ_FL_UCGC) ? 1 : 0;
1301  state->apll = (flags & SAA7115_FREQ_FL_APLL) ? 1 : 0;
1302  saa711x_s_clock_freq(sd, state->audclk_freq);
1303  return 0;
1304 }
1305 
1306 static int saa711x_reset(struct v4l2_subdev *sd, u32 val)
1307 {
1308  v4l2_dbg(1, debug, sd, "decoder RESET\n");
1309  saa711x_writeregs(sd, saa7115_cfg_reset_scaler);
1310  return 0;
1311 }
1312 
1313 static int saa711x_g_vbi_data(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_data *data)
1314 {
1315  /* Note: the internal field ID is inverted for NTSC,
1316  so data->field 0 maps to the saa7115 even field,
1317  whereas for PAL it maps to the saa7115 odd field. */
1318  switch (data->id) {
1319  case V4L2_SLICED_WSS_625:
1320  if (saa711x_read(sd, 0x6b) & 0xc0)
1321  return -EIO;
1322  data->data[0] = saa711x_read(sd, 0x6c);
1323  data->data[1] = saa711x_read(sd, 0x6d);
1324  return 0;
1326  if (data->field == 0) {
1327  /* CC */
1328  if (saa711x_read(sd, 0x66) & 0x30)
1329  return -EIO;
1330  data->data[0] = saa711x_read(sd, 0x69);
1331  data->data[1] = saa711x_read(sd, 0x6a);
1332  return 0;
1333  }
1334  /* XDS */
1335  if (saa711x_read(sd, 0x66) & 0xc0)
1336  return -EIO;
1337  data->data[0] = saa711x_read(sd, 0x67);
1338  data->data[1] = saa711x_read(sd, 0x68);
1339  return 0;
1340  default:
1341  return -EINVAL;
1342  }
1343 }
1344 
1345 static int saa711x_querystd(struct v4l2_subdev *sd, v4l2_std_id *std)
1346 {
1347  struct saa711x_state *state = to_state(sd);
1348  int reg1f, reg1e;
1349 
1350  /*
1351  * The V4L2 core already initializes std with all supported
1352  * Standards. All driver needs to do is to mask it, to remove
1353  * standards that don't apply from the mask
1354  */
1355 
1356  reg1f = saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC);
1357  v4l2_dbg(1, debug, sd, "Status byte 2 (0x1f)=0x%02x\n", reg1f);
1358 
1359  /* horizontal/vertical not locked */
1360  if (reg1f & 0x40)
1361  goto ret;
1362 
1363  if (reg1f & 0x20)
1364  *std &= V4L2_STD_525_60;
1365  else
1366  *std &= V4L2_STD_625_50;
1367 
1368  if (state->ident != V4L2_IDENT_SAA7115)
1369  goto ret;
1370 
1371  reg1e = saa711x_read(sd, R_1E_STATUS_BYTE_1_VD_DEC);
1372 
1373  switch (reg1e & 0x03) {
1374  case 1:
1375  *std &= V4L2_STD_NTSC;
1376  break;
1377  case 2:
1378  /*
1379  * V4L2_STD_PAL just cover the european PAL standards.
1380  * This is wrong, as the device could also be using an
1381  * other PAL standard.
1382  */
1385  break;
1386  case 3:
1387  *std &= V4L2_STD_SECAM;
1388  break;
1389  default:
1390  /* Can't detect anything */
1391  break;
1392  }
1393 
1394  v4l2_dbg(1, debug, sd, "Status byte 1 (0x1e)=0x%02x\n", reg1e);
1395 
1396 ret:
1397  v4l2_dbg(1, debug, sd, "detected std mask = %08Lx\n", *std);
1398 
1399  return 0;
1400 }
1401 
1402 static int saa711x_g_input_status(struct v4l2_subdev *sd, u32 *status)
1403 {
1404  struct saa711x_state *state = to_state(sd);
1405  int reg1e = 0x80;
1406  int reg1f;
1407 
1408  *status = V4L2_IN_ST_NO_SIGNAL;
1409  if (state->ident == V4L2_IDENT_SAA7115)
1410  reg1e = saa711x_read(sd, R_1E_STATUS_BYTE_1_VD_DEC);
1411  reg1f = saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC);
1412  if ((reg1f & 0xc1) == 0x81 && (reg1e & 0xc0) == 0x80)
1413  *status = 0;
1414  return 0;
1415 }
1416 
1417 #ifdef CONFIG_VIDEO_ADV_DEBUG
1418 static int saa711x_g_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg)
1419 {
1420  struct i2c_client *client = v4l2_get_subdevdata(sd);
1421 
1422  if (!v4l2_chip_match_i2c_client(client, &reg->match))
1423  return -EINVAL;
1424  if (!capable(CAP_SYS_ADMIN))
1425  return -EPERM;
1426  reg->val = saa711x_read(sd, reg->reg & 0xff);
1427  reg->size = 1;
1428  return 0;
1429 }
1430 
1431 static int saa711x_s_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg)
1432 {
1433  struct i2c_client *client = v4l2_get_subdevdata(sd);
1434 
1435  if (!v4l2_chip_match_i2c_client(client, &reg->match))
1436  return -EINVAL;
1437  if (!capable(CAP_SYS_ADMIN))
1438  return -EPERM;
1439  saa711x_write(sd, reg->reg & 0xff, reg->val & 0xff);
1440  return 0;
1441 }
1442 #endif
1443 
1444 static int saa711x_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip)
1445 {
1446  struct saa711x_state *state = to_state(sd);
1447  struct i2c_client *client = v4l2_get_subdevdata(sd);
1448 
1449  return v4l2_chip_ident_i2c_client(client, chip, state->ident, 0);
1450 }
1451 
1452 static int saa711x_log_status(struct v4l2_subdev *sd)
1453 {
1454  struct saa711x_state *state = to_state(sd);
1455  int reg1e, reg1f;
1456  int signalOk;
1457  int vcr;
1458 
1459  v4l2_info(sd, "Audio frequency: %d Hz\n", state->audclk_freq);
1460  if (state->ident != V4L2_IDENT_SAA7115) {
1461  /* status for the saa7114 */
1462  reg1f = saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC);
1463  signalOk = (reg1f & 0xc1) == 0x81;
1464  v4l2_info(sd, "Video signal: %s\n", signalOk ? "ok" : "bad");
1465  v4l2_info(sd, "Frequency: %s\n", (reg1f & 0x20) ? "60 Hz" : "50 Hz");
1466  return 0;
1467  }
1468 
1469  /* status for the saa7115 */
1470  reg1e = saa711x_read(sd, R_1E_STATUS_BYTE_1_VD_DEC);
1471  reg1f = saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC);
1472 
1473  signalOk = (reg1f & 0xc1) == 0x81 && (reg1e & 0xc0) == 0x80;
1474  vcr = !(reg1f & 0x10);
1475 
1476  if (state->input >= 6)
1477  v4l2_info(sd, "Input: S-Video %d\n", state->input - 6);
1478  else
1479  v4l2_info(sd, "Input: Composite %d\n", state->input);
1480  v4l2_info(sd, "Video signal: %s\n", signalOk ? (vcr ? "VCR" : "broadcast/DVD") : "bad");
1481  v4l2_info(sd, "Frequency: %s\n", (reg1f & 0x20) ? "60 Hz" : "50 Hz");
1482 
1483  switch (reg1e & 0x03) {
1484  case 1:
1485  v4l2_info(sd, "Detected format: NTSC\n");
1486  break;
1487  case 2:
1488  v4l2_info(sd, "Detected format: PAL\n");
1489  break;
1490  case 3:
1491  v4l2_info(sd, "Detected format: SECAM\n");
1492  break;
1493  default:
1494  v4l2_info(sd, "Detected format: BW/No color\n");
1495  break;
1496  }
1497  v4l2_info(sd, "Width, Height: %d, %d\n", state->width, state->height);
1498  v4l2_ctrl_handler_log_status(&state->hdl, sd->name);
1499  return 0;
1500 }
1501 
1502 /* ----------------------------------------------------------------------- */
1503 
1504 static const struct v4l2_ctrl_ops saa711x_ctrl_ops = {
1505  .s_ctrl = saa711x_s_ctrl,
1506  .g_volatile_ctrl = saa711x_g_volatile_ctrl,
1507 };
1508 
1509 static const struct v4l2_subdev_core_ops saa711x_core_ops = {
1510  .log_status = saa711x_log_status,
1511  .g_chip_ident = saa711x_g_chip_ident,
1512  .g_ext_ctrls = v4l2_subdev_g_ext_ctrls,
1513  .try_ext_ctrls = v4l2_subdev_try_ext_ctrls,
1514  .s_ext_ctrls = v4l2_subdev_s_ext_ctrls,
1515  .g_ctrl = v4l2_subdev_g_ctrl,
1516  .s_ctrl = v4l2_subdev_s_ctrl,
1517  .queryctrl = v4l2_subdev_queryctrl,
1518  .querymenu = v4l2_subdev_querymenu,
1519  .s_std = saa711x_s_std,
1520  .reset = saa711x_reset,
1521  .s_gpio = saa711x_s_gpio,
1522 #ifdef CONFIG_VIDEO_ADV_DEBUG
1523  .g_register = saa711x_g_register,
1524  .s_register = saa711x_s_register,
1525 #endif
1526 };
1527 
1528 static const struct v4l2_subdev_tuner_ops saa711x_tuner_ops = {
1529  .s_radio = saa711x_s_radio,
1530  .g_tuner = saa711x_g_tuner,
1531 };
1532 
1533 static const struct v4l2_subdev_audio_ops saa711x_audio_ops = {
1534  .s_clock_freq = saa711x_s_clock_freq,
1535 };
1536 
1537 static const struct v4l2_subdev_video_ops saa711x_video_ops = {
1538  .s_routing = saa711x_s_routing,
1539  .s_crystal_freq = saa711x_s_crystal_freq,
1540  .s_mbus_fmt = saa711x_s_mbus_fmt,
1541  .s_stream = saa711x_s_stream,
1542  .querystd = saa711x_querystd,
1543  .g_input_status = saa711x_g_input_status,
1544 };
1545 
1546 static const struct v4l2_subdev_vbi_ops saa711x_vbi_ops = {
1547  .g_vbi_data = saa711x_g_vbi_data,
1548  .decode_vbi_line = saa711x_decode_vbi_line,
1549  .g_sliced_fmt = saa711x_g_sliced_fmt,
1550  .s_sliced_fmt = saa711x_s_sliced_fmt,
1551  .s_raw_fmt = saa711x_s_raw_fmt,
1552 };
1553 
1554 static const struct v4l2_subdev_ops saa711x_ops = {
1555  .core = &saa711x_core_ops,
1556  .tuner = &saa711x_tuner_ops,
1557  .audio = &saa711x_audio_ops,
1558  .video = &saa711x_video_ops,
1559  .vbi = &saa711x_vbi_ops,
1560 };
1561 
1562 /* ----------------------------------------------------------------------- */
1563 
1564 static int saa711x_probe(struct i2c_client *client,
1565  const struct i2c_device_id *id)
1566 {
1567  struct saa711x_state *state;
1568  struct v4l2_subdev *sd;
1569  struct v4l2_ctrl_handler *hdl;
1570  int i;
1571  char name[17];
1572  char chip_id;
1573  int autodetect = !id || id->driver_data == 1;
1574 
1575  /* Check if the adapter supports the needed features */
1576  if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
1577  return -EIO;
1578 
1579  for (i = 0; i < 0x0f; i++) {
1580  i2c_smbus_write_byte_data(client, 0, i);
1581  name[i] = (i2c_smbus_read_byte_data(client, 0) & 0x0f) + '0';
1582  if (name[i] > '9')
1583  name[i] += 'a' - '9' - 1;
1584  }
1585  name[i] = '\0';
1586 
1587  chip_id = name[5];
1588 
1589  /* Check whether this chip is part of the saa711x series */
1590  if (memcmp(name + 1, "f711", 4)) {
1591  v4l_dbg(1, debug, client, "chip found @ 0x%x (ID %s) does not match a known saa711x chip.\n",
1592  client->addr << 1, name);
1593  return -ENODEV;
1594  }
1595 
1596  /* Safety check */
1597  if (!autodetect && id->name[6] != chip_id) {
1598  v4l_warn(client, "found saa711%c while %s was expected\n",
1599  chip_id, id->name);
1600  }
1601  snprintf(client->name, sizeof(client->name), "saa711%c", chip_id);
1602  v4l_info(client, "saa711%c found (%s) @ 0x%x (%s)\n", chip_id, name,
1603  client->addr << 1, client->adapter->name);
1604 
1605  state = kzalloc(sizeof(struct saa711x_state), GFP_KERNEL);
1606  if (state == NULL)
1607  return -ENOMEM;
1608  sd = &state->sd;
1609  v4l2_i2c_subdev_init(sd, client, &saa711x_ops);
1610 
1611  hdl = &state->hdl;
1612  v4l2_ctrl_handler_init(hdl, 6);
1613  /* add in ascending ID order */
1614  v4l2_ctrl_new_std(hdl, &saa711x_ctrl_ops,
1615  V4L2_CID_BRIGHTNESS, 0, 255, 1, 128);
1616  v4l2_ctrl_new_std(hdl, &saa711x_ctrl_ops,
1617  V4L2_CID_CONTRAST, 0, 127, 1, 64);
1618  v4l2_ctrl_new_std(hdl, &saa711x_ctrl_ops,
1619  V4L2_CID_SATURATION, 0, 127, 1, 64);
1620  v4l2_ctrl_new_std(hdl, &saa711x_ctrl_ops,
1621  V4L2_CID_HUE, -128, 127, 1, 0);
1622  state->agc = v4l2_ctrl_new_std(hdl, &saa711x_ctrl_ops,
1623  V4L2_CID_CHROMA_AGC, 0, 1, 1, 1);
1624  state->gain = v4l2_ctrl_new_std(hdl, &saa711x_ctrl_ops,
1625  V4L2_CID_CHROMA_GAIN, 0, 127, 1, 40);
1626  sd->ctrl_handler = hdl;
1627  if (hdl->error) {
1628  int err = hdl->error;
1629 
1631  kfree(state);
1632  return err;
1633  }
1634  v4l2_ctrl_auto_cluster(2, &state->agc, 0, true);
1635 
1636  state->input = -1;
1637  state->output = SAA7115_IPORT_ON;
1638  state->enable = 1;
1639  state->radio = 0;
1640  switch (chip_id) {
1641  case '1':
1642  state->ident = V4L2_IDENT_SAA7111;
1643  if (saa711x_read(sd, R_00_CHIP_VERSION) & 0xf0) {
1644  v4l_info(client, "saa7111a variant found\n");
1645  state->ident = V4L2_IDENT_SAA7111A;
1646  }
1647  break;
1648  case '3':
1649  state->ident = V4L2_IDENT_SAA7113;
1650  break;
1651  case '4':
1652  state->ident = V4L2_IDENT_SAA7114;
1653  break;
1654  case '5':
1655  state->ident = V4L2_IDENT_SAA7115;
1656  break;
1657  case '8':
1658  state->ident = V4L2_IDENT_SAA7118;
1659  break;
1660  default:
1661  state->ident = V4L2_IDENT_SAA7111;
1662  v4l2_info(sd, "WARNING: Chip is not known - Falling back to saa7111\n");
1663  break;
1664  }
1665 
1666  state->audclk_freq = 48000;
1667 
1668  v4l2_dbg(1, debug, sd, "writing init values\n");
1669 
1670  /* init to 60hz/48khz */
1672  switch (state->ident) {
1673  case V4L2_IDENT_SAA7111:
1674  case V4L2_IDENT_SAA7111A:
1675  saa711x_writeregs(sd, saa7111_init);
1676  break;
1677  case V4L2_IDENT_SAA7113:
1678  saa711x_writeregs(sd, saa7113_init);
1679  break;
1680  default:
1682  saa711x_writeregs(sd, saa7115_init_auto_input);
1683  }
1684  if (state->ident > V4L2_IDENT_SAA7111A)
1685  saa711x_writeregs(sd, saa7115_init_misc);
1686  saa711x_set_v4lstd(sd, V4L2_STD_NTSC);
1688 
1689  v4l2_dbg(1, debug, sd, "status: (1E) 0x%02x, (1F) 0x%02x\n",
1690  saa711x_read(sd, R_1E_STATUS_BYTE_1_VD_DEC),
1691  saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC));
1692  return 0;
1693 }
1694 
1695 /* ----------------------------------------------------------------------- */
1696 
1697 static int saa711x_remove(struct i2c_client *client)
1698 {
1699  struct v4l2_subdev *sd = i2c_get_clientdata(client);
1700 
1703  kfree(to_state(sd));
1704  return 0;
1705 }
1706 
1707 static const struct i2c_device_id saa711x_id[] = {
1708  { "saa7115_auto", 1 }, /* autodetect */
1709  { "saa7111", 0 },
1710  { "saa7113", 0 },
1711  { "saa7114", 0 },
1712  { "saa7115", 0 },
1713  { "saa7118", 0 },
1714  { }
1715 };
1716 MODULE_DEVICE_TABLE(i2c, saa711x_id);
1717 
1718 static struct i2c_driver saa711x_driver = {
1719  .driver = {
1720  .owner = THIS_MODULE,
1721  .name = "saa7115",
1722  },
1723  .probe = saa711x_probe,
1724  .remove = saa711x_remove,
1725  .id_table = saa711x_id,
1726 };
1727 
1728 module_i2c_driver(saa711x_driver);