diff options
author | Steven Toth <stoth@hauppauge.com> | 2006-12-02 18:15:51 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2006-12-10 05:50:47 -0500 |
commit | 6c5be74c86f102c2d4e123bc51d2fa93155fd794 (patch) | |
tree | 72bb1b00045f7c263721f113f92d286405ae96d7 /drivers/media/video/cx88/cx88.h | |
parent | 91bb9be6ff4101652bb104f9f083f340e73ba6dd (diff) |
V4L/DVB (4676): Dynamic cx88 mpeg port management for HVR1300 MPEG2/DVB-T support.
A series of patches to change the cx88 framework to allow the
PCI mpeg port to be shared dynamically between different
types of drivers or applications. This patch changes the cx88-dvb
and cx88-blackbird drivers to become 'sub drivers' of a higher
single cx88-mpeg driver.
The cx88-mpeg driver is a superset of the previous cx88-mpeg/blackbird
drivers and now owns the IRQ. cx88-dvb/blackbird now become mini drivers,
registering themselves with cx88-mpeg through a standard interface with
callbacks.
Sub drivers request access to hardware via the cx88-mpeg driver. In turn
the cx88-mpeg driver determines whether the hardware is busy and accepts
or refuses the request, grant access using callbacks into the sub drivers.
The net effect is that you are no longer able to tamper with the mpeg port
from multiple different applications at the same time, potentially breaking
a live mpeg2 hardware encoding or dvb stream.
The mechanism extends to enable multiple dvb frontends to be registered
and share the single resource.
Signed-off-by: Steven Toth <stoth@hauppauge.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video/cx88/cx88.h')
-rw-r--r-- | drivers/media/video/cx88/cx88.h | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/drivers/media/video/cx88/cx88.h b/drivers/media/video/cx88/cx88.h index 3bc91aad4fe5..5980e47aee13 100644 --- a/drivers/media/video/cx88/cx88.h +++ b/drivers/media/video/cx88/cx88.h | |||
@@ -74,6 +74,11 @@ enum cx88_board_type { | |||
74 | CX88_MPEG_BLACKBIRD | 74 | CX88_MPEG_BLACKBIRD |
75 | }; | 75 | }; |
76 | 76 | ||
77 | enum cx8802_board_access { | ||
78 | CX8802_DRVCTL_SHARED = 1, | ||
79 | CX8802_DRVCTL_EXCLUSIVE = 2, | ||
80 | }; | ||
81 | |||
77 | /* ----------------------------------------------------------- */ | 82 | /* ----------------------------------------------------------- */ |
78 | /* tv norms */ | 83 | /* tv norms */ |
79 | 84 | ||
@@ -330,6 +335,7 @@ struct cx88_core { | |||
330 | 335 | ||
331 | /* cx88-video needs to access cx8802 for hybrid tuner pll access. */ | 336 | /* cx88-video needs to access cx8802 for hybrid tuner pll access. */ |
332 | struct cx8802_dev *dvbdev; | 337 | struct cx8802_dev *dvbdev; |
338 | enum cx88_board_type active_type_id; | ||
333 | }; | 339 | }; |
334 | 340 | ||
335 | struct cx8800_dev; | 341 | struct cx8800_dev; |
@@ -405,6 +411,31 @@ struct cx8802_suspend_state { | |||
405 | int disabled; | 411 | int disabled; |
406 | }; | 412 | }; |
407 | 413 | ||
414 | struct cx8802_driver { | ||
415 | struct cx88_core *core; | ||
416 | struct list_head devlist; | ||
417 | |||
418 | /* Type of driver and access required */ | ||
419 | enum cx88_board_type type_id; | ||
420 | enum cx8802_board_access hw_access; | ||
421 | |||
422 | /* MPEG 8802 internal only */ | ||
423 | int (*suspend)(struct pci_dev *pci_dev, pm_message_t state); | ||
424 | int (*resume)(struct pci_dev *pci_dev); | ||
425 | |||
426 | /* MPEG 8802 -> mini driver - Driver probe and configuration */ | ||
427 | int (*probe)(struct cx8802_driver *drv); | ||
428 | int (*remove)(struct cx8802_driver *drv); | ||
429 | |||
430 | /* MPEG 8802 -> mini driver - Access for hardware control */ | ||
431 | int (*advise_acquire)(struct cx8802_driver *drv); | ||
432 | int (*advise_release)(struct cx8802_driver *drv); | ||
433 | |||
434 | /* MPEG 8802 <- mini driver - Access for hardware control */ | ||
435 | int (*request_acquire)(struct cx8802_driver *drv); | ||
436 | int (*request_release)(struct cx8802_driver *drv); | ||
437 | }; | ||
438 | |||
408 | struct cx8802_dev { | 439 | struct cx8802_dev { |
409 | struct cx88_core *core; | 440 | struct cx88_core *core; |
410 | spinlock_t slock; | 441 | spinlock_t slock; |
@@ -439,6 +470,9 @@ struct cx8802_dev { | |||
439 | 470 | ||
440 | /* mpeg params */ | 471 | /* mpeg params */ |
441 | struct cx2341x_mpeg_params params; | 472 | struct cx2341x_mpeg_params params; |
473 | |||
474 | /* List of attached drivers */ | ||
475 | struct cx8802_driver drvlist; | ||
442 | }; | 476 | }; |
443 | 477 | ||
444 | /* ----------------------------------------------------------- */ | 478 | /* ----------------------------------------------------------- */ |
@@ -571,6 +605,11 @@ void cx88_get_stereo(struct cx88_core *core, struct v4l2_tuner *t); | |||
571 | void cx88_set_stereo(struct cx88_core *core, u32 mode, int manual); | 605 | void cx88_set_stereo(struct cx88_core *core, u32 mode, int manual); |
572 | int cx88_audio_thread(void *data); | 606 | int cx88_audio_thread(void *data); |
573 | 607 | ||
608 | int cx8802_register_driver(struct cx8802_driver *drv); | ||
609 | int cx8802_unregister_driver(struct cx8802_driver *drv); | ||
610 | struct cx8802_dev * cx8802_get_device(struct inode *inode); | ||
611 | struct cx8802_driver * cx8802_get_driver(struct cx8802_dev *dev, enum cx88_board_type btype); | ||
612 | |||
574 | /* ----------------------------------------------------------- */ | 613 | /* ----------------------------------------------------------- */ |
575 | /* cx88-input.c */ | 614 | /* cx88-input.c */ |
576 | 615 | ||
@@ -600,6 +639,13 @@ extern int cx88_do_ioctl(struct inode *inode, struct file *file, int radio, | |||
600 | extern const u32 cx88_user_ctrls[]; | 639 | extern const u32 cx88_user_ctrls[]; |
601 | extern int cx8800_ctrl_query(struct v4l2_queryctrl *qctrl); | 640 | extern int cx8800_ctrl_query(struct v4l2_queryctrl *qctrl); |
602 | 641 | ||
642 | /* ----------------------------------------------------------- */ | ||
643 | /* cx88-blackbird.c */ | ||
644 | /* used by cx88-ivtv ioctl emulation layer */ | ||
645 | extern int (*cx88_ioctl_hook)(struct inode *inode, struct file *file, | ||
646 | unsigned int cmd, void *arg); | ||
647 | extern unsigned int (*cx88_ioctl_translator)(unsigned int cmd); | ||
648 | |||
603 | /* | 649 | /* |
604 | * Local variables: | 650 | * Local variables: |
605 | * c-basic-offset: 8 | 651 | * c-basic-offset: 8 |