diff options
author | Mauro Carvalho Chehab <mchehab@infradead.org> | 2006-08-25 15:53:10 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-01-25 16:01:00 -0500 |
commit | 5eba35714e0dfa5618b438cfe46037f22133badc (patch) | |
tree | 127d8fdae1d44e72c0ccfa9f7bd8b69b5d5f8a4e /drivers/media/video/tda9875.c | |
parent | 7a00d45cf017172c74d15bad0f9f14720efd69dd (diff) |
V4L/DVB (6420): V4L2 conversion for tda9875 from V4L1 API
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video/tda9875.c')
-rw-r--r-- | drivers/media/video/tda9875.c | 167 |
1 files changed, 112 insertions, 55 deletions
diff --git a/drivers/media/video/tda9875.c b/drivers/media/video/tda9875.c index d11044170872..3c0557130a70 100644 --- a/drivers/media/video/tda9875.c +++ b/drivers/media/video/tda9875.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * | 7 | * |
8 | * Copyright (c) 2000 Guillaume Delvit based on Gerd Knorr source and | 8 | * Copyright (c) 2000 Guillaume Delvit based on Gerd Knorr source and |
9 | * Eric Sandeen | 9 | * Eric Sandeen |
10 | * Copyright (c) 2006 Mauro Carvalho Chehab <mchehab@infradead.org> | ||
10 | * This code is placed under the terms of the GNU General Public License | 11 | * This code is placed under the terms of the GNU General Public License |
11 | * Based on tda9855.c by Steve VanDeBogart (vandebo@uclink.berkeley.edu) | 12 | * Based on tda9855.c by Steve VanDeBogart (vandebo@uclink.berkeley.edu) |
12 | * Which was based on tda8425.c by Greg Alexander (c) 1998 | 13 | * Which was based on tda8425.c by Greg Alexander (c) 1998 |
@@ -268,87 +269,143 @@ static int tda9875_detach(struct i2c_client *client) | |||
268 | return 0; | 269 | return 0; |
269 | } | 270 | } |
270 | 271 | ||
271 | static int tda9875_command(struct i2c_client *client, | 272 | static int tda9875_get_ctrl(struct i2c_client *client, |
272 | unsigned int cmd, void *arg) | 273 | struct v4l2_control *ctrl) |
273 | { | 274 | { |
274 | struct tda9875 *t = i2c_get_clientdata(client); | 275 | struct tda9875 *t = i2c_get_clientdata(client); |
275 | 276 | ||
276 | dprintk("In tda9875_command...\n"); | 277 | switch (ctrl->id) { |
278 | case V4L2_CID_AUDIO_VOLUME: | ||
279 | { | ||
280 | int left = (t->lvol+84)*606; | ||
281 | int right = (t->rvol+84)*606; | ||
277 | 282 | ||
278 | switch (cmd) { | 283 | ctrl->value=max(left,right); |
279 | /* --- v4l ioctls --- */ | 284 | return 0; |
280 | /* take care: bttv does userspace copying, we'll get a | 285 | } |
281 | kernel pointer here... */ | 286 | case V4L2_CID_AUDIO_BALANCE: |
282 | case VIDIOCGAUDIO: | ||
283 | { | 287 | { |
284 | struct video_audio *va = arg; | 288 | int left = (t->lvol+84)*606; |
285 | int left,right; | 289 | int right = (t->rvol+84)*606; |
290 | int volume = max(left,right); | ||
291 | int balance = (32768*min(left,right))/ | ||
292 | (volume ? volume : 1); | ||
293 | ctrl->value=(left<right)? | ||
294 | (65535-balance) : balance; | ||
295 | return 0; | ||
296 | } | ||
297 | case V4L2_CID_AUDIO_BASS: | ||
298 | ctrl->value = (t->bass+12)*2427; /* min -12 max +15 */ | ||
299 | return 0; | ||
300 | case V4L2_CID_AUDIO_TREBLE: | ||
301 | ctrl->value = (t->treble+12)*2730;/* min -12 max +12 */ | ||
302 | return 0; | ||
303 | } | ||
304 | return -EINVAL; | ||
305 | } | ||
286 | 306 | ||
287 | dprintk("VIDIOCGAUDIO\n"); | 307 | static int tda9875_set_ctrl(struct i2c_client *client, |
308 | struct v4l2_control *ctrl) | ||
309 | { | ||
310 | struct tda9875 *t = i2c_get_clientdata(client); | ||
311 | int chvol=0, volume, balance, left, right; | ||
288 | 312 | ||
289 | va->flags |= VIDEO_AUDIO_VOLUME | | 313 | switch (ctrl->id) { |
290 | VIDEO_AUDIO_BASS | | 314 | case V4L2_CID_AUDIO_VOLUME: |
291 | VIDEO_AUDIO_TREBLE; | 315 | left = (t->lvol+84)*606; |
316 | right = (t->rvol+84)*606; | ||
317 | |||
318 | volume = max(left,right); | ||
319 | balance = (32768*min(left,right))/ | ||
320 | (volume ? volume : 1); | ||
321 | balance =(left<right)? | ||
322 | (65535-balance) : balance; | ||
323 | |||
324 | volume = ctrl->value; | ||
292 | 325 | ||
293 | /* min is -84 max is 24 */ | 326 | chvol=1; |
327 | break; | ||
328 | case V4L2_CID_AUDIO_BALANCE: | ||
294 | left = (t->lvol+84)*606; | 329 | left = (t->lvol+84)*606; |
295 | right = (t->rvol+84)*606; | 330 | right = (t->rvol+84)*606; |
296 | va->volume=max(left,right); | 331 | |
297 | va->balance=(32768*min(left,right))/ | 332 | volume=max(left,right); |
298 | (va->volume ? va->volume : 1); | 333 | |
299 | va->balance=(left<right)? | 334 | balance = ctrl->value; |
300 | (65535-va->balance) : va->balance; | 335 | |
301 | va->bass = (t->bass+12)*2427; /* min -12 max +15 */ | 336 | chvol=1; |
302 | va->treble = (t->treble+12)*2730;/* min -12 max +12 */ | 337 | break; |
303 | va->mode |= VIDEO_SOUND_MONO; | 338 | case V4L2_CID_AUDIO_BASS: |
304 | 339 | t->bass = ((ctrl->value/2400)-12) & 0xff; | |
305 | break; /* VIDIOCGAUDIO case */ | 340 | if (t->bass > 15) |
341 | t->bass = 15; | ||
342 | if (t->bass < -12) | ||
343 | t->bass = -12 & 0xff; | ||
344 | break; | ||
345 | case V4L2_CID_AUDIO_TREBLE: | ||
346 | t->treble = ((ctrl->value/2700)-12) & 0xff; | ||
347 | if (t->treble > 12) | ||
348 | t->treble = 12; | ||
349 | if (t->treble < -12) | ||
350 | t->treble = -12 & 0xff; | ||
351 | break; | ||
352 | default: | ||
353 | return -EINVAL; | ||
306 | } | 354 | } |
307 | 355 | ||
308 | case VIDIOCSAUDIO: | 356 | if (chvol) { |
309 | { | 357 | left = (min(65536 - balance,32768) * |
310 | struct video_audio *va = arg; | 358 | volume) / 32768; |
311 | int left,right; | 359 | right = (min(balance,32768) * |
312 | 360 | volume) / 32768; | |
313 | dprintk("VIDEOCSAUDIO...\n"); | ||
314 | left = (min(65536 - va->balance,32768) * | ||
315 | va->volume) / 32768; | ||
316 | right = (min(va->balance,(__u16)32768) * | ||
317 | va->volume) / 32768; | ||
318 | t->lvol = ((left/606)-84) & 0xff; | 361 | t->lvol = ((left/606)-84) & 0xff; |
319 | if (t->lvol > 24) | 362 | if (t->lvol > 24) |
320 | t->lvol = 24; | 363 | t->lvol = 24; |
321 | if (t->lvol < -84) | 364 | if (t->lvol < -84) |
322 | t->lvol = -84 & 0xff; | 365 | t->lvol = -84 & 0xff; |
323 | 366 | ||
324 | t->rvol = ((right/606)-84) & 0xff; | 367 | t->rvol = ((right/606)-84) & 0xff; |
325 | if (t->rvol > 24) | 368 | if (t->rvol > 24) |
326 | t->rvol = 24; | 369 | t->rvol = 24; |
327 | if (t->rvol < -84) | 370 | if (t->rvol < -84) |
328 | t->rvol = -84 & 0xff; | 371 | t->rvol = -84 & 0xff; |
329 | 372 | } | |
330 | t->bass = ((va->bass/2400)-12) & 0xff; | ||
331 | if (t->bass > 15) | ||
332 | t->bass = 15; | ||
333 | if (t->bass < -12) | ||
334 | t->bass = -12 & 0xff; | ||
335 | |||
336 | t->treble = ((va->treble/2700)-12) & 0xff; | ||
337 | if (t->treble > 12) | ||
338 | t->treble = 12; | ||
339 | if (t->treble < -12) | ||
340 | t->treble = -12 & 0xff; | ||
341 | 373 | ||
374 | //printk("tda9875 bal:%04x vol:%04x bass:%04x treble:%04x\n",va->balance,va->volume,va->bass,va->treble); | ||
342 | 375 | ||
376 | tda9875_set(client); | ||
343 | 377 | ||
344 | //printk("tda9875 bal:%04x vol:%04x bass:%04x treble:%04x\n",va->balance,va->volume,va->bass,va->treble); | 378 | return 0; |
379 | } | ||
345 | 380 | ||
346 | 381 | ||
347 | tda9875_set(client); | 382 | static int tda9875_command(struct i2c_client *client, |
383 | unsigned int cmd, void *arg) | ||
384 | { | ||
385 | dprintk("In tda9875_command...\n"); | ||
348 | 386 | ||
349 | break; | 387 | switch (cmd) { |
388 | /* --- v4l ioctls --- */ | ||
389 | /* take care: bttv does userspace copying, we'll get a | ||
390 | kernel pointer here... */ | ||
391 | case VIDIOC_QUERYCTRL: | ||
392 | { | ||
393 | struct v4l2_queryctrl *qc = arg; | ||
394 | |||
395 | switch (qc->id) { | ||
396 | case V4L2_CID_AUDIO_VOLUME: | ||
397 | case V4L2_CID_AUDIO_BASS: | ||
398 | case V4L2_CID_AUDIO_TREBLE: | ||
399 | default: | ||
400 | return -EINVAL; | ||
401 | } | ||
402 | return v4l2_ctrl_query_fill_std(qc); | ||
403 | } | ||
404 | case VIDIOC_S_CTRL: | ||
405 | return tda9875_set_ctrl(client, arg); | ||
350 | 406 | ||
351 | } /* end of VIDEOCSAUDIO case */ | 407 | case VIDIOC_G_CTRL: |
408 | return tda9875_get_ctrl(client, arg); | ||
352 | 409 | ||
353 | default: /* Not VIDEOCGAUDIO or VIDEOCSAUDIO */ | 410 | default: /* Not VIDEOCGAUDIO or VIDEOCSAUDIO */ |
354 | 411 | ||