]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/media/dvb/dvb-core/dvb_frontend.c
V4L/DVB (3673): Fix budget-av CAM reset
[mirror_ubuntu-artful-kernel.git] / drivers / media / dvb / dvb-core / dvb_frontend.c
CommitLineData
1da177e4
LT
1/*
2 * dvb_frontend.c: DVB frontend tuning interface/thread
3 *
4 *
5 * Copyright (C) 1999-2001 Ralph Metzler
6 * Marcus Metzler
7 * Holger Waechtler
8 * for convergence integrated media GmbH
9 *
10 * Copyright (C) 2004 Andrew de Quincey (tuning thread cleanup)
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
26 */
27
28#include <linux/string.h>
29#include <linux/kernel.h>
30#include <linux/sched.h>
31#include <linux/wait.h>
32#include <linux/slab.h>
33#include <linux/poll.h>
34#include <linux/module.h>
35#include <linux/moduleparam.h>
36#include <linux/list.h>
37#include <linux/suspend.h>
cc89c229 38#include <linux/jiffies.h>
1da177e4 39#include <asm/processor.h>
1da177e4
LT
40
41#include "dvb_frontend.h"
42#include "dvbdev.h"
43
44static int dvb_frontend_debug;
45static int dvb_shutdown_timeout = 5;
46static int dvb_force_auto_inversion;
47static int dvb_override_tune_delay;
48static int dvb_powerdown_on_sleep = 1;
49
50module_param_named(frontend_debug, dvb_frontend_debug, int, 0644);
f4f009a7 51MODULE_PARM_DESC(frontend_debug, "Turn on/off frontend core debugging (default:off).");
6baad3f0 52module_param(dvb_shutdown_timeout, int, 0644);
1da177e4 53MODULE_PARM_DESC(dvb_shutdown_timeout, "wait <shutdown_timeout> seconds after close() before suspending hardware");
6baad3f0 54module_param(dvb_force_auto_inversion, int, 0644);
1da177e4 55MODULE_PARM_DESC(dvb_force_auto_inversion, "0: normal (default), 1: INVERSION_AUTO forced always");
6baad3f0 56module_param(dvb_override_tune_delay, int, 0644);
1da177e4 57MODULE_PARM_DESC(dvb_override_tune_delay, "0: normal (default), >0 => delay in milliseconds to wait for lock after a tune attempt");
6baad3f0 58module_param(dvb_powerdown_on_sleep, int, 0644);
1da177e4
LT
59MODULE_PARM_DESC(dvb_powerdown_on_sleep, "0: do not power down, 1: turn LNB volatage off on sleep (default)");
60
61#define dprintk if (dvb_frontend_debug) printk
62
63#define FESTATE_IDLE 1
64#define FESTATE_RETUNE 2
65#define FESTATE_TUNING_FAST 4
66#define FESTATE_TUNING_SLOW 8
67#define FESTATE_TUNED 16
68#define FESTATE_ZIGZAG_FAST 32
69#define FESTATE_ZIGZAG_SLOW 64
70#define FESTATE_DISEQC 128
71#define FESTATE_WAITFORLOCK (FESTATE_TUNING_FAST | FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW | FESTATE_DISEQC)
72#define FESTATE_SEARCHING_FAST (FESTATE_TUNING_FAST | FESTATE_ZIGZAG_FAST)
73#define FESTATE_SEARCHING_SLOW (FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_SLOW)
74#define FESTATE_LOSTLOCK (FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW)
75/*
76 * FESTATE_IDLE. No tuning parameters have been supplied and the loop is idling.
77 * FESTATE_RETUNE. Parameters have been supplied, but we have not yet performed the first tune.
78 * FESTATE_TUNING_FAST. Tuning parameters have been supplied and fast zigzag scan is in progress.
79 * FESTATE_TUNING_SLOW. Tuning parameters have been supplied. Fast zigzag failed, so we're trying again, but slower.
80 * FESTATE_TUNED. The frontend has successfully locked on.
81 * FESTATE_ZIGZAG_FAST. The lock has been lost, and a fast zigzag has been initiated to try and regain it.
82 * FESTATE_ZIGZAG_SLOW. The lock has been lost. Fast zigzag has been failed, so we're trying again, but slower.
83 * FESTATE_DISEQC. A DISEQC command has just been issued.
84 * FESTATE_WAITFORLOCK. When we're waiting for a lock.
85 * FESTATE_SEARCHING_FAST. When we're searching for a signal using a fast zigzag scan.
86 * FESTATE_SEARCHING_SLOW. When we're searching for a signal using a slow zigzag scan.
87 * FESTATE_LOSTLOCK. When the lock has been lost, and we're searching it again.
88 */
89
3593cab5 90static DEFINE_MUTEX(frontend_mutex);
1da177e4
LT
91
92struct dvb_frontend_private {
93
36cb557a 94 /* thread/frontend values */
1da177e4
LT
95 struct dvb_device *dvbdev;
96 struct dvb_frontend_parameters parameters;
97 struct dvb_fe_events events;
98 struct semaphore sem;
99 struct list_head list_head;
100 wait_queue_head_t wait_queue;
101 pid_t thread_pid;
102 unsigned long release_jiffies;
36cb557a
AQ
103 unsigned int exit;
104 unsigned int wakeup;
1da177e4 105 fe_status_t status;
400b7083 106 unsigned long tune_mode_flags;
36cb557a 107 unsigned int delay;
86f40cc3 108 unsigned int reinitialise;
36cb557a
AQ
109
110 /* swzigzag values */
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;
1da177e4
LT
123};
124
86f40cc3 125static void dvb_frontend_wakeup(struct dvb_frontend *fe);
1da177e4
LT
126
127static void dvb_frontend_add_event(struct dvb_frontend *fe, fe_status_t status)
128{
0c53c70f 129 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1da177e4
LT
130 struct dvb_fe_events *events = &fepriv->events;
131 struct dvb_frontend_event *e;
132 int wp;
133
134 dprintk ("%s\n", __FUNCTION__);
135
136 if (down_interruptible (&events->sem))
137 return;
138
139 wp = (events->eventw + 1) % MAX_EVENT;
140
141 if (wp == events->eventr) {
142 events->overflow = 1;
143 events->eventr = (events->eventr + 1) % MAX_EVENT;
144 }
145
146 e = &events->events[events->eventw];
147
148 memcpy (&e->parameters, &fepriv->parameters,
149 sizeof (struct dvb_frontend_parameters));
150
151 if (status & FE_HAS_LOCK)
152 if (fe->ops->get_frontend)
153 fe->ops->get_frontend(fe, &e->parameters);
154
155 events->eventw = wp;
156
157 up (&events->sem);
158
159 e->status = status;
160
161 wake_up_interruptible (&events->wait_queue);
162}
163
164static int dvb_frontend_get_event(struct dvb_frontend *fe,
165 struct dvb_frontend_event *event, int flags)
166{
0c53c70f 167 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1da177e4
LT
168 struct dvb_fe_events *events = &fepriv->events;
169
170 dprintk ("%s\n", __FUNCTION__);
171
172 if (events->overflow) {
173 events->overflow = 0;
174 return -EOVERFLOW;
175 }
176
177 if (events->eventw == events->eventr) {
178 int ret;
179
180 if (flags & O_NONBLOCK)
181 return -EWOULDBLOCK;
182
183 up(&fepriv->sem);
184
185 ret = wait_event_interruptible (events->wait_queue,
186 events->eventw != events->eventr);
187
188 if (down_interruptible (&fepriv->sem))
189 return -ERESTARTSYS;
190
191 if (ret < 0)
192 return ret;
193 }
194
195 if (down_interruptible (&events->sem))
196 return -ERESTARTSYS;
197
198 memcpy (event, &events->events[events->eventr],
199 sizeof(struct dvb_frontend_event));
200
201 events->eventr = (events->eventr + 1) % MAX_EVENT;
202
203 up (&events->sem);
204
205 return 0;
206}
207
208static void dvb_frontend_init(struct dvb_frontend *fe)
209{
210 dprintk ("DVB: initialising frontend %i (%s)...\n",
211 fe->dvb->num,
212 fe->ops->info.name);
213
214 if (fe->ops->init)
215 fe->ops->init(fe);
216}
217
86f40cc3
AQ
218void dvb_frontend_reinitialise(struct dvb_frontend *fe)
219{
220 struct dvb_frontend_private *fepriv = fe->frontend_priv;
221
222 fepriv->reinitialise = 1;
223 dvb_frontend_wakeup(fe);
224}
225EXPORT_SYMBOL(dvb_frontend_reinitialise);
226
36cb557a 227static void dvb_frontend_swzigzag_update_delay(struct dvb_frontend_private *fepriv, int locked)
1da177e4 228{
36cb557a 229 int q2;
1da177e4 230
36cb557a 231 dprintk ("%s\n", __FUNCTION__);
1da177e4 232
36cb557a
AQ
233 if (locked)
234 (fepriv->quality) = (fepriv->quality * 220 + 36*256) / 256;
235 else
236 (fepriv->quality) = (fepriv->quality * 220 + 0) / 256;
1da177e4 237
36cb557a
AQ
238 q2 = fepriv->quality - 128;
239 q2 *= q2;
1da177e4 240
36cb557a 241 fepriv->delay = fepriv->min_delay + q2 * HZ / (128*128);
1da177e4
LT
242}
243
244/**
245 * Performs automatic twiddling of frontend parameters.
246 *
247 * @param fe The frontend concerned.
248 * @param check_wrapped Checks if an iteration has completed. DO NOT SET ON THE FIRST ATTEMPT
249 * @returns Number of complete iterations that have been performed.
250 */
36cb557a 251static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wrapped)
1da177e4
LT
252{
253 int autoinversion;
254 int ready = 0;
0c53c70f 255 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1da177e4
LT
256 int original_inversion = fepriv->parameters.inversion;
257 u32 original_frequency = fepriv->parameters.frequency;
258
259 /* are we using autoinversion? */
260 autoinversion = ((!(fe->ops->info.caps & FE_CAN_INVERSION_AUTO)) &&
261 (fepriv->parameters.inversion == INVERSION_AUTO));
262
263 /* setup parameters correctly */
264 while(!ready) {
265 /* calculate the lnb_drift */
266 fepriv->lnb_drift = fepriv->auto_step * fepriv->step_size;
267
268 /* wrap the auto_step if we've exceeded the maximum drift */
269 if (fepriv->lnb_drift > fepriv->max_drift) {
270 fepriv->auto_step = 0;
271 fepriv->auto_sub_step = 0;
272 fepriv->lnb_drift = 0;
273 }
274
275 /* perform inversion and +/- zigzag */
276 switch(fepriv->auto_sub_step) {
277 case 0:
278 /* try with the current inversion and current drift setting */
279 ready = 1;
280 break;
281
282 case 1:
283 if (!autoinversion) break;
284
285 fepriv->inversion = (fepriv->inversion == INVERSION_OFF) ? INVERSION_ON : INVERSION_OFF;
286 ready = 1;
287 break;
288
289 case 2:
290 if (fepriv->lnb_drift == 0) break;
291
292 fepriv->lnb_drift = -fepriv->lnb_drift;
293 ready = 1;
294 break;
295
296 case 3:
297 if (fepriv->lnb_drift == 0) break;
298 if (!autoinversion) break;
299
300 fepriv->inversion = (fepriv->inversion == INVERSION_OFF) ? INVERSION_ON : INVERSION_OFF;
301 fepriv->lnb_drift = -fepriv->lnb_drift;
302 ready = 1;
303 break;
304
305 default:
306 fepriv->auto_step++;
307 fepriv->auto_sub_step = -1; /* it'll be incremented to 0 in a moment */
308 break;
309 }
310
311 if (!ready) fepriv->auto_sub_step++;
312 }
313
314 /* if this attempt would hit where we started, indicate a complete
315 * iteration has occurred */
316 if ((fepriv->auto_step == fepriv->started_auto_step) &&
317 (fepriv->auto_sub_step == 0) && check_wrapped) {
318 return 1;
319 }
320
321 dprintk("%s: drift:%i inversion:%i auto_step:%i "
322 "auto_sub_step:%i started_auto_step:%i\n",
323 __FUNCTION__, fepriv->lnb_drift, fepriv->inversion,
324 fepriv->auto_step, fepriv->auto_sub_step, fepriv->started_auto_step);
325
326 /* set the frontend itself */
327 fepriv->parameters.frequency += fepriv->lnb_drift;
328 if (autoinversion)
329 fepriv->parameters.inversion = fepriv->inversion;
330 if (fe->ops->set_frontend)
331 fe->ops->set_frontend(fe, &fepriv->parameters);
332
333 fepriv->parameters.frequency = original_frequency;
334 fepriv->parameters.inversion = original_inversion;
335
336 fepriv->auto_sub_step++;
337 return 0;
338}
339
36cb557a
AQ
340static void dvb_frontend_swzigzag(struct dvb_frontend *fe)
341{
342 fe_status_t s;
343 struct dvb_frontend_private *fepriv = fe->frontend_priv;
344
345 /* if we've got no parameters, just keep idling */
346 if (fepriv->state & FESTATE_IDLE) {
347 fepriv->delay = 3*HZ;
348 fepriv->quality = 0;
349 return;
350 }
351
352 /* in SCAN mode, we just set the frontend when asked and leave it alone */
353 if (fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT) {
354 if (fepriv->state & FESTATE_RETUNE) {
355 if (fe->ops->set_frontend)
356 fe->ops->set_frontend(fe, &fepriv->parameters);
357 fepriv->state = FESTATE_TUNED;
358 }
359 fepriv->delay = 3*HZ;
360 fepriv->quality = 0;
361 return;
362 }
363
364 /* get the frontend status */
365 if (fepriv->state & FESTATE_RETUNE) {
366 s = 0;
367 } else {
368 if (fe->ops->read_status)
369 fe->ops->read_status(fe, &s);
370 if (s != fepriv->status) {
371 dvb_frontend_add_event(fe, s);
372 fepriv->status = s;
373 }
374 }
375
376 /* if we're not tuned, and we have a lock, move to the TUNED state */
377 if ((fepriv->state & FESTATE_WAITFORLOCK) && (s & FE_HAS_LOCK)) {
378 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
379 fepriv->state = FESTATE_TUNED;
380
381 /* if we're tuned, then we have determined the correct inversion */
382 if ((!(fe->ops->info.caps & FE_CAN_INVERSION_AUTO)) &&
383 (fepriv->parameters.inversion == INVERSION_AUTO)) {
384 fepriv->parameters.inversion = fepriv->inversion;
385 }
386 return;
387 }
388
389 /* if we are tuned already, check we're still locked */
390 if (fepriv->state & FESTATE_TUNED) {
391 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
392
393 /* we're tuned, and the lock is still good... */
394 if (s & FE_HAS_LOCK) {
395 return;
396 } else { /* if we _WERE_ tuned, but now don't have a lock */
397 fepriv->state = FESTATE_ZIGZAG_FAST;
398 fepriv->started_auto_step = fepriv->auto_step;
399 fepriv->check_wrapped = 0;
400 }
401 }
402
403 /* don't actually do anything if we're in the LOSTLOCK state,
404 * the frontend is set to FE_CAN_RECOVER, and the max_drift is 0 */
405 if ((fepriv->state & FESTATE_LOSTLOCK) &&
406 (fe->ops->info.caps & FE_CAN_RECOVER) && (fepriv->max_drift == 0)) {
407 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
408 return;
409 }
410
411 /* don't do anything if we're in the DISEQC state, since this
412 * might be someone with a motorized dish controlled by DISEQC.
413 * If its actually a re-tune, there will be a SET_FRONTEND soon enough. */
414 if (fepriv->state & FESTATE_DISEQC) {
415 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
416 return;
417 }
418
419 /* if we're in the RETUNE state, set everything up for a brand
420 * new scan, keeping the current inversion setting, as the next
421 * tune is _very_ likely to require the same */
422 if (fepriv->state & FESTATE_RETUNE) {
423 fepriv->lnb_drift = 0;
424 fepriv->auto_step = 0;
425 fepriv->auto_sub_step = 0;
426 fepriv->started_auto_step = 0;
427 fepriv->check_wrapped = 0;
428 }
429
430 /* fast zigzag. */
431 if ((fepriv->state & FESTATE_SEARCHING_FAST) || (fepriv->state & FESTATE_RETUNE)) {
432 fepriv->delay = fepriv->min_delay;
433
434 /* peform a tune */
435 if (dvb_frontend_swzigzag_autotune(fe, fepriv->check_wrapped)) {
436 /* OK, if we've run out of trials at the fast speed.
437 * Drop back to slow for the _next_ attempt */
438 fepriv->state = FESTATE_SEARCHING_SLOW;
439 fepriv->started_auto_step = fepriv->auto_step;
440 return;
441 }
442 fepriv->check_wrapped = 1;
443
444 /* if we've just retuned, enter the ZIGZAG_FAST state.
445 * This ensures we cannot return from an
446 * FE_SET_FRONTEND ioctl before the first frontend tune
447 * occurs */
448 if (fepriv->state & FESTATE_RETUNE) {
449 fepriv->state = FESTATE_TUNING_FAST;
450 }
451 }
452
453 /* slow zigzag */
454 if (fepriv->state & FESTATE_SEARCHING_SLOW) {
455 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
456
457 /* Note: don't bother checking for wrapping; we stay in this
458 * state until we get a lock */
459 dvb_frontend_swzigzag_autotune(fe, 0);
460 }
461}
462
1da177e4
LT
463static int dvb_frontend_is_exiting(struct dvb_frontend *fe)
464{
0c53c70f 465 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1da177e4
LT
466
467 if (fepriv->exit)
468 return 1;
469
470 if (fepriv->dvbdev->writers == 1)
cc89c229 471 if (time_after(jiffies, fepriv->release_jiffies +
36cb557a 472 dvb_shutdown_timeout * HZ))
1da177e4
LT
473 return 1;
474
475 return 0;
476}
477
478static int dvb_frontend_should_wakeup(struct dvb_frontend *fe)
479{
0c53c70f 480 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1da177e4
LT
481
482 if (fepriv->wakeup) {
483 fepriv->wakeup = 0;
484 return 1;
485 }
486 return dvb_frontend_is_exiting(fe);
487}
488
489static void dvb_frontend_wakeup(struct dvb_frontend *fe)
490{
0c53c70f 491 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1da177e4
LT
492
493 fepriv->wakeup = 1;
494 wake_up_interruptible(&fepriv->wait_queue);
495}
496
1da177e4
LT
497static int dvb_frontend_thread(void *data)
498{
0c53c70f
JS
499 struct dvb_frontend *fe = data;
500 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1da177e4
LT
501 unsigned long timeout;
502 char name [15];
1da177e4 503 fe_status_t s;
36cb557a 504 struct dvb_frontend_parameters *params;
1da177e4
LT
505
506 dprintk("%s\n", __FUNCTION__);
507
508 snprintf (name, sizeof(name), "kdvb-fe-%i", fe->dvb->num);
509
afd1a0c9
MCC
510 lock_kernel();
511 daemonize(name);
512 sigfillset(&current->blocked);
513 unlock_kernel();
1da177e4 514
36cb557a
AQ
515 fepriv->check_wrapped = 0;
516 fepriv->quality = 0;
517 fepriv->delay = 3*HZ;
1da177e4 518 fepriv->status = 0;
1da177e4 519 fepriv->wakeup = 0;
86f40cc3 520 fepriv->reinitialise = 1;
1da177e4
LT
521
522 while (1) {
523 up(&fepriv->sem); /* is locked when we enter the thread... */
524
525 timeout = wait_event_interruptible_timeout(fepriv->wait_queue,
526 dvb_frontend_should_wakeup(fe),
36cb557a 527 fepriv->delay);
1da177e4
LT
528 if (0 != dvb_frontend_is_exiting(fe)) {
529 /* got signal or quitting */
530 break;
531 }
532
3e1d1d28 533 try_to_freeze();
1da177e4
LT
534
535 if (down_interruptible(&fepriv->sem))
536 break;
537
86f40cc3
AQ
538 if (fepriv->reinitialise) {
539 dvb_frontend_init(fe);
540 fepriv->reinitialise = 0;
541 }
542
36cb557a
AQ
543 /* do an iteration of the tuning loop */
544 if (fe->ops->tune) {
545 /* have we been asked to retune? */
546 params = NULL;
547 if (fepriv->state & FESTATE_RETUNE) {
548 params = &fepriv->parameters;
549 fepriv->state = FESTATE_TUNED;
550 }
1da177e4 551
36cb557a 552 fe->ops->tune(fe, params, fepriv->tune_mode_flags, &fepriv->delay, &s);
1da177e4
LT
553 if (s != fepriv->status) {
554 dvb_frontend_add_event(fe, s);
555 fepriv->status = s;
556 }
36cb557a
AQ
557 } else {
558 dvb_frontend_swzigzag(fe);
1da177e4
LT
559 }
560 }
561
562 if (dvb_shutdown_timeout) {
563 if (dvb_powerdown_on_sleep)
564 if (fe->ops->set_voltage)
565 fe->ops->set_voltage(fe, SEC_VOLTAGE_OFF);
566 if (fe->ops->sleep)
567 fe->ops->sleep(fe);
568 }
569
570 fepriv->thread_pid = 0;
571 mb();
572
573 dvb_frontend_wakeup(fe);
574 return 0;
575}
576
577static void dvb_frontend_stop(struct dvb_frontend *fe)
578{
579 unsigned long ret;
0c53c70f 580 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1da177e4
LT
581
582 dprintk ("%s\n", __FUNCTION__);
583
584 fepriv->exit = 1;
585 mb();
586
587 if (!fepriv->thread_pid)
588 return;
589
590 /* check if the thread is really alive */
591 if (kill_proc(fepriv->thread_pid, 0, 1) == -ESRCH) {
592 printk("dvb_frontend_stop: thread PID %d already died\n",
593 fepriv->thread_pid);
594 /* make sure the mutex was not held by the thread */
595 init_MUTEX (&fepriv->sem);
596 return;
597 }
598
599 /* wake up the frontend thread, so it notices that fe->exit == 1 */
600 dvb_frontend_wakeup(fe);
601
602 /* wait until the frontend thread has exited */
603 ret = wait_event_interruptible(fepriv->wait_queue,0 == fepriv->thread_pid);
604 if (-ERESTARTSYS != ret) {
605 fepriv->state = FESTATE_IDLE;
606 return;
607 }
608 fepriv->state = FESTATE_IDLE;
609
610 /* paranoia check in case a signal arrived */
611 if (fepriv->thread_pid)
612 printk("dvb_frontend_stop: warning: thread PID %d won't exit\n",
613 fepriv->thread_pid);
614}
615
83b75b04
N
616s32 timeval_usec_diff(struct timeval lasttime, struct timeval curtime)
617{
618 return ((curtime.tv_usec < lasttime.tv_usec) ?
619 1000000 - lasttime.tv_usec + curtime.tv_usec :
620 curtime.tv_usec - lasttime.tv_usec);
621}
622EXPORT_SYMBOL(timeval_usec_diff);
623
624static inline void timeval_usec_add(struct timeval *curtime, u32 add_usec)
625{
626 curtime->tv_usec += add_usec;
627 if (curtime->tv_usec >= 1000000) {
628 curtime->tv_usec -= 1000000;
629 curtime->tv_sec++;
630 }
631}
632
633/*
634 * Sleep until gettimeofday() > waketime + add_usec
635 * This needs to be as precise as possible, but as the delay is
636 * usually between 2ms and 32ms, it is done using a scheduled msleep
637 * followed by usleep (normally a busy-wait loop) for the remainder
638 */
639void dvb_frontend_sleep_until(struct timeval *waketime, u32 add_usec)
640{
641 struct timeval lasttime;
642 s32 delta, newdelta;
643
644 timeval_usec_add(waketime, add_usec);
645
646 do_gettimeofday(&lasttime);
647 delta = timeval_usec_diff(lasttime, *waketime);
648 if (delta > 2500) {
649 msleep((delta - 1500) / 1000);
650 do_gettimeofday(&lasttime);
651 newdelta = timeval_usec_diff(lasttime, *waketime);
652 delta = (newdelta > delta) ? 0 : newdelta;
653 }
654 if (delta > 0)
655 udelay(delta);
656}
657EXPORT_SYMBOL(dvb_frontend_sleep_until);
658
1da177e4
LT
659static int dvb_frontend_start(struct dvb_frontend *fe)
660{
661 int ret;
0c53c70f 662 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1da177e4
LT
663
664 dprintk ("%s\n", __FUNCTION__);
665
666 if (fepriv->thread_pid) {
667 if (!fepriv->exit)
668 return 0;
669 else
670 dvb_frontend_stop (fe);
671 }
672
673 if (signal_pending(current))
674 return -EINTR;
675 if (down_interruptible (&fepriv->sem))
676 return -EINTR;
677
678 fepriv->state = FESTATE_IDLE;
679 fepriv->exit = 0;
680 fepriv->thread_pid = 0;
681 mb();
682
683 ret = kernel_thread (dvb_frontend_thread, fe, 0);
684
685 if (ret < 0) {
686 printk("dvb_frontend_start: failed to start kernel_thread (%d)\n", ret);
687 up(&fepriv->sem);
688 return ret;
689 }
690 fepriv->thread_pid = ret;
691
692 return 0;
693}
694
695static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
696 unsigned int cmd, void *parg)
697{
698 struct dvb_device *dvbdev = file->private_data;
699 struct dvb_frontend *fe = dvbdev->priv;
0c53c70f 700 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1da177e4
LT
701 int err = -EOPNOTSUPP;
702
703 dprintk ("%s\n", __FUNCTION__);
704
705 if (!fe || fepriv->exit)
706 return -ENODEV;
707
708 if ((file->f_flags & O_ACCMODE) == O_RDONLY &&
709 (_IOC_DIR(cmd) != _IOC_READ || cmd == FE_GET_EVENT ||
710 cmd == FE_DISEQC_RECV_SLAVE_REPLY))
711 return -EPERM;
712
713 if (down_interruptible (&fepriv->sem))
714 return -ERESTARTSYS;
715
716 switch (cmd) {
717 case FE_GET_INFO: {
0c53c70f 718 struct dvb_frontend_info* info = parg;
1da177e4
LT
719 memcpy(info, &fe->ops->info, sizeof(struct dvb_frontend_info));
720
721 /* Force the CAN_INVERSION_AUTO bit on. If the frontend doesn't
722 * do it, it is done for it. */
723 info->caps |= FE_CAN_INVERSION_AUTO;
724 err = 0;
725 break;
726 }
727
6757ccc5
PB
728 case FE_READ_STATUS: {
729 fe_status_t* status = parg;
730
731 /* if retune was requested but hasn't occured yet, prevent
732 * that user get signal state from previous tuning */
733 if(fepriv->state == FESTATE_RETUNE) {
734 err=0;
735 *status = 0;
736 break;
737 }
738
1da177e4 739 if (fe->ops->read_status)
6757ccc5 740 err = fe->ops->read_status(fe, status);
1da177e4 741 break;
6757ccc5 742 }
1da177e4
LT
743 case FE_READ_BER:
744 if (fe->ops->read_ber)
745 err = fe->ops->read_ber(fe, (__u32*) parg);
746 break;
747
748 case FE_READ_SIGNAL_STRENGTH:
749 if (fe->ops->read_signal_strength)
750 err = fe->ops->read_signal_strength(fe, (__u16*) parg);
751 break;
752
753 case FE_READ_SNR:
754 if (fe->ops->read_snr)
755 err = fe->ops->read_snr(fe, (__u16*) parg);
756 break;
757
758 case FE_READ_UNCORRECTED_BLOCKS:
759 if (fe->ops->read_ucblocks)
760 err = fe->ops->read_ucblocks(fe, (__u32*) parg);
761 break;
762
763
764 case FE_DISEQC_RESET_OVERLOAD:
765 if (fe->ops->diseqc_reset_overload) {
766 err = fe->ops->diseqc_reset_overload(fe);
767 fepriv->state = FESTATE_DISEQC;
768 fepriv->status = 0;
769 }
770 break;
771
772 case FE_DISEQC_SEND_MASTER_CMD:
773 if (fe->ops->diseqc_send_master_cmd) {
774 err = fe->ops->diseqc_send_master_cmd(fe, (struct dvb_diseqc_master_cmd*) parg);
775 fepriv->state = FESTATE_DISEQC;
776 fepriv->status = 0;
777 }
778 break;
779
780 case FE_DISEQC_SEND_BURST:
781 if (fe->ops->diseqc_send_burst) {
782 err = fe->ops->diseqc_send_burst(fe, (fe_sec_mini_cmd_t) parg);
783 fepriv->state = FESTATE_DISEQC;
784 fepriv->status = 0;
785 }
786 break;
787
788 case FE_SET_TONE:
789 if (fe->ops->set_tone) {
790 err = fe->ops->set_tone(fe, (fe_sec_tone_mode_t) parg);
791 fepriv->state = FESTATE_DISEQC;
792 fepriv->status = 0;
793 }
794 break;
795
796 case FE_SET_VOLTAGE:
797 if (fe->ops->set_voltage) {
798 err = fe->ops->set_voltage(fe, (fe_sec_voltage_t) parg);
799 fepriv->state = FESTATE_DISEQC;
800 fepriv->status = 0;
801 }
802 break;
803
804 case FE_DISHNETWORK_SEND_LEGACY_CMD:
805 if (fe->ops->dishnetwork_send_legacy_command) {
e18828e4 806 err = fe->ops->dishnetwork_send_legacy_command(fe, (unsigned long) parg);
1da177e4
LT
807 fepriv->state = FESTATE_DISEQC;
808 fepriv->status = 0;
83b75b04
N
809 } else if (fe->ops->set_voltage) {
810 /*
811 * NOTE: This is a fallback condition. Some frontends
812 * (stv0299 for instance) take longer than 8msec to
813 * respond to a set_voltage command. Those switches
814 * need custom routines to switch properly. For all
815 * other frontends, the following shoule work ok.
816 * Dish network legacy switches (as used by Dish500)
817 * are controlled by sending 9-bit command words
818 * spaced 8msec apart.
819 * the actual command word is switch/port dependant
820 * so it is up to the userspace application to send
821 * the right command.
822 * The command must always start with a '0' after
823 * initialization, so parg is 8 bits and does not
824 * include the initialization or start bit
825 */
400b7083 826 unsigned long cmd = ((unsigned long) parg) << 1;
83b75b04
N
827 struct timeval nexttime;
828 struct timeval tv[10];
829 int i;
830 u8 last = 1;
831 if (dvb_frontend_debug)
400b7083 832 printk("%s switch command: 0x%04lx\n", __FUNCTION__, cmd);
83b75b04
N
833 do_gettimeofday(&nexttime);
834 if (dvb_frontend_debug)
835 memcpy(&tv[0], &nexttime, sizeof(struct timeval));
836 /* before sending a command, initialize by sending
837 * a 32ms 18V to the switch
838 */
839 fe->ops->set_voltage(fe, SEC_VOLTAGE_18);
840 dvb_frontend_sleep_until(&nexttime, 32000);
841
842 for (i = 0; i < 9; i++) {
843 if (dvb_frontend_debug)
844 do_gettimeofday(&tv[i + 1]);
845 if ((cmd & 0x01) != last) {
846 /* set voltage to (last ? 13V : 18V) */
847 fe->ops->set_voltage(fe, (last) ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18);
848 last = (last) ? 0 : 1;
849 }
850 cmd = cmd >> 1;
851 if (i != 8)
852 dvb_frontend_sleep_until(&nexttime, 8000);
853 }
854 if (dvb_frontend_debug) {
855 printk("%s(%d): switch delay (should be 32k followed by all 8k\n",
856 __FUNCTION__, fe->dvb->num);
857 for (i = 1; i < 10; i++)
858 printk("%d: %d\n", i, timeval_usec_diff(tv[i-1] , tv[i]));
859 }
860 err = 0;
861 fepriv->state = FESTATE_DISEQC;
862 fepriv->status = 0;
1da177e4
LT
863 }
864 break;
865
866 case FE_DISEQC_RECV_SLAVE_REPLY:
867 if (fe->ops->diseqc_recv_slave_reply)
868 err = fe->ops->diseqc_recv_slave_reply(fe, (struct dvb_diseqc_slave_reply*) parg);
869 break;
870
871 case FE_ENABLE_HIGH_LNB_VOLTAGE:
872 if (fe->ops->enable_high_lnb_voltage)
e18828e4 873 err = fe->ops->enable_high_lnb_voltage(fe, (long) parg);
1da177e4
LT
874 break;
875
876 case FE_SET_FRONTEND: {
877 struct dvb_frontend_tune_settings fetunesettings;
878
879 memcpy (&fepriv->parameters, parg,
880 sizeof (struct dvb_frontend_parameters));
881
882 memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
883 memcpy(&fetunesettings.parameters, parg,
884 sizeof (struct dvb_frontend_parameters));
885
886 /* force auto frequency inversion if requested */
887 if (dvb_force_auto_inversion) {
888 fepriv->parameters.inversion = INVERSION_AUTO;
889 fetunesettings.parameters.inversion = INVERSION_AUTO;
890 }
891 if (fe->ops->info.type == FE_OFDM) {
892 /* without hierachical coding code_rate_LP is irrelevant,
893 * so we tolerate the otherwise invalid FEC_NONE setting */
894 if (fepriv->parameters.u.ofdm.hierarchy_information == HIERARCHY_NONE &&
895 fepriv->parameters.u.ofdm.code_rate_LP == FEC_NONE)
896 fepriv->parameters.u.ofdm.code_rate_LP = FEC_AUTO;
897 }
898
899 /* get frontend-specific tuning settings */
900 if (fe->ops->get_tune_settings && (fe->ops->get_tune_settings(fe, &fetunesettings) == 0)) {
901 fepriv->min_delay = (fetunesettings.min_delay_ms * HZ) / 1000;
902 fepriv->max_drift = fetunesettings.max_drift;
903 fepriv->step_size = fetunesettings.step_size;
904 } else {
905 /* default values */
906 switch(fe->ops->info.type) {
907 case FE_QPSK:
908 fepriv->min_delay = HZ/20;
909 fepriv->step_size = fepriv->parameters.u.qpsk.symbol_rate / 16000;
910 fepriv->max_drift = fepriv->parameters.u.qpsk.symbol_rate / 2000;
911 break;
912
913 case FE_QAM:
914 fepriv->min_delay = HZ/20;
915 fepriv->step_size = 0; /* no zigzag */
916 fepriv->max_drift = 0;
917 break;
918
919 case FE_OFDM:
920 fepriv->min_delay = HZ/20;
921 fepriv->step_size = fe->ops->info.frequency_stepsize * 2;
922 fepriv->max_drift = (fe->ops->info.frequency_stepsize * 2) + 1;
923 break;
924 case FE_ATSC:
925 printk("dvb-core: FE_ATSC not handled yet.\n");
926 break;
927 }
928 }
929 if (dvb_override_tune_delay > 0)
930 fepriv->min_delay = (dvb_override_tune_delay * HZ) / 1000;
931
932 fepriv->state = FESTATE_RETUNE;
933 dvb_frontend_wakeup(fe);
934 dvb_frontend_add_event(fe, 0);
935 fepriv->status = 0;
936 err = 0;
937 break;
938 }
939
940 case FE_GET_EVENT:
941 err = dvb_frontend_get_event (fe, parg, file->f_flags);
942 break;
943
944 case FE_GET_FRONTEND:
945 if (fe->ops->get_frontend) {
946 memcpy (parg, &fepriv->parameters, sizeof (struct dvb_frontend_parameters));
947 err = fe->ops->get_frontend(fe, (struct dvb_frontend_parameters*) parg);
948 }
949 break;
36cb557a
AQ
950
951 case FE_SET_FRONTEND_TUNE_MODE:
e18828e4 952 fepriv->tune_mode_flags = (unsigned long) parg;
36cb557a 953 break;
1da177e4
LT
954 };
955
956 up (&fepriv->sem);
957 return err;
958}
959
960static unsigned int dvb_frontend_poll(struct file *file, struct poll_table_struct *wait)
961{
962 struct dvb_device *dvbdev = file->private_data;
963 struct dvb_frontend *fe = dvbdev->priv;
0c53c70f 964 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1da177e4
LT
965
966 dprintk ("%s\n", __FUNCTION__);
967
968 poll_wait (file, &fepriv->events.wait_queue, wait);
969
970 if (fepriv->events.eventw != fepriv->events.eventr)
971 return (POLLIN | POLLRDNORM | POLLPRI);
972
973 return 0;
974}
975
976static int dvb_frontend_open(struct inode *inode, struct file *file)
977{
978 struct dvb_device *dvbdev = file->private_data;
979 struct dvb_frontend *fe = dvbdev->priv;
0c53c70f 980 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1da177e4
LT
981 int ret;
982
983 dprintk ("%s\n", __FUNCTION__);
984
985 if ((ret = dvb_generic_open (inode, file)) < 0)
986 return ret;
987
988 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
989 ret = dvb_frontend_start (fe);
990 if (ret)
991 dvb_generic_release (inode, file);
992
993 /* empty event queue */
994 fepriv->events.eventr = fepriv->events.eventw = 0;
36cb557a
AQ
995
996 /* normal tune mode when opened R/W */
997 fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
1da177e4
LT
998 }
999
1000 return ret;
1001}
1002
1003static int dvb_frontend_release(struct inode *inode, struct file *file)
1004{
1005 struct dvb_device *dvbdev = file->private_data;
1006 struct dvb_frontend *fe = dvbdev->priv;
0c53c70f 1007 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1da177e4
LT
1008
1009 dprintk ("%s\n", __FUNCTION__);
1010
1011 if ((file->f_flags & O_ACCMODE) != O_RDONLY)
1012 fepriv->release_jiffies = jiffies;
1013
1014 return dvb_generic_release (inode, file);
1015}
1016
1017static struct file_operations dvb_frontend_fops = {
1018 .owner = THIS_MODULE,
1019 .ioctl = dvb_generic_ioctl,
1020 .poll = dvb_frontend_poll,
1021 .open = dvb_frontend_open,
1022 .release = dvb_frontend_release
1023};
1024
1025int dvb_register_frontend(struct dvb_adapter* dvb,
1026 struct dvb_frontend* fe)
1027{
1028 struct dvb_frontend_private *fepriv;
1029 static const struct dvb_device dvbdev_template = {
1030 .users = ~0,
1031 .writers = 1,
1032 .readers = (~0)-1,
1033 .fops = &dvb_frontend_fops,
1034 .kernel_ioctl = dvb_frontend_ioctl
1035 };
1036
1037 dprintk ("%s\n", __FUNCTION__);
1038
3593cab5 1039 if (mutex_lock_interruptible(&frontend_mutex))
1da177e4
LT
1040 return -ERESTARTSYS;
1041
7408187d 1042 fe->frontend_priv = kzalloc(sizeof(struct dvb_frontend_private), GFP_KERNEL);
1da177e4 1043 if (fe->frontend_priv == NULL) {
3593cab5 1044 mutex_unlock(&frontend_mutex);
1da177e4
LT
1045 return -ENOMEM;
1046 }
0c53c70f 1047 fepriv = fe->frontend_priv;
1da177e4
LT
1048
1049 init_MUTEX (&fepriv->sem);
1050 init_waitqueue_head (&fepriv->wait_queue);
1051 init_waitqueue_head (&fepriv->events.wait_queue);
1052 init_MUTEX (&fepriv->events.sem);
1053 fe->dvb = dvb;
1054 fepriv->inversion = INVERSION_OFF;
1055
1056 printk ("DVB: registering frontend %i (%s)...\n",
1057 fe->dvb->num,
1058 fe->ops->info.name);
1059
1060 dvb_register_device (fe->dvb, &fepriv->dvbdev, &dvbdev_template,
1061 fe, DVB_DEVICE_FRONTEND);
1062
3593cab5 1063 mutex_unlock(&frontend_mutex);
1da177e4
LT
1064 return 0;
1065}
1066EXPORT_SYMBOL(dvb_register_frontend);
1067
1068int dvb_unregister_frontend(struct dvb_frontend* fe)
1069{
0c53c70f 1070 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1da177e4
LT
1071 dprintk ("%s\n", __FUNCTION__);
1072
3593cab5 1073 mutex_lock(&frontend_mutex);
1da177e4
LT
1074 dvb_unregister_device (fepriv->dvbdev);
1075 dvb_frontend_stop (fe);
1076 if (fe->ops->release)
1077 fe->ops->release(fe);
1078 else
1079 printk("dvb_frontend: Demodulator (%s) does not have a release callback!\n", fe->ops->info.name);
1080 /* fe is invalid now */
1081 kfree(fepriv);
3593cab5 1082 mutex_unlock(&frontend_mutex);
1da177e4
LT
1083 return 0;
1084}
1085EXPORT_SYMBOL(dvb_unregister_frontend);