diff options
Diffstat (limited to 'drivers/media/video/cx25840/cx25840-vbi.c')
-rw-r--r-- | drivers/media/video/cx25840/cx25840-vbi.c | 152 |
1 files changed, 4 insertions, 148 deletions
diff --git a/drivers/media/video/cx25840/cx25840-vbi.c b/drivers/media/video/cx25840/cx25840-vbi.c index c754b9d13369..69f2bbdbb929 100644 --- a/drivers/media/video/cx25840/cx25840-vbi.c +++ b/drivers/media/video/cx25840/cx25840-vbi.c | |||
@@ -82,150 +82,6 @@ static int decode_vps(u8 * dst, u8 * p) | |||
82 | return err & 0xf0; | 82 | return err & 0xf0; |
83 | } | 83 | } |
84 | 84 | ||
85 | void cx25840_vbi_setup(struct i2c_client *client) | ||
86 | { | ||
87 | struct cx25840_state *state = i2c_get_clientdata(client); | ||
88 | v4l2_std_id std = state->std; | ||
89 | int hblank,hactive,burst,vblank,vactive,sc,vblank656,src_decimation; | ||
90 | int luma_lpf,uv_lpf, comb; | ||
91 | u32 pll_int,pll_frac,pll_post; | ||
92 | |||
93 | /* datasheet startup, step 8d */ | ||
94 | if (std & ~V4L2_STD_NTSC) { | ||
95 | cx25840_write(client, 0x49f, 0x11); | ||
96 | } else { | ||
97 | cx25840_write(client, 0x49f, 0x14); | ||
98 | } | ||
99 | |||
100 | if (std & V4L2_STD_625_50) { | ||
101 | hblank=0x084; | ||
102 | hactive=0x2d0; | ||
103 | burst=0x5d; | ||
104 | vblank=0x024; | ||
105 | vactive=0x244; | ||
106 | vblank656=0x28; | ||
107 | src_decimation=0x21f; | ||
108 | |||
109 | luma_lpf=2; | ||
110 | if (std & V4L2_STD_SECAM) { | ||
111 | uv_lpf=0; | ||
112 | comb=0; | ||
113 | sc=0x0a425f; | ||
114 | } else if (std == V4L2_STD_PAL_Nc) { | ||
115 | uv_lpf=1; | ||
116 | comb=0x20; | ||
117 | sc=556453; | ||
118 | } else { | ||
119 | uv_lpf=1; | ||
120 | comb=0x20; | ||
121 | sc=0x0a8263; | ||
122 | } | ||
123 | } else { | ||
124 | hactive=720; | ||
125 | hblank=122; | ||
126 | vactive=487; | ||
127 | luma_lpf=1; | ||
128 | uv_lpf=1; | ||
129 | |||
130 | src_decimation=0x21f; | ||
131 | if (std == V4L2_STD_PAL_60) { | ||
132 | vblank=26; | ||
133 | vblank656=26; | ||
134 | burst=0x5b; | ||
135 | luma_lpf=2; | ||
136 | comb=0x20; | ||
137 | sc=0x0a8263; | ||
138 | } else if (std == V4L2_STD_PAL_M) { | ||
139 | vblank=20; | ||
140 | vblank656=24; | ||
141 | burst=0x61; | ||
142 | comb=0x20; | ||
143 | |||
144 | sc=555452; | ||
145 | } else { | ||
146 | vblank=26; | ||
147 | vblank656=26; | ||
148 | burst=0x5b; | ||
149 | comb=0x66; | ||
150 | sc=556063; | ||
151 | } | ||
152 | } | ||
153 | |||
154 | /* DEBUG: Displays configured PLL frequency */ | ||
155 | pll_int=cx25840_read(client, 0x108); | ||
156 | pll_frac=cx25840_read4(client, 0x10c)&0x1ffffff; | ||
157 | pll_post=cx25840_read(client, 0x109); | ||
158 | v4l_dbg(1, cx25840_debug, client, | ||
159 | "PLL regs = int: %u, frac: %u, post: %u\n", | ||
160 | pll_int,pll_frac,pll_post); | ||
161 | |||
162 | if (pll_post) { | ||
163 | int fin, fsc; | ||
164 | int pll= (28636363L*((((u64)pll_int)<<25L)+pll_frac)) >>25L; | ||
165 | |||
166 | pll/=pll_post; | ||
167 | v4l_dbg(1, cx25840_debug, client, "PLL = %d.%06d MHz\n", | ||
168 | pll/1000000, pll%1000000); | ||
169 | v4l_dbg(1, cx25840_debug, client, "PLL/8 = %d.%06d MHz\n", | ||
170 | pll/8000000, (pll/8)%1000000); | ||
171 | |||
172 | fin=((u64)src_decimation*pll)>>12; | ||
173 | v4l_dbg(1, cx25840_debug, client, "ADC Sampling freq = " | ||
174 | "%d.%06d MHz\n", | ||
175 | fin/1000000,fin%1000000); | ||
176 | |||
177 | fsc= (((u64)sc)*pll) >> 24L; | ||
178 | v4l_dbg(1, cx25840_debug, client, "Chroma sub-carrier freq = " | ||
179 | "%d.%06d MHz\n", | ||
180 | fsc/1000000,fsc%1000000); | ||
181 | |||
182 | v4l_dbg(1, cx25840_debug, client, "hblank %i, hactive %i, " | ||
183 | "vblank %i, vactive %i, vblank656 %i, src_dec %i, " | ||
184 | "burst 0x%02x, luma_lpf %i, uv_lpf %i, comb 0x%02x," | ||
185 | " sc 0x%06x\n", | ||
186 | hblank, hactive, vblank, vactive, vblank656, | ||
187 | src_decimation, burst, luma_lpf, uv_lpf, comb, sc); | ||
188 | } | ||
189 | |||
190 | /* Sets horizontal blanking delay and active lines */ | ||
191 | cx25840_write(client, 0x470, hblank); | ||
192 | cx25840_write(client, 0x471, 0xff&(((hblank>>8)&0x3)|(hactive <<4))); | ||
193 | cx25840_write(client, 0x472, hactive>>4); | ||
194 | |||
195 | /* Sets burst gate delay */ | ||
196 | cx25840_write(client, 0x473, burst); | ||
197 | |||
198 | /* Sets vertical blanking delay and active duration */ | ||
199 | cx25840_write(client, 0x474, vblank); | ||
200 | cx25840_write(client, 0x475, 0xff&(((vblank>>8)&0x3)|(vactive <<4))); | ||
201 | cx25840_write(client, 0x476, vactive>>4); | ||
202 | cx25840_write(client, 0x477, vblank656); | ||
203 | |||
204 | /* Sets src decimation rate */ | ||
205 | cx25840_write(client, 0x478, 0xff&src_decimation); | ||
206 | cx25840_write(client, 0x479, 0xff&(src_decimation>>8)); | ||
207 | |||
208 | /* Sets Luma and UV Low pass filters */ | ||
209 | cx25840_write(client, 0x47a, luma_lpf<<6|((uv_lpf<<4)&0x30)); | ||
210 | |||
211 | /* Enables comb filters */ | ||
212 | cx25840_write(client, 0x47b, comb); | ||
213 | |||
214 | /* Sets SC Step*/ | ||
215 | cx25840_write(client, 0x47c, sc); | ||
216 | cx25840_write(client, 0x47d, 0xff&sc>>8); | ||
217 | cx25840_write(client, 0x47e, 0xff&sc>>16); | ||
218 | |||
219 | /* Sets VBI parameters */ | ||
220 | if (std & V4L2_STD_625_50) { | ||
221 | cx25840_write(client, 0x47f, 0x01); | ||
222 | state->vbi_line_offset = 5; | ||
223 | } else { | ||
224 | cx25840_write(client, 0x47f, 0x00); | ||
225 | state->vbi_line_offset = 8; | ||
226 | } | ||
227 | } | ||
228 | |||
229 | int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg) | 85 | int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg) |
230 | { | 86 | { |
231 | struct cx25840_state *state = i2c_get_clientdata(client); | 87 | struct cx25840_state *state = i2c_get_clientdata(client); |
@@ -292,8 +148,8 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg) | |||
292 | /* raw VBI */ | 148 | /* raw VBI */ |
293 | memset(svbi, 0, sizeof(*svbi)); | 149 | memset(svbi, 0, sizeof(*svbi)); |
294 | 150 | ||
295 | /* Setup VBI */ | 151 | /* Setup standard */ |
296 | cx25840_vbi_setup(client); | 152 | cx25840_std_setup(client); |
297 | 153 | ||
298 | /* VBI Offset */ | 154 | /* VBI Offset */ |
299 | cx25840_write(client, 0x47f, vbi_offset); | 155 | cx25840_write(client, 0x47f, vbi_offset); |
@@ -304,8 +160,8 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg) | |||
304 | for (x = 0; x <= 23; x++) | 160 | for (x = 0; x <= 23; x++) |
305 | lcr[x] = 0x00; | 161 | lcr[x] = 0x00; |
306 | 162 | ||
307 | /* Setup VBI */ | 163 | /* Setup standard */ |
308 | cx25840_vbi_setup(client); | 164 | cx25840_std_setup(client); |
309 | 165 | ||
310 | /* Sliced VBI */ | 166 | /* Sliced VBI */ |
311 | cx25840_write(client, 0x404, 0x32); /* Ancillary data */ | 167 | cx25840_write(client, 0x404, 0x32); /* Ancillary data */ |