1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#ifndef _EM28XX_H
26#define _EM28XX_H
27
28#include <linux/workqueue.h>
29#include <linux/i2c.h>
30#include <linux/mutex.h>
31#include <linux/videodev2.h>
32
33#include <media/videobuf-vmalloc.h>
34#include <media/v4l2-device.h>
35#include <media/ir-kbd-i2c.h>
36#include <media/rc-core.h>
37#if defined(CONFIG_VIDEO_EM28XX_DVB) || defined(CONFIG_VIDEO_EM28XX_DVB_MODULE)
38#include <media/videobuf-dvb.h>
39#endif
40#include "tuner-xc2028.h"
41#include "xc5000.h"
42#include "em28xx-reg.h"
43
44
45#define EM2800_BOARD_UNKNOWN 0
46#define EM2820_BOARD_UNKNOWN 1
47#define EM2820_BOARD_TERRATEC_CINERGY_250 2
48#define EM2820_BOARD_PINNACLE_USB_2 3
49#define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 4
50#define EM2820_BOARD_MSI_VOX_USB_2 5
51#define EM2800_BOARD_TERRATEC_CINERGY_200 6
52#define EM2800_BOARD_LEADTEK_WINFAST_USBII 7
53#define EM2800_BOARD_KWORLD_USB2800 8
54#define EM2820_BOARD_PINNACLE_DVC_90 9
55#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 10
56#define EM2880_BOARD_TERRATEC_HYBRID_XS 11
57#define EM2820_BOARD_KWORLD_PVRTV2800RF 12
58#define EM2880_BOARD_TERRATEC_PRODIGY_XS 13
59#define EM2820_BOARD_PROLINK_PLAYTV_USB2 14
60#define EM2800_BOARD_VGEAR_POCKETTV 15
61#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 16
62#define EM2880_BOARD_PINNACLE_PCTV_HD_PRO 17
63#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 18
64#define EM2860_BOARD_SAA711X_REFERENCE_DESIGN 19
65#define EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 20
66#define EM2800_BOARD_GRABBEEX_USB2800 21
67#define EM2750_BOARD_UNKNOWN 22
68#define EM2750_BOARD_DLCW_130 23
69#define EM2820_BOARD_DLINK_USB_TV 24
70#define EM2820_BOARD_GADMEI_UTV310 25
71#define EM2820_BOARD_HERCULES_SMART_TV_USB2 26
72#define EM2820_BOARD_PINNACLE_USB_2_FM1216ME 27
73#define EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE 28
74#define EM2860_BOARD_TVP5150_REFERENCE_DESIGN 29
75#define EM2820_BOARD_VIDEOLOGY_20K14XUSB 30
76#define EM2821_BOARD_USBGEAR_VD204 31
77#define EM2821_BOARD_SUPERCOMP_USB_2 32
78#define EM2860_BOARD_ELGATO_VIDEO_CAPTURE 33
79#define EM2860_BOARD_TERRATEC_HYBRID_XS 34
80#define EM2860_BOARD_TYPHOON_DVD_MAKER 35
81#define EM2860_BOARD_NETGMBH_CAM 36
82#define EM2860_BOARD_GADMEI_UTV330 37
83#define EM2861_BOARD_YAKUMO_MOVIE_MIXER 38
84#define EM2861_BOARD_KWORLD_PVRTV_300U 39
85#define EM2861_BOARD_PLEXTOR_PX_TV100U 40
86#define EM2870_BOARD_KWORLD_350U 41
87#define EM2870_BOARD_KWORLD_355U 42
88#define EM2870_BOARD_TERRATEC_XS 43
89#define EM2870_BOARD_TERRATEC_XS_MT2060 44
90#define EM2870_BOARD_PINNACLE_PCTV_DVB 45
91#define EM2870_BOARD_COMPRO_VIDEOMATE 46
92#define EM2880_BOARD_KWORLD_DVB_305U 47
93#define EM2880_BOARD_KWORLD_DVB_310U 48
94#define EM2880_BOARD_MSI_DIGIVOX_AD 49
95#define EM2880_BOARD_MSI_DIGIVOX_AD_II 50
96#define EM2880_BOARD_TERRATEC_HYBRID_XS_FR 51
97#define EM2881_BOARD_DNT_DA2_HYBRID 52
98#define EM2881_BOARD_PINNACLE_HYBRID_PRO 53
99#define EM2882_BOARD_KWORLD_VS_DVBT 54
100#define EM2882_BOARD_TERRATEC_HYBRID_XS 55
101#define EM2882_BOARD_PINNACLE_HYBRID_PRO_330E 56
102#define EM2883_BOARD_KWORLD_HYBRID_330U 57
103#define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU 58
104#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 60
105#define EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2 61
106#define EM2820_BOARD_GADMEI_TVR200 62
107#define EM2860_BOARD_KAIOMY_TVNPC_U2 63
108#define EM2860_BOARD_EASYCAP 64
109#define EM2820_BOARD_IODATA_GVMVP_SZ 65
110#define EM2880_BOARD_EMPIRE_DUAL_TV 66
111#define EM2860_BOARD_TERRATEC_GRABBY 67
112#define EM2860_BOARD_TERRATEC_AV350 68
113#define EM2882_BOARD_KWORLD_ATSC_315U 69
114#define EM2882_BOARD_EVGA_INDTUBE 70
115#define EM2820_BOARD_SILVERCREST_WEBCAM 71
116#define EM2861_BOARD_GADMEI_UTV330PLUS 72
117#define EM2870_BOARD_REDDO_DVB_C_USB_BOX 73
118#define EM2800_BOARD_VC211A 74
119#define EM2882_BOARD_DIKOM_DK300 75
120#define EM2870_BOARD_KWORLD_A340 76
121#define EM2874_BOARD_LEADERSHIP_ISDBT 77
122#define EM28174_BOARD_PCTV_290E 78
123#define EM2884_BOARD_TERRATEC_H5 79
124#define EM28174_BOARD_PCTV_460E 80
125#define EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C 81
126#define EM2884_BOARD_CINERGY_HTC_STICK 82
127#define EM2860_BOARD_HT_VIDBOX_NW03 83
128#define EM2874_BOARD_MAXMEDIA_UB425_TC 84
129#define EM2884_BOARD_PCTV_510E 85
130#define EM2884_BOARD_PCTV_520E 86
131
132
133#define EM28XX_MIN_BUF 4
134#define EM28XX_DEF_BUF 8
135
136
137#define URB_MAX_CTRL_SIZE 80
138
139
140#define EM28XX_BOARD_NOT_VALIDATED 1
141#define EM28XX_BOARD_VALIDATED 0
142
143
144#define EM28XX_START_AUDIO 1
145#define EM28XX_STOP_AUDIO 0
146
147
148#define EM28XX_MAXBOARDS 4
149
150
151#define EM28XX_NUM_FRAMES 5
152
153#define EM28XX_NUM_READ_FRAMES 2
154
155
156#define EM28XX_NUM_BUFS 5
157#define EM28XX_DVB_NUM_BUFS 5
158
159
160
161
162
163#define EM28XX_NUM_PACKETS 64
164#define EM28XX_DVB_MAX_PACKETS 64
165
166#define EM28XX_INTERLACED_DEFAULT 1
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190#define EM28XX_URB_TIMEOUT \
191 msecs_to_jiffies(EM28XX_NUM_BUFS * EM28XX_NUM_PACKETS)
192
193
194#define EM2800_I2C_WRITE_TIMEOUT 20
195
196enum em28xx_mode {
197 EM28XX_SUSPEND,
198 EM28XX_ANALOG_MODE,
199 EM28XX_DIGITAL_MODE,
200};
201
202
203struct em28xx;
204
205struct em28xx_usb_isoc_bufs {
206
207 int max_pkt_size;
208
209
210 int num_packets;
211
212
213 int num_bufs;
214
215
216 struct urb **urb;
217
218
219 char **transfer_buffer;
220};
221
222struct em28xx_usb_isoc_ctl {
223
224 struct em28xx_usb_isoc_bufs analog_bufs;
225
226
227 struct em28xx_usb_isoc_bufs digital_bufs;
228
229
230 struct em28xx_buffer *vid_buf;
231 struct em28xx_buffer *vbi_buf;
232
233
234 int (*isoc_copy) (struct em28xx *dev, struct urb *urb);
235
236};
237
238
239struct em28xx_fmt {
240 char *name;
241 u32 fourcc;
242 int depth;
243 int reg;
244};
245
246
247struct em28xx_buffer {
248
249 struct videobuf_buffer vb;
250
251 struct list_head frame;
252 int top_field;
253};
254
255struct em28xx_dmaqueue {
256 struct list_head active;
257
258 wait_queue_head_t wq;
259
260
261 int pos;
262};
263
264
265
266#define MAX_EM28XX_INPUT 4
267enum enum28xx_itype {
268 EM28XX_VMUX_COMPOSITE1 = 1,
269 EM28XX_VMUX_COMPOSITE2,
270 EM28XX_VMUX_COMPOSITE3,
271 EM28XX_VMUX_COMPOSITE4,
272 EM28XX_VMUX_SVIDEO,
273 EM28XX_VMUX_TELEVISION,
274 EM28XX_VMUX_CABLE,
275 EM28XX_VMUX_DVB,
276 EM28XX_VMUX_DEBUG,
277 EM28XX_RADIO,
278};
279
280enum em28xx_ac97_mode {
281 EM28XX_NO_AC97 = 0,
282 EM28XX_AC97_EM202,
283 EM28XX_AC97_SIGMATEL,
284 EM28XX_AC97_OTHER,
285};
286
287struct em28xx_audio_mode {
288 enum em28xx_ac97_mode ac97;
289
290 u16 ac97_feat;
291 u32 ac97_vendor_id;
292
293 unsigned int has_audio:1;
294
295 unsigned int i2s_3rates:1;
296 unsigned int i2s_5rates:1;
297};
298
299
300
301
302
303
304
305enum em28xx_amux {
306
307 EM28XX_AMUX_VIDEO,
308
309 EM28XX_AMUX_LINE_IN,
310
311
312 EM28XX_AMUX_VIDEO2,
313 EM28XX_AMUX_PHONE,
314 EM28XX_AMUX_MIC,
315 EM28XX_AMUX_CD,
316 EM28XX_AMUX_AUX,
317 EM28XX_AMUX_PCM_OUT,
318};
319
320enum em28xx_aout {
321
322 EM28XX_AOUT_MASTER = 1 << 0,
323 EM28XX_AOUT_LINE = 1 << 1,
324 EM28XX_AOUT_MONO = 1 << 2,
325 EM28XX_AOUT_LFE = 1 << 3,
326 EM28XX_AOUT_SURR = 1 << 4,
327
328
329 EM28XX_AOUT_PCM_IN = 1 << 7,
330
331
332 EM28XX_AOUT_PCM_MIC_PCM = 0 << 8,
333 EM28XX_AOUT_PCM_CD = 1 << 8,
334 EM28XX_AOUT_PCM_VIDEO = 2 << 8,
335 EM28XX_AOUT_PCM_AUX = 3 << 8,
336 EM28XX_AOUT_PCM_LINE = 4 << 8,
337 EM28XX_AOUT_PCM_STEREO = 5 << 8,
338 EM28XX_AOUT_PCM_MONO = 6 << 8,
339 EM28XX_AOUT_PCM_PHONE = 7 << 8,
340};
341
342static inline int ac97_return_record_select(int a_out)
343{
344 return (a_out & 0x700) >> 8;
345}
346
347struct em28xx_reg_seq {
348 int reg;
349 unsigned char val, mask;
350 int sleep;
351};
352
353struct em28xx_input {
354 enum enum28xx_itype type;
355 unsigned int vmux;
356 enum em28xx_amux amux;
357 enum em28xx_aout aout;
358 struct em28xx_reg_seq *gpio;
359};
360
361#define INPUT(nr) (&em28xx_boards[dev->model].input[nr])
362
363enum em28xx_decoder {
364 EM28XX_NODECODER = 0,
365 EM28XX_TVP5150,
366 EM28XX_SAA711X,
367};
368
369enum em28xx_sensor {
370 EM28XX_NOSENSOR = 0,
371 EM28XX_MT9V011,
372 EM28XX_MT9M001,
373 EM28XX_MT9M111,
374};
375
376enum em28xx_adecoder {
377 EM28XX_NOADECODER = 0,
378 EM28XX_TVAUDIO,
379};
380
381struct em28xx_board {
382 char *name;
383 int vchannels;
384 int tuner_type;
385 int tuner_addr;
386
387
388 unsigned int tda9887_conf;
389
390
391 struct em28xx_reg_seq *dvb_gpio;
392 struct em28xx_reg_seq *suspend_gpio;
393 struct em28xx_reg_seq *tuner_gpio;
394 struct em28xx_reg_seq *mute_gpio;
395
396 unsigned int is_em2800:1;
397 unsigned int has_msp34xx:1;
398 unsigned int mts_firmware:1;
399 unsigned int max_range_640_480:1;
400 unsigned int has_dvb:1;
401 unsigned int has_snapshot_button:1;
402 unsigned int is_webcam:1;
403 unsigned int valid:1;
404 unsigned int has_ir_i2c:1;
405
406 unsigned char xclk, i2c_speed;
407 unsigned char radio_addr;
408 unsigned short tvaudio_addr;
409
410 enum em28xx_decoder decoder;
411 enum em28xx_adecoder adecoder;
412
413 struct em28xx_input input[MAX_EM28XX_INPUT];
414 struct em28xx_input radio;
415 char *ir_codes;
416};
417
418struct em28xx_eeprom {
419 u32 id;
420 u16 vendor_ID;
421 u16 product_ID;
422
423 u16 chip_conf;
424
425 u16 board_conf;
426
427 u16 string1, string2, string3;
428
429 u8 string_idx_table;
430};
431
432
433enum em28xx_dev_state {
434 DEV_INITIALIZED = 0x01,
435 DEV_DISCONNECTED = 0x02,
436 DEV_MISCONFIGURED = 0x04,
437};
438
439#define EM28XX_AUDIO_BUFS 5
440#define EM28XX_NUM_AUDIO_PACKETS 64
441#define EM28XX_AUDIO_MAX_PACKET_SIZE 196
442#define EM28XX_CAPTURE_STREAM_EN 1
443
444
445#define EM28XX_AUDIO 0x10
446#define EM28XX_DVB 0x20
447#define EM28XX_RC 0x30
448
449
450#define EM28XX_RESOURCE_VIDEO 0x01
451#define EM28XX_RESOURCE_VBI 0x02
452
453struct em28xx_audio {
454 char name[50];
455 char *transfer_buffer[EM28XX_AUDIO_BUFS];
456 struct urb *urb[EM28XX_AUDIO_BUFS];
457 struct usb_device *udev;
458 unsigned int capture_transfer_done;
459 struct snd_pcm_substream *capture_pcm_substream;
460
461 unsigned int hwptr_done_capture;
462 struct snd_card *sndcard;
463
464 int users;
465 spinlock_t slock;
466};
467
468struct em28xx;
469
470struct em28xx_fh {
471 struct em28xx *dev;
472 int radio;
473 unsigned int resources;
474
475 struct videobuf_queue vb_vidq;
476 struct videobuf_queue vb_vbiq;
477
478 enum v4l2_buf_type type;
479};
480
481
482struct em28xx {
483
484 char name[30];
485 int model;
486 int devno;
487 enum em28xx_chip_id chip_id;
488
489 int audio_ifnum;
490
491 struct v4l2_device v4l2_dev;
492 struct em28xx_board board;
493
494
495 enum em28xx_sensor em28xx_sensor;
496 int sensor_xres, sensor_yres;
497 int sensor_xtal;
498
499
500 int progressive;
501
502
503 int vinmode, vinctl;
504
505 unsigned int has_audio_class:1;
506 unsigned int has_alsa_audio:1;
507 unsigned int is_audio_only:1;
508
509
510 struct work_struct wq_trigger;
511 atomic_t stream_started;
512
513 struct em28xx_fmt *format;
514
515 struct em28xx_IR *ir;
516
517
518 unsigned int wait_after_write;
519
520 struct list_head devlist;
521
522 u32 i2s_speed;
523
524 struct em28xx_audio_mode audio_mode;
525
526 int tuner_type;
527 int tuner_addr;
528 int tda9887_conf;
529
530 struct i2c_adapter i2c_adap;
531 struct i2c_client i2c_client;
532
533 int users;
534 struct video_device *vdev;
535 v4l2_std_id norm;
536 int ctl_freq;
537 unsigned int ctl_input;
538 unsigned int ctl_ainput;
539 unsigned int ctl_aoutput;
540 int mute;
541 int volume;
542
543 int width;
544 int height;
545 unsigned hscale;
546 unsigned vscale;
547 int interlaced;
548 unsigned int video_bytesread;
549
550 unsigned long hash;
551 unsigned long i2c_hash;
552
553
554 struct em28xx_audio adev;
555
556
557 enum em28xx_dev_state state;
558
559
560 int capture_type;
561 int vbi_read;
562 unsigned char cur_field;
563 unsigned int vbi_width;
564 unsigned int vbi_height;
565
566 struct work_struct request_module_wk;
567
568
569 struct mutex lock;
570 struct mutex ctrl_urb_lock;
571
572 struct list_head inqueue, outqueue;
573 struct video_device *vbi_dev;
574 struct video_device *radio_dev;
575
576
577 unsigned int resources;
578
579 unsigned char eedata[256];
580
581
582 struct em28xx_dmaqueue vidq;
583 struct em28xx_dmaqueue vbiq;
584 struct em28xx_usb_isoc_ctl isoc_ctl;
585 spinlock_t slock;
586
587
588 struct usb_device *udev;
589 int alt;
590 int max_pkt_size;
591 int num_alt;
592 unsigned int *alt_max_pkt_size;
593 int dvb_alt;
594 unsigned int dvb_max_pkt_size;
595 char urb_buf[URB_MAX_CTRL_SIZE];
596
597
598 int (*em28xx_write_regs) (struct em28xx *dev, u16 reg,
599 char *buf, int len);
600 int (*em28xx_read_reg) (struct em28xx *dev, u16 reg);
601 int (*em28xx_read_reg_req_len) (struct em28xx *dev, u8 req, u16 reg,
602 char *buf, int len);
603 int (*em28xx_write_regs_req) (struct em28xx *dev, u8 req, u16 reg,
604 char *buf, int len);
605 int (*em28xx_read_reg_req) (struct em28xx *dev, u8 req, u16 reg);
606
607 enum em28xx_mode mode;
608
609
610 u16 reg_gpo_num, reg_gpio_num;
611
612
613 unsigned char reg_gpo, reg_gpio;
614
615
616 char snapshot_button_path[30];
617 struct input_dev *sbutton_input_dev;
618 struct delayed_work sbutton_query_work;
619
620 struct em28xx_dvb *dvb;
621
622
623 struct IR_i2c_init_data init_data;
624};
625
626struct em28xx_ops {
627 struct list_head next;
628 char *name;
629 int id;
630 int (*init)(struct em28xx *);
631 int (*fini)(struct em28xx *);
632};
633
634
635void em28xx_do_i2c_scan(struct em28xx *dev);
636int em28xx_i2c_register(struct em28xx *dev);
637int em28xx_i2c_unregister(struct em28xx *dev);
638
639
640
641u32 em28xx_request_buffers(struct em28xx *dev, u32 count);
642void em28xx_queue_unusedframes(struct em28xx *dev);
643void em28xx_release_buffers(struct em28xx *dev);
644
645int em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg,
646 char *buf, int len);
647int em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg);
648int em28xx_read_reg(struct em28xx *dev, u16 reg);
649int em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf,
650 int len);
651int em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len);
652int em28xx_write_reg(struct em28xx *dev, u16 reg, u8 val);
653int em28xx_write_reg_bits(struct em28xx *dev, u16 reg, u8 val,
654 u8 bitmask);
655
656int em28xx_read_ac97(struct em28xx *dev, u8 reg);
657int em28xx_write_ac97(struct em28xx *dev, u8 reg, u16 val);
658
659int em28xx_audio_analog_set(struct em28xx *dev);
660int em28xx_audio_setup(struct em28xx *dev);
661
662int em28xx_colorlevels_set_default(struct em28xx *dev);
663int em28xx_capture_start(struct em28xx *dev, int start);
664int em28xx_vbi_supported(struct em28xx *dev);
665int em28xx_set_outfmt(struct em28xx *dev);
666int em28xx_resolution_set(struct em28xx *dev);
667int em28xx_set_alternate(struct em28xx *dev);
668int em28xx_alloc_isoc(struct em28xx *dev, enum em28xx_mode mode,
669 int max_packets, int num_bufs, int max_pkt_size);
670int em28xx_init_isoc(struct em28xx *dev, enum em28xx_mode mode,
671 int max_packets, int num_bufs, int max_pkt_size,
672 int (*isoc_copy) (struct em28xx *dev, struct urb *urb));
673void em28xx_uninit_isoc(struct em28xx *dev, enum em28xx_mode mode);
674void em28xx_stop_urbs(struct em28xx *dev);
675int em28xx_isoc_dvb_max_packetsize(struct em28xx *dev);
676int em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode);
677int em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio);
678void em28xx_wake_i2c(struct em28xx *dev);
679int em28xx_register_extension(struct em28xx_ops *dev);
680void em28xx_unregister_extension(struct em28xx_ops *dev);
681void em28xx_init_extension(struct em28xx *dev);
682void em28xx_close_extension(struct em28xx *dev);
683
684
685int em28xx_register_analog_devices(struct em28xx *dev);
686void em28xx_release_analog_resources(struct em28xx *dev);
687
688
689extern int em2800_variant_detect(struct usb_device *udev, int model);
690extern struct em28xx_board em28xx_boards[];
691extern struct usb_device_id em28xx_id_table[];
692extern const unsigned int em28xx_bcount;
693int em28xx_tuner_callback(void *ptr, int component, int command, int arg);
694void em28xx_release_resources(struct em28xx *dev);
695
696
697extern struct videobuf_queue_ops em28xx_vbi_qops;
698
699
700
701#define em28xx_err(fmt, arg...) do {\
702 printk(KERN_ERR fmt , ##arg); } while (0)
703
704#define em28xx_errdev(fmt, arg...) do {\
705 printk(KERN_ERR "%s: "fmt,\
706 dev->name , ##arg); } while (0)
707
708#define em28xx_info(fmt, arg...) do {\
709 printk(KERN_INFO "%s: "fmt,\
710 dev->name , ##arg); } while (0)
711#define em28xx_warn(fmt, arg...) do {\
712 printk(KERN_WARNING "%s: "fmt,\
713 dev->name , ##arg); } while (0)
714
715static inline int em28xx_compression_disable(struct em28xx *dev)
716{
717
718 return em28xx_write_reg(dev, EM28XX_R26_COMPR, 0x00);
719}
720
721static inline int em28xx_contrast_get(struct em28xx *dev)
722{
723 return em28xx_read_reg(dev, EM28XX_R20_YGAIN) & 0x1f;
724}
725
726static inline int em28xx_brightness_get(struct em28xx *dev)
727{
728 return em28xx_read_reg(dev, EM28XX_R21_YOFFSET);
729}
730
731static inline int em28xx_saturation_get(struct em28xx *dev)
732{
733 return em28xx_read_reg(dev, EM28XX_R22_UVGAIN) & 0x1f;
734}
735
736static inline int em28xx_u_balance_get(struct em28xx *dev)
737{
738 return em28xx_read_reg(dev, EM28XX_R23_UOFFSET);
739}
740
741static inline int em28xx_v_balance_get(struct em28xx *dev)
742{
743 return em28xx_read_reg(dev, EM28XX_R24_VOFFSET);
744}
745
746static inline int em28xx_gamma_get(struct em28xx *dev)
747{
748 return em28xx_read_reg(dev, EM28XX_R14_GAMMA) & 0x3f;
749}
750
751static inline int em28xx_contrast_set(struct em28xx *dev, s32 val)
752{
753 u8 tmp = (u8) val;
754 return em28xx_write_regs(dev, EM28XX_R20_YGAIN, &tmp, 1);
755}
756
757static inline int em28xx_brightness_set(struct em28xx *dev, s32 val)
758{
759 u8 tmp = (u8) val;
760 return em28xx_write_regs(dev, EM28XX_R21_YOFFSET, &tmp, 1);
761}
762
763static inline int em28xx_saturation_set(struct em28xx *dev, s32 val)
764{
765 u8 tmp = (u8) val;
766 return em28xx_write_regs(dev, EM28XX_R22_UVGAIN, &tmp, 1);
767}
768
769static inline int em28xx_u_balance_set(struct em28xx *dev, s32 val)
770{
771 u8 tmp = (u8) val;
772 return em28xx_write_regs(dev, EM28XX_R23_UOFFSET, &tmp, 1);
773}
774
775static inline int em28xx_v_balance_set(struct em28xx *dev, s32 val)
776{
777 u8 tmp = (u8) val;
778 return em28xx_write_regs(dev, EM28XX_R24_VOFFSET, &tmp, 1);
779}
780
781static inline int em28xx_gamma_set(struct em28xx *dev, s32 val)
782{
783 u8 tmp = (u8) val;
784 return em28xx_write_regs(dev, EM28XX_R14_GAMMA, &tmp, 1);
785}
786
787
788static inline unsigned int norm_maxw(struct em28xx *dev)
789{
790 if (dev->board.is_webcam)
791 return dev->sensor_xres;
792
793 if (dev->board.max_range_640_480)
794 return 640;
795
796 return 720;
797}
798
799static inline unsigned int norm_maxh(struct em28xx *dev)
800{
801 if (dev->board.is_webcam)
802 return dev->sensor_yres;
803
804 if (dev->board.max_range_640_480)
805 return 480;
806
807 return (dev->norm & V4L2_STD_625_50) ? 576 : 480;
808}
809#endif
810