Merge rsync://www.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[pandora-kernel.git] / drivers / media / dvb / dvb-core / dvb_frontend.c
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>
38 #include <linux/jiffies.h>
39 #include <asm/processor.h>
40 #include <asm/semaphore.h>
41
42 #include "dvb_frontend.h"
43 #include "dvbdev.h"
44
45 // #define DEBUG_LOCKLOSS 1
46
47 static int dvb_frontend_debug;
48 static int dvb_shutdown_timeout = 5;
49 static int dvb_force_auto_inversion;
50 static int dvb_override_tune_delay;
51 static int dvb_powerdown_on_sleep = 1;
52
53 module_param_named(frontend_debug, dvb_frontend_debug, int, 0644);
54 MODULE_PARM_DESC(frontend_debug, "Turn on/off frontend core debugging (default:off).");
55 module_param(dvb_shutdown_timeout, int, 0444);
56 MODULE_PARM_DESC(dvb_shutdown_timeout, "wait <shutdown_timeout> seconds after close() before suspending hardware");
57 module_param(dvb_force_auto_inversion, int, 0444);
58 MODULE_PARM_DESC(dvb_force_auto_inversion, "0: normal (default), 1: INVERSION_AUTO forced always");
59 module_param(dvb_override_tune_delay, int, 0444);
60 MODULE_PARM_DESC(dvb_override_tune_delay, "0: normal (default), >0 => delay in milliseconds to wait for lock after a tune attempt");
61 module_param(dvb_powerdown_on_sleep, int, 0444);
62 MODULE_PARM_DESC(dvb_powerdown_on_sleep, "0: do not power down, 1: turn LNB volatage off on sleep (default)");
63
64 #define dprintk if (dvb_frontend_debug) printk
65
66 #define FESTATE_IDLE 1
67 #define FESTATE_RETUNE 2
68 #define FESTATE_TUNING_FAST 4
69 #define FESTATE_TUNING_SLOW 8
70 #define FESTATE_TUNED 16
71 #define FESTATE_ZIGZAG_FAST 32
72 #define FESTATE_ZIGZAG_SLOW 64
73 #define FESTATE_DISEQC 128
74 #define FESTATE_WAITFORLOCK (FESTATE_TUNING_FAST | FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW | FESTATE_DISEQC)
75 #define FESTATE_SEARCHING_FAST (FESTATE_TUNING_FAST | FESTATE_ZIGZAG_FAST)
76 #define FESTATE_SEARCHING_SLOW (FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_SLOW)
77 #define FESTATE_LOSTLOCK (FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW)
78 /*
79  * FESTATE_IDLE. No tuning parameters have been supplied and the loop is idling.
80  * FESTATE_RETUNE. Parameters have been supplied, but we have not yet performed the first tune.
81  * FESTATE_TUNING_FAST. Tuning parameters have been supplied and fast zigzag scan is in progress.
82  * FESTATE_TUNING_SLOW. Tuning parameters have been supplied. Fast zigzag failed, so we're trying again, but slower.
83  * FESTATE_TUNED. The frontend has successfully locked on.
84  * FESTATE_ZIGZAG_FAST. The lock has been lost, and a fast zigzag has been initiated to try and regain it.
85  * FESTATE_ZIGZAG_SLOW. The lock has been lost. Fast zigzag has been failed, so we're trying again, but slower.
86  * FESTATE_DISEQC. A DISEQC command has just been issued.
87  * FESTATE_WAITFORLOCK. When we're waiting for a lock.
88  * FESTATE_SEARCHING_FAST. When we're searching for a signal using a fast zigzag scan.
89  * FESTATE_SEARCHING_SLOW. When we're searching for a signal using a slow zigzag scan.
90  * FESTATE_LOSTLOCK. When the lock has been lost, and we're searching it again.
91  */
92
93 static DECLARE_MUTEX(frontend_mutex);
94
95 struct dvb_frontend_private {
96
97         struct dvb_device *dvbdev;
98         struct dvb_frontend_parameters parameters;
99         struct dvb_fe_events events;
100         struct semaphore sem;
101         struct list_head list_head;
102         wait_queue_head_t wait_queue;
103         pid_t thread_pid;
104         unsigned long release_jiffies;
105         int state;
106         int bending;
107         int lnb_drift;
108         int inversion;
109         int auto_step;
110         int auto_sub_step;
111         int started_auto_step;
112         int min_delay;
113         int max_drift;
114         int step_size;
115         int exit;
116         int wakeup;
117         fe_status_t status;
118         fe_sec_tone_mode_t tone;
119 };
120
121
122 static void dvb_frontend_add_event(struct dvb_frontend *fe, fe_status_t status)
123 {
124         struct dvb_frontend_private *fepriv = fe->frontend_priv;
125         struct dvb_fe_events *events = &fepriv->events;
126         struct dvb_frontend_event *e;
127         int wp;
128
129         dprintk ("%s\n", __FUNCTION__);
130
131         if (down_interruptible (&events->sem))
132                 return;
133
134         wp = (events->eventw + 1) % MAX_EVENT;
135
136         if (wp == events->eventr) {
137                 events->overflow = 1;
138                 events->eventr = (events->eventr + 1) % MAX_EVENT;
139         }
140
141         e = &events->events[events->eventw];
142
143         memcpy (&e->parameters, &fepriv->parameters,
144                 sizeof (struct dvb_frontend_parameters));
145
146         if (status & FE_HAS_LOCK)
147                 if (fe->ops->get_frontend)
148                         fe->ops->get_frontend(fe, &e->parameters);
149
150         events->eventw = wp;
151
152         up (&events->sem);
153
154         e->status = status;
155
156         wake_up_interruptible (&events->wait_queue);
157 }
158
159 static int dvb_frontend_get_event(struct dvb_frontend *fe,
160                             struct dvb_frontend_event *event, int flags)
161 {
162         struct dvb_frontend_private *fepriv = fe->frontend_priv;
163         struct dvb_fe_events *events = &fepriv->events;
164
165         dprintk ("%s\n", __FUNCTION__);
166
167         if (events->overflow) {
168                 events->overflow = 0;
169                 return -EOVERFLOW;
170         }
171
172         if (events->eventw == events->eventr) {
173                 int ret;
174
175                 if (flags & O_NONBLOCK)
176                         return -EWOULDBLOCK;
177
178                 up(&fepriv->sem);
179
180                 ret = wait_event_interruptible (events->wait_queue,
181                                                 events->eventw != events->eventr);
182
183                 if (down_interruptible (&fepriv->sem))
184                         return -ERESTARTSYS;
185
186                 if (ret < 0)
187                         return ret;
188         }
189
190         if (down_interruptible (&events->sem))
191                 return -ERESTARTSYS;
192
193         memcpy (event, &events->events[events->eventr],
194                 sizeof(struct dvb_frontend_event));
195
196         events->eventr = (events->eventr + 1) % MAX_EVENT;
197
198         up (&events->sem);
199
200         return 0;
201 }
202
203 static void dvb_frontend_init(struct dvb_frontend *fe)
204 {
205         dprintk ("DVB: initialising frontend %i (%s)...\n",
206                  fe->dvb->num,
207                  fe->ops->info.name);
208
209         if (fe->ops->init)
210                 fe->ops->init(fe);
211 }
212
213 static void update_delay(int *quality, int *delay, int min_delay, int locked)
214 {
215             int q2;
216
217             dprintk ("%s\n", __FUNCTION__);
218
219             if (locked)
220                       (*quality) = (*quality * 220 + 36*256) / 256;
221             else
222                       (*quality) = (*quality * 220 + 0) / 256;
223
224             q2 = *quality - 128;
225             q2 *= q2;
226
227             *delay = min_delay + q2 * HZ / (128*128);
228 }
229
230 /**
231  * Performs automatic twiddling of frontend parameters.
232  *
233  * @param fe The frontend concerned.
234  * @param check_wrapped Checks if an iteration has completed. DO NOT SET ON THE FIRST ATTEMPT
235  * @returns Number of complete iterations that have been performed.
236  */
237 static int dvb_frontend_autotune(struct dvb_frontend *fe, int check_wrapped)
238 {
239         int autoinversion;
240         int ready = 0;
241         struct dvb_frontend_private *fepriv = fe->frontend_priv;
242         int original_inversion = fepriv->parameters.inversion;
243         u32 original_frequency = fepriv->parameters.frequency;
244
245         /* are we using autoinversion? */
246         autoinversion = ((!(fe->ops->info.caps & FE_CAN_INVERSION_AUTO)) &&
247                          (fepriv->parameters.inversion == INVERSION_AUTO));
248
249         /* setup parameters correctly */
250         while(!ready) {
251                 /* calculate the lnb_drift */
252                 fepriv->lnb_drift = fepriv->auto_step * fepriv->step_size;
253
254                 /* wrap the auto_step if we've exceeded the maximum drift */
255                 if (fepriv->lnb_drift > fepriv->max_drift) {
256                         fepriv->auto_step = 0;
257                         fepriv->auto_sub_step = 0;
258                         fepriv->lnb_drift = 0;
259                 }
260
261                 /* perform inversion and +/- zigzag */
262                 switch(fepriv->auto_sub_step) {
263                 case 0:
264                         /* try with the current inversion and current drift setting */
265                         ready = 1;
266                         break;
267
268                 case 1:
269                         if (!autoinversion) break;
270
271                         fepriv->inversion = (fepriv->inversion == INVERSION_OFF) ? INVERSION_ON : INVERSION_OFF;
272                         ready = 1;
273                         break;
274
275                 case 2:
276                         if (fepriv->lnb_drift == 0) break;
277
278                         fepriv->lnb_drift = -fepriv->lnb_drift;
279                         ready = 1;
280                         break;
281
282                 case 3:
283                         if (fepriv->lnb_drift == 0) break;
284                         if (!autoinversion) break;
285
286                         fepriv->inversion = (fepriv->inversion == INVERSION_OFF) ? INVERSION_ON : INVERSION_OFF;
287                         fepriv->lnb_drift = -fepriv->lnb_drift;
288                         ready = 1;
289                         break;
290
291                 default:
292                         fepriv->auto_step++;
293                         fepriv->auto_sub_step = -1; /* it'll be incremented to 0 in a moment */
294                         break;
295                 }
296
297                 if (!ready) fepriv->auto_sub_step++;
298         }
299
300         /* if this attempt would hit where we started, indicate a complete
301          * iteration has occurred */
302         if ((fepriv->auto_step == fepriv->started_auto_step) &&
303             (fepriv->auto_sub_step == 0) && check_wrapped) {
304                 return 1;
305         }
306
307         dprintk("%s: drift:%i inversion:%i auto_step:%i "
308                 "auto_sub_step:%i started_auto_step:%i\n",
309                 __FUNCTION__, fepriv->lnb_drift, fepriv->inversion,
310                 fepriv->auto_step, fepriv->auto_sub_step, fepriv->started_auto_step);
311
312         /* set the frontend itself */
313         fepriv->parameters.frequency += fepriv->lnb_drift;
314         if (autoinversion)
315                 fepriv->parameters.inversion = fepriv->inversion;
316         if (fe->ops->set_frontend)
317                 fe->ops->set_frontend(fe, &fepriv->parameters);
318
319         fepriv->parameters.frequency = original_frequency;
320         fepriv->parameters.inversion = original_inversion;
321
322         fepriv->auto_sub_step++;
323         return 0;
324 }
325
326 static int dvb_frontend_is_exiting(struct dvb_frontend *fe)
327 {
328         struct dvb_frontend_private *fepriv = fe->frontend_priv;
329
330         if (fepriv->exit)
331                 return 1;
332
333         if (fepriv->dvbdev->writers == 1)
334                 if (time_after(jiffies, fepriv->release_jiffies +
335                                         dvb_shutdown_timeout * HZ))
336                         return 1;
337
338         return 0;
339 }
340
341 static int dvb_frontend_should_wakeup(struct dvb_frontend *fe)
342 {
343         struct dvb_frontend_private *fepriv = fe->frontend_priv;
344
345         if (fepriv->wakeup) {
346                 fepriv->wakeup = 0;
347                 return 1;
348         }
349         return dvb_frontend_is_exiting(fe);
350 }
351
352 static void dvb_frontend_wakeup(struct dvb_frontend *fe)
353 {
354         struct dvb_frontend_private *fepriv = fe->frontend_priv;
355
356         fepriv->wakeup = 1;
357         wake_up_interruptible(&fepriv->wait_queue);
358 }
359
360 /*
361  * FIXME: use linux/kthread.h
362  */
363 static int dvb_frontend_thread(void *data)
364 {
365         struct dvb_frontend *fe = data;
366         struct dvb_frontend_private *fepriv = fe->frontend_priv;
367         unsigned long timeout;
368         char name [15];
369         int quality = 0, delay = 3*HZ;
370         fe_status_t s;
371         int check_wrapped = 0;
372
373         dprintk("%s\n", __FUNCTION__);
374
375         snprintf (name, sizeof(name), "kdvb-fe-%i", fe->dvb->num);
376
377         lock_kernel();
378         daemonize(name);
379         sigfillset(&current->blocked);
380         unlock_kernel();
381
382         fepriv->status = 0;
383         dvb_frontend_init(fe);
384         fepriv->wakeup = 0;
385
386         while (1) {
387                 up(&fepriv->sem);           /* is locked when we enter the thread... */
388
389                 timeout = wait_event_interruptible_timeout(fepriv->wait_queue,
390                                                            dvb_frontend_should_wakeup(fe),
391                                                            delay);
392                 if (0 != dvb_frontend_is_exiting(fe)) {
393                         /* got signal or quitting */
394                         break;
395                 }
396
397                 try_to_freeze();
398
399                 if (down_interruptible(&fepriv->sem))
400                         break;
401
402                 /* if we've got no parameters, just keep idling */
403                 if (fepriv->state & FESTATE_IDLE) {
404                         delay = 3*HZ;
405                         quality = 0;
406                         continue;
407                 }
408
409                 /* get the frontend status */
410                 if (fepriv->state & FESTATE_RETUNE) {
411                         s = 0;
412                 } else {
413                         if (fe->ops->read_status)
414                                 fe->ops->read_status(fe, &s);
415                         if (s != fepriv->status) {
416                                 dvb_frontend_add_event(fe, s);
417                                 fepriv->status = s;
418                         }
419                 }
420                 /* if we're not tuned, and we have a lock, move to the TUNED state */
421                 if ((fepriv->state & FESTATE_WAITFORLOCK) && (s & FE_HAS_LOCK)) {
422                         update_delay(&quality, &delay, fepriv->min_delay, s & FE_HAS_LOCK);
423                         fepriv->state = FESTATE_TUNED;
424
425                         /* if we're tuned, then we have determined the correct inversion */
426                         if ((!(fe->ops->info.caps & FE_CAN_INVERSION_AUTO)) &&
427                             (fepriv->parameters.inversion == INVERSION_AUTO)) {
428                                 fepriv->parameters.inversion = fepriv->inversion;
429                         }
430                         continue;
431                 }
432
433                 /* if we are tuned already, check we're still locked */
434                 if (fepriv->state & FESTATE_TUNED) {
435                         update_delay(&quality, &delay, fepriv->min_delay, s & FE_HAS_LOCK);
436
437                         /* we're tuned, and the lock is still good... */
438                         if (s & FE_HAS_LOCK)
439                                 continue;
440                         else { /* if we _WERE_ tuned, but now don't have a lock */
441 #ifdef DEBUG_LOCKLOSS
442                                 /* first of all try setting the tone again if it was on - this
443                                  * sometimes works around problems with noisy power supplies */
444                                 if (fe->ops->set_tone && (fepriv->tone == SEC_TONE_ON)) {
445                                         fe->ops->set_tone(fe, fepriv->tone);
446                                         mdelay(100);
447                                         s = 0;
448                                         fe->ops->read_status(fe, &s);
449                                         if (s & FE_HAS_LOCK) {
450                                                 printk("DVB%i: Lock was lost, but regained by setting "
451                                                        "the tone. This may indicate your power supply "
452                                                        "is noisy/slightly incompatable with this DVB-S "
453                                                        "adapter\n", fe->dvb->num);
454                                                 fepriv->state = FESTATE_TUNED;
455                                                 continue;
456                                         }
457                                 }
458 #endif
459                                 /* some other reason for losing the lock - start zigzagging */
460                                 fepriv->state = FESTATE_ZIGZAG_FAST;
461                                 fepriv->started_auto_step = fepriv->auto_step;
462                                 check_wrapped = 0;
463                         }
464                 }
465
466                 /* don't actually do anything if we're in the LOSTLOCK state,
467                  * the frontend is set to FE_CAN_RECOVER, and the max_drift is 0 */
468                 if ((fepriv->state & FESTATE_LOSTLOCK) &&
469                     (fe->ops->info.caps & FE_CAN_RECOVER) && (fepriv->max_drift == 0)) {
470                         update_delay(&quality, &delay, fepriv->min_delay, s & FE_HAS_LOCK);
471                         continue;
472                 }
473
474                 /* don't do anything if we're in the DISEQC state, since this
475                  * might be someone with a motorized dish controlled by DISEQC.
476                  * If its actually a re-tune, there will be a SET_FRONTEND soon enough. */
477                 if (fepriv->state & FESTATE_DISEQC) {
478                         update_delay(&quality, &delay, fepriv->min_delay, s & FE_HAS_LOCK);
479                         continue;
480                 }
481
482                 /* if we're in the RETUNE state, set everything up for a brand
483                  * new scan, keeping the current inversion setting, as the next
484                  * tune is _very_ likely to require the same */
485                 if (fepriv->state & FESTATE_RETUNE) {
486                         fepriv->lnb_drift = 0;
487                         fepriv->auto_step = 0;
488                         fepriv->auto_sub_step = 0;
489                         fepriv->started_auto_step = 0;
490                         check_wrapped = 0;
491                 }
492
493                 /* fast zigzag. */
494                 if ((fepriv->state & FESTATE_SEARCHING_FAST) || (fepriv->state & FESTATE_RETUNE)) {
495                         delay = fepriv->min_delay;
496
497                         /* peform a tune */
498                         if (dvb_frontend_autotune(fe, check_wrapped)) {
499                                 /* OK, if we've run out of trials at the fast speed.
500                                  * Drop back to slow for the _next_ attempt */
501                                 fepriv->state = FESTATE_SEARCHING_SLOW;
502                                 fepriv->started_auto_step = fepriv->auto_step;
503                                 continue;
504                         }
505                         check_wrapped = 1;
506
507                         /* if we've just retuned, enter the ZIGZAG_FAST state.
508                          * This ensures we cannot return from an
509                          * FE_SET_FRONTEND ioctl before the first frontend tune
510                          * occurs */
511                         if (fepriv->state & FESTATE_RETUNE) {
512                                 fepriv->state = FESTATE_TUNING_FAST;
513                         }
514                 }
515
516                 /* slow zigzag */
517                 if (fepriv->state & FESTATE_SEARCHING_SLOW) {
518                         update_delay(&quality, &delay, fepriv->min_delay, s & FE_HAS_LOCK);
519
520                         /* Note: don't bother checking for wrapping; we stay in this
521                          * state until we get a lock */
522                         dvb_frontend_autotune(fe, 0);
523                 }
524         }
525
526         if (dvb_shutdown_timeout) {
527                 if (dvb_powerdown_on_sleep)
528                         if (fe->ops->set_voltage)
529                                 fe->ops->set_voltage(fe, SEC_VOLTAGE_OFF);
530                 if (fe->ops->sleep)
531                         fe->ops->sleep(fe);
532         }
533
534         fepriv->thread_pid = 0;
535         mb();
536
537         dvb_frontend_wakeup(fe);
538         return 0;
539 }
540
541 static void dvb_frontend_stop(struct dvb_frontend *fe)
542 {
543         unsigned long ret;
544         struct dvb_frontend_private *fepriv = fe->frontend_priv;
545
546         dprintk ("%s\n", __FUNCTION__);
547
548         fepriv->exit = 1;
549         mb();
550
551         if (!fepriv->thread_pid)
552                 return;
553
554         /* check if the thread is really alive */
555         if (kill_proc(fepriv->thread_pid, 0, 1) == -ESRCH) {
556                 printk("dvb_frontend_stop: thread PID %d already died\n",
557                                 fepriv->thread_pid);
558                 /* make sure the mutex was not held by the thread */
559                 init_MUTEX (&fepriv->sem);
560                 return;
561         }
562
563         /* wake up the frontend thread, so it notices that fe->exit == 1 */
564         dvb_frontend_wakeup(fe);
565
566         /* wait until the frontend thread has exited */
567         ret = wait_event_interruptible(fepriv->wait_queue,0 == fepriv->thread_pid);
568         if (-ERESTARTSYS != ret) {
569                 fepriv->state = FESTATE_IDLE;
570                 return;
571         }
572         fepriv->state = FESTATE_IDLE;
573
574         /* paranoia check in case a signal arrived */
575         if (fepriv->thread_pid)
576                 printk("dvb_frontend_stop: warning: thread PID %d won't exit\n",
577                                 fepriv->thread_pid);
578 }
579
580 static int dvb_frontend_start(struct dvb_frontend *fe)
581 {
582         int ret;
583         struct dvb_frontend_private *fepriv = fe->frontend_priv;
584
585         dprintk ("%s\n", __FUNCTION__);
586
587         if (fepriv->thread_pid) {
588                 if (!fepriv->exit)
589                         return 0;
590                 else
591                         dvb_frontend_stop (fe);
592         }
593
594         if (signal_pending(current))
595                 return -EINTR;
596         if (down_interruptible (&fepriv->sem))
597                 return -EINTR;
598
599         fepriv->state = FESTATE_IDLE;
600         fepriv->exit = 0;
601         fepriv->thread_pid = 0;
602         mb();
603
604         ret = kernel_thread (dvb_frontend_thread, fe, 0);
605
606         if (ret < 0) {
607                 printk("dvb_frontend_start: failed to start kernel_thread (%d)\n", ret);
608                 up(&fepriv->sem);
609                 return ret;
610         }
611         fepriv->thread_pid = ret;
612
613         return 0;
614 }
615
616 static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
617                         unsigned int cmd, void *parg)
618 {
619         struct dvb_device *dvbdev = file->private_data;
620         struct dvb_frontend *fe = dvbdev->priv;
621         struct dvb_frontend_private *fepriv = fe->frontend_priv;
622         int err = -EOPNOTSUPP;
623
624         dprintk ("%s\n", __FUNCTION__);
625
626         if (!fe || fepriv->exit)
627                 return -ENODEV;
628
629         if ((file->f_flags & O_ACCMODE) == O_RDONLY &&
630             (_IOC_DIR(cmd) != _IOC_READ || cmd == FE_GET_EVENT ||
631              cmd == FE_DISEQC_RECV_SLAVE_REPLY))
632                 return -EPERM;
633
634         if (down_interruptible (&fepriv->sem))
635                 return -ERESTARTSYS;
636
637         switch (cmd) {
638         case FE_GET_INFO: {
639                 struct dvb_frontend_info* info = parg;
640                 memcpy(info, &fe->ops->info, sizeof(struct dvb_frontend_info));
641
642                 /* Force the CAN_INVERSION_AUTO bit on. If the frontend doesn't
643                  * do it, it is done for it. */
644                 info->caps |= FE_CAN_INVERSION_AUTO;
645                 err = 0;
646                 break;
647         }
648
649         case FE_READ_STATUS: {
650                 fe_status_t* status = parg;
651
652                 /* if retune was requested but hasn't occured yet, prevent
653                  * that user get signal state from previous tuning */
654                 if(fepriv->state == FESTATE_RETUNE) {
655                         err=0;
656                         *status = 0;
657                         break;
658                 }
659
660                 if (fe->ops->read_status)
661                         err = fe->ops->read_status(fe, status);
662                 break;
663         }
664         case FE_READ_BER:
665                 if (fe->ops->read_ber)
666                         err = fe->ops->read_ber(fe, (__u32*) parg);
667                 break;
668
669         case FE_READ_SIGNAL_STRENGTH:
670                 if (fe->ops->read_signal_strength)
671                         err = fe->ops->read_signal_strength(fe, (__u16*) parg);
672                 break;
673
674         case FE_READ_SNR:
675                 if (fe->ops->read_snr)
676                         err = fe->ops->read_snr(fe, (__u16*) parg);
677                 break;
678
679         case FE_READ_UNCORRECTED_BLOCKS:
680                 if (fe->ops->read_ucblocks)
681                         err = fe->ops->read_ucblocks(fe, (__u32*) parg);
682                 break;
683
684
685         case FE_DISEQC_RESET_OVERLOAD:
686                 if (fe->ops->diseqc_reset_overload) {
687                         err = fe->ops->diseqc_reset_overload(fe);
688                         fepriv->state = FESTATE_DISEQC;
689                         fepriv->status = 0;
690                 }
691                 break;
692
693         case FE_DISEQC_SEND_MASTER_CMD:
694                 if (fe->ops->diseqc_send_master_cmd) {
695                         err = fe->ops->diseqc_send_master_cmd(fe, (struct dvb_diseqc_master_cmd*) parg);
696                         fepriv->state = FESTATE_DISEQC;
697                         fepriv->status = 0;
698                 }
699                 break;
700
701         case FE_DISEQC_SEND_BURST:
702                 if (fe->ops->diseqc_send_burst) {
703                         err = fe->ops->diseqc_send_burst(fe, (fe_sec_mini_cmd_t) parg);
704                         fepriv->state = FESTATE_DISEQC;
705                         fepriv->status = 0;
706                 }
707                 break;
708
709         case FE_SET_TONE:
710                 if (fe->ops->set_tone) {
711                         err = fe->ops->set_tone(fe, (fe_sec_tone_mode_t) parg);
712                         fepriv->state = FESTATE_DISEQC;
713                         fepriv->status = 0;
714                         fepriv->tone = (fe_sec_tone_mode_t) parg;
715                 }
716                 break;
717
718         case FE_SET_VOLTAGE:
719                 if (fe->ops->set_voltage) {
720                         err = fe->ops->set_voltage(fe, (fe_sec_voltage_t) parg);
721                         fepriv->state = FESTATE_DISEQC;
722                         fepriv->status = 0;
723                 }
724                 break;
725
726         case FE_DISHNETWORK_SEND_LEGACY_CMD:
727                 if (fe->ops->dishnetwork_send_legacy_command) {
728                         err = fe->ops->dishnetwork_send_legacy_command(fe, (unsigned int) parg);
729                         fepriv->state = FESTATE_DISEQC;
730                         fepriv->status = 0;
731                 }
732                 break;
733
734         case FE_DISEQC_RECV_SLAVE_REPLY:
735                 if (fe->ops->diseqc_recv_slave_reply)
736                         err = fe->ops->diseqc_recv_slave_reply(fe, (struct dvb_diseqc_slave_reply*) parg);
737                 break;
738
739         case FE_ENABLE_HIGH_LNB_VOLTAGE:
740                 if (fe->ops->enable_high_lnb_voltage)
741                         err = fe->ops->enable_high_lnb_voltage(fe, (int) parg);
742                 break;
743
744         case FE_SET_FRONTEND: {
745                 struct dvb_frontend_tune_settings fetunesettings;
746
747                 memcpy (&fepriv->parameters, parg,
748                         sizeof (struct dvb_frontend_parameters));
749
750                 memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
751                 memcpy(&fetunesettings.parameters, parg,
752                        sizeof (struct dvb_frontend_parameters));
753
754                 /* force auto frequency inversion if requested */
755                 if (dvb_force_auto_inversion) {
756                         fepriv->parameters.inversion = INVERSION_AUTO;
757                         fetunesettings.parameters.inversion = INVERSION_AUTO;
758                 }
759                 if (fe->ops->info.type == FE_OFDM) {
760                         /* without hierachical coding code_rate_LP is irrelevant,
761                          * so we tolerate the otherwise invalid FEC_NONE setting */
762                         if (fepriv->parameters.u.ofdm.hierarchy_information == HIERARCHY_NONE &&
763                             fepriv->parameters.u.ofdm.code_rate_LP == FEC_NONE)
764                                 fepriv->parameters.u.ofdm.code_rate_LP = FEC_AUTO;
765                 }
766
767                 /* get frontend-specific tuning settings */
768                 if (fe->ops->get_tune_settings && (fe->ops->get_tune_settings(fe, &fetunesettings) == 0)) {
769                         fepriv->min_delay = (fetunesettings.min_delay_ms * HZ) / 1000;
770                         fepriv->max_drift = fetunesettings.max_drift;
771                         fepriv->step_size = fetunesettings.step_size;
772                 } else {
773                         /* default values */
774                         switch(fe->ops->info.type) {
775                         case FE_QPSK:
776                                 fepriv->min_delay = HZ/20;
777                                 fepriv->step_size = fepriv->parameters.u.qpsk.symbol_rate / 16000;
778                                 fepriv->max_drift = fepriv->parameters.u.qpsk.symbol_rate / 2000;
779                                 break;
780
781                         case FE_QAM:
782                                 fepriv->min_delay = HZ/20;
783                                 fepriv->step_size = 0; /* no zigzag */
784                                 fepriv->max_drift = 0;
785                                 break;
786
787                         case FE_OFDM:
788                                 fepriv->min_delay = HZ/20;
789                                 fepriv->step_size = fe->ops->info.frequency_stepsize * 2;
790                                 fepriv->max_drift = (fe->ops->info.frequency_stepsize * 2) + 1;
791                                 break;
792                         case FE_ATSC:
793                                 printk("dvb-core: FE_ATSC not handled yet.\n");
794                                 break;
795                         }
796                 }
797                 if (dvb_override_tune_delay > 0)
798                         fepriv->min_delay = (dvb_override_tune_delay * HZ) / 1000;
799
800                 fepriv->state = FESTATE_RETUNE;
801                 dvb_frontend_wakeup(fe);
802                 dvb_frontend_add_event(fe, 0);
803                 fepriv->status = 0;
804                 err = 0;
805                 break;
806         }
807
808         case FE_GET_EVENT:
809                 err = dvb_frontend_get_event (fe, parg, file->f_flags);
810                 break;
811
812         case FE_GET_FRONTEND:
813                 if (fe->ops->get_frontend) {
814                         memcpy (parg, &fepriv->parameters, sizeof (struct dvb_frontend_parameters));
815                         err = fe->ops->get_frontend(fe, (struct dvb_frontend_parameters*) parg);
816                 }
817                 break;
818         };
819
820         up (&fepriv->sem);
821         return err;
822 }
823
824 static unsigned int dvb_frontend_poll(struct file *file, struct poll_table_struct *wait)
825 {
826         struct dvb_device *dvbdev = file->private_data;
827         struct dvb_frontend *fe = dvbdev->priv;
828         struct dvb_frontend_private *fepriv = fe->frontend_priv;
829
830         dprintk ("%s\n", __FUNCTION__);
831
832         poll_wait (file, &fepriv->events.wait_queue, wait);
833
834         if (fepriv->events.eventw != fepriv->events.eventr)
835                 return (POLLIN | POLLRDNORM | POLLPRI);
836
837         return 0;
838 }
839
840 static int dvb_frontend_open(struct inode *inode, struct file *file)
841 {
842         struct dvb_device *dvbdev = file->private_data;
843         struct dvb_frontend *fe = dvbdev->priv;
844         struct dvb_frontend_private *fepriv = fe->frontend_priv;
845         int ret;
846
847         dprintk ("%s\n", __FUNCTION__);
848
849         if ((ret = dvb_generic_open (inode, file)) < 0)
850                 return ret;
851
852         if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
853                 ret = dvb_frontend_start (fe);
854                 if (ret)
855                         dvb_generic_release (inode, file);
856
857                 /*  empty event queue */
858                 fepriv->events.eventr = fepriv->events.eventw = 0;
859         }
860
861         return ret;
862 }
863
864 static int dvb_frontend_release(struct inode *inode, struct file *file)
865 {
866         struct dvb_device *dvbdev = file->private_data;
867         struct dvb_frontend *fe = dvbdev->priv;
868         struct dvb_frontend_private *fepriv = fe->frontend_priv;
869
870         dprintk ("%s\n", __FUNCTION__);
871
872         if ((file->f_flags & O_ACCMODE) != O_RDONLY)
873                 fepriv->release_jiffies = jiffies;
874
875         return dvb_generic_release (inode, file);
876 }
877
878 static struct file_operations dvb_frontend_fops = {
879         .owner          = THIS_MODULE,
880         .ioctl          = dvb_generic_ioctl,
881         .poll           = dvb_frontend_poll,
882         .open           = dvb_frontend_open,
883         .release        = dvb_frontend_release
884 };
885
886 int dvb_register_frontend(struct dvb_adapter* dvb,
887                           struct dvb_frontend* fe)
888 {
889         struct dvb_frontend_private *fepriv;
890         static const struct dvb_device dvbdev_template = {
891                 .users = ~0,
892                 .writers = 1,
893                 .readers = (~0)-1,
894                 .fops = &dvb_frontend_fops,
895                 .kernel_ioctl = dvb_frontend_ioctl
896         };
897
898         dprintk ("%s\n", __FUNCTION__);
899
900         if (down_interruptible (&frontend_mutex))
901                 return -ERESTARTSYS;
902
903         fe->frontend_priv = kmalloc(sizeof(struct dvb_frontend_private), GFP_KERNEL);
904         if (fe->frontend_priv == NULL) {
905                 up(&frontend_mutex);
906                 return -ENOMEM;
907         }
908         fepriv = fe->frontend_priv;
909         memset(fe->frontend_priv, 0, sizeof(struct dvb_frontend_private));
910
911         init_MUTEX (&fepriv->sem);
912         init_waitqueue_head (&fepriv->wait_queue);
913         init_waitqueue_head (&fepriv->events.wait_queue);
914         init_MUTEX (&fepriv->events.sem);
915         fe->dvb = dvb;
916         fepriv->inversion = INVERSION_OFF;
917         fepriv->tone = SEC_TONE_OFF;
918
919         printk ("DVB: registering frontend %i (%s)...\n",
920                 fe->dvb->num,
921                 fe->ops->info.name);
922
923         dvb_register_device (fe->dvb, &fepriv->dvbdev, &dvbdev_template,
924                              fe, DVB_DEVICE_FRONTEND);
925
926         up (&frontend_mutex);
927         return 0;
928 }
929 EXPORT_SYMBOL(dvb_register_frontend);
930
931 int dvb_unregister_frontend(struct dvb_frontend* fe)
932 {
933         struct dvb_frontend_private *fepriv = fe->frontend_priv;
934         dprintk ("%s\n", __FUNCTION__);
935
936         down (&frontend_mutex);
937         dvb_unregister_device (fepriv->dvbdev);
938         dvb_frontend_stop (fe);
939         if (fe->ops->release)
940                 fe->ops->release(fe);
941         else
942                 printk("dvb_frontend: Demodulator (%s) does not have a release callback!\n", fe->ops->info.name);
943         /* fe is invalid now */
944         kfree(fepriv);
945         up (&frontend_mutex);
946         return 0;
947 }
948 EXPORT_SYMBOL(dvb_unregister_frontend);