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 CX18_DRIVER_H
26#define CX18_DRIVER_H
27
28#include <linux/module.h>
29#include <linux/moduleparam.h>
30#include <linux/init.h>
31#include <linux/delay.h>
32#include <linux/sched.h>
33#include <linux/fs.h>
34#include <linux/pci.h>
35#include <linux/interrupt.h>
36#include <linux/spinlock.h>
37#include <linux/i2c.h>
38#include <linux/i2c-algo-bit.h>
39#include <linux/list.h>
40#include <linux/unistd.h>
41#include <linux/pagemap.h>
42#include <linux/workqueue.h>
43#include <linux/mutex.h>
44#include <linux/slab.h>
45#include <asm/byteorder.h>
46
47#include <media/v4l2-common.h>
48#include <media/v4l2-ioctl.h>
49#include <media/v4l2-device.h>
50#include <media/v4l2-fh.h>
51#include <media/tuner.h>
52#include <media/ir-kbd-i2c.h>
53#include "cx18-mailbox.h"
54#include "cx18-av-core.h"
55#include "cx23418.h"
56
57
58#include "demux.h"
59#include "dmxdev.h"
60#include "dvb_demux.h"
61#include "dvb_frontend.h"
62#include "dvb_net.h"
63#include "dvbdev.h"
64
65
66#include <media/videobuf-core.h>
67#include <media/videobuf-vmalloc.h>
68
69#ifndef CONFIG_PCI
70# error "This driver requires kernel PCI support."
71#endif
72
73#define CX18_MEM_OFFSET 0x00000000
74#define CX18_MEM_SIZE 0x04000000
75#define CX18_REG_OFFSET 0x02000000
76
77
78#define CX18_MAX_CARDS 32
79
80
81#define CX18_CARD_HVR_1600_ESMT 0
82#define CX18_CARD_HVR_1600_SAMSUNG 1
83#define CX18_CARD_COMPRO_H900 2
84#define CX18_CARD_YUAN_MPC718 3
85#define CX18_CARD_CNXT_RAPTOR_PAL 4
86#define CX18_CARD_TOSHIBA_QOSMIO_DVBT 5
87#define CX18_CARD_LEADTEK_PVR2100 6
88#define CX18_CARD_LEADTEK_DVR3100H 7
89#define CX18_CARD_GOTVIEW_PCI_DVD3 8
90#define CX18_CARD_HVR_1600_S5H1411 9
91#define CX18_CARD_LAST 9
92
93#define CX18_ENC_STREAM_TYPE_MPG 0
94#define CX18_ENC_STREAM_TYPE_TS 1
95#define CX18_ENC_STREAM_TYPE_YUV 2
96#define CX18_ENC_STREAM_TYPE_VBI 3
97#define CX18_ENC_STREAM_TYPE_PCM 4
98#define CX18_ENC_STREAM_TYPE_IDX 5
99#define CX18_ENC_STREAM_TYPE_RAD 6
100#define CX18_MAX_STREAMS 7
101
102
103#define PCI_VENDOR_ID_CX 0x14f1
104#define PCI_DEVICE_ID_CX23418 0x5b7a
105
106
107#define CX18_PCI_ID_HAUPPAUGE 0x0070
108#define CX18_PCI_ID_COMPRO 0x185b
109#define CX18_PCI_ID_YUAN 0x12ab
110#define CX18_PCI_ID_CONEXANT 0x14f1
111#define CX18_PCI_ID_TOSHIBA 0x1179
112#define CX18_PCI_ID_LEADTEK 0x107D
113#define CX18_PCI_ID_GOTVIEW 0x5854
114
115
116
117
118
119
120#define CX18_DEFAULT_ENC_TS_BUFFERS 1
121#define CX18_DEFAULT_ENC_MPG_BUFFERS 2
122#define CX18_DEFAULT_ENC_IDX_BUFFERS 1
123#define CX18_DEFAULT_ENC_YUV_BUFFERS 2
124#define CX18_DEFAULT_ENC_VBI_BUFFERS 1
125#define CX18_DEFAULT_ENC_PCM_BUFFERS 1
126
127
128#define CX18_MAX_FW_MDLS_PER_STREAM 63
129
130
131#define CX18_UNIT_ENC_YUV_BUFSIZE (720 * 32 * 3 / 2)
132#define CX18_625_LINE_ENC_YUV_BUFSIZE (CX18_UNIT_ENC_YUV_BUFSIZE * 576/32)
133#define CX18_525_LINE_ENC_YUV_BUFSIZE (CX18_UNIT_ENC_YUV_BUFSIZE * 480/32)
134
135
136struct cx18_enc_idx_entry {
137 __le32 length;
138 __le32 offset_low;
139 __le32 offset_high;
140 __le32 flags;
141 __le32 pts_low;
142 __le32 pts_high;
143} __attribute__ ((packed));
144#define CX18_UNIT_ENC_IDX_BUFSIZE \
145 (sizeof(struct cx18_enc_idx_entry) * V4L2_ENC_IDX_ENTRIES)
146
147
148#define CX18_DEFAULT_ENC_TS_BUFSIZE 32
149#define CX18_DEFAULT_ENC_MPG_BUFSIZE 32
150#define CX18_DEFAULT_ENC_IDX_BUFSIZE (CX18_UNIT_ENC_IDX_BUFSIZE * 1 / 1024 + 1)
151#define CX18_DEFAULT_ENC_YUV_BUFSIZE (CX18_UNIT_ENC_YUV_BUFSIZE * 3 / 1024 + 1)
152#define CX18_DEFAULT_ENC_PCM_BUFSIZE 4
153
154
155#define I2C_CLIENTS_MAX 16
156
157
158
159
160#define CX18_DBGFLG_WARN (1 << 0)
161#define CX18_DBGFLG_INFO (1 << 1)
162#define CX18_DBGFLG_API (1 << 2)
163#define CX18_DBGFLG_DMA (1 << 3)
164#define CX18_DBGFLG_IOCTL (1 << 4)
165#define CX18_DBGFLG_FILE (1 << 5)
166#define CX18_DBGFLG_I2C (1 << 6)
167#define CX18_DBGFLG_IRQ (1 << 7)
168
169#define CX18_DBGFLG_HIGHVOL (1 << 8)
170
171
172
173#define CX18_DEBUG(x, type, fmt, args...) \
174 do { \
175 if ((x) & cx18_debug) \
176 v4l2_info(&cx->v4l2_dev, " " type ": " fmt , ## args); \
177 } while (0)
178#define CX18_DEBUG_WARN(fmt, args...) CX18_DEBUG(CX18_DBGFLG_WARN, "warning", fmt , ## args)
179#define CX18_DEBUG_INFO(fmt, args...) CX18_DEBUG(CX18_DBGFLG_INFO, "info", fmt , ## args)
180#define CX18_DEBUG_API(fmt, args...) CX18_DEBUG(CX18_DBGFLG_API, "api", fmt , ## args)
181#define CX18_DEBUG_DMA(fmt, args...) CX18_DEBUG(CX18_DBGFLG_DMA, "dma", fmt , ## args)
182#define CX18_DEBUG_IOCTL(fmt, args...) CX18_DEBUG(CX18_DBGFLG_IOCTL, "ioctl", fmt , ## args)
183#define CX18_DEBUG_FILE(fmt, args...) CX18_DEBUG(CX18_DBGFLG_FILE, "file", fmt , ## args)
184#define CX18_DEBUG_I2C(fmt, args...) CX18_DEBUG(CX18_DBGFLG_I2C, "i2c", fmt , ## args)
185#define CX18_DEBUG_IRQ(fmt, args...) CX18_DEBUG(CX18_DBGFLG_IRQ, "irq", fmt , ## args)
186
187#define CX18_DEBUG_HIGH_VOL(x, type, fmt, args...) \
188 do { \
189 if (((x) & cx18_debug) && (cx18_debug & CX18_DBGFLG_HIGHVOL)) \
190 v4l2_info(&cx->v4l2_dev, " " type ": " fmt , ## args); \
191 } while (0)
192#define CX18_DEBUG_HI_WARN(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_WARN, "warning", fmt , ## args)
193#define CX18_DEBUG_HI_INFO(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_INFO, "info", fmt , ## args)
194#define CX18_DEBUG_HI_API(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_API, "api", fmt , ## args)
195#define CX18_DEBUG_HI_DMA(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_DMA, "dma", fmt , ## args)
196#define CX18_DEBUG_HI_IOCTL(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_IOCTL, "ioctl", fmt , ## args)
197#define CX18_DEBUG_HI_FILE(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_FILE, "file", fmt , ## args)
198#define CX18_DEBUG_HI_I2C(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_I2C, "i2c", fmt , ## args)
199#define CX18_DEBUG_HI_IRQ(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_IRQ, "irq", fmt , ## args)
200
201
202#define CX18_ERR(fmt, args...) v4l2_err(&cx->v4l2_dev, fmt , ## args)
203#define CX18_WARN(fmt, args...) v4l2_warn(&cx->v4l2_dev, fmt , ## args)
204#define CX18_INFO(fmt, args...) v4l2_info(&cx->v4l2_dev, fmt , ## args)
205
206
207#define CX18_DEBUG_DEV(x, dev, type, fmt, args...) \
208 do { \
209 if ((x) & cx18_debug) \
210 v4l2_info(dev, " " type ": " fmt , ## args); \
211 } while (0)
212#define CX18_DEBUG_WARN_DEV(dev, fmt, args...) \
213 CX18_DEBUG_DEV(CX18_DBGFLG_WARN, dev, "warning", fmt , ## args)
214#define CX18_DEBUG_INFO_DEV(dev, fmt, args...) \
215 CX18_DEBUG_DEV(CX18_DBGFLG_INFO, dev, "info", fmt , ## args)
216#define CX18_DEBUG_API_DEV(dev, fmt, args...) \
217 CX18_DEBUG_DEV(CX18_DBGFLG_API, dev, "api", fmt , ## args)
218#define CX18_DEBUG_DMA_DEV(dev, fmt, args...) \
219 CX18_DEBUG_DEV(CX18_DBGFLG_DMA, dev, "dma", fmt , ## args)
220#define CX18_DEBUG_IOCTL_DEV(dev, fmt, args...) \
221 CX18_DEBUG_DEV(CX18_DBGFLG_IOCTL, dev, "ioctl", fmt , ## args)
222#define CX18_DEBUG_FILE_DEV(dev, fmt, args...) \
223 CX18_DEBUG_DEV(CX18_DBGFLG_FILE, dev, "file", fmt , ## args)
224#define CX18_DEBUG_I2C_DEV(dev, fmt, args...) \
225 CX18_DEBUG_DEV(CX18_DBGFLG_I2C, dev, "i2c", fmt , ## args)
226#define CX18_DEBUG_IRQ_DEV(dev, fmt, args...) \
227 CX18_DEBUG_DEV(CX18_DBGFLG_IRQ, dev, "irq", fmt , ## args)
228
229#define CX18_DEBUG_HIGH_VOL_DEV(x, dev, type, fmt, args...) \
230 do { \
231 if (((x) & cx18_debug) && (cx18_debug & CX18_DBGFLG_HIGHVOL)) \
232 v4l2_info(dev, " " type ": " fmt , ## args); \
233 } while (0)
234#define CX18_DEBUG_HI_WARN_DEV(dev, fmt, args...) \
235 CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_WARN, dev, "warning", fmt , ## args)
236#define CX18_DEBUG_HI_INFO_DEV(dev, fmt, args...) \
237 CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_INFO, dev, "info", fmt , ## args)
238#define CX18_DEBUG_HI_API_DEV(dev, fmt, args...) \
239 CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_API, dev, "api", fmt , ## args)
240#define CX18_DEBUG_HI_DMA_DEV(dev, fmt, args...) \
241 CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_DMA, dev, "dma", fmt , ## args)
242#define CX18_DEBUG_HI_IOCTL_DEV(dev, fmt, args...) \
243 CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_IOCTL, dev, "ioctl", fmt , ## args)
244#define CX18_DEBUG_HI_FILE_DEV(dev, fmt, args...) \
245 CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_FILE, dev, "file", fmt , ## args)
246#define CX18_DEBUG_HI_I2C_DEV(dev, fmt, args...) \
247 CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_I2C, dev, "i2c", fmt , ## args)
248#define CX18_DEBUG_HI_IRQ_DEV(dev, fmt, args...) \
249 CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_IRQ, dev, "irq", fmt , ## args)
250
251#define CX18_ERR_DEV(dev, fmt, args...) v4l2_err(dev, fmt , ## args)
252#define CX18_WARN_DEV(dev, fmt, args...) v4l2_warn(dev, fmt , ## args)
253#define CX18_INFO_DEV(dev, fmt, args...) v4l2_info(dev, fmt , ## args)
254
255extern int cx18_debug;
256
257struct cx18_options {
258 int megabytes[CX18_MAX_STREAMS];
259 int cardtype;
260 int tuner;
261 int radio;
262};
263
264
265#define CX18_F_M_NEED_SWAP 0
266
267
268#define CX18_F_S_CLAIMED 3
269#define CX18_F_S_STREAMING 4
270#define CX18_F_S_INTERNAL_USE 5
271#define CX18_F_S_STREAMOFF 7
272#define CX18_F_S_APPL_IO 8
273#define CX18_F_S_STOPPING 9
274
275
276#define CX18_F_I_LOADED_FW 0
277#define CX18_F_I_EOS 4
278#define CX18_F_I_RADIO_USER 5
279#define CX18_F_I_ENC_PAUSED 13
280#define CX18_F_I_INITED 21
281#define CX18_F_I_FAILED 22
282
283
284#define CX18_SLICED_TYPE_TELETEXT_B (1)
285#define CX18_SLICED_TYPE_CAPTION_525 (4)
286#define CX18_SLICED_TYPE_WSS_625 (5)
287#define CX18_SLICED_TYPE_VPS (7)
288
289
290
291
292
293
294
295
296
297
298#define list_entry_is_past_end(pos, head, member) \
299 (&pos->member == (head))
300
301struct cx18_buffer {
302 struct list_head list;
303 dma_addr_t dma_handle;
304 char *buf;
305
306 u32 bytesused;
307 u32 readpos;
308};
309
310struct cx18_mdl {
311 struct list_head list;
312 u32 id;
313
314 unsigned int skipped;
315 unsigned long m_flags;
316
317 struct list_head buf_list;
318 struct cx18_buffer *curr_buf;
319
320 u32 bytesused;
321 u32 readpos;
322};
323
324struct cx18_queue {
325 struct list_head list;
326 atomic_t depth;
327 u32 bytesused;
328 spinlock_t lock;
329};
330
331struct cx18_stream;
332
333struct cx18_dvb {
334 struct cx18_stream *stream;
335 struct dmx_frontend hw_frontend;
336 struct dmx_frontend mem_frontend;
337 struct dmxdev dmxdev;
338 struct dvb_adapter dvb_adapter;
339 struct dvb_demux demux;
340 struct dvb_frontend *fe;
341 struct dvb_net dvbnet;
342 int enabled;
343 int feeding;
344 struct mutex feedlock;
345};
346
347struct cx18;
348struct cx18_scb;
349
350
351#define CX18_MAX_MDL_ACKS 2
352#define CX18_MAX_IN_WORK_ORDERS (CX18_MAX_FW_MDLS_PER_STREAM + 7)
353
354
355#define CX18_F_EWO_MB_STALE_UPON_RECEIPT 0x1
356#define CX18_F_EWO_MB_STALE_WHILE_PROC 0x2
357#define CX18_F_EWO_MB_STALE \
358 (CX18_F_EWO_MB_STALE_UPON_RECEIPT | CX18_F_EWO_MB_STALE_WHILE_PROC)
359
360struct cx18_in_work_order {
361 struct work_struct work;
362 atomic_t pending;
363 struct cx18 *cx;
364 unsigned long flags;
365 int rpu;
366 struct cx18_mailbox mb;
367 struct cx18_mdl_ack mdl_ack[CX18_MAX_MDL_ACKS];
368 char *str;
369};
370
371#define CX18_INVALID_TASK_HANDLE 0xffffffff
372
373struct cx18_stream {
374
375
376 struct video_device *video_dev;
377 struct cx18_dvb *dvb;
378 struct cx18 *cx;
379 const char *name;
380 int type;
381 u32 handle;
382 unsigned int mdl_base_idx;
383
384 u32 id;
385 unsigned long s_flags;
386 int dma;
387
388
389 wait_queue_head_t waitq;
390
391
392 struct list_head buf_pool;
393 u32 buffers;
394 u32 buf_size;
395
396
397 u32 bufs_per_mdl;
398 u32 mdl_size;
399
400
401 struct cx18_queue q_free;
402 struct cx18_queue q_busy;
403 struct cx18_queue q_full;
404 struct cx18_queue q_idle;
405
406 struct work_struct out_work_order;
407
408
409 u32 pixelformat;
410 u32 vb_bytes_per_frame;
411 struct list_head vb_capture;
412 spinlock_t vb_lock;
413 struct timer_list vb_timeout;
414
415 struct videobuf_queue vbuf_q;
416 spinlock_t vbuf_q_lock;
417 enum v4l2_buf_type vb_type;
418};
419
420struct cx18_videobuf_buffer {
421
422 struct videobuf_buffer vb;
423 v4l2_std_id tvnorm;
424 u32 bytes_used;
425};
426
427struct cx18_open_id {
428 struct v4l2_fh fh;
429 u32 open_id;
430 int type;
431 struct cx18 *cx;
432};
433
434static inline struct cx18_open_id *fh2id(struct v4l2_fh *fh)
435{
436 return container_of(fh, struct cx18_open_id, fh);
437}
438
439static inline struct cx18_open_id *file2id(struct file *file)
440{
441 return fh2id(file->private_data);
442}
443
444
445struct cx18_card;
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493static const u32 vbi_active_samples = 1444;
494static const u32 vbi_hblank_samples_60Hz = 272;
495static const u32 vbi_hblank_samples_50Hz = 284;
496
497#define CX18_VBI_FRAMES 32
498
499struct vbi_info {
500
501 struct v4l2_format in;
502 struct v4l2_sliced_vbi_format *sliced_in;
503 u32 count;
504 u32 start[2];
505
506 u32 frame;
507
508
509
510
511
512
513
514 int insert_mpeg;
515
516
517
518
519
520
521
522
523 struct v4l2_sliced_vbi_data sliced_data[36];
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547#define CX18_SLICED_MPEG_DATA_MAXSZ 1584
548
549#define CX18_SLICED_MPEG_DATA_BUFSZ (CX18_SLICED_MPEG_DATA_MAXSZ+8)
550 u8 *sliced_mpeg_data[CX18_VBI_FRAMES];
551 u32 sliced_mpeg_size[CX18_VBI_FRAMES];
552
553
554 u32 inserted_frame;
555
556
557
558
559
560
561 struct cx18_mdl sliced_mpeg_mdl;
562 struct cx18_buffer sliced_mpeg_buf;
563};
564
565
566struct cx18_i2c_algo_callback_data {
567 struct cx18 *cx;
568 int bus_index;
569};
570
571#define CX18_MAX_MMIO_WR_RETRIES 10
572
573
574struct cx18 {
575 int instance;
576 struct pci_dev *pci_dev;
577 struct v4l2_device v4l2_dev;
578 struct v4l2_subdev *sd_av;
579 struct v4l2_subdev *sd_extmux;
580
581 const struct cx18_card *card;
582 const char *card_name;
583 const struct cx18_card_tuner_i2c *card_i2c;
584 u8 is_50hz;
585 u8 is_60hz;
586 u8 nof_inputs;
587 u8 nof_audio_inputs;
588 u32 v4l2_cap;
589 u32 hw_flags;
590 unsigned int free_mdl_idx;
591 struct cx18_scb __iomem *scb;
592 struct mutex epu2apu_mb_lock;
593 struct mutex epu2cpu_mb_lock;
594
595 struct cx18_av_state av_state;
596
597
598 struct cx2341x_handler cxhdl;
599 u32 filter_mode;
600 u32 temporal_strength;
601 u32 spatial_strength;
602
603
604 unsigned long dualwatch_jiffies;
605 u32 dualwatch_stereo_mode;
606
607 struct mutex serialize_lock;
608 struct cx18_options options;
609 int stream_buffers[CX18_MAX_STREAMS];
610 int stream_buf_size[CX18_MAX_STREAMS];
611 struct cx18_stream streams[CX18_MAX_STREAMS];
612 struct snd_cx18_card *alsa;
613 void (*pcm_announce_callback)(struct snd_cx18_card *card, u8 *pcm_data,
614 size_t num_bytes);
615
616 unsigned long i_flags;
617 atomic_t ana_capturing;
618 atomic_t tot_capturing;
619 int search_pack_header;
620
621 int open_id;
622
623
624
625 resource_size_t base_addr;
626
627 u8 card_rev;
628 void __iomem *enc_mem, *reg_mem;
629
630 struct vbi_info vbi;
631
632 u64 mpg_data_received;
633 u64 vbi_data_inserted;
634
635 wait_queue_head_t mb_apu_waitq;
636 wait_queue_head_t mb_cpu_waitq;
637 wait_queue_head_t cap_w;
638
639 wait_queue_head_t dma_waitq;
640
641 u32 sw1_irq_mask;
642 u32 sw2_irq_mask;
643 u32 hw2_irq_mask;
644
645 struct workqueue_struct *in_work_queue;
646 char in_workq_name[11];
647 struct cx18_in_work_order in_work_order[CX18_MAX_IN_WORK_ORDERS];
648 char epu_debug_str[256];
649
650
651 struct i2c_adapter i2c_adap[2];
652 struct i2c_algo_bit_data i2c_algo[2];
653 struct cx18_i2c_algo_callback_data i2c_algo_cb_data[2];
654
655 struct IR_i2c_init_data ir_i2c_init_data;
656
657
658 u32 gpio_dir;
659 u32 gpio_val;
660 struct mutex gpio_lock;
661 struct v4l2_subdev sd_gpiomux;
662 struct v4l2_subdev sd_resetctrl;
663
664
665
666
667 u32 audio_input;
668 u32 active_input;
669 v4l2_std_id std;
670 v4l2_std_id tuner_std;
671
672
673 struct work_struct request_module_wk;
674};
675
676static inline struct cx18 *to_cx18(struct v4l2_device *v4l2_dev)
677{
678 return container_of(v4l2_dev, struct cx18, v4l2_dev);
679}
680
681
682extern int (*cx18_ext_init)(struct cx18 *);
683
684
685extern int cx18_first_minor;
686
687
688
689
690int cx18_msleep_timeout(unsigned int msecs, int intr);
691
692
693struct tveeprom;
694void cx18_read_eeprom(struct cx18 *cx, struct tveeprom *tv);
695
696
697int cx18_init_on_first_open(struct cx18 *cx);
698
699
700static inline int cx18_raw_vbi(const struct cx18 *cx)
701{
702 return cx->vbi.in.type == V4L2_BUF_TYPE_VBI_CAPTURE;
703}
704
705
706
707#define cx18_call_hw(cx, hw, o, f, args...) \
708 do { \
709 struct v4l2_subdev *__sd; \
710 __v4l2_device_call_subdevs_p(&(cx)->v4l2_dev, __sd, \
711 !(hw) || (__sd->grp_id & (hw)), o, f , ##args); \
712 } while (0)
713
714#define cx18_call_all(cx, o, f, args...) cx18_call_hw(cx, 0, o, f , ##args)
715
716
717
718
719#define cx18_call_hw_err(cx, hw, o, f, args...) \
720({ \
721 struct v4l2_subdev *__sd; \
722 __v4l2_device_call_subdevs_until_err_p(&(cx)->v4l2_dev, \
723 __sd, !(hw) || (__sd->grp_id & (hw)), o, f, \
724 ##args); \
725})
726
727#define cx18_call_all_err(cx, o, f, args...) \
728 cx18_call_hw_err(cx, 0, o, f , ##args)
729
730#endif
731