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