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/videodev2.h>
29#include <media/videobuf-vmalloc.h>
30#include <media/v4l2-device.h>
31
32#include <linux/i2c.h>
33#include <linux/mutex.h>
34#include <media/ir-kbd-i2c.h>
35#if defined(CONFIG_VIDEO_EM28XX_DVB) || defined(CONFIG_VIDEO_EM28XX_DVB_MODULE)
36#include <media/videobuf-dvb.h>
37#endif
38#include "tuner-xc2028.h"
39#include "em28xx-reg.h"
40
41
42#define EM2800_BOARD_UNKNOWN 0
43#define EM2820_BOARD_UNKNOWN 1
44#define EM2820_BOARD_TERRATEC_CINERGY_250 2
45#define EM2820_BOARD_PINNACLE_USB_2 3
46#define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 4
47#define EM2820_BOARD_MSI_VOX_USB_2 5
48#define EM2800_BOARD_TERRATEC_CINERGY_200 6
49#define EM2800_BOARD_LEADTEK_WINFAST_USBII 7
50#define EM2800_BOARD_KWORLD_USB2800 8
51#define EM2820_BOARD_PINNACLE_DVC_90 9
52#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 10
53#define EM2880_BOARD_TERRATEC_HYBRID_XS 11
54#define EM2820_BOARD_KWORLD_PVRTV2800RF 12
55#define EM2880_BOARD_TERRATEC_PRODIGY_XS 13
56#define EM2820_BOARD_PROLINK_PLAYTV_USB2 14
57#define EM2800_BOARD_VGEAR_POCKETTV 15
58#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 16
59#define EM2880_BOARD_PINNACLE_PCTV_HD_PRO 17
60#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 18
61#define EM2860_BOARD_SAA711X_REFERENCE_DESIGN 19
62#define EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 20
63#define EM2800_BOARD_GRABBEEX_USB2800 21
64#define EM2750_BOARD_UNKNOWN 22
65#define EM2750_BOARD_DLCW_130 23
66#define EM2820_BOARD_DLINK_USB_TV 24
67#define EM2820_BOARD_GADMEI_UTV310 25
68#define EM2820_BOARD_HERCULES_SMART_TV_USB2 26
69#define EM2820_BOARD_PINNACLE_USB_2_FM1216ME 27
70#define EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE 28
71#define EM2820_BOARD_VIDEOLOGY_20K14XUSB 30
72#define EM2821_BOARD_USBGEAR_VD204 31
73#define EM2821_BOARD_SUPERCOMP_USB_2 32
74#define EM2860_BOARD_TERRATEC_HYBRID_XS 34
75#define EM2860_BOARD_TYPHOON_DVD_MAKER 35
76#define EM2860_BOARD_NETGMBH_CAM 36
77#define EM2860_BOARD_GADMEI_UTV330 37
78#define EM2861_BOARD_YAKUMO_MOVIE_MIXER 38
79#define EM2861_BOARD_KWORLD_PVRTV_300U 39
80#define EM2861_BOARD_PLEXTOR_PX_TV100U 40
81#define EM2870_BOARD_KWORLD_350U 41
82#define EM2870_BOARD_KWORLD_355U 42
83#define EM2870_BOARD_TERRATEC_XS 43
84#define EM2870_BOARD_TERRATEC_XS_MT2060 44
85#define EM2870_BOARD_PINNACLE_PCTV_DVB 45
86#define EM2870_BOARD_COMPRO_VIDEOMATE 46
87#define EM2880_BOARD_KWORLD_DVB_305U 47
88#define EM2880_BOARD_KWORLD_DVB_310U 48
89#define EM2880_BOARD_MSI_DIGIVOX_AD 49
90#define EM2880_BOARD_MSI_DIGIVOX_AD_II 50
91#define EM2880_BOARD_TERRATEC_HYBRID_XS_FR 51
92#define EM2881_BOARD_DNT_DA2_HYBRID 52
93#define EM2881_BOARD_PINNACLE_HYBRID_PRO 53
94#define EM2882_BOARD_KWORLD_VS_DVBT 54
95#define EM2882_BOARD_TERRATEC_HYBRID_XS 55
96#define EM2882_BOARD_PINNACLE_HYBRID_PRO 56
97#define EM2883_BOARD_KWORLD_HYBRID_330U 57
98#define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU 58
99#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 60
100#define EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2 61
101#define EM2820_BOARD_GADMEI_TVR200 62
102#define EM2860_BOARD_KAIOMY_TVNPC_U2 63
103#define EM2860_BOARD_EASYCAP 64
104#define EM2820_BOARD_IODATA_GVMVP_SZ 65
105#define EM2880_BOARD_EMPIRE_DUAL_TV 66
106#define EM2860_BOARD_TERRATEC_GRABBY 67
107#define EM2860_BOARD_TERRATEC_AV350 68
108#define EM2882_BOARD_KWORLD_ATSC_315U 69
109#define EM2882_BOARD_EVGA_INDTUBE 70
110#define EM2820_BOARD_SILVERCREST_WEBCAM 71
111#define EM2861_BOARD_GADMEI_UTV330PLUS 72
112#define EM2870_BOARD_REDDO_DVB_C_USB_BOX 73
113
114
115#define EM28XX_MIN_BUF 4
116#define EM28XX_DEF_BUF 8
117
118
119#define URB_MAX_CTRL_SIZE 80
120
121
122#define EM28XX_BOARD_NOT_VALIDATED 1
123#define EM28XX_BOARD_VALIDATED 0
124
125
126#define EM28XX_START_AUDIO 1
127#define EM28XX_STOP_AUDIO 0
128
129
130#define EM28XX_MAXBOARDS 4
131
132
133#define EM28XX_NUM_FRAMES 5
134
135#define EM28XX_NUM_READ_FRAMES 2
136
137
138#define EM28XX_NUM_BUFS 5
139
140
141
142
143
144#define EM28XX_NUM_PACKETS 40
145
146
147#define EM28XX_PINOUT 0
148
149#define EM28XX_INTERLACED_DEFAULT 1
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173#define EM28XX_URB_TIMEOUT \
174 msecs_to_jiffies(EM28XX_NUM_BUFS * EM28XX_NUM_PACKETS)
175
176
177#define EM2800_I2C_WRITE_TIMEOUT 20
178
179enum em28xx_mode {
180 EM28XX_SUSPEND,
181 EM28XX_ANALOG_MODE,
182 EM28XX_DIGITAL_MODE,
183};
184
185enum em28xx_stream_state {
186 STREAM_OFF,
187 STREAM_INTERRUPT,
188 STREAM_ON,
189};
190
191struct em28xx;
192
193struct em28xx_usb_isoc_ctl {
194
195 int max_pkt_size;
196
197
198 int num_bufs;
199
200
201 struct urb **urb;
202
203
204 char **transfer_buffer;
205
206
207 u8 cmd;
208 int pos, size, pktsize;
209
210
211 int field;
212
213
214 u32 tmp_buf;
215 int tmp_buf_len;
216
217
218 struct em28xx_buffer *vid_buf;
219 struct em28xx_buffer *vbi_buf;
220
221
222 int nfields;
223
224
225 int (*isoc_copy) (struct em28xx *dev, struct urb *urb);
226
227};
228
229
230struct em28xx_fmt {
231 char *name;
232 u32 fourcc;
233 int depth;
234 int reg;
235};
236
237
238struct em28xx_buffer {
239
240 struct videobuf_buffer vb;
241
242 struct list_head frame;
243 int top_field;
244 int receiving;
245};
246
247struct em28xx_dmaqueue {
248 struct list_head active;
249 struct list_head queued;
250
251 wait_queue_head_t wq;
252
253
254 int pos;
255};
256
257
258enum em28xx_io_method {
259 IO_NONE,
260 IO_READ,
261 IO_MMAP,
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 struct ir_scancode_table *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
448
449#define EM28XX_RESOURCE_VIDEO 0x01
450#define EM28XX_RESOURCE_VBI 0x02
451
452struct em28xx_audio {
453 char name[50];
454 char *transfer_buffer[EM28XX_AUDIO_BUFS];
455 struct urb *urb[EM28XX_AUDIO_BUFS];
456 struct usb_device *udev;
457 unsigned int capture_transfer_done;
458 struct snd_pcm_substream *capture_pcm_substream;
459
460 unsigned int hwptr_done_capture;
461 struct snd_card *sndcard;
462
463 int users;
464 enum em28xx_stream_state capture_stream;
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 struct v4l2_device v4l2_dev;
490 struct em28xx_board board;
491
492
493 enum em28xx_sensor em28xx_sensor;
494 int sensor_xres, sensor_yres;
495 int sensor_xtal;
496
497
498 int progressive;
499
500
501 int vinmode, vinctl;
502
503 unsigned int has_audio_class:1;
504 unsigned int has_alsa_audio:1;
505
506 struct em28xx_fmt *format;
507
508 struct em28xx_IR *ir;
509
510
511 unsigned int wait_after_write;
512
513 struct list_head devlist;
514
515 u32 i2s_speed;
516
517 struct em28xx_audio_mode audio_mode;
518
519 int tuner_type;
520 int tuner_addr;
521 int tda9887_conf;
522
523 struct i2c_adapter i2c_adap;
524 struct i2c_client i2c_client;
525
526 int users;
527 struct video_device *vdev;
528 v4l2_std_id norm;
529 int ctl_freq;
530 unsigned int ctl_input;
531 unsigned int ctl_ainput;
532 unsigned int ctl_aoutput;
533 int mute;
534 int volume;
535
536 int width;
537 int height;
538 unsigned hscale;
539 unsigned vscale;
540 int interlaced;
541 unsigned int video_bytesread;
542
543 unsigned long hash;
544 unsigned long i2c_hash;
545
546
547 struct em28xx_audio adev;
548
549
550 enum em28xx_dev_state state;
551 enum em28xx_io_method io;
552
553
554 int capture_type;
555 int vbi_read;
556 unsigned char cur_field;
557
558
559 struct work_struct request_module_wk;
560
561
562 struct mutex lock;
563 struct mutex ctrl_urb_lock;
564
565 struct list_head inqueue, outqueue;
566 wait_queue_head_t open, wait_frame, wait_stream;
567 struct video_device *vbi_dev;
568 struct video_device *radio_dev;
569
570
571 unsigned int resources;
572
573 unsigned char eedata[256];
574
575
576 struct em28xx_dmaqueue vidq;
577 struct em28xx_dmaqueue vbiq;
578 struct em28xx_usb_isoc_ctl isoc_ctl;
579 spinlock_t slock;
580
581
582 struct usb_device *udev;
583 int alt;
584 int max_pkt_size;
585 int num_alt;
586 unsigned int *alt_max_pkt_size;
587 struct urb *urb[EM28XX_NUM_BUFS];
588 char *transfer_buffer[EM28XX_NUM_BUFS];
589
590 char urb_buf[URB_MAX_CTRL_SIZE];
591
592
593 int (*em28xx_write_regs) (struct em28xx *dev, u16 reg,
594 char *buf, int len);
595 int (*em28xx_read_reg) (struct em28xx *dev, u16 reg);
596 int (*em28xx_read_reg_req_len) (struct em28xx *dev, u8 req, u16 reg,
597 char *buf, int len);
598 int (*em28xx_write_regs_req) (struct em28xx *dev, u8 req, u16 reg,
599 char *buf, int len);
600 int (*em28xx_read_reg_req) (struct em28xx *dev, u8 req, u16 reg);
601
602 enum em28xx_mode mode;
603
604
605 u16 reg_gpo_num, reg_gpio_num;
606
607
608 unsigned char reg_gpo, reg_gpio;
609
610
611 char snapshot_button_path[30];
612 struct input_dev *sbutton_input_dev;
613 struct delayed_work sbutton_query_work;
614
615 struct em28xx_dvb *dvb;
616
617
618 struct i2c_board_info info;
619 struct IR_i2c_init_data init_data;
620};
621
622struct em28xx_ops {
623 struct list_head next;
624 char *name;
625 int id;
626 int (*init)(struct em28xx *);
627 int (*fini)(struct em28xx *);
628};
629
630
631void em28xx_do_i2c_scan(struct em28xx *dev);
632int em28xx_i2c_register(struct em28xx *dev);
633int em28xx_i2c_unregister(struct em28xx *dev);
634
635
636
637u32 em28xx_request_buffers(struct em28xx *dev, u32 count);
638void em28xx_queue_unusedframes(struct em28xx *dev);
639void em28xx_release_buffers(struct em28xx *dev);
640
641int em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg,
642 char *buf, int len);
643int em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg);
644int em28xx_read_reg(struct em28xx *dev, u16 reg);
645int em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf,
646 int len);
647int em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len);
648int em28xx_write_reg(struct em28xx *dev, u16 reg, u8 val);
649
650int em28xx_read_ac97(struct em28xx *dev, u8 reg);
651int em28xx_write_ac97(struct em28xx *dev, u8 reg, u16 val);
652
653int em28xx_audio_analog_set(struct em28xx *dev);
654int em28xx_audio_setup(struct em28xx *dev);
655
656int em28xx_colorlevels_set_default(struct em28xx *dev);
657int em28xx_capture_start(struct em28xx *dev, int start);
658int em28xx_vbi_supported(struct em28xx *dev);
659int em28xx_set_outfmt(struct em28xx *dev);
660int em28xx_resolution_set(struct em28xx *dev);
661int em28xx_set_alternate(struct em28xx *dev);
662int em28xx_init_isoc(struct em28xx *dev, int max_packets,
663 int num_bufs, int max_pkt_size,
664 int (*isoc_copy) (struct em28xx *dev, struct urb *urb));
665void em28xx_uninit_isoc(struct em28xx *dev);
666int em28xx_isoc_dvb_max_packetsize(struct em28xx *dev);
667int em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode);
668int em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio);
669void em28xx_wake_i2c(struct em28xx *dev);
670void em28xx_remove_from_devlist(struct em28xx *dev);
671void em28xx_add_into_devlist(struct em28xx *dev);
672struct em28xx *em28xx_get_device(int minor,
673 enum v4l2_buf_type *fh_type,
674 int *has_radio);
675int em28xx_register_extension(struct em28xx_ops *dev);
676void em28xx_unregister_extension(struct em28xx_ops *dev);
677void em28xx_init_extension(struct em28xx *dev);
678void em28xx_close_extension(struct em28xx *dev);
679
680
681int em28xx_register_analog_devices(struct em28xx *dev);
682void em28xx_release_analog_resources(struct em28xx *dev);
683
684
685extern int em2800_variant_detect(struct usb_device *udev, int model);
686extern void em28xx_pre_card_setup(struct em28xx *dev);
687extern void em28xx_card_setup(struct em28xx *dev);
688extern struct em28xx_board em28xx_boards[];
689extern struct usb_device_id em28xx_id_table[];
690extern const unsigned int em28xx_bcount;
691void em28xx_register_i2c_ir(struct em28xx *dev);
692int em28xx_tuner_callback(void *ptr, int component, int command, int arg);
693void em28xx_release_resources(struct em28xx *dev);
694
695
696int em28xx_get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
697int em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
698int em28xx_get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key,
699 u32 *ir_raw);
700void em28xx_register_snapshot_button(struct em28xx *dev);
701void em28xx_deregister_snapshot_button(struct em28xx *dev);
702
703int em28xx_ir_init(struct em28xx *dev);
704int em28xx_ir_fini(struct em28xx *dev);
705
706
707extern struct videobuf_queue_ops em28xx_vbi_qops;
708
709
710
711#define em28xx_err(fmt, arg...) do {\
712 printk(KERN_ERR fmt , ##arg); } while (0)
713
714#define em28xx_errdev(fmt, arg...) do {\
715 printk(KERN_ERR "%s: "fmt,\
716 dev->name , ##arg); } while (0)
717
718#define em28xx_info(fmt, arg...) do {\
719 printk(KERN_INFO "%s: "fmt,\
720 dev->name , ##arg); } while (0)
721#define em28xx_warn(fmt, arg...) do {\
722 printk(KERN_WARNING "%s: "fmt,\
723 dev->name , ##arg); } while (0)
724
725static inline int em28xx_compression_disable(struct em28xx *dev)
726{
727
728 return em28xx_write_reg(dev, EM28XX_R26_COMPR, 0x00);
729}
730
731static inline int em28xx_contrast_get(struct em28xx *dev)
732{
733 return em28xx_read_reg(dev, EM28XX_R20_YGAIN) & 0x1f;
734}
735
736static inline int em28xx_brightness_get(struct em28xx *dev)
737{
738 return em28xx_read_reg(dev, EM28XX_R21_YOFFSET);
739}
740
741static inline int em28xx_saturation_get(struct em28xx *dev)
742{
743 return em28xx_read_reg(dev, EM28XX_R22_UVGAIN) & 0x1f;
744}
745
746static inline int em28xx_u_balance_get(struct em28xx *dev)
747{
748 return em28xx_read_reg(dev, EM28XX_R23_UOFFSET);
749}
750
751static inline int em28xx_v_balance_get(struct em28xx *dev)
752{
753 return em28xx_read_reg(dev, EM28XX_R24_VOFFSET);
754}
755
756static inline int em28xx_gamma_get(struct em28xx *dev)
757{
758 return em28xx_read_reg(dev, EM28XX_R14_GAMMA) & 0x3f;
759}
760
761static inline int em28xx_contrast_set(struct em28xx *dev, s32 val)
762{
763 u8 tmp = (u8) val;
764 return em28xx_write_regs(dev, EM28XX_R20_YGAIN, &tmp, 1);
765}
766
767static inline int em28xx_brightness_set(struct em28xx *dev, s32 val)
768{
769 u8 tmp = (u8) val;
770 return em28xx_write_regs(dev, EM28XX_R21_YOFFSET, &tmp, 1);
771}
772
773static inline int em28xx_saturation_set(struct em28xx *dev, s32 val)
774{
775 u8 tmp = (u8) val;
776 return em28xx_write_regs(dev, EM28XX_R22_UVGAIN, &tmp, 1);
777}
778
779static inline int em28xx_u_balance_set(struct em28xx *dev, s32 val)
780{
781 u8 tmp = (u8) val;
782 return em28xx_write_regs(dev, EM28XX_R23_UOFFSET, &tmp, 1);
783}
784
785static inline int em28xx_v_balance_set(struct em28xx *dev, s32 val)
786{
787 u8 tmp = (u8) val;
788 return em28xx_write_regs(dev, EM28XX_R24_VOFFSET, &tmp, 1);
789}
790
791static inline int em28xx_gamma_set(struct em28xx *dev, s32 val)
792{
793 u8 tmp = (u8) val;
794 return em28xx_write_regs(dev, EM28XX_R14_GAMMA, &tmp, 1);
795}
796
797
798static inline unsigned int norm_maxw(struct em28xx *dev)
799{
800 if (dev->board.is_webcam)
801 return dev->sensor_xres;
802
803 if (dev->board.max_range_640_480)
804 return 640;
805
806 return 720;
807}
808
809static inline unsigned int norm_maxh(struct em28xx *dev)
810{
811 if (dev->board.is_webcam)
812 return dev->sensor_yres;
813
814 if (dev->board.max_range_640_480)
815 return 480;
816
817 return (dev->norm & V4L2_STD_625_50) ? 576 : 480;
818}
819#endif
820