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
26
27
28
29#define __DVB_CORE__
30
31#include <linux/string.h>
32#include <linux/kernel.h>
33#include <linux/sched.h>
34#include <linux/wait.h>
35#include <linux/slab.h>
36#include <linux/poll.h>
37#include <linux/semaphore.h>
38#include <linux/module.h>
39#include <linux/list.h>
40#include <linux/freezer.h>
41#include <linux/jiffies.h>
42#include <linux/kthread.h>
43#include <linux/ktime.h>
44#include <asm/processor.h>
45
46#include "dvb_frontend.h"
47#include "dvbdev.h"
48#include <linux/dvb/version.h>
49
50static int dvb_frontend_debug;
51static int dvb_shutdown_timeout;
52static int dvb_force_auto_inversion;
53static int dvb_override_tune_delay;
54static int dvb_powerdown_on_sleep = 1;
55static int dvb_mfe_wait_time = 5;
56
57module_param_named(frontend_debug, dvb_frontend_debug, int, 0644);
58MODULE_PARM_DESC(frontend_debug, "Turn on/off frontend core debugging (default:off).");
59module_param(dvb_shutdown_timeout, int, 0644);
60MODULE_PARM_DESC(dvb_shutdown_timeout, "wait <shutdown_timeout> seconds after close() before suspending hardware");
61module_param(dvb_force_auto_inversion, int, 0644);
62MODULE_PARM_DESC(dvb_force_auto_inversion, "0: normal (default), 1: INVERSION_AUTO forced always");
63module_param(dvb_override_tune_delay, int, 0644);
64MODULE_PARM_DESC(dvb_override_tune_delay, "0: normal (default), >0 => delay in milliseconds to wait for lock after a tune attempt");
65module_param(dvb_powerdown_on_sleep, int, 0644);
66MODULE_PARM_DESC(dvb_powerdown_on_sleep, "0: do not power down, 1: turn LNB voltage off on sleep (default)");
67module_param(dvb_mfe_wait_time, int, 0644);
68MODULE_PARM_DESC(dvb_mfe_wait_time, "Wait up to <mfe_wait_time> seconds on open() for multi-frontend to become available (default:5 seconds)");
69
70#define FESTATE_IDLE 1
71#define FESTATE_RETUNE 2
72#define FESTATE_TUNING_FAST 4
73#define FESTATE_TUNING_SLOW 8
74#define FESTATE_TUNED 16
75#define FESTATE_ZIGZAG_FAST 32
76#define FESTATE_ZIGZAG_SLOW 64
77#define FESTATE_DISEQC 128
78#define FESTATE_ERROR 256
79#define FESTATE_WAITFORLOCK (FESTATE_TUNING_FAST | FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW | FESTATE_DISEQC)
80#define FESTATE_SEARCHING_FAST (FESTATE_TUNING_FAST | FESTATE_ZIGZAG_FAST)
81#define FESTATE_SEARCHING_SLOW (FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_SLOW)
82#define FESTATE_LOSTLOCK (FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW)
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99static DEFINE_MUTEX(frontend_mutex);
100
101struct dvb_frontend_private {
102
103
104 struct dvb_device *dvbdev;
105 struct dvb_frontend_parameters parameters_out;
106 struct dvb_fe_events events;
107 struct semaphore sem;
108 struct list_head list_head;
109 wait_queue_head_t wait_queue;
110 struct task_struct *thread;
111 unsigned long release_jiffies;
112 unsigned int wakeup;
113 enum fe_status status;
114 unsigned long tune_mode_flags;
115 unsigned int delay;
116 unsigned int reinitialise;
117 int tone;
118 int voltage;
119
120
121 unsigned int state;
122 unsigned int bending;
123 int lnb_drift;
124 unsigned int inversion;
125 unsigned int auto_step;
126 unsigned int auto_sub_step;
127 unsigned int started_auto_step;
128 unsigned int min_delay;
129 unsigned int max_drift;
130 unsigned int step_size;
131 int quality;
132 unsigned int check_wrapped;
133 enum dvbfe_search algo_status;
134
135#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
136 struct media_pipeline pipe;
137 struct media_entity *pipe_start_entity;
138#endif
139};
140
141static void dvb_frontend_wakeup(struct dvb_frontend *fe);
142static int dtv_get_frontend(struct dvb_frontend *fe,
143 struct dvb_frontend_parameters *p_out);
144static int dtv_property_legacy_params_sync(struct dvb_frontend *fe,
145 struct dvb_frontend_parameters *p);
146
147static bool has_get_frontend(struct dvb_frontend *fe)
148{
149 return fe->ops.get_frontend != NULL;
150}
151
152
153
154
155
156
157enum dvbv3_emulation_type {
158 DVBV3_UNKNOWN,
159 DVBV3_QPSK,
160 DVBV3_QAM,
161 DVBV3_OFDM,
162 DVBV3_ATSC,
163};
164
165static enum dvbv3_emulation_type dvbv3_type(u32 delivery_system)
166{
167 switch (delivery_system) {
168 case SYS_DVBC_ANNEX_A:
169 case SYS_DVBC_ANNEX_C:
170 return DVBV3_QAM;
171 case SYS_DVBS:
172 case SYS_DVBS2:
173 case SYS_TURBO:
174 case SYS_ISDBS:
175 case SYS_DSS:
176 return DVBV3_QPSK;
177 case SYS_DVBT:
178 case SYS_DVBT2:
179 case SYS_ISDBT:
180 case SYS_DTMB:
181 return DVBV3_OFDM;
182 case SYS_ATSC:
183 case SYS_ATSCMH:
184 case SYS_DVBC_ANNEX_B:
185 return DVBV3_ATSC;
186 case SYS_UNDEFINED:
187 case SYS_ISDBC:
188 case SYS_DVBH:
189 case SYS_DAB:
190 default:
191
192
193
194
195
196
197 return DVBV3_UNKNOWN;
198 }
199}
200
201static void dvb_frontend_add_event(struct dvb_frontend *fe,
202 enum fe_status status)
203{
204 struct dvb_frontend_private *fepriv = fe->frontend_priv;
205 struct dvb_fe_events *events = &fepriv->events;
206 struct dvb_frontend_event *e;
207 int wp;
208
209 dev_dbg(fe->dvb->device, "%s:\n", __func__);
210
211 if ((status & FE_HAS_LOCK) && has_get_frontend(fe))
212 dtv_get_frontend(fe, &fepriv->parameters_out);
213
214 mutex_lock(&events->mtx);
215
216 wp = (events->eventw + 1) % MAX_EVENT;
217 if (wp == events->eventr) {
218 events->overflow = 1;
219 events->eventr = (events->eventr + 1) % MAX_EVENT;
220 }
221
222 e = &events->events[events->eventw];
223 e->status = status;
224 e->parameters = fepriv->parameters_out;
225
226 events->eventw = wp;
227
228 mutex_unlock(&events->mtx);
229
230 wake_up_interruptible (&events->wait_queue);
231}
232
233static int dvb_frontend_get_event(struct dvb_frontend *fe,
234 struct dvb_frontend_event *event, int flags)
235{
236 struct dvb_frontend_private *fepriv = fe->frontend_priv;
237 struct dvb_fe_events *events = &fepriv->events;
238
239 dev_dbg(fe->dvb->device, "%s:\n", __func__);
240
241 if (events->overflow) {
242 events->overflow = 0;
243 return -EOVERFLOW;
244 }
245
246 if (events->eventw == events->eventr) {
247 int ret;
248
249 if (flags & O_NONBLOCK)
250 return -EWOULDBLOCK;
251
252 up(&fepriv->sem);
253
254 ret = wait_event_interruptible (events->wait_queue,
255 events->eventw != events->eventr);
256
257 if (down_interruptible (&fepriv->sem))
258 return -ERESTARTSYS;
259
260 if (ret < 0)
261 return ret;
262 }
263
264 mutex_lock(&events->mtx);
265 *event = events->events[events->eventr];
266 events->eventr = (events->eventr + 1) % MAX_EVENT;
267 mutex_unlock(&events->mtx);
268
269 return 0;
270}
271
272static void dvb_frontend_clear_events(struct dvb_frontend *fe)
273{
274 struct dvb_frontend_private *fepriv = fe->frontend_priv;
275 struct dvb_fe_events *events = &fepriv->events;
276
277 mutex_lock(&events->mtx);
278 events->eventr = events->eventw;
279 mutex_unlock(&events->mtx);
280}
281
282static void dvb_frontend_init(struct dvb_frontend *fe)
283{
284 dev_dbg(fe->dvb->device,
285 "%s: initialising adapter %i frontend %i (%s)...\n",
286 __func__, fe->dvb->num, fe->id, fe->ops.info.name);
287
288 if (fe->ops.init)
289 fe->ops.init(fe);
290 if (fe->ops.tuner_ops.init) {
291 if (fe->ops.i2c_gate_ctrl)
292 fe->ops.i2c_gate_ctrl(fe, 1);
293 fe->ops.tuner_ops.init(fe);
294 if (fe->ops.i2c_gate_ctrl)
295 fe->ops.i2c_gate_ctrl(fe, 0);
296 }
297}
298
299void dvb_frontend_reinitialise(struct dvb_frontend *fe)
300{
301 struct dvb_frontend_private *fepriv = fe->frontend_priv;
302
303 fepriv->reinitialise = 1;
304 dvb_frontend_wakeup(fe);
305}
306EXPORT_SYMBOL(dvb_frontend_reinitialise);
307
308static void dvb_frontend_swzigzag_update_delay(struct dvb_frontend_private *fepriv, int locked)
309{
310 int q2;
311 struct dvb_frontend *fe = fepriv->dvbdev->priv;
312
313 dev_dbg(fe->dvb->device, "%s:\n", __func__);
314
315 if (locked)
316 (fepriv->quality) = (fepriv->quality * 220 + 36*256) / 256;
317 else
318 (fepriv->quality) = (fepriv->quality * 220 + 0) / 256;
319
320 q2 = fepriv->quality - 128;
321 q2 *= q2;
322
323 fepriv->delay = fepriv->min_delay + q2 * HZ / (128*128);
324}
325
326
327
328
329
330
331
332
333static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wrapped)
334{
335 int autoinversion;
336 int ready = 0;
337 int fe_set_err = 0;
338 struct dvb_frontend_private *fepriv = fe->frontend_priv;
339 struct dtv_frontend_properties *c = &fe->dtv_property_cache, tmp;
340 int original_inversion = c->inversion;
341 u32 original_frequency = c->frequency;
342
343
344 autoinversion = ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
345 (c->inversion == INVERSION_AUTO));
346
347
348 while(!ready) {
349
350 fepriv->lnb_drift = fepriv->auto_step * fepriv->step_size;
351
352
353 if (fepriv->lnb_drift > fepriv->max_drift) {
354 fepriv->auto_step = 0;
355 fepriv->auto_sub_step = 0;
356 fepriv->lnb_drift = 0;
357 }
358
359
360 switch(fepriv->auto_sub_step) {
361 case 0:
362
363 ready = 1;
364 break;
365
366 case 1:
367 if (!autoinversion) break;
368
369 fepriv->inversion = (fepriv->inversion == INVERSION_OFF) ? INVERSION_ON : INVERSION_OFF;
370 ready = 1;
371 break;
372
373 case 2:
374 if (fepriv->lnb_drift == 0) break;
375
376 fepriv->lnb_drift = -fepriv->lnb_drift;
377 ready = 1;
378 break;
379
380 case 3:
381 if (fepriv->lnb_drift == 0) break;
382 if (!autoinversion) break;
383
384 fepriv->inversion = (fepriv->inversion == INVERSION_OFF) ? INVERSION_ON : INVERSION_OFF;
385 fepriv->lnb_drift = -fepriv->lnb_drift;
386 ready = 1;
387 break;
388
389 default:
390 fepriv->auto_step++;
391 fepriv->auto_sub_step = -1;
392 break;
393 }
394
395 if (!ready) fepriv->auto_sub_step++;
396 }
397
398
399
400 if ((fepriv->auto_step == fepriv->started_auto_step) &&
401 (fepriv->auto_sub_step == 0) && check_wrapped) {
402 return 1;
403 }
404
405 dev_dbg(fe->dvb->device, "%s: drift:%i inversion:%i auto_step:%i " \
406 "auto_sub_step:%i started_auto_step:%i\n",
407 __func__, fepriv->lnb_drift, fepriv->inversion,
408 fepriv->auto_step, fepriv->auto_sub_step,
409 fepriv->started_auto_step);
410
411
412 c->frequency += fepriv->lnb_drift;
413 if (autoinversion)
414 c->inversion = fepriv->inversion;
415 tmp = *c;
416 if (fe->ops.set_frontend)
417 fe_set_err = fe->ops.set_frontend(fe);
418 *c = tmp;
419 if (fe_set_err < 0) {
420 fepriv->state = FESTATE_ERROR;
421 return fe_set_err;
422 }
423
424 c->frequency = original_frequency;
425 c->inversion = original_inversion;
426
427 fepriv->auto_sub_step++;
428 return 0;
429}
430
431static void dvb_frontend_swzigzag(struct dvb_frontend *fe)
432{
433 enum fe_status s = 0;
434 int retval = 0;
435 struct dvb_frontend_private *fepriv = fe->frontend_priv;
436 struct dtv_frontend_properties *c = &fe->dtv_property_cache, tmp;
437
438
439 if (fepriv->state & FESTATE_IDLE) {
440 fepriv->delay = 3*HZ;
441 fepriv->quality = 0;
442 return;
443 }
444
445
446 if (fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT) {
447 if (fepriv->state & FESTATE_RETUNE) {
448 tmp = *c;
449 if (fe->ops.set_frontend)
450 retval = fe->ops.set_frontend(fe);
451 *c = tmp;
452 if (retval < 0)
453 fepriv->state = FESTATE_ERROR;
454 else
455 fepriv->state = FESTATE_TUNED;
456 }
457 fepriv->delay = 3*HZ;
458 fepriv->quality = 0;
459 return;
460 }
461
462
463 if (fepriv->state & FESTATE_RETUNE) {
464 s = 0;
465 } else {
466 if (fe->ops.read_status)
467 fe->ops.read_status(fe, &s);
468 if (s != fepriv->status) {
469 dvb_frontend_add_event(fe, s);
470 fepriv->status = s;
471 }
472 }
473
474
475 if ((fepriv->state & FESTATE_WAITFORLOCK) && (s & FE_HAS_LOCK)) {
476 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
477 fepriv->state = FESTATE_TUNED;
478
479
480 if ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
481 (c->inversion == INVERSION_AUTO)) {
482 c->inversion = fepriv->inversion;
483 }
484 return;
485 }
486
487
488 if (fepriv->state & FESTATE_TUNED) {
489 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
490
491
492 if (s & FE_HAS_LOCK) {
493 return;
494 } else {
495 fepriv->state = FESTATE_ZIGZAG_FAST;
496 fepriv->started_auto_step = fepriv->auto_step;
497 fepriv->check_wrapped = 0;
498 }
499 }
500
501
502
503 if ((fepriv->state & FESTATE_LOSTLOCK) &&
504 (fe->ops.info.caps & FE_CAN_RECOVER) && (fepriv->max_drift == 0)) {
505 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
506 return;
507 }
508
509
510
511
512 if (fepriv->state & FESTATE_DISEQC) {
513 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
514 return;
515 }
516
517
518
519
520 if (fepriv->state & FESTATE_RETUNE) {
521 fepriv->lnb_drift = 0;
522 fepriv->auto_step = 0;
523 fepriv->auto_sub_step = 0;
524 fepriv->started_auto_step = 0;
525 fepriv->check_wrapped = 0;
526 }
527
528
529 if ((fepriv->state & FESTATE_SEARCHING_FAST) || (fepriv->state & FESTATE_RETUNE)) {
530 fepriv->delay = fepriv->min_delay;
531
532
533 retval = dvb_frontend_swzigzag_autotune(fe,
534 fepriv->check_wrapped);
535 if (retval < 0) {
536 return;
537 } else if (retval) {
538
539
540 fepriv->state = FESTATE_SEARCHING_SLOW;
541 fepriv->started_auto_step = fepriv->auto_step;
542 return;
543 }
544 fepriv->check_wrapped = 1;
545
546
547
548
549
550 if (fepriv->state & FESTATE_RETUNE) {
551 fepriv->state = FESTATE_TUNING_FAST;
552 }
553 }
554
555
556 if (fepriv->state & FESTATE_SEARCHING_SLOW) {
557 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
558
559
560
561 dvb_frontend_swzigzag_autotune(fe, 0);
562 }
563}
564
565static int dvb_frontend_is_exiting(struct dvb_frontend *fe)
566{
567 struct dvb_frontend_private *fepriv = fe->frontend_priv;
568
569 if (fe->exit != DVB_FE_NO_EXIT)
570 return 1;
571
572 if (fepriv->dvbdev->writers == 1)
573 if (time_after_eq(jiffies, fepriv->release_jiffies +
574 dvb_shutdown_timeout * HZ))
575 return 1;
576
577 return 0;
578}
579
580static int dvb_frontend_should_wakeup(struct dvb_frontend *fe)
581{
582 struct dvb_frontend_private *fepriv = fe->frontend_priv;
583
584 if (fepriv->wakeup) {
585 fepriv->wakeup = 0;
586 return 1;
587 }
588 return dvb_frontend_is_exiting(fe);
589}
590
591static void dvb_frontend_wakeup(struct dvb_frontend *fe)
592{
593 struct dvb_frontend_private *fepriv = fe->frontend_priv;
594
595 fepriv->wakeup = 1;
596 wake_up_interruptible(&fepriv->wait_queue);
597}
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617#ifdef CONFIG_MEDIA_CONTROLLER_DVB
618static int dvb_enable_media_tuner(struct dvb_frontend *fe)
619{
620 struct dvb_frontend_private *fepriv = fe->frontend_priv;
621 struct dvb_adapter *adapter = fe->dvb;
622 struct media_device *mdev = adapter->mdev;
623 struct media_entity *entity, *source;
624 struct media_link *link, *found_link = NULL;
625 int ret, n_links = 0, active_links = 0;
626
627 fepriv->pipe_start_entity = NULL;
628
629 if (!mdev)
630 return 0;
631
632 entity = fepriv->dvbdev->entity;
633 fepriv->pipe_start_entity = entity;
634
635 list_for_each_entry(link, &entity->links, list) {
636 if (link->sink->entity == entity) {
637 found_link = link;
638 n_links++;
639 if (link->flags & MEDIA_LNK_FL_ENABLED)
640 active_links++;
641 }
642 }
643
644 if (!n_links || active_links == 1 || !found_link)
645 return 0;
646
647
648
649
650
651
652 if (n_links > 1 && active_links != 1) {
653 dev_err(fe->dvb->device,
654 "WARNING: there are %d active links among %d tuners. This is a driver's bug!\n",
655 active_links, n_links);
656 return -EINVAL;
657 }
658
659 source = found_link->source->entity;
660 fepriv->pipe_start_entity = source;
661 list_for_each_entry(link, &source->links, list) {
662 struct media_entity *sink;
663 int flags = 0;
664
665 sink = link->sink->entity;
666 if (sink == entity)
667 flags = MEDIA_LNK_FL_ENABLED;
668
669 ret = media_entity_setup_link(link, flags);
670 if (ret) {
671 dev_err(fe->dvb->device,
672 "Couldn't change link %s->%s to %s. Error %d\n",
673 source->name, sink->name,
674 flags ? "enabled" : "disabled",
675 ret);
676 return ret;
677 } else
678 dev_dbg(fe->dvb->device,
679 "link %s->%s was %s\n",
680 source->name, sink->name,
681 flags ? "ENABLED" : "disabled");
682 }
683 return 0;
684}
685#endif
686
687static int dvb_frontend_thread(void *data)
688{
689 struct dvb_frontend *fe = data;
690 struct dvb_frontend_private *fepriv = fe->frontend_priv;
691 enum fe_status s;
692 enum dvbfe_algo algo;
693#ifdef CONFIG_MEDIA_CONTROLLER_DVB
694 int ret;
695#endif
696
697 bool re_tune = false;
698 bool semheld = false;
699
700 dev_dbg(fe->dvb->device, "%s:\n", __func__);
701
702 fepriv->check_wrapped = 0;
703 fepriv->quality = 0;
704 fepriv->delay = 3*HZ;
705 fepriv->status = 0;
706 fepriv->wakeup = 0;
707 fepriv->reinitialise = 0;
708
709#ifdef CONFIG_MEDIA_CONTROLLER_DVB
710 ret = dvb_enable_media_tuner(fe);
711 if (ret) {
712
713 dev_info(fe->dvb->device,
714 "proceeding with FE task\n");
715 } else if (fepriv->pipe_start_entity) {
716 ret = media_entity_pipeline_start(fepriv->pipe_start_entity,
717 &fepriv->pipe);
718 if (ret)
719 return ret;
720 }
721#endif
722
723 dvb_frontend_init(fe);
724
725 set_freezable();
726 while (1) {
727 up(&fepriv->sem);
728restart:
729 wait_event_interruptible_timeout(fepriv->wait_queue,
730 dvb_frontend_should_wakeup(fe) || kthread_should_stop()
731 || freezing(current),
732 fepriv->delay);
733
734 if (kthread_should_stop() || dvb_frontend_is_exiting(fe)) {
735
736 if (!down_interruptible(&fepriv->sem))
737 semheld = true;
738 fe->exit = DVB_FE_NORMAL_EXIT;
739 break;
740 }
741
742 if (try_to_freeze())
743 goto restart;
744
745 if (down_interruptible(&fepriv->sem))
746 break;
747
748 if (fepriv->reinitialise) {
749 dvb_frontend_init(fe);
750 if (fe->ops.set_tone && fepriv->tone != -1)
751 fe->ops.set_tone(fe, fepriv->tone);
752 if (fe->ops.set_voltage && fepriv->voltage != -1)
753 fe->ops.set_voltage(fe, fepriv->voltage);
754 fepriv->reinitialise = 0;
755 }
756
757
758 if (fe->ops.get_frontend_algo) {
759 algo = fe->ops.get_frontend_algo(fe);
760 switch (algo) {
761 case DVBFE_ALGO_HW:
762 dev_dbg(fe->dvb->device, "%s: Frontend ALGO = DVBFE_ALGO_HW\n", __func__);
763
764 if (fepriv->state & FESTATE_RETUNE) {
765 dev_dbg(fe->dvb->device, "%s: Retune requested, FESTATE_RETUNE\n", __func__);
766 re_tune = true;
767 fepriv->state = FESTATE_TUNED;
768 } else {
769 re_tune = false;
770 }
771
772 if (fe->ops.tune)
773 fe->ops.tune(fe, re_tune, fepriv->tune_mode_flags, &fepriv->delay, &s);
774
775 if (s != fepriv->status && !(fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT)) {
776 dev_dbg(fe->dvb->device, "%s: state changed, adding current state\n", __func__);
777 dvb_frontend_add_event(fe, s);
778 fepriv->status = s;
779 }
780 break;
781 case DVBFE_ALGO_SW:
782 dev_dbg(fe->dvb->device, "%s: Frontend ALGO = DVBFE_ALGO_SW\n", __func__);
783 dvb_frontend_swzigzag(fe);
784 break;
785 case DVBFE_ALGO_CUSTOM:
786 dev_dbg(fe->dvb->device, "%s: Frontend ALGO = DVBFE_ALGO_CUSTOM, state=%d\n", __func__, fepriv->state);
787 if (fepriv->state & FESTATE_RETUNE) {
788 dev_dbg(fe->dvb->device, "%s: Retune requested, FESTAT_RETUNE\n", __func__);
789 fepriv->state = FESTATE_TUNED;
790 }
791
792
793
794
795 if (fepriv->algo_status & DVBFE_ALGO_SEARCH_AGAIN) {
796 if (fe->ops.search) {
797 fepriv->algo_status = fe->ops.search(fe);
798
799
800
801 } else {
802 fepriv->algo_status &= ~DVBFE_ALGO_SEARCH_AGAIN;
803 }
804 }
805
806 if (fepriv->algo_status != DVBFE_ALGO_SEARCH_SUCCESS) {
807 fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
808 fepriv->delay = HZ / 2;
809 }
810 dtv_property_legacy_params_sync(fe, &fepriv->parameters_out);
811 fe->ops.read_status(fe, &s);
812 if (s != fepriv->status) {
813 dvb_frontend_add_event(fe, s);
814 fepriv->status = s;
815 if (!(s & FE_HAS_LOCK)) {
816 fepriv->delay = HZ / 10;
817 fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
818 } else {
819 fepriv->delay = 60 * HZ;
820 }
821 }
822 break;
823 default:
824 dev_dbg(fe->dvb->device, "%s: UNDEFINED ALGO !\n", __func__);
825 break;
826 }
827 } else {
828 dvb_frontend_swzigzag(fe);
829 }
830 }
831
832#ifdef CONFIG_MEDIA_CONTROLLER_DVB
833 if (fepriv->pipe_start_entity)
834 media_entity_pipeline_stop(fepriv->pipe_start_entity);
835 fepriv->pipe_start_entity = NULL;
836#endif
837
838 if (dvb_powerdown_on_sleep) {
839 if (fe->ops.set_voltage)
840 fe->ops.set_voltage(fe, SEC_VOLTAGE_OFF);
841 if (fe->ops.tuner_ops.sleep) {
842 if (fe->ops.i2c_gate_ctrl)
843 fe->ops.i2c_gate_ctrl(fe, 1);
844 fe->ops.tuner_ops.sleep(fe);
845 if (fe->ops.i2c_gate_ctrl)
846 fe->ops.i2c_gate_ctrl(fe, 0);
847 }
848 if (fe->ops.sleep)
849 fe->ops.sleep(fe);
850 }
851
852 fepriv->thread = NULL;
853 if (kthread_should_stop())
854 fe->exit = DVB_FE_DEVICE_REMOVED;
855 else
856 fe->exit = DVB_FE_NO_EXIT;
857 mb();
858
859 if (semheld)
860 up(&fepriv->sem);
861 dvb_frontend_wakeup(fe);
862 return 0;
863}
864
865static void dvb_frontend_stop(struct dvb_frontend *fe)
866{
867 struct dvb_frontend_private *fepriv = fe->frontend_priv;
868
869 dev_dbg(fe->dvb->device, "%s:\n", __func__);
870
871 if (fe->exit != DVB_FE_DEVICE_REMOVED)
872 fe->exit = DVB_FE_NORMAL_EXIT;
873 mb();
874
875 if (!fepriv->thread)
876 return;
877
878 kthread_stop(fepriv->thread);
879
880 sema_init(&fepriv->sem, 1);
881 fepriv->state = FESTATE_IDLE;
882
883
884 if (fepriv->thread)
885 dev_warn(fe->dvb->device,
886 "dvb_frontend_stop: warning: thread %p won't exit\n",
887 fepriv->thread);
888}
889
890
891
892
893
894
895
896
897void dvb_frontend_sleep_until(ktime_t *waketime, u32 add_usec)
898{
899 s32 delta;
900
901 *waketime = ktime_add_us(*waketime, add_usec);
902 delta = ktime_us_delta(ktime_get_real(), *waketime);
903 if (delta > 2500) {
904 msleep((delta - 1500) / 1000);
905 delta = ktime_us_delta(ktime_get_real(), *waketime);
906 }
907 if (delta > 0)
908 udelay(delta);
909}
910EXPORT_SYMBOL(dvb_frontend_sleep_until);
911
912static int dvb_frontend_start(struct dvb_frontend *fe)
913{
914 int ret;
915 struct dvb_frontend_private *fepriv = fe->frontend_priv;
916 struct task_struct *fe_thread;
917
918 dev_dbg(fe->dvb->device, "%s:\n", __func__);
919
920 if (fepriv->thread) {
921 if (fe->exit == DVB_FE_NO_EXIT)
922 return 0;
923 else
924 dvb_frontend_stop (fe);
925 }
926
927 if (signal_pending(current))
928 return -EINTR;
929 if (down_interruptible (&fepriv->sem))
930 return -EINTR;
931
932 fepriv->state = FESTATE_IDLE;
933 fe->exit = DVB_FE_NO_EXIT;
934 fepriv->thread = NULL;
935 mb();
936
937 fe_thread = kthread_run(dvb_frontend_thread, fe,
938 "kdvb-ad-%i-fe-%i", fe->dvb->num,fe->id);
939 if (IS_ERR(fe_thread)) {
940 ret = PTR_ERR(fe_thread);
941 dev_warn(fe->dvb->device,
942 "dvb_frontend_start: failed to start kthread (%d)\n",
943 ret);
944 up(&fepriv->sem);
945 return ret;
946 }
947 fepriv->thread = fe_thread;
948 return 0;
949}
950
951static void dvb_frontend_get_frequency_limits(struct dvb_frontend *fe,
952 u32 *freq_min, u32 *freq_max)
953{
954 *freq_min = max(fe->ops.info.frequency_min, fe->ops.tuner_ops.info.frequency_min);
955
956 if (fe->ops.info.frequency_max == 0)
957 *freq_max = fe->ops.tuner_ops.info.frequency_max;
958 else if (fe->ops.tuner_ops.info.frequency_max == 0)
959 *freq_max = fe->ops.info.frequency_max;
960 else
961 *freq_max = min(fe->ops.info.frequency_max, fe->ops.tuner_ops.info.frequency_max);
962
963 if (*freq_min == 0 || *freq_max == 0)
964 dev_warn(fe->dvb->device, "DVB: adapter %i frontend %u frequency limits undefined - fix the driver\n",
965 fe->dvb->num, fe->id);
966}
967
968static int dvb_frontend_check_parameters(struct dvb_frontend *fe)
969{
970 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
971 u32 freq_min;
972 u32 freq_max;
973
974
975 dvb_frontend_get_frequency_limits(fe, &freq_min, &freq_max);
976 if ((freq_min && c->frequency < freq_min) ||
977 (freq_max && c->frequency > freq_max)) {
978 dev_warn(fe->dvb->device, "DVB: adapter %i frontend %i frequency %u out of range (%u..%u)\n",
979 fe->dvb->num, fe->id, c->frequency,
980 freq_min, freq_max);
981 return -EINVAL;
982 }
983
984
985 switch (c->delivery_system) {
986 case SYS_DVBS:
987 case SYS_DVBS2:
988 case SYS_TURBO:
989 case SYS_DVBC_ANNEX_A:
990 case SYS_DVBC_ANNEX_C:
991 if ((fe->ops.info.symbol_rate_min &&
992 c->symbol_rate < fe->ops.info.symbol_rate_min) ||
993 (fe->ops.info.symbol_rate_max &&
994 c->symbol_rate > fe->ops.info.symbol_rate_max)) {
995 dev_warn(fe->dvb->device, "DVB: adapter %i frontend %i symbol rate %u out of range (%u..%u)\n",
996 fe->dvb->num, fe->id, c->symbol_rate,
997 fe->ops.info.symbol_rate_min,
998 fe->ops.info.symbol_rate_max);
999 return -EINVAL;
1000 }
1001 default:
1002 break;
1003 }
1004
1005 return 0;
1006}
1007
1008static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
1009{
1010 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1011 int i;
1012 u32 delsys;
1013
1014 delsys = c->delivery_system;
1015 memset(c, 0, offsetof(struct dtv_frontend_properties, strength));
1016 c->delivery_system = delsys;
1017
1018 c->state = DTV_CLEAR;
1019
1020 dev_dbg(fe->dvb->device, "%s: Clearing cache for delivery system %d\n",
1021 __func__, c->delivery_system);
1022
1023 c->transmission_mode = TRANSMISSION_MODE_AUTO;
1024 c->bandwidth_hz = 0;
1025 c->guard_interval = GUARD_INTERVAL_AUTO;
1026 c->hierarchy = HIERARCHY_AUTO;
1027 c->symbol_rate = 0;
1028 c->code_rate_HP = FEC_AUTO;
1029 c->code_rate_LP = FEC_AUTO;
1030 c->fec_inner = FEC_AUTO;
1031 c->rolloff = ROLLOFF_AUTO;
1032 c->voltage = SEC_VOLTAGE_OFF;
1033 c->sectone = SEC_TONE_OFF;
1034 c->pilot = PILOT_AUTO;
1035
1036 c->isdbt_partial_reception = 0;
1037 c->isdbt_sb_mode = 0;
1038 c->isdbt_sb_subchannel = 0;
1039 c->isdbt_sb_segment_idx = 0;
1040 c->isdbt_sb_segment_count = 0;
1041 c->isdbt_layer_enabled = 0;
1042 for (i = 0; i < 3; i++) {
1043 c->layer[i].fec = FEC_AUTO;
1044 c->layer[i].modulation = QAM_AUTO;
1045 c->layer[i].interleaving = 0;
1046 c->layer[i].segment_count = 0;
1047 }
1048
1049 c->stream_id = NO_STREAM_ID_FILTER;
1050
1051 switch (c->delivery_system) {
1052 case SYS_DVBS:
1053 case SYS_DVBS2:
1054 case SYS_TURBO:
1055 c->modulation = QPSK;
1056 c->rolloff = ROLLOFF_35;
1057 break;
1058 case SYS_ATSC:
1059 c->modulation = VSB_8;
1060 break;
1061 case SYS_ISDBS:
1062 c->symbol_rate = 28860000;
1063 c->rolloff = ROLLOFF_35;
1064 c->bandwidth_hz = c->symbol_rate / 100 * 135;
1065 break;
1066 default:
1067 c->modulation = QAM_AUTO;
1068 break;
1069 }
1070
1071 c->lna = LNA_AUTO;
1072
1073 return 0;
1074}
1075
1076#define _DTV_CMD(n, s, b) \
1077[n] = { \
1078 .name = #n, \
1079 .cmd = n, \
1080 .set = s,\
1081 .buffer = b \
1082}
1083
1084static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = {
1085 _DTV_CMD(DTV_TUNE, 1, 0),
1086 _DTV_CMD(DTV_CLEAR, 1, 0),
1087
1088
1089 _DTV_CMD(DTV_FREQUENCY, 1, 0),
1090 _DTV_CMD(DTV_BANDWIDTH_HZ, 1, 0),
1091 _DTV_CMD(DTV_MODULATION, 1, 0),
1092 _DTV_CMD(DTV_INVERSION, 1, 0),
1093 _DTV_CMD(DTV_DISEQC_MASTER, 1, 1),
1094 _DTV_CMD(DTV_SYMBOL_RATE, 1, 0),
1095 _DTV_CMD(DTV_INNER_FEC, 1, 0),
1096 _DTV_CMD(DTV_VOLTAGE, 1, 0),
1097 _DTV_CMD(DTV_TONE, 1, 0),
1098 _DTV_CMD(DTV_PILOT, 1, 0),
1099 _DTV_CMD(DTV_ROLLOFF, 1, 0),
1100 _DTV_CMD(DTV_DELIVERY_SYSTEM, 1, 0),
1101 _DTV_CMD(DTV_HIERARCHY, 1, 0),
1102 _DTV_CMD(DTV_CODE_RATE_HP, 1, 0),
1103 _DTV_CMD(DTV_CODE_RATE_LP, 1, 0),
1104 _DTV_CMD(DTV_GUARD_INTERVAL, 1, 0),
1105 _DTV_CMD(DTV_TRANSMISSION_MODE, 1, 0),
1106 _DTV_CMD(DTV_INTERLEAVING, 1, 0),
1107
1108 _DTV_CMD(DTV_ISDBT_PARTIAL_RECEPTION, 1, 0),
1109 _DTV_CMD(DTV_ISDBT_SOUND_BROADCASTING, 1, 0),
1110 _DTV_CMD(DTV_ISDBT_SB_SUBCHANNEL_ID, 1, 0),
1111 _DTV_CMD(DTV_ISDBT_SB_SEGMENT_IDX, 1, 0),
1112 _DTV_CMD(DTV_ISDBT_SB_SEGMENT_COUNT, 1, 0),
1113 _DTV_CMD(DTV_ISDBT_LAYER_ENABLED, 1, 0),
1114 _DTV_CMD(DTV_ISDBT_LAYERA_FEC, 1, 0),
1115 _DTV_CMD(DTV_ISDBT_LAYERA_MODULATION, 1, 0),
1116 _DTV_CMD(DTV_ISDBT_LAYERA_SEGMENT_COUNT, 1, 0),
1117 _DTV_CMD(DTV_ISDBT_LAYERA_TIME_INTERLEAVING, 1, 0),
1118 _DTV_CMD(DTV_ISDBT_LAYERB_FEC, 1, 0),
1119 _DTV_CMD(DTV_ISDBT_LAYERB_MODULATION, 1, 0),
1120 _DTV_CMD(DTV_ISDBT_LAYERB_SEGMENT_COUNT, 1, 0),
1121 _DTV_CMD(DTV_ISDBT_LAYERB_TIME_INTERLEAVING, 1, 0),
1122 _DTV_CMD(DTV_ISDBT_LAYERC_FEC, 1, 0),
1123 _DTV_CMD(DTV_ISDBT_LAYERC_MODULATION, 1, 0),
1124 _DTV_CMD(DTV_ISDBT_LAYERC_SEGMENT_COUNT, 1, 0),
1125 _DTV_CMD(DTV_ISDBT_LAYERC_TIME_INTERLEAVING, 1, 0),
1126
1127 _DTV_CMD(DTV_STREAM_ID, 1, 0),
1128 _DTV_CMD(DTV_DVBT2_PLP_ID_LEGACY, 1, 0),
1129 _DTV_CMD(DTV_LNA, 1, 0),
1130
1131
1132 _DTV_CMD(DTV_DISEQC_SLAVE_REPLY, 0, 1),
1133 _DTV_CMD(DTV_API_VERSION, 0, 0),
1134
1135 _DTV_CMD(DTV_ENUM_DELSYS, 0, 0),
1136
1137 _DTV_CMD(DTV_ATSCMH_PARADE_ID, 1, 0),
1138 _DTV_CMD(DTV_ATSCMH_RS_FRAME_ENSEMBLE, 1, 0),
1139
1140 _DTV_CMD(DTV_ATSCMH_FIC_VER, 0, 0),
1141 _DTV_CMD(DTV_ATSCMH_NOG, 0, 0),
1142 _DTV_CMD(DTV_ATSCMH_TNOG, 0, 0),
1143 _DTV_CMD(DTV_ATSCMH_SGN, 0, 0),
1144 _DTV_CMD(DTV_ATSCMH_PRC, 0, 0),
1145 _DTV_CMD(DTV_ATSCMH_RS_FRAME_MODE, 0, 0),
1146 _DTV_CMD(DTV_ATSCMH_RS_CODE_MODE_PRI, 0, 0),
1147 _DTV_CMD(DTV_ATSCMH_RS_CODE_MODE_SEC, 0, 0),
1148 _DTV_CMD(DTV_ATSCMH_SCCC_BLOCK_MODE, 0, 0),
1149 _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_A, 0, 0),
1150 _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_B, 0, 0),
1151 _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_C, 0, 0),
1152 _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_D, 0, 0),
1153
1154
1155 _DTV_CMD(DTV_STAT_SIGNAL_STRENGTH, 0, 0),
1156 _DTV_CMD(DTV_STAT_CNR, 0, 0),
1157 _DTV_CMD(DTV_STAT_PRE_ERROR_BIT_COUNT, 0, 0),
1158 _DTV_CMD(DTV_STAT_PRE_TOTAL_BIT_COUNT, 0, 0),
1159 _DTV_CMD(DTV_STAT_POST_ERROR_BIT_COUNT, 0, 0),
1160 _DTV_CMD(DTV_STAT_POST_TOTAL_BIT_COUNT, 0, 0),
1161 _DTV_CMD(DTV_STAT_ERROR_BLOCK_COUNT, 0, 0),
1162 _DTV_CMD(DTV_STAT_TOTAL_BLOCK_COUNT, 0, 0),
1163};
1164
1165static void dtv_property_dump(struct dvb_frontend *fe, struct dtv_property *tvp)
1166{
1167 int i;
1168
1169 if (tvp->cmd <= 0 || tvp->cmd > DTV_MAX_COMMAND) {
1170 dev_warn(fe->dvb->device, "%s: tvp.cmd = 0x%08x undefined\n",
1171 __func__, tvp->cmd);
1172 return;
1173 }
1174
1175 dev_dbg(fe->dvb->device, "%s: tvp.cmd = 0x%08x (%s)\n", __func__,
1176 tvp->cmd, dtv_cmds[tvp->cmd].name);
1177
1178 if (dtv_cmds[tvp->cmd].buffer) {
1179 dev_dbg(fe->dvb->device, "%s: tvp.u.buffer.len = 0x%02x\n",
1180 __func__, tvp->u.buffer.len);
1181
1182 for(i = 0; i < tvp->u.buffer.len; i++)
1183 dev_dbg(fe->dvb->device,
1184 "%s: tvp.u.buffer.data[0x%02x] = 0x%02x\n",
1185 __func__, i, tvp->u.buffer.data[i]);
1186 } else {
1187 dev_dbg(fe->dvb->device, "%s: tvp.u.data = 0x%08x\n", __func__,
1188 tvp->u.data);
1189 }
1190}
1191
1192
1193
1194
1195
1196static int dtv_property_cache_sync(struct dvb_frontend *fe,
1197 struct dtv_frontend_properties *c,
1198 const struct dvb_frontend_parameters *p)
1199{
1200 c->frequency = p->frequency;
1201 c->inversion = p->inversion;
1202
1203 switch (dvbv3_type(c->delivery_system)) {
1204 case DVBV3_QPSK:
1205 dev_dbg(fe->dvb->device, "%s: Preparing QPSK req\n", __func__);
1206 c->symbol_rate = p->u.qpsk.symbol_rate;
1207 c->fec_inner = p->u.qpsk.fec_inner;
1208 break;
1209 case DVBV3_QAM:
1210 dev_dbg(fe->dvb->device, "%s: Preparing QAM req\n", __func__);
1211 c->symbol_rate = p->u.qam.symbol_rate;
1212 c->fec_inner = p->u.qam.fec_inner;
1213 c->modulation = p->u.qam.modulation;
1214 break;
1215 case DVBV3_OFDM:
1216 dev_dbg(fe->dvb->device, "%s: Preparing OFDM req\n", __func__);
1217
1218 switch (p->u.ofdm.bandwidth) {
1219 case BANDWIDTH_10_MHZ:
1220 c->bandwidth_hz = 10000000;
1221 break;
1222 case BANDWIDTH_8_MHZ:
1223 c->bandwidth_hz = 8000000;
1224 break;
1225 case BANDWIDTH_7_MHZ:
1226 c->bandwidth_hz = 7000000;
1227 break;
1228 case BANDWIDTH_6_MHZ:
1229 c->bandwidth_hz = 6000000;
1230 break;
1231 case BANDWIDTH_5_MHZ:
1232 c->bandwidth_hz = 5000000;
1233 break;
1234 case BANDWIDTH_1_712_MHZ:
1235 c->bandwidth_hz = 1712000;
1236 break;
1237 case BANDWIDTH_AUTO:
1238 c->bandwidth_hz = 0;
1239 }
1240
1241 c->code_rate_HP = p->u.ofdm.code_rate_HP;
1242 c->code_rate_LP = p->u.ofdm.code_rate_LP;
1243 c->modulation = p->u.ofdm.constellation;
1244 c->transmission_mode = p->u.ofdm.transmission_mode;
1245 c->guard_interval = p->u.ofdm.guard_interval;
1246 c->hierarchy = p->u.ofdm.hierarchy_information;
1247 break;
1248 case DVBV3_ATSC:
1249 dev_dbg(fe->dvb->device, "%s: Preparing ATSC req\n", __func__);
1250 c->modulation = p->u.vsb.modulation;
1251 if (c->delivery_system == SYS_ATSCMH)
1252 break;
1253 if ((c->modulation == VSB_8) || (c->modulation == VSB_16))
1254 c->delivery_system = SYS_ATSC;
1255 else
1256 c->delivery_system = SYS_DVBC_ANNEX_B;
1257 break;
1258 case DVBV3_UNKNOWN:
1259 dev_err(fe->dvb->device,
1260 "%s: doesn't know how to handle a DVBv3 call to delivery system %i\n",
1261 __func__, c->delivery_system);
1262 return -EINVAL;
1263 }
1264
1265 return 0;
1266}
1267
1268
1269
1270
1271static int dtv_property_legacy_params_sync(struct dvb_frontend *fe,
1272 struct dvb_frontend_parameters *p)
1273{
1274 const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1275
1276 p->frequency = c->frequency;
1277 p->inversion = c->inversion;
1278
1279 switch (dvbv3_type(c->delivery_system)) {
1280 case DVBV3_UNKNOWN:
1281 dev_err(fe->dvb->device,
1282 "%s: doesn't know how to handle a DVBv3 call to delivery system %i\n",
1283 __func__, c->delivery_system);
1284 return -EINVAL;
1285 case DVBV3_QPSK:
1286 dev_dbg(fe->dvb->device, "%s: Preparing QPSK req\n", __func__);
1287 p->u.qpsk.symbol_rate = c->symbol_rate;
1288 p->u.qpsk.fec_inner = c->fec_inner;
1289 break;
1290 case DVBV3_QAM:
1291 dev_dbg(fe->dvb->device, "%s: Preparing QAM req\n", __func__);
1292 p->u.qam.symbol_rate = c->symbol_rate;
1293 p->u.qam.fec_inner = c->fec_inner;
1294 p->u.qam.modulation = c->modulation;
1295 break;
1296 case DVBV3_OFDM:
1297 dev_dbg(fe->dvb->device, "%s: Preparing OFDM req\n", __func__);
1298 switch (c->bandwidth_hz) {
1299 case 10000000:
1300 p->u.ofdm.bandwidth = BANDWIDTH_10_MHZ;
1301 break;
1302 case 8000000:
1303 p->u.ofdm.bandwidth = BANDWIDTH_8_MHZ;
1304 break;
1305 case 7000000:
1306 p->u.ofdm.bandwidth = BANDWIDTH_7_MHZ;
1307 break;
1308 case 6000000:
1309 p->u.ofdm.bandwidth = BANDWIDTH_6_MHZ;
1310 break;
1311 case 5000000:
1312 p->u.ofdm.bandwidth = BANDWIDTH_5_MHZ;
1313 break;
1314 case 1712000:
1315 p->u.ofdm.bandwidth = BANDWIDTH_1_712_MHZ;
1316 break;
1317 case 0:
1318 default:
1319 p->u.ofdm.bandwidth = BANDWIDTH_AUTO;
1320 }
1321 p->u.ofdm.code_rate_HP = c->code_rate_HP;
1322 p->u.ofdm.code_rate_LP = c->code_rate_LP;
1323 p->u.ofdm.constellation = c->modulation;
1324 p->u.ofdm.transmission_mode = c->transmission_mode;
1325 p->u.ofdm.guard_interval = c->guard_interval;
1326 p->u.ofdm.hierarchy_information = c->hierarchy;
1327 break;
1328 case DVBV3_ATSC:
1329 dev_dbg(fe->dvb->device, "%s: Preparing VSB req\n", __func__);
1330 p->u.vsb.modulation = c->modulation;
1331 break;
1332 }
1333 return 0;
1334}
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346static int dtv_get_frontend(struct dvb_frontend *fe,
1347 struct dvb_frontend_parameters *p_out)
1348{
1349 int r;
1350
1351 if (fe->ops.get_frontend) {
1352 r = fe->ops.get_frontend(fe);
1353 if (unlikely(r < 0))
1354 return r;
1355 if (p_out)
1356 dtv_property_legacy_params_sync(fe, p_out);
1357 return 0;
1358 }
1359
1360
1361 return 0;
1362}
1363
1364static int dvb_frontend_ioctl_legacy(struct file *file,
1365 unsigned int cmd, void *parg);
1366static int dvb_frontend_ioctl_properties(struct file *file,
1367 unsigned int cmd, void *parg);
1368
1369static int dtv_property_process_get(struct dvb_frontend *fe,
1370 const struct dtv_frontend_properties *c,
1371 struct dtv_property *tvp,
1372 struct file *file)
1373{
1374 int r, ncaps;
1375
1376 switch(tvp->cmd) {
1377 case DTV_ENUM_DELSYS:
1378 ncaps = 0;
1379 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1380 tvp->u.buffer.data[ncaps] = fe->ops.delsys[ncaps];
1381 ncaps++;
1382 }
1383 tvp->u.buffer.len = ncaps;
1384 break;
1385 case DTV_FREQUENCY:
1386 tvp->u.data = c->frequency;
1387 break;
1388 case DTV_MODULATION:
1389 tvp->u.data = c->modulation;
1390 break;
1391 case DTV_BANDWIDTH_HZ:
1392 tvp->u.data = c->bandwidth_hz;
1393 break;
1394 case DTV_INVERSION:
1395 tvp->u.data = c->inversion;
1396 break;
1397 case DTV_SYMBOL_RATE:
1398 tvp->u.data = c->symbol_rate;
1399 break;
1400 case DTV_INNER_FEC:
1401 tvp->u.data = c->fec_inner;
1402 break;
1403 case DTV_PILOT:
1404 tvp->u.data = c->pilot;
1405 break;
1406 case DTV_ROLLOFF:
1407 tvp->u.data = c->rolloff;
1408 break;
1409 case DTV_DELIVERY_SYSTEM:
1410 tvp->u.data = c->delivery_system;
1411 break;
1412 case DTV_VOLTAGE:
1413 tvp->u.data = c->voltage;
1414 break;
1415 case DTV_TONE:
1416 tvp->u.data = c->sectone;
1417 break;
1418 case DTV_API_VERSION:
1419 tvp->u.data = (DVB_API_VERSION << 8) | DVB_API_VERSION_MINOR;
1420 break;
1421 case DTV_CODE_RATE_HP:
1422 tvp->u.data = c->code_rate_HP;
1423 break;
1424 case DTV_CODE_RATE_LP:
1425 tvp->u.data = c->code_rate_LP;
1426 break;
1427 case DTV_GUARD_INTERVAL:
1428 tvp->u.data = c->guard_interval;
1429 break;
1430 case DTV_TRANSMISSION_MODE:
1431 tvp->u.data = c->transmission_mode;
1432 break;
1433 case DTV_HIERARCHY:
1434 tvp->u.data = c->hierarchy;
1435 break;
1436 case DTV_INTERLEAVING:
1437 tvp->u.data = c->interleaving;
1438 break;
1439
1440
1441 case DTV_ISDBT_PARTIAL_RECEPTION:
1442 tvp->u.data = c->isdbt_partial_reception;
1443 break;
1444 case DTV_ISDBT_SOUND_BROADCASTING:
1445 tvp->u.data = c->isdbt_sb_mode;
1446 break;
1447 case DTV_ISDBT_SB_SUBCHANNEL_ID:
1448 tvp->u.data = c->isdbt_sb_subchannel;
1449 break;
1450 case DTV_ISDBT_SB_SEGMENT_IDX:
1451 tvp->u.data = c->isdbt_sb_segment_idx;
1452 break;
1453 case DTV_ISDBT_SB_SEGMENT_COUNT:
1454 tvp->u.data = c->isdbt_sb_segment_count;
1455 break;
1456 case DTV_ISDBT_LAYER_ENABLED:
1457 tvp->u.data = c->isdbt_layer_enabled;
1458 break;
1459 case DTV_ISDBT_LAYERA_FEC:
1460 tvp->u.data = c->layer[0].fec;
1461 break;
1462 case DTV_ISDBT_LAYERA_MODULATION:
1463 tvp->u.data = c->layer[0].modulation;
1464 break;
1465 case DTV_ISDBT_LAYERA_SEGMENT_COUNT:
1466 tvp->u.data = c->layer[0].segment_count;
1467 break;
1468 case DTV_ISDBT_LAYERA_TIME_INTERLEAVING:
1469 tvp->u.data = c->layer[0].interleaving;
1470 break;
1471 case DTV_ISDBT_LAYERB_FEC:
1472 tvp->u.data = c->layer[1].fec;
1473 break;
1474 case DTV_ISDBT_LAYERB_MODULATION:
1475 tvp->u.data = c->layer[1].modulation;
1476 break;
1477 case DTV_ISDBT_LAYERB_SEGMENT_COUNT:
1478 tvp->u.data = c->layer[1].segment_count;
1479 break;
1480 case DTV_ISDBT_LAYERB_TIME_INTERLEAVING:
1481 tvp->u.data = c->layer[1].interleaving;
1482 break;
1483 case DTV_ISDBT_LAYERC_FEC:
1484 tvp->u.data = c->layer[2].fec;
1485 break;
1486 case DTV_ISDBT_LAYERC_MODULATION:
1487 tvp->u.data = c->layer[2].modulation;
1488 break;
1489 case DTV_ISDBT_LAYERC_SEGMENT_COUNT:
1490 tvp->u.data = c->layer[2].segment_count;
1491 break;
1492 case DTV_ISDBT_LAYERC_TIME_INTERLEAVING:
1493 tvp->u.data = c->layer[2].interleaving;
1494 break;
1495
1496
1497 case DTV_STREAM_ID:
1498 case DTV_DVBT2_PLP_ID_LEGACY:
1499 tvp->u.data = c->stream_id;
1500 break;
1501
1502
1503 case DTV_ATSCMH_FIC_VER:
1504 tvp->u.data = fe->dtv_property_cache.atscmh_fic_ver;
1505 break;
1506 case DTV_ATSCMH_PARADE_ID:
1507 tvp->u.data = fe->dtv_property_cache.atscmh_parade_id;
1508 break;
1509 case DTV_ATSCMH_NOG:
1510 tvp->u.data = fe->dtv_property_cache.atscmh_nog;
1511 break;
1512 case DTV_ATSCMH_TNOG:
1513 tvp->u.data = fe->dtv_property_cache.atscmh_tnog;
1514 break;
1515 case DTV_ATSCMH_SGN:
1516 tvp->u.data = fe->dtv_property_cache.atscmh_sgn;
1517 break;
1518 case DTV_ATSCMH_PRC:
1519 tvp->u.data = fe->dtv_property_cache.atscmh_prc;
1520 break;
1521 case DTV_ATSCMH_RS_FRAME_MODE:
1522 tvp->u.data = fe->dtv_property_cache.atscmh_rs_frame_mode;
1523 break;
1524 case DTV_ATSCMH_RS_FRAME_ENSEMBLE:
1525 tvp->u.data = fe->dtv_property_cache.atscmh_rs_frame_ensemble;
1526 break;
1527 case DTV_ATSCMH_RS_CODE_MODE_PRI:
1528 tvp->u.data = fe->dtv_property_cache.atscmh_rs_code_mode_pri;
1529 break;
1530 case DTV_ATSCMH_RS_CODE_MODE_SEC:
1531 tvp->u.data = fe->dtv_property_cache.atscmh_rs_code_mode_sec;
1532 break;
1533 case DTV_ATSCMH_SCCC_BLOCK_MODE:
1534 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_block_mode;
1535 break;
1536 case DTV_ATSCMH_SCCC_CODE_MODE_A:
1537 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_a;
1538 break;
1539 case DTV_ATSCMH_SCCC_CODE_MODE_B:
1540 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_b;
1541 break;
1542 case DTV_ATSCMH_SCCC_CODE_MODE_C:
1543 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_c;
1544 break;
1545 case DTV_ATSCMH_SCCC_CODE_MODE_D:
1546 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_d;
1547 break;
1548
1549 case DTV_LNA:
1550 tvp->u.data = c->lna;
1551 break;
1552
1553
1554 case DTV_STAT_SIGNAL_STRENGTH:
1555 tvp->u.st = c->strength;
1556 break;
1557 case DTV_STAT_CNR:
1558 tvp->u.st = c->cnr;
1559 break;
1560 case DTV_STAT_PRE_ERROR_BIT_COUNT:
1561 tvp->u.st = c->pre_bit_error;
1562 break;
1563 case DTV_STAT_PRE_TOTAL_BIT_COUNT:
1564 tvp->u.st = c->pre_bit_count;
1565 break;
1566 case DTV_STAT_POST_ERROR_BIT_COUNT:
1567 tvp->u.st = c->post_bit_error;
1568 break;
1569 case DTV_STAT_POST_TOTAL_BIT_COUNT:
1570 tvp->u.st = c->post_bit_count;
1571 break;
1572 case DTV_STAT_ERROR_BLOCK_COUNT:
1573 tvp->u.st = c->block_error;
1574 break;
1575 case DTV_STAT_TOTAL_BLOCK_COUNT:
1576 tvp->u.st = c->block_count;
1577 break;
1578 default:
1579 dev_dbg(fe->dvb->device,
1580 "%s: FE property %d doesn't exist\n",
1581 __func__, tvp->cmd);
1582 return -EINVAL;
1583 }
1584
1585
1586 if (fe->ops.get_property) {
1587 r = fe->ops.get_property(fe, tvp);
1588 if (r < 0)
1589 return r;
1590 }
1591
1592 dtv_property_dump(fe, tvp);
1593
1594 return 0;
1595}
1596
1597static int dtv_set_frontend(struct dvb_frontend *fe);
1598
1599static bool is_dvbv3_delsys(u32 delsys)
1600{
1601 bool status;
1602
1603 status = (delsys == SYS_DVBT) || (delsys == SYS_DVBC_ANNEX_A) ||
1604 (delsys == SYS_DVBS) || (delsys == SYS_ATSC);
1605
1606 return status;
1607}
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619static int emulate_delivery_system(struct dvb_frontend *fe, u32 delsys)
1620{
1621 int i;
1622 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1623
1624 c->delivery_system = delsys;
1625
1626
1627
1628
1629 if (c->delivery_system == SYS_ISDBT) {
1630 dev_dbg(fe->dvb->device,
1631 "%s: Using defaults for SYS_ISDBT\n",
1632 __func__);
1633
1634 if (!c->bandwidth_hz)
1635 c->bandwidth_hz = 6000000;
1636
1637 c->isdbt_partial_reception = 0;
1638 c->isdbt_sb_mode = 0;
1639 c->isdbt_sb_subchannel = 0;
1640 c->isdbt_sb_segment_idx = 0;
1641 c->isdbt_sb_segment_count = 0;
1642 c->isdbt_layer_enabled = 7;
1643 for (i = 0; i < 3; i++) {
1644 c->layer[i].fec = FEC_AUTO;
1645 c->layer[i].modulation = QAM_AUTO;
1646 c->layer[i].interleaving = 0;
1647 c->layer[i].segment_count = 0;
1648 }
1649 }
1650 dev_dbg(fe->dvb->device, "%s: change delivery system on cache to %d\n",
1651 __func__, c->delivery_system);
1652
1653 return 0;
1654}
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673static int dvbv5_set_delivery_system(struct dvb_frontend *fe,
1674 u32 desired_system)
1675{
1676 int ncaps;
1677 u32 delsys = SYS_UNDEFINED;
1678 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1679 enum dvbv3_emulation_type type;
1680
1681
1682
1683
1684
1685
1686
1687 if (desired_system == SYS_UNDEFINED)
1688 desired_system = fe->ops.delsys[0];
1689
1690
1691
1692
1693
1694
1695 ncaps = 0;
1696 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1697 if (fe->ops.delsys[ncaps] == desired_system) {
1698 c->delivery_system = desired_system;
1699 dev_dbg(fe->dvb->device,
1700 "%s: Changing delivery system to %d\n",
1701 __func__, desired_system);
1702 return 0;
1703 }
1704 ncaps++;
1705 }
1706
1707
1708
1709
1710
1711
1712
1713
1714 if (!is_dvbv3_delsys(desired_system)) {
1715 dev_dbg(fe->dvb->device,
1716 "%s: Delivery system %d not supported.\n",
1717 __func__, desired_system);
1718 return -EINVAL;
1719 }
1720
1721 type = dvbv3_type(desired_system);
1722
1723
1724
1725
1726
1727 ncaps = 0;
1728 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1729 if (dvbv3_type(fe->ops.delsys[ncaps]) == type)
1730 delsys = fe->ops.delsys[ncaps];
1731 ncaps++;
1732 }
1733
1734
1735 if (delsys == SYS_UNDEFINED) {
1736 dev_dbg(fe->dvb->device,
1737 "%s: Delivery system %d not supported on emulation mode.\n",
1738 __func__, desired_system);
1739 return -EINVAL;
1740 }
1741
1742 dev_dbg(fe->dvb->device,
1743 "%s: Using delivery system %d emulated as if it were %d\n",
1744 __func__, delsys, desired_system);
1745
1746 return emulate_delivery_system(fe, desired_system);
1747}
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777static int dvbv3_set_delivery_system(struct dvb_frontend *fe)
1778{
1779 int ncaps;
1780 u32 delsys = SYS_UNDEFINED;
1781 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1782
1783
1784 if (c->delivery_system == SYS_UNDEFINED)
1785 c->delivery_system = fe->ops.delsys[0];
1786
1787
1788
1789
1790
1791 if (is_dvbv3_delsys(c->delivery_system)) {
1792 dev_dbg(fe->dvb->device,
1793 "%s: Using delivery system to %d\n",
1794 __func__, c->delivery_system);
1795 return 0;
1796 }
1797
1798
1799
1800
1801
1802 ncaps = 0;
1803 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1804 if (dvbv3_type(fe->ops.delsys[ncaps]) != DVBV3_UNKNOWN) {
1805 delsys = fe->ops.delsys[ncaps];
1806 break;
1807 }
1808 ncaps++;
1809 }
1810 if (delsys == SYS_UNDEFINED) {
1811 dev_dbg(fe->dvb->device,
1812 "%s: Couldn't find a delivery system that works with FE_SET_FRONTEND\n",
1813 __func__);
1814 return -EINVAL;
1815 }
1816 return emulate_delivery_system(fe, delsys);
1817}
1818
1819static int dtv_property_process_set(struct dvb_frontend *fe,
1820 struct dtv_property *tvp,
1821 struct file *file)
1822{
1823 int r = 0;
1824 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1825
1826
1827 if (fe->ops.set_property) {
1828 r = fe->ops.set_property(fe, tvp);
1829 if (r < 0)
1830 return r;
1831 }
1832
1833 switch(tvp->cmd) {
1834 case DTV_CLEAR:
1835
1836
1837
1838
1839 dvb_frontend_clear_cache(fe);
1840 break;
1841 case DTV_TUNE:
1842
1843
1844
1845
1846 c->state = tvp->cmd;
1847 dev_dbg(fe->dvb->device, "%s: Finalised property cache\n",
1848 __func__);
1849
1850 r = dtv_set_frontend(fe);
1851 break;
1852 case DTV_FREQUENCY:
1853 c->frequency = tvp->u.data;
1854 break;
1855 case DTV_MODULATION:
1856 c->modulation = tvp->u.data;
1857 break;
1858 case DTV_BANDWIDTH_HZ:
1859 c->bandwidth_hz = tvp->u.data;
1860 break;
1861 case DTV_INVERSION:
1862 c->inversion = tvp->u.data;
1863 break;
1864 case DTV_SYMBOL_RATE:
1865 c->symbol_rate = tvp->u.data;
1866 break;
1867 case DTV_INNER_FEC:
1868 c->fec_inner = tvp->u.data;
1869 break;
1870 case DTV_PILOT:
1871 c->pilot = tvp->u.data;
1872 break;
1873 case DTV_ROLLOFF:
1874 c->rolloff = tvp->u.data;
1875 break;
1876 case DTV_DELIVERY_SYSTEM:
1877 r = dvbv5_set_delivery_system(fe, tvp->u.data);
1878 break;
1879 case DTV_VOLTAGE:
1880 c->voltage = tvp->u.data;
1881 r = dvb_frontend_ioctl_legacy(file, FE_SET_VOLTAGE,
1882 (void *)c->voltage);
1883 break;
1884 case DTV_TONE:
1885 c->sectone = tvp->u.data;
1886 r = dvb_frontend_ioctl_legacy(file, FE_SET_TONE,
1887 (void *)c->sectone);
1888 break;
1889 case DTV_CODE_RATE_HP:
1890 c->code_rate_HP = tvp->u.data;
1891 break;
1892 case DTV_CODE_RATE_LP:
1893 c->code_rate_LP = tvp->u.data;
1894 break;
1895 case DTV_GUARD_INTERVAL:
1896 c->guard_interval = tvp->u.data;
1897 break;
1898 case DTV_TRANSMISSION_MODE:
1899 c->transmission_mode = tvp->u.data;
1900 break;
1901 case DTV_HIERARCHY:
1902 c->hierarchy = tvp->u.data;
1903 break;
1904 case DTV_INTERLEAVING:
1905 c->interleaving = tvp->u.data;
1906 break;
1907
1908
1909 case DTV_ISDBT_PARTIAL_RECEPTION:
1910 c->isdbt_partial_reception = tvp->u.data;
1911 break;
1912 case DTV_ISDBT_SOUND_BROADCASTING:
1913 c->isdbt_sb_mode = tvp->u.data;
1914 break;
1915 case DTV_ISDBT_SB_SUBCHANNEL_ID:
1916 c->isdbt_sb_subchannel = tvp->u.data;
1917 break;
1918 case DTV_ISDBT_SB_SEGMENT_IDX:
1919 c->isdbt_sb_segment_idx = tvp->u.data;
1920 break;
1921 case DTV_ISDBT_SB_SEGMENT_COUNT:
1922 c->isdbt_sb_segment_count = tvp->u.data;
1923 break;
1924 case DTV_ISDBT_LAYER_ENABLED:
1925 c->isdbt_layer_enabled = tvp->u.data;
1926 break;
1927 case DTV_ISDBT_LAYERA_FEC:
1928 c->layer[0].fec = tvp->u.data;
1929 break;
1930 case DTV_ISDBT_LAYERA_MODULATION:
1931 c->layer[0].modulation = tvp->u.data;
1932 break;
1933 case DTV_ISDBT_LAYERA_SEGMENT_COUNT:
1934 c->layer[0].segment_count = tvp->u.data;
1935 break;
1936 case DTV_ISDBT_LAYERA_TIME_INTERLEAVING:
1937 c->layer[0].interleaving = tvp->u.data;
1938 break;
1939 case DTV_ISDBT_LAYERB_FEC:
1940 c->layer[1].fec = tvp->u.data;
1941 break;
1942 case DTV_ISDBT_LAYERB_MODULATION:
1943 c->layer[1].modulation = tvp->u.data;
1944 break;
1945 case DTV_ISDBT_LAYERB_SEGMENT_COUNT:
1946 c->layer[1].segment_count = tvp->u.data;
1947 break;
1948 case DTV_ISDBT_LAYERB_TIME_INTERLEAVING:
1949 c->layer[1].interleaving = tvp->u.data;
1950 break;
1951 case DTV_ISDBT_LAYERC_FEC:
1952 c->layer[2].fec = tvp->u.data;
1953 break;
1954 case DTV_ISDBT_LAYERC_MODULATION:
1955 c->layer[2].modulation = tvp->u.data;
1956 break;
1957 case DTV_ISDBT_LAYERC_SEGMENT_COUNT:
1958 c->layer[2].segment_count = tvp->u.data;
1959 break;
1960 case DTV_ISDBT_LAYERC_TIME_INTERLEAVING:
1961 c->layer[2].interleaving = tvp->u.data;
1962 break;
1963
1964
1965 case DTV_STREAM_ID:
1966 case DTV_DVBT2_PLP_ID_LEGACY:
1967 c->stream_id = tvp->u.data;
1968 break;
1969
1970
1971 case DTV_ATSCMH_PARADE_ID:
1972 fe->dtv_property_cache.atscmh_parade_id = tvp->u.data;
1973 break;
1974 case DTV_ATSCMH_RS_FRAME_ENSEMBLE:
1975 fe->dtv_property_cache.atscmh_rs_frame_ensemble = tvp->u.data;
1976 break;
1977
1978 case DTV_LNA:
1979 c->lna = tvp->u.data;
1980 if (fe->ops.set_lna)
1981 r = fe->ops.set_lna(fe);
1982 if (r < 0)
1983 c->lna = LNA_AUTO;
1984 break;
1985
1986 default:
1987 return -EINVAL;
1988 }
1989
1990 return r;
1991}
1992
1993static int dvb_frontend_ioctl(struct file *file,
1994 unsigned int cmd, void *parg)
1995{
1996 struct dvb_device *dvbdev = file->private_data;
1997 struct dvb_frontend *fe = dvbdev->priv;
1998 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1999 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2000 int err = -EOPNOTSUPP;
2001
2002 dev_dbg(fe->dvb->device, "%s: (%d)\n", __func__, _IOC_NR(cmd));
2003 if (down_interruptible(&fepriv->sem))
2004 return -ERESTARTSYS;
2005
2006 if (fe->exit != DVB_FE_NO_EXIT) {
2007 up(&fepriv->sem);
2008 return -ENODEV;
2009 }
2010
2011 if ((file->f_flags & O_ACCMODE) == O_RDONLY &&
2012 (_IOC_DIR(cmd) != _IOC_READ || cmd == FE_GET_EVENT ||
2013 cmd == FE_DISEQC_RECV_SLAVE_REPLY)) {
2014 up(&fepriv->sem);
2015 return -EPERM;
2016 }
2017
2018 if ((cmd == FE_SET_PROPERTY) || (cmd == FE_GET_PROPERTY))
2019 err = dvb_frontend_ioctl_properties(file, cmd, parg);
2020 else {
2021 c->state = DTV_UNDEFINED;
2022 err = dvb_frontend_ioctl_legacy(file, cmd, parg);
2023 }
2024
2025 up(&fepriv->sem);
2026 return err;
2027}
2028
2029static int dvb_frontend_ioctl_properties(struct file *file,
2030 unsigned int cmd, void *parg)
2031{
2032 struct dvb_device *dvbdev = file->private_data;
2033 struct dvb_frontend *fe = dvbdev->priv;
2034 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2035 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
2036 int err = 0;
2037
2038 struct dtv_properties *tvps = parg;
2039 struct dtv_property *tvp = NULL;
2040 int i;
2041
2042 dev_dbg(fe->dvb->device, "%s:\n", __func__);
2043
2044 if (cmd == FE_SET_PROPERTY) {
2045 dev_dbg(fe->dvb->device, "%s: properties.num = %d\n", __func__, tvps->num);
2046 dev_dbg(fe->dvb->device, "%s: properties.props = %p\n", __func__, tvps->props);
2047
2048
2049
2050 if ((tvps->num == 0) || (tvps->num > DTV_IOCTL_MAX_MSGS))
2051 return -EINVAL;
2052
2053 tvp = kmalloc(tvps->num * sizeof(struct dtv_property), GFP_KERNEL);
2054 if (!tvp) {
2055 err = -ENOMEM;
2056 goto out;
2057 }
2058
2059 if (copy_from_user(tvp, (void __user *)tvps->props,
2060 tvps->num * sizeof(struct dtv_property))) {
2061 err = -EFAULT;
2062 goto out;
2063 }
2064
2065 for (i = 0; i < tvps->num; i++) {
2066 err = dtv_property_process_set(fe, tvp + i, file);
2067 if (err < 0)
2068 goto out;
2069 (tvp + i)->result = err;
2070 }
2071
2072 if (c->state == DTV_TUNE)
2073 dev_dbg(fe->dvb->device, "%s: Property cache is full, tuning\n", __func__);
2074
2075 } else if (cmd == FE_GET_PROPERTY) {
2076 dev_dbg(fe->dvb->device, "%s: properties.num = %d\n", __func__, tvps->num);
2077 dev_dbg(fe->dvb->device, "%s: properties.props = %p\n", __func__, tvps->props);
2078
2079
2080
2081 if ((tvps->num == 0) || (tvps->num > DTV_IOCTL_MAX_MSGS))
2082 return -EINVAL;
2083
2084 tvp = kmalloc(tvps->num * sizeof(struct dtv_property), GFP_KERNEL);
2085 if (!tvp) {
2086 err = -ENOMEM;
2087 goto out;
2088 }
2089
2090 if (copy_from_user(tvp, (void __user *)tvps->props,
2091 tvps->num * sizeof(struct dtv_property))) {
2092 err = -EFAULT;
2093 goto out;
2094 }
2095
2096
2097
2098
2099
2100
2101 if (fepriv->state != FESTATE_IDLE) {
2102 err = dtv_get_frontend(fe, NULL);
2103 if (err < 0)
2104 goto out;
2105 }
2106 for (i = 0; i < tvps->num; i++) {
2107 err = dtv_property_process_get(fe, c, tvp + i, file);
2108 if (err < 0)
2109 goto out;
2110 (tvp + i)->result = err;
2111 }
2112
2113 if (copy_to_user((void __user *)tvps->props, tvp,
2114 tvps->num * sizeof(struct dtv_property))) {
2115 err = -EFAULT;
2116 goto out;
2117 }
2118
2119 } else
2120 err = -EOPNOTSUPP;
2121
2122out:
2123 kfree(tvp);
2124 return err;
2125}
2126
2127static int dtv_set_frontend(struct dvb_frontend *fe)
2128{
2129 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2130 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
2131 struct dvb_frontend_tune_settings fetunesettings;
2132 u32 rolloff = 0;
2133
2134 if (dvb_frontend_check_parameters(fe) < 0)
2135 return -EINVAL;
2136
2137
2138
2139
2140
2141
2142 dtv_property_legacy_params_sync(fe, &fepriv->parameters_out);
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163 switch (c->delivery_system) {
2164 case SYS_ATSC:
2165 case SYS_DVBC_ANNEX_B:
2166 c->bandwidth_hz = 6000000;
2167 break;
2168 case SYS_DVBC_ANNEX_A:
2169 rolloff = 115;
2170 break;
2171 case SYS_DVBC_ANNEX_C:
2172 rolloff = 113;
2173 break;
2174 case SYS_DVBS:
2175 case SYS_TURBO:
2176 case SYS_ISDBS:
2177 rolloff = 135;
2178 break;
2179 case SYS_DVBS2:
2180 switch (c->rolloff) {
2181 case ROLLOFF_20:
2182 rolloff = 120;
2183 break;
2184 case ROLLOFF_25:
2185 rolloff = 125;
2186 break;
2187 default:
2188 case ROLLOFF_35:
2189 rolloff = 135;
2190 }
2191 break;
2192 default:
2193 break;
2194 }
2195 if (rolloff)
2196 c->bandwidth_hz = mult_frac(c->symbol_rate, rolloff, 100);
2197
2198
2199 if (dvb_force_auto_inversion)
2200 c->inversion = INVERSION_AUTO;
2201
2202
2203
2204
2205
2206 if (c->hierarchy == HIERARCHY_NONE && c->code_rate_LP == FEC_NONE)
2207 c->code_rate_LP = FEC_AUTO;
2208
2209
2210 memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
2211 if (fe->ops.get_tune_settings && (fe->ops.get_tune_settings(fe, &fetunesettings) == 0)) {
2212 fepriv->min_delay = (fetunesettings.min_delay_ms * HZ) / 1000;
2213 fepriv->max_drift = fetunesettings.max_drift;
2214 fepriv->step_size = fetunesettings.step_size;
2215 } else {
2216
2217 switch (c->delivery_system) {
2218 case SYS_DVBS:
2219 case SYS_DVBS2:
2220 case SYS_ISDBS:
2221 case SYS_TURBO:
2222 case SYS_DVBC_ANNEX_A:
2223 case SYS_DVBC_ANNEX_C:
2224 fepriv->min_delay = HZ / 20;
2225 fepriv->step_size = c->symbol_rate / 16000;
2226 fepriv->max_drift = c->symbol_rate / 2000;
2227 break;
2228 case SYS_DVBT:
2229 case SYS_DVBT2:
2230 case SYS_ISDBT:
2231 case SYS_DTMB:
2232 fepriv->min_delay = HZ / 20;
2233 fepriv->step_size = fe->ops.info.frequency_stepsize * 2;
2234 fepriv->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
2235 break;
2236 default:
2237
2238
2239
2240
2241 fepriv->min_delay = HZ / 20;
2242 fepriv->step_size = 0;
2243 fepriv->max_drift = 0;
2244 break;
2245 }
2246 }
2247 if (dvb_override_tune_delay > 0)
2248 fepriv->min_delay = (dvb_override_tune_delay * HZ) / 1000;
2249
2250 fepriv->state = FESTATE_RETUNE;
2251
2252
2253 fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
2254
2255 dvb_frontend_clear_events(fe);
2256 dvb_frontend_add_event(fe, 0);
2257 dvb_frontend_wakeup(fe);
2258 fepriv->status = 0;
2259
2260 return 0;
2261}
2262
2263
2264static int dvb_frontend_ioctl_legacy(struct file *file,
2265 unsigned int cmd, void *parg)
2266{
2267 struct dvb_device *dvbdev = file->private_data;
2268 struct dvb_frontend *fe = dvbdev->priv;
2269 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2270 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
2271 int err = -EOPNOTSUPP;
2272
2273 switch (cmd) {
2274 case FE_GET_INFO: {
2275 struct dvb_frontend_info* info = parg;
2276
2277 memcpy(info, &fe->ops.info, sizeof(struct dvb_frontend_info));
2278 dvb_frontend_get_frequency_limits(fe, &info->frequency_min, &info->frequency_max);
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291 switch (dvbv3_type(c->delivery_system)) {
2292 case DVBV3_QPSK:
2293 info->type = FE_QPSK;
2294 break;
2295 case DVBV3_ATSC:
2296 info->type = FE_ATSC;
2297 break;
2298 case DVBV3_QAM:
2299 info->type = FE_QAM;
2300 break;
2301 case DVBV3_OFDM:
2302 info->type = FE_OFDM;
2303 break;
2304 default:
2305 dev_err(fe->dvb->device,
2306 "%s: doesn't know how to handle a DVBv3 call to delivery system %i\n",
2307 __func__, c->delivery_system);
2308 fe->ops.info.type = FE_OFDM;
2309 }
2310 dev_dbg(fe->dvb->device, "%s: current delivery system on cache: %d, V3 type: %d\n",
2311 __func__, c->delivery_system, fe->ops.info.type);
2312
2313
2314 if (!(fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT))
2315 info->caps |= FE_CAN_INVERSION_AUTO;
2316 err = 0;
2317 break;
2318 }
2319
2320 case FE_READ_STATUS: {
2321 enum fe_status *status = parg;
2322
2323
2324
2325 if (fepriv->state == FESTATE_RETUNE ||
2326 fepriv->state == FESTATE_ERROR) {
2327 err=0;
2328 *status = 0;
2329 break;
2330 }
2331
2332 if (fe->ops.read_status)
2333 err = fe->ops.read_status(fe, status);
2334 break;
2335 }
2336
2337 case FE_READ_BER:
2338 if (fe->ops.read_ber) {
2339 if (fepriv->thread)
2340 err = fe->ops.read_ber(fe, (__u32 *) parg);
2341 else
2342 err = -EAGAIN;
2343 }
2344 break;
2345
2346 case FE_READ_SIGNAL_STRENGTH:
2347 if (fe->ops.read_signal_strength) {
2348 if (fepriv->thread)
2349 err = fe->ops.read_signal_strength(fe, (__u16 *) parg);
2350 else
2351 err = -EAGAIN;
2352 }
2353 break;
2354
2355 case FE_READ_SNR:
2356 if (fe->ops.read_snr) {
2357 if (fepriv->thread)
2358 err = fe->ops.read_snr(fe, (__u16 *) parg);
2359 else
2360 err = -EAGAIN;
2361 }
2362 break;
2363
2364 case FE_READ_UNCORRECTED_BLOCKS:
2365 if (fe->ops.read_ucblocks) {
2366 if (fepriv->thread)
2367 err = fe->ops.read_ucblocks(fe, (__u32 *) parg);
2368 else
2369 err = -EAGAIN;
2370 }
2371 break;
2372
2373 case FE_DISEQC_RESET_OVERLOAD:
2374 if (fe->ops.diseqc_reset_overload) {
2375 err = fe->ops.diseqc_reset_overload(fe);
2376 fepriv->state = FESTATE_DISEQC;
2377 fepriv->status = 0;
2378 }
2379 break;
2380
2381 case FE_DISEQC_SEND_MASTER_CMD:
2382 if (fe->ops.diseqc_send_master_cmd) {
2383 struct dvb_diseqc_master_cmd *cmd = parg;
2384
2385 if (cmd->msg_len > sizeof(cmd->msg)) {
2386 err = -EINVAL;
2387 break;
2388 }
2389 err = fe->ops.diseqc_send_master_cmd(fe, cmd);
2390 fepriv->state = FESTATE_DISEQC;
2391 fepriv->status = 0;
2392 }
2393 break;
2394
2395 case FE_DISEQC_SEND_BURST:
2396 if (fe->ops.diseqc_send_burst) {
2397 err = fe->ops.diseqc_send_burst(fe,
2398 (enum fe_sec_mini_cmd)parg);
2399 fepriv->state = FESTATE_DISEQC;
2400 fepriv->status = 0;
2401 }
2402 break;
2403
2404 case FE_SET_TONE:
2405 if (fe->ops.set_tone) {
2406 err = fe->ops.set_tone(fe,
2407 (enum fe_sec_tone_mode)parg);
2408 fepriv->tone = (enum fe_sec_tone_mode)parg;
2409 fepriv->state = FESTATE_DISEQC;
2410 fepriv->status = 0;
2411 }
2412 break;
2413
2414 case FE_SET_VOLTAGE:
2415 if (fe->ops.set_voltage) {
2416 err = fe->ops.set_voltage(fe,
2417 (enum fe_sec_voltage)parg);
2418 fepriv->voltage = (enum fe_sec_voltage)parg;
2419 fepriv->state = FESTATE_DISEQC;
2420 fepriv->status = 0;
2421 }
2422 break;
2423
2424 case FE_DISHNETWORK_SEND_LEGACY_CMD:
2425 if (fe->ops.dishnetwork_send_legacy_command) {
2426 err = fe->ops.dishnetwork_send_legacy_command(fe,
2427 (unsigned long)parg);
2428 fepriv->state = FESTATE_DISEQC;
2429 fepriv->status = 0;
2430 } else if (fe->ops.set_voltage) {
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447 unsigned long swcmd = ((unsigned long) parg) << 1;
2448 ktime_t nexttime;
2449 ktime_t tv[10];
2450 int i;
2451 u8 last = 1;
2452 if (dvb_frontend_debug)
2453 printk("%s switch command: 0x%04lx\n", __func__, swcmd);
2454 nexttime = ktime_get_real();
2455 if (dvb_frontend_debug)
2456 tv[0] = nexttime;
2457
2458
2459
2460 fe->ops.set_voltage(fe, SEC_VOLTAGE_18);
2461 dvb_frontend_sleep_until(&nexttime, 32000);
2462
2463 for (i = 0; i < 9; i++) {
2464 if (dvb_frontend_debug)
2465 tv[i+1] = ktime_get_real();
2466 if ((swcmd & 0x01) != last) {
2467
2468 fe->ops.set_voltage(fe, (last) ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18);
2469 last = (last) ? 0 : 1;
2470 }
2471 swcmd = swcmd >> 1;
2472 if (i != 8)
2473 dvb_frontend_sleep_until(&nexttime, 8000);
2474 }
2475 if (dvb_frontend_debug) {
2476 printk("%s(%d): switch delay (should be 32k followed by all 8k\n",
2477 __func__, fe->dvb->num);
2478 for (i = 1; i < 10; i++)
2479 printk("%d: %d\n", i,
2480 (int) ktime_us_delta(tv[i], tv[i-1]));
2481 }
2482 err = 0;
2483 fepriv->state = FESTATE_DISEQC;
2484 fepriv->status = 0;
2485 }
2486 break;
2487
2488 case FE_DISEQC_RECV_SLAVE_REPLY:
2489 if (fe->ops.diseqc_recv_slave_reply)
2490 err = fe->ops.diseqc_recv_slave_reply(fe, (struct dvb_diseqc_slave_reply*) parg);
2491 break;
2492
2493 case FE_ENABLE_HIGH_LNB_VOLTAGE:
2494 if (fe->ops.enable_high_lnb_voltage)
2495 err = fe->ops.enable_high_lnb_voltage(fe, (long) parg);
2496 break;
2497
2498 case FE_SET_FRONTEND:
2499 err = dvbv3_set_delivery_system(fe);
2500 if (err)
2501 break;
2502
2503 err = dtv_property_cache_sync(fe, c, parg);
2504 if (err)
2505 break;
2506 err = dtv_set_frontend(fe);
2507 break;
2508 case FE_GET_EVENT:
2509 err = dvb_frontend_get_event (fe, parg, file->f_flags);
2510 break;
2511
2512 case FE_GET_FRONTEND:
2513 err = dtv_get_frontend(fe, parg);
2514 break;
2515
2516 case FE_SET_FRONTEND_TUNE_MODE:
2517 fepriv->tune_mode_flags = (unsigned long) parg;
2518 err = 0;
2519 break;
2520 }
2521
2522 return err;
2523}
2524
2525
2526static unsigned int dvb_frontend_poll(struct file *file, struct poll_table_struct *wait)
2527{
2528 struct dvb_device *dvbdev = file->private_data;
2529 struct dvb_frontend *fe = dvbdev->priv;
2530 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2531
2532 dev_dbg_ratelimited(fe->dvb->device, "%s:\n", __func__);
2533
2534 poll_wait (file, &fepriv->events.wait_queue, wait);
2535
2536 if (fepriv->events.eventw != fepriv->events.eventr)
2537 return (POLLIN | POLLRDNORM | POLLPRI);
2538
2539 return 0;
2540}
2541
2542static int dvb_frontend_open(struct inode *inode, struct file *file)
2543{
2544 struct dvb_device *dvbdev = file->private_data;
2545 struct dvb_frontend *fe = dvbdev->priv;
2546 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2547 struct dvb_adapter *adapter = fe->dvb;
2548 int ret;
2549
2550 dev_dbg(fe->dvb->device, "%s:\n", __func__);
2551 if (fe->exit == DVB_FE_DEVICE_REMOVED)
2552 return -ENODEV;
2553
2554 if (adapter->mfe_shared) {
2555 mutex_lock (&adapter->mfe_lock);
2556
2557 if (adapter->mfe_dvbdev == NULL)
2558 adapter->mfe_dvbdev = dvbdev;
2559
2560 else if (adapter->mfe_dvbdev != dvbdev) {
2561 struct dvb_device
2562 *mfedev = adapter->mfe_dvbdev;
2563 struct dvb_frontend
2564 *mfe = mfedev->priv;
2565 struct dvb_frontend_private
2566 *mfepriv = mfe->frontend_priv;
2567 int mferetry = (dvb_mfe_wait_time << 1);
2568
2569 mutex_unlock (&adapter->mfe_lock);
2570 while (mferetry-- && (mfedev->users != -1 ||
2571 mfepriv->thread != NULL)) {
2572 if(msleep_interruptible(500)) {
2573 if(signal_pending(current))
2574 return -EINTR;
2575 }
2576 }
2577
2578 mutex_lock (&adapter->mfe_lock);
2579 if(adapter->mfe_dvbdev != dvbdev) {
2580 mfedev = adapter->mfe_dvbdev;
2581 mfe = mfedev->priv;
2582 mfepriv = mfe->frontend_priv;
2583 if (mfedev->users != -1 ||
2584 mfepriv->thread != NULL) {
2585 mutex_unlock (&adapter->mfe_lock);
2586 return -EBUSY;
2587 }
2588 adapter->mfe_dvbdev = dvbdev;
2589 }
2590 }
2591 }
2592
2593 if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) {
2594 if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0)
2595 goto err0;
2596
2597
2598
2599
2600
2601
2602
2603 fepriv->reinitialise = 1;
2604 }
2605
2606 if ((ret = dvb_generic_open (inode, file)) < 0)
2607 goto err1;
2608
2609 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
2610
2611 fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
2612 fepriv->tone = -1;
2613 fepriv->voltage = -1;
2614
2615 ret = dvb_frontend_start (fe);
2616 if (ret)
2617 goto err2;
2618
2619
2620 fepriv->events.eventr = fepriv->events.eventw = 0;
2621 }
2622
2623 if (adapter->mfe_shared)
2624 mutex_unlock (&adapter->mfe_lock);
2625 return ret;
2626
2627err2:
2628 dvb_generic_release(inode, file);
2629err1:
2630 if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl)
2631 fe->ops.ts_bus_ctrl(fe, 0);
2632err0:
2633 if (adapter->mfe_shared)
2634 mutex_unlock (&adapter->mfe_lock);
2635 return ret;
2636}
2637
2638static int dvb_frontend_release(struct inode *inode, struct file *file)
2639{
2640 struct dvb_device *dvbdev = file->private_data;
2641 struct dvb_frontend *fe = dvbdev->priv;
2642 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2643 int ret;
2644
2645 dev_dbg(fe->dvb->device, "%s:\n", __func__);
2646
2647 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
2648 fepriv->release_jiffies = jiffies;
2649 mb();
2650 }
2651
2652 ret = dvb_generic_release (inode, file);
2653
2654 if (dvbdev->users == -1) {
2655 wake_up(&fepriv->wait_queue);
2656 if (fe->exit != DVB_FE_NO_EXIT)
2657 wake_up(&dvbdev->wait_queue);
2658 if (fe->ops.ts_bus_ctrl)
2659 fe->ops.ts_bus_ctrl(fe, 0);
2660 }
2661
2662 return ret;
2663}
2664
2665static const struct file_operations dvb_frontend_fops = {
2666 .owner = THIS_MODULE,
2667 .unlocked_ioctl = dvb_generic_ioctl,
2668 .poll = dvb_frontend_poll,
2669 .open = dvb_frontend_open,
2670 .release = dvb_frontend_release,
2671 .llseek = noop_llseek,
2672};
2673
2674int dvb_frontend_suspend(struct dvb_frontend *fe)
2675{
2676 int ret = 0;
2677
2678 dev_dbg(fe->dvb->device, "%s: adap=%d fe=%d\n", __func__, fe->dvb->num,
2679 fe->id);
2680
2681 if (fe->ops.tuner_ops.suspend)
2682 ret = fe->ops.tuner_ops.suspend(fe);
2683 else if (fe->ops.tuner_ops.sleep)
2684 ret = fe->ops.tuner_ops.sleep(fe);
2685
2686 if (fe->ops.sleep)
2687 ret = fe->ops.sleep(fe);
2688
2689 return ret;
2690}
2691EXPORT_SYMBOL(dvb_frontend_suspend);
2692
2693int dvb_frontend_resume(struct dvb_frontend *fe)
2694{
2695 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2696 int ret = 0;
2697
2698 dev_dbg(fe->dvb->device, "%s: adap=%d fe=%d\n", __func__, fe->dvb->num,
2699 fe->id);
2700
2701 fe->exit = DVB_FE_DEVICE_RESUME;
2702 if (fe->ops.init)
2703 ret = fe->ops.init(fe);
2704
2705 if (fe->ops.tuner_ops.resume)
2706 ret = fe->ops.tuner_ops.resume(fe);
2707 else if (fe->ops.tuner_ops.init)
2708 ret = fe->ops.tuner_ops.init(fe);
2709
2710 if (fe->ops.set_tone && fepriv->tone != -1)
2711 fe->ops.set_tone(fe, fepriv->tone);
2712 if (fe->ops.set_voltage && fepriv->voltage != -1)
2713 fe->ops.set_voltage(fe, fepriv->voltage);
2714
2715 fe->exit = DVB_FE_NO_EXIT;
2716 fepriv->state = FESTATE_RETUNE;
2717 dvb_frontend_wakeup(fe);
2718
2719 return ret;
2720}
2721EXPORT_SYMBOL(dvb_frontend_resume);
2722
2723int dvb_register_frontend(struct dvb_adapter* dvb,
2724 struct dvb_frontend* fe)
2725{
2726 struct dvb_frontend_private *fepriv;
2727 const struct dvb_device dvbdev_template = {
2728 .users = ~0,
2729 .writers = 1,
2730 .readers = (~0)-1,
2731 .fops = &dvb_frontend_fops,
2732#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
2733 .name = fe->ops.info.name,
2734#endif
2735 .kernel_ioctl = dvb_frontend_ioctl
2736 };
2737
2738 dev_dbg(dvb->device, "%s:\n", __func__);
2739
2740 if (mutex_lock_interruptible(&frontend_mutex))
2741 return -ERESTARTSYS;
2742
2743 fe->frontend_priv = kzalloc(sizeof(struct dvb_frontend_private), GFP_KERNEL);
2744 if (fe->frontend_priv == NULL) {
2745 mutex_unlock(&frontend_mutex);
2746 return -ENOMEM;
2747 }
2748 fepriv = fe->frontend_priv;
2749
2750 sema_init(&fepriv->sem, 1);
2751 init_waitqueue_head (&fepriv->wait_queue);
2752 init_waitqueue_head (&fepriv->events.wait_queue);
2753 mutex_init(&fepriv->events.mtx);
2754 fe->dvb = dvb;
2755 fepriv->inversion = INVERSION_OFF;
2756
2757 dev_info(fe->dvb->device,
2758 "DVB: registering adapter %i frontend %i (%s)...\n",
2759 fe->dvb->num, fe->id, fe->ops.info.name);
2760
2761 dvb_register_device (fe->dvb, &fepriv->dvbdev, &dvbdev_template,
2762 fe, DVB_DEVICE_FRONTEND, 0);
2763
2764
2765
2766
2767
2768
2769 fe->dtv_property_cache.delivery_system = fe->ops.delsys[0];
2770 dvb_frontend_clear_cache(fe);
2771
2772 mutex_unlock(&frontend_mutex);
2773 return 0;
2774}
2775EXPORT_SYMBOL(dvb_register_frontend);
2776
2777int dvb_unregister_frontend(struct dvb_frontend* fe)
2778{
2779 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2780 dev_dbg(fe->dvb->device, "%s:\n", __func__);
2781
2782 mutex_lock(&frontend_mutex);
2783 dvb_frontend_stop (fe);
2784 mutex_unlock(&frontend_mutex);
2785
2786 if (fepriv->dvbdev->users < -1)
2787 wait_event(fepriv->dvbdev->wait_queue,
2788 fepriv->dvbdev->users==-1);
2789
2790 mutex_lock(&frontend_mutex);
2791 dvb_unregister_device (fepriv->dvbdev);
2792
2793
2794 kfree(fepriv);
2795 mutex_unlock(&frontend_mutex);
2796 return 0;
2797}
2798EXPORT_SYMBOL(dvb_unregister_frontend);
2799
2800#ifdef CONFIG_MEDIA_ATTACH
2801void dvb_frontend_detach(struct dvb_frontend* fe)
2802{
2803 void *ptr;
2804
2805 if (fe->ops.release_sec) {
2806 fe->ops.release_sec(fe);
2807 dvb_detach(fe->ops.release_sec);
2808 }
2809 if (fe->ops.tuner_ops.release) {
2810 fe->ops.tuner_ops.release(fe);
2811 dvb_detach(fe->ops.tuner_ops.release);
2812 }
2813 if (fe->ops.analog_ops.release) {
2814 fe->ops.analog_ops.release(fe);
2815 dvb_detach(fe->ops.analog_ops.release);
2816 }
2817 ptr = (void*)fe->ops.release;
2818 if (ptr) {
2819 fe->ops.release(fe);
2820 dvb_detach(ptr);
2821 }
2822}
2823#else
2824void dvb_frontend_detach(struct dvb_frontend* fe)
2825{
2826 if (fe->ops.release_sec)
2827 fe->ops.release_sec(fe);
2828 if (fe->ops.tuner_ops.release)
2829 fe->ops.tuner_ops.release(fe);
2830 if (fe->ops.analog_ops.release)
2831 fe->ops.analog_ops.release(fe);
2832 if (fe->ops.release)
2833 fe->ops.release(fe);
2834}
2835#endif
2836EXPORT_SYMBOL(dvb_frontend_detach);
2837