- dprintk ("%s\n", __FUNCTION__);
-
- if (down_interruptible (&frontend_mutex))
- return -ERESTARTSYS;
-
- ioctl = kmalloc (sizeof(struct dvb_frontend_ioctl_data), GFP_KERNEL);
-
- if (!ioctl) {
- up (&frontend_mutex);
- return -ENOMEM;
- }
-
- ioctl->adapter = adapter;
- ioctl->before_ioctl = before_ioctl;
- ioctl->after_ioctl = after_ioctl;
- ioctl->before_after_data = before_after_data;
-
- list_add_tail (&ioctl->list_head, &frontend_ioctl_list);
-
- list_for_each (entry, &frontend_list) {
- struct dvb_frontend_data *fe;
-
- fe = list_entry (entry, struct dvb_frontend_data, list_head);
-
- if (fe->frontend.i2c->adapter == adapter &&
- fe->frontend.before_ioctl == NULL &&
- fe->frontend.after_ioctl == NULL)
- {
- fe->frontend.before_ioctl = before_ioctl;
- fe->frontend.after_ioctl = after_ioctl;
- fe->frontend.before_after_data = before_after_data;
- }
- }
-
- up (&frontend_mutex);
-
- return 0;
-}
-
-
-void
-dvb_remove_frontend_ioctls (struct dvb_adapter *adapter,
- int (*before_ioctl) (struct dvb_frontend *frontend,
- unsigned int cmd, void *arg),
- int (*after_ioctl) (struct dvb_frontend *frontend,
- unsigned int cmd, void *arg))
-{
- struct list_head *entry, *n;
-
- dprintk ("%s\n", __FUNCTION__);
-
- down (&frontend_mutex);
-
- list_for_each (entry, &frontend_list) {
- struct dvb_frontend_data *fe;
-
- fe = list_entry (entry, struct dvb_frontend_data, list_head);
-
- if (fe->frontend.i2c->adapter == adapter &&
- fe->frontend.before_ioctl == before_ioctl &&
- fe->frontend.after_ioctl == after_ioctl)
- {
- fe->frontend.before_ioctl = NULL;
- fe->frontend.after_ioctl = NULL;
-
- }
- }
-
- list_for_each_safe (entry, n, &frontend_ioctl_list) {
- struct dvb_frontend_ioctl_data *ioctl;
-
- ioctl = list_entry (entry, struct dvb_frontend_ioctl_data, list_head);
-
- if (ioctl->adapter == adapter &&
- ioctl->before_ioctl == before_ioctl &&
- ioctl->after_ioctl == after_ioctl)
- {
- list_del (&ioctl->list_head);
- kfree (ioctl);
-
- break;
- }
- }
-
- up (&frontend_mutex);
-}
-
-
-int
-dvb_add_frontend_notifier (struct dvb_adapter *adapter,
- void (*callback) (fe_status_t s, void *data),
- void *data)
-{
- struct dvb_frontend_notifier_data *notifier;
- struct list_head *entry;
-
- dprintk ("%s\n", __FUNCTION__);
-
- if (down_interruptible (&frontend_mutex))
- return -ERESTARTSYS;
-
- notifier = kmalloc (sizeof(struct dvb_frontend_notifier_data), GFP_KERNEL);
-
- if (!notifier) {
- up (&frontend_mutex);
- return -ENOMEM;
- }
-
- notifier->adapter = adapter;
- notifier->callback = callback;
- notifier->data = data;
-
- list_add_tail (¬ifier->list_head, &frontend_notifier_list);
-
- list_for_each (entry, &frontend_list) {
- struct dvb_frontend_data *fe;
-
- fe = list_entry (entry, struct dvb_frontend_data, list_head);
-
- if (fe->frontend.i2c->adapter == adapter &&
- fe->frontend.notifier_callback == NULL)
- {
- fe->frontend.notifier_callback = callback;
- fe->frontend.notifier_data = data;
- }
- }
-
- up (&frontend_mutex);
-
- return 0;
-}
-
-
-void
-dvb_remove_frontend_notifier (struct dvb_adapter *adapter,
- void (*callback) (fe_status_t s, void *data))
-{
- struct list_head *entry, *n;
-
- dprintk ("%s\n", __FUNCTION__);
-
- down (&frontend_mutex);
-
- list_for_each (entry, &frontend_list) {
- struct dvb_frontend_data *fe;
-
- fe = list_entry (entry, struct dvb_frontend_data, list_head);
-
- if (fe->frontend.i2c->adapter == adapter &&
- fe->frontend.notifier_callback == callback)
- {
- fe->frontend.notifier_callback = NULL;
-
- }
- }
-
- list_for_each_safe (entry, n, &frontend_notifier_list) {
- struct dvb_frontend_notifier_data *notifier;
-
- notifier = list_entry (entry, struct dvb_frontend_notifier_data, list_head);
-
- if (notifier->adapter == adapter &&
- notifier->callback == callback)
- {
- list_del (¬ifier->list_head);
- kfree (notifier);
-
- break;
- }
- }
-
- up (&frontend_mutex);