kernel-fxtec-pro1x/include/media/videobuf-dvb.h
Darron Broad 59b1842da1 V4L/DVB (9227): MFE: Add multi-frontend mutual exclusion
This add frontend R/W mutual exclusion.
Prior to this point in time it was possible to open both
frontends simultaneously which an MFE card cannot support.

In order to stop this, a delayed open is performed which
has the following function:

-  Return EBUSY after a configurable amount of time
   if a frontend is unavailable due to the other being
   in use.

-  Only allow opening of a frontend if the kernel thread
   of the other has stopped.

This solution was chosen to allow switching between
frontends to work as seamlessly as possible. When both
frontends are actually opened simultaneously then one
will only open, but if quick switching is performed
between one of many then the new open will succeed in
a clean fashion rather than interrupting a kernel
thread.

Signed-off-by: Darron Broad <darron@kewl.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2008-10-17 17:24:15 -03:00

71 lines
2 KiB
C

#include <dvbdev.h>
#include <dmxdev.h>
#include <dvb_demux.h>
#include <dvb_net.h>
#include <dvb_frontend.h>
struct videobuf_dvb {
/* filling that the job of the driver */
char *name;
struct dvb_frontend *frontend;
struct videobuf_queue dvbq;
/* video-buf-dvb state info */
struct mutex lock;
struct task_struct *thread;
int nfeeds;
/* videobuf_dvb_(un)register manges this */
struct dvb_adapter adapter;
struct dvb_demux demux;
struct dmxdev dmxdev;
struct dmx_frontend fe_hw;
struct dmx_frontend fe_mem;
struct dvb_net net;
};
struct videobuf_dvb_frontend {
void *dev;
struct list_head felist;
int id;
struct videobuf_dvb dvb;
};
struct videobuf_dvb_frontends {
struct mutex lock;
struct dvb_adapter adapter;
int active_fe_id; /* Indicates which frontend in the felist is in use */
struct videobuf_dvb_frontend frontend;
int gate; /* Frontend with gate control 0=!MFE,1=fe0,2=fe1 etc */
};
int videobuf_dvb_register_bus(struct videobuf_dvb_frontends *f,
struct module *module,
void *adapter_priv,
struct device *device,
short *adapter_nr,
int mfe_shared);
void videobuf_dvb_unregister_bus(struct videobuf_dvb_frontends *f);
int videobuf_dvb_register_adapter(struct videobuf_dvb_frontends *f,
struct module *module,
void *adapter_priv,
struct device *device,
char *adapter_name,
short *adapter_nr,
int mfe_shared);
int videobuf_dvb_register_frontend(struct dvb_adapter *adapter, struct videobuf_dvb *dvb);
struct videobuf_dvb_frontend * videobuf_dvb_alloc_frontend(void *private, struct videobuf_dvb_frontends *f, int id);
struct videobuf_dvb_frontend * videobuf_dvb_get_frontend(struct videobuf_dvb_frontends *f, int id);
int videobuf_dvb_find_frontend(struct videobuf_dvb_frontends *f, struct dvb_frontend *p);
/*
* Local variables:
* c-basic-offset: 8
* End:
*/