0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #define __DVB_CORE__
0015
0016 #define pr_fmt(fmt) "dvb_frontend: " fmt
0017
0018 #include <linux/string.h>
0019 #include <linux/kernel.h>
0020 #include <linux/sched/signal.h>
0021 #include <linux/wait.h>
0022 #include <linux/slab.h>
0023 #include <linux/poll.h>
0024 #include <linux/semaphore.h>
0025 #include <linux/module.h>
0026 #include <linux/nospec.h>
0027 #include <linux/list.h>
0028 #include <linux/freezer.h>
0029 #include <linux/jiffies.h>
0030 #include <linux/kthread.h>
0031 #include <linux/ktime.h>
0032 #include <linux/compat.h>
0033 #include <asm/processor.h>
0034
0035 #include <media/dvb_frontend.h>
0036 #include <media/dvbdev.h>
0037 #include <linux/dvb/version.h>
0038
0039 static int dvb_frontend_debug;
0040 static int dvb_shutdown_timeout;
0041 static int dvb_force_auto_inversion;
0042 static int dvb_override_tune_delay;
0043 static int dvb_powerdown_on_sleep = 1;
0044 static int dvb_mfe_wait_time = 5;
0045
0046 module_param_named(frontend_debug, dvb_frontend_debug, int, 0644);
0047 MODULE_PARM_DESC(frontend_debug, "Turn on/off frontend core debugging (default:off).");
0048 module_param(dvb_shutdown_timeout, int, 0644);
0049 MODULE_PARM_DESC(dvb_shutdown_timeout, "wait <shutdown_timeout> seconds after close() before suspending hardware");
0050 module_param(dvb_force_auto_inversion, int, 0644);
0051 MODULE_PARM_DESC(dvb_force_auto_inversion, "0: normal (default), 1: INVERSION_AUTO forced always");
0052 module_param(dvb_override_tune_delay, int, 0644);
0053 MODULE_PARM_DESC(dvb_override_tune_delay, "0: normal (default), >0 => delay in milliseconds to wait for lock after a tune attempt");
0054 module_param(dvb_powerdown_on_sleep, int, 0644);
0055 MODULE_PARM_DESC(dvb_powerdown_on_sleep, "0: do not power down, 1: turn LNB voltage off on sleep (default)");
0056 module_param(dvb_mfe_wait_time, int, 0644);
0057 MODULE_PARM_DESC(dvb_mfe_wait_time, "Wait up to <mfe_wait_time> seconds on open() for multi-frontend to become available (default:5 seconds)");
0058
0059 #define dprintk(fmt, arg...) \
0060 printk(KERN_DEBUG pr_fmt("%s: " fmt), __func__, ##arg)
0061
0062 #define FESTATE_IDLE 1
0063 #define FESTATE_RETUNE 2
0064 #define FESTATE_TUNING_FAST 4
0065 #define FESTATE_TUNING_SLOW 8
0066 #define FESTATE_TUNED 16
0067 #define FESTATE_ZIGZAG_FAST 32
0068 #define FESTATE_ZIGZAG_SLOW 64
0069 #define FESTATE_DISEQC 128
0070 #define FESTATE_ERROR 256
0071 #define FESTATE_WAITFORLOCK (FESTATE_TUNING_FAST | FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW | FESTATE_DISEQC)
0072 #define FESTATE_SEARCHING_FAST (FESTATE_TUNING_FAST | FESTATE_ZIGZAG_FAST)
0073 #define FESTATE_SEARCHING_SLOW (FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_SLOW)
0074 #define FESTATE_LOSTLOCK (FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW)
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091 static DEFINE_MUTEX(frontend_mutex);
0092
0093 struct dvb_frontend_private {
0094
0095 struct dvb_device *dvbdev;
0096 struct dvb_frontend_parameters parameters_out;
0097 struct dvb_fe_events events;
0098 struct semaphore sem;
0099 struct list_head list_head;
0100 wait_queue_head_t wait_queue;
0101 struct task_struct *thread;
0102 unsigned long release_jiffies;
0103 unsigned int wakeup;
0104 enum fe_status status;
0105 unsigned long tune_mode_flags;
0106 unsigned int delay;
0107 unsigned int reinitialise;
0108 int tone;
0109 int voltage;
0110
0111
0112 unsigned int state;
0113 unsigned int bending;
0114 int lnb_drift;
0115 unsigned int inversion;
0116 unsigned int auto_step;
0117 unsigned int auto_sub_step;
0118 unsigned int started_auto_step;
0119 unsigned int min_delay;
0120 unsigned int max_drift;
0121 unsigned int step_size;
0122 int quality;
0123 unsigned int check_wrapped;
0124 enum dvbfe_search algo_status;
0125
0126 #if defined(CONFIG_MEDIA_CONTROLLER_DVB)
0127 struct media_pipeline pipe;
0128 #endif
0129 };
0130
0131 static void dvb_frontend_invoke_release(struct dvb_frontend *fe,
0132 void (*release)(struct dvb_frontend *fe));
0133
0134 static void __dvb_frontend_free(struct dvb_frontend *fe)
0135 {
0136 struct dvb_frontend_private *fepriv = fe->frontend_priv;
0137
0138 if (fepriv)
0139 dvb_free_device(fepriv->dvbdev);
0140
0141 dvb_frontend_invoke_release(fe, fe->ops.release);
0142
0143 kfree(fepriv);
0144 }
0145
0146 static void dvb_frontend_free(struct kref *ref)
0147 {
0148 struct dvb_frontend *fe =
0149 container_of(ref, struct dvb_frontend, refcount);
0150
0151 __dvb_frontend_free(fe);
0152 }
0153
0154 static void dvb_frontend_put(struct dvb_frontend *fe)
0155 {
0156
0157 if (fe->ops.detach)
0158 fe->ops.detach(fe);
0159
0160
0161
0162
0163 if (fe->frontend_priv)
0164 kref_put(&fe->refcount, dvb_frontend_free);
0165 else
0166 __dvb_frontend_free(fe);
0167 }
0168
0169 static void dvb_frontend_get(struct dvb_frontend *fe)
0170 {
0171 kref_get(&fe->refcount);
0172 }
0173
0174 static void dvb_frontend_wakeup(struct dvb_frontend *fe);
0175 static int dtv_get_frontend(struct dvb_frontend *fe,
0176 struct dtv_frontend_properties *c,
0177 struct dvb_frontend_parameters *p_out);
0178 static int
0179 dtv_property_legacy_params_sync(struct dvb_frontend *fe,
0180 const struct dtv_frontend_properties *c,
0181 struct dvb_frontend_parameters *p);
0182
0183 static bool has_get_frontend(struct dvb_frontend *fe)
0184 {
0185 return fe->ops.get_frontend;
0186 }
0187
0188
0189
0190
0191
0192
0193 enum dvbv3_emulation_type {
0194 DVBV3_UNKNOWN,
0195 DVBV3_QPSK,
0196 DVBV3_QAM,
0197 DVBV3_OFDM,
0198 DVBV3_ATSC,
0199 };
0200
0201 static enum dvbv3_emulation_type dvbv3_type(u32 delivery_system)
0202 {
0203 switch (delivery_system) {
0204 case SYS_DVBC_ANNEX_A:
0205 case SYS_DVBC_ANNEX_C:
0206 return DVBV3_QAM;
0207 case SYS_DVBS:
0208 case SYS_DVBS2:
0209 case SYS_TURBO:
0210 case SYS_ISDBS:
0211 case SYS_DSS:
0212 return DVBV3_QPSK;
0213 case SYS_DVBT:
0214 case SYS_DVBT2:
0215 case SYS_ISDBT:
0216 case SYS_DTMB:
0217 return DVBV3_OFDM;
0218 case SYS_ATSC:
0219 case SYS_ATSCMH:
0220 case SYS_DVBC_ANNEX_B:
0221 return DVBV3_ATSC;
0222 case SYS_UNDEFINED:
0223 case SYS_ISDBC:
0224 case SYS_DVBH:
0225 case SYS_DAB:
0226 default:
0227
0228
0229
0230
0231
0232
0233 return DVBV3_UNKNOWN;
0234 }
0235 }
0236
0237 static void dvb_frontend_add_event(struct dvb_frontend *fe,
0238 enum fe_status status)
0239 {
0240 struct dvb_frontend_private *fepriv = fe->frontend_priv;
0241 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
0242 struct dvb_fe_events *events = &fepriv->events;
0243 struct dvb_frontend_event *e;
0244 int wp;
0245
0246 dev_dbg(fe->dvb->device, "%s:\n", __func__);
0247
0248 if ((status & FE_HAS_LOCK) && has_get_frontend(fe))
0249 dtv_get_frontend(fe, c, &fepriv->parameters_out);
0250
0251 mutex_lock(&events->mtx);
0252
0253 wp = (events->eventw + 1) % MAX_EVENT;
0254 if (wp == events->eventr) {
0255 events->overflow = 1;
0256 events->eventr = (events->eventr + 1) % MAX_EVENT;
0257 }
0258
0259 e = &events->events[events->eventw];
0260 e->status = status;
0261 e->parameters = fepriv->parameters_out;
0262
0263 events->eventw = wp;
0264
0265 mutex_unlock(&events->mtx);
0266
0267 wake_up_interruptible(&events->wait_queue);
0268 }
0269
0270 static int dvb_frontend_test_event(struct dvb_frontend_private *fepriv,
0271 struct dvb_fe_events *events)
0272 {
0273 int ret;
0274
0275 up(&fepriv->sem);
0276 ret = events->eventw != events->eventr;
0277 down(&fepriv->sem);
0278
0279 return ret;
0280 }
0281
0282 static int dvb_frontend_get_event(struct dvb_frontend *fe,
0283 struct dvb_frontend_event *event, int flags)
0284 {
0285 struct dvb_frontend_private *fepriv = fe->frontend_priv;
0286 struct dvb_fe_events *events = &fepriv->events;
0287
0288 dev_dbg(fe->dvb->device, "%s:\n", __func__);
0289
0290 if (events->overflow) {
0291 events->overflow = 0;
0292 return -EOVERFLOW;
0293 }
0294
0295 if (events->eventw == events->eventr) {
0296 int ret;
0297
0298 if (flags & O_NONBLOCK)
0299 return -EWOULDBLOCK;
0300
0301 ret = wait_event_interruptible(events->wait_queue,
0302 dvb_frontend_test_event(fepriv, events));
0303
0304 if (ret < 0)
0305 return ret;
0306 }
0307
0308 mutex_lock(&events->mtx);
0309 *event = events->events[events->eventr];
0310 events->eventr = (events->eventr + 1) % MAX_EVENT;
0311 mutex_unlock(&events->mtx);
0312
0313 return 0;
0314 }
0315
0316 static void dvb_frontend_clear_events(struct dvb_frontend *fe)
0317 {
0318 struct dvb_frontend_private *fepriv = fe->frontend_priv;
0319 struct dvb_fe_events *events = &fepriv->events;
0320
0321 mutex_lock(&events->mtx);
0322 events->eventr = events->eventw;
0323 mutex_unlock(&events->mtx);
0324 }
0325
0326 static void dvb_frontend_init(struct dvb_frontend *fe)
0327 {
0328 dev_dbg(fe->dvb->device,
0329 "%s: initialising adapter %i frontend %i (%s)...\n",
0330 __func__, fe->dvb->num, fe->id, fe->ops.info.name);
0331
0332 if (fe->ops.init)
0333 fe->ops.init(fe);
0334 if (fe->ops.tuner_ops.init) {
0335 if (fe->ops.i2c_gate_ctrl)
0336 fe->ops.i2c_gate_ctrl(fe, 1);
0337 fe->ops.tuner_ops.init(fe);
0338 if (fe->ops.i2c_gate_ctrl)
0339 fe->ops.i2c_gate_ctrl(fe, 0);
0340 }
0341 }
0342
0343 void dvb_frontend_reinitialise(struct dvb_frontend *fe)
0344 {
0345 struct dvb_frontend_private *fepriv = fe->frontend_priv;
0346
0347 fepriv->reinitialise = 1;
0348 dvb_frontend_wakeup(fe);
0349 }
0350 EXPORT_SYMBOL(dvb_frontend_reinitialise);
0351
0352 static void dvb_frontend_swzigzag_update_delay(struct dvb_frontend_private *fepriv, int locked)
0353 {
0354 int q2;
0355 struct dvb_frontend *fe = fepriv->dvbdev->priv;
0356
0357 dev_dbg(fe->dvb->device, "%s:\n", __func__);
0358
0359 if (locked)
0360 (fepriv->quality) = (fepriv->quality * 220 + 36 * 256) / 256;
0361 else
0362 (fepriv->quality) = (fepriv->quality * 220 + 0) / 256;
0363
0364 q2 = fepriv->quality - 128;
0365 q2 *= q2;
0366
0367 fepriv->delay = fepriv->min_delay + q2 * HZ / (128 * 128);
0368 }
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380 static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wrapped)
0381 {
0382 int autoinversion;
0383 int ready = 0;
0384 int fe_set_err = 0;
0385 struct dvb_frontend_private *fepriv = fe->frontend_priv;
0386 struct dtv_frontend_properties *c = &fe->dtv_property_cache, tmp;
0387 int original_inversion = c->inversion;
0388 u32 original_frequency = c->frequency;
0389
0390
0391 autoinversion = ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
0392 (c->inversion == INVERSION_AUTO));
0393
0394
0395 while (!ready) {
0396
0397 fepriv->lnb_drift = fepriv->auto_step * fepriv->step_size;
0398
0399
0400 if (fepriv->lnb_drift > fepriv->max_drift) {
0401 fepriv->auto_step = 0;
0402 fepriv->auto_sub_step = 0;
0403 fepriv->lnb_drift = 0;
0404 }
0405
0406
0407 switch (fepriv->auto_sub_step) {
0408 case 0:
0409
0410 ready = 1;
0411 break;
0412
0413 case 1:
0414 if (!autoinversion) break;
0415
0416 fepriv->inversion = (fepriv->inversion == INVERSION_OFF) ? INVERSION_ON : INVERSION_OFF;
0417 ready = 1;
0418 break;
0419
0420 case 2:
0421 if (fepriv->lnb_drift == 0) break;
0422
0423 fepriv->lnb_drift = -fepriv->lnb_drift;
0424 ready = 1;
0425 break;
0426
0427 case 3:
0428 if (fepriv->lnb_drift == 0) break;
0429 if (!autoinversion) break;
0430
0431 fepriv->inversion = (fepriv->inversion == INVERSION_OFF) ? INVERSION_ON : INVERSION_OFF;
0432 fepriv->lnb_drift = -fepriv->lnb_drift;
0433 ready = 1;
0434 break;
0435
0436 default:
0437 fepriv->auto_step++;
0438 fepriv->auto_sub_step = -1;
0439 break;
0440 }
0441
0442 if (!ready) fepriv->auto_sub_step++;
0443 }
0444
0445
0446
0447 if ((fepriv->auto_step == fepriv->started_auto_step) &&
0448 (fepriv->auto_sub_step == 0) && check_wrapped) {
0449 return 1;
0450 }
0451
0452 dev_dbg(fe->dvb->device,
0453 "%s: drift:%i inversion:%i auto_step:%i auto_sub_step:%i started_auto_step:%i\n",
0454 __func__, fepriv->lnb_drift, fepriv->inversion,
0455 fepriv->auto_step, fepriv->auto_sub_step,
0456 fepriv->started_auto_step);
0457
0458
0459 c->frequency += fepriv->lnb_drift;
0460 if (autoinversion)
0461 c->inversion = fepriv->inversion;
0462 tmp = *c;
0463 if (fe->ops.set_frontend)
0464 fe_set_err = fe->ops.set_frontend(fe);
0465 *c = tmp;
0466 if (fe_set_err < 0) {
0467 fepriv->state = FESTATE_ERROR;
0468 return fe_set_err;
0469 }
0470
0471 c->frequency = original_frequency;
0472 c->inversion = original_inversion;
0473
0474 fepriv->auto_sub_step++;
0475 return 0;
0476 }
0477
0478 static void dvb_frontend_swzigzag(struct dvb_frontend *fe)
0479 {
0480 enum fe_status s = FE_NONE;
0481 int retval = 0;
0482 struct dvb_frontend_private *fepriv = fe->frontend_priv;
0483 struct dtv_frontend_properties *c = &fe->dtv_property_cache, tmp;
0484
0485 if (fepriv->max_drift)
0486 dev_warn_once(fe->dvb->device,
0487 "Frontend requested software zigzag, but didn't set the frequency step size\n");
0488
0489
0490 if (fepriv->state & FESTATE_IDLE) {
0491 fepriv->delay = 3 * HZ;
0492 fepriv->quality = 0;
0493 return;
0494 }
0495
0496
0497 if (fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT) {
0498 if (fepriv->state & FESTATE_RETUNE) {
0499 tmp = *c;
0500 if (fe->ops.set_frontend)
0501 retval = fe->ops.set_frontend(fe);
0502 *c = tmp;
0503 if (retval < 0)
0504 fepriv->state = FESTATE_ERROR;
0505 else
0506 fepriv->state = FESTATE_TUNED;
0507 }
0508 fepriv->delay = 3 * HZ;
0509 fepriv->quality = 0;
0510 return;
0511 }
0512
0513
0514 if (fepriv->state & FESTATE_RETUNE) {
0515 s = 0;
0516 } else {
0517 if (fe->ops.read_status)
0518 fe->ops.read_status(fe, &s);
0519 if (s != fepriv->status) {
0520 dvb_frontend_add_event(fe, s);
0521 fepriv->status = s;
0522 }
0523 }
0524
0525
0526 if ((fepriv->state & FESTATE_WAITFORLOCK) && (s & FE_HAS_LOCK)) {
0527 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
0528 fepriv->state = FESTATE_TUNED;
0529
0530
0531 if ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
0532 (c->inversion == INVERSION_AUTO)) {
0533 c->inversion = fepriv->inversion;
0534 }
0535 return;
0536 }
0537
0538
0539 if (fepriv->state & FESTATE_TUNED) {
0540 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
0541
0542
0543 if (s & FE_HAS_LOCK) {
0544 return;
0545 } else {
0546 fepriv->state = FESTATE_ZIGZAG_FAST;
0547 fepriv->started_auto_step = fepriv->auto_step;
0548 fepriv->check_wrapped = 0;
0549 }
0550 }
0551
0552
0553
0554 if ((fepriv->state & FESTATE_LOSTLOCK) &&
0555 (fe->ops.info.caps & FE_CAN_RECOVER) && (fepriv->max_drift == 0)) {
0556 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
0557 return;
0558 }
0559
0560
0561
0562
0563 if (fepriv->state & FESTATE_DISEQC) {
0564 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
0565 return;
0566 }
0567
0568
0569
0570
0571 if (fepriv->state & FESTATE_RETUNE) {
0572 fepriv->lnb_drift = 0;
0573 fepriv->auto_step = 0;
0574 fepriv->auto_sub_step = 0;
0575 fepriv->started_auto_step = 0;
0576 fepriv->check_wrapped = 0;
0577 }
0578
0579
0580 if ((fepriv->state & FESTATE_SEARCHING_FAST) || (fepriv->state & FESTATE_RETUNE)) {
0581 fepriv->delay = fepriv->min_delay;
0582
0583
0584 retval = dvb_frontend_swzigzag_autotune(fe,
0585 fepriv->check_wrapped);
0586 if (retval < 0) {
0587 return;
0588 } else if (retval) {
0589
0590
0591 fepriv->state = FESTATE_SEARCHING_SLOW;
0592 fepriv->started_auto_step = fepriv->auto_step;
0593 return;
0594 }
0595 fepriv->check_wrapped = 1;
0596
0597
0598
0599
0600
0601 if (fepriv->state & FESTATE_RETUNE) {
0602 fepriv->state = FESTATE_TUNING_FAST;
0603 }
0604 }
0605
0606
0607 if (fepriv->state & FESTATE_SEARCHING_SLOW) {
0608 dvb_frontend_swzigzag_update_delay(fepriv, s & FE_HAS_LOCK);
0609
0610
0611
0612 dvb_frontend_swzigzag_autotune(fe, 0);
0613 }
0614 }
0615
0616 static int dvb_frontend_is_exiting(struct dvb_frontend *fe)
0617 {
0618 struct dvb_frontend_private *fepriv = fe->frontend_priv;
0619
0620 if (fe->exit != DVB_FE_NO_EXIT)
0621 return 1;
0622
0623 if (fepriv->dvbdev->writers == 1)
0624 if (time_after_eq(jiffies, fepriv->release_jiffies +
0625 dvb_shutdown_timeout * HZ))
0626 return 1;
0627
0628 return 0;
0629 }
0630
0631 static int dvb_frontend_should_wakeup(struct dvb_frontend *fe)
0632 {
0633 struct dvb_frontend_private *fepriv = fe->frontend_priv;
0634
0635 if (fepriv->wakeup) {
0636 fepriv->wakeup = 0;
0637 return 1;
0638 }
0639 return dvb_frontend_is_exiting(fe);
0640 }
0641
0642 static void dvb_frontend_wakeup(struct dvb_frontend *fe)
0643 {
0644 struct dvb_frontend_private *fepriv = fe->frontend_priv;
0645
0646 fepriv->wakeup = 1;
0647 wake_up_interruptible(&fepriv->wait_queue);
0648 }
0649
0650 static int dvb_frontend_thread(void *data)
0651 {
0652 struct dvb_frontend *fe = data;
0653 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
0654 struct dvb_frontend_private *fepriv = fe->frontend_priv;
0655 enum fe_status s = FE_NONE;
0656 enum dvbfe_algo algo;
0657 bool re_tune = false;
0658 bool semheld = false;
0659
0660 dev_dbg(fe->dvb->device, "%s:\n", __func__);
0661
0662 fepriv->check_wrapped = 0;
0663 fepriv->quality = 0;
0664 fepriv->delay = 3 * HZ;
0665 fepriv->status = 0;
0666 fepriv->wakeup = 0;
0667 fepriv->reinitialise = 0;
0668
0669 dvb_frontend_init(fe);
0670
0671 set_freezable();
0672 while (1) {
0673 up(&fepriv->sem);
0674 restart:
0675 wait_event_interruptible_timeout(fepriv->wait_queue,
0676 dvb_frontend_should_wakeup(fe) ||
0677 kthread_should_stop() ||
0678 freezing(current),
0679 fepriv->delay);
0680
0681 if (kthread_should_stop() || dvb_frontend_is_exiting(fe)) {
0682
0683 if (!down_interruptible(&fepriv->sem))
0684 semheld = true;
0685 fe->exit = DVB_FE_NORMAL_EXIT;
0686 break;
0687 }
0688
0689 if (try_to_freeze())
0690 goto restart;
0691
0692 if (down_interruptible(&fepriv->sem))
0693 break;
0694
0695 if (fepriv->reinitialise) {
0696 dvb_frontend_init(fe);
0697 if (fe->ops.set_tone && fepriv->tone != -1)
0698 fe->ops.set_tone(fe, fepriv->tone);
0699 if (fe->ops.set_voltage && fepriv->voltage != -1)
0700 fe->ops.set_voltage(fe, fepriv->voltage);
0701 fepriv->reinitialise = 0;
0702 }
0703
0704
0705 if (fe->ops.get_frontend_algo) {
0706 algo = fe->ops.get_frontend_algo(fe);
0707 switch (algo) {
0708 case DVBFE_ALGO_HW:
0709 dev_dbg(fe->dvb->device, "%s: Frontend ALGO = DVBFE_ALGO_HW\n", __func__);
0710
0711 if (fepriv->state & FESTATE_RETUNE) {
0712 dev_dbg(fe->dvb->device, "%s: Retune requested, FESTATE_RETUNE\n", __func__);
0713 re_tune = true;
0714 fepriv->state = FESTATE_TUNED;
0715 } else {
0716 re_tune = false;
0717 }
0718
0719 if (fe->ops.tune)
0720 fe->ops.tune(fe, re_tune, fepriv->tune_mode_flags, &fepriv->delay, &s);
0721
0722 if (s != fepriv->status && !(fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT)) {
0723 dev_dbg(fe->dvb->device, "%s: state changed, adding current state\n", __func__);
0724 dvb_frontend_add_event(fe, s);
0725 fepriv->status = s;
0726 }
0727 break;
0728 case DVBFE_ALGO_SW:
0729 dev_dbg(fe->dvb->device, "%s: Frontend ALGO = DVBFE_ALGO_SW\n", __func__);
0730 dvb_frontend_swzigzag(fe);
0731 break;
0732 case DVBFE_ALGO_CUSTOM:
0733 dev_dbg(fe->dvb->device, "%s: Frontend ALGO = DVBFE_ALGO_CUSTOM, state=%d\n", __func__, fepriv->state);
0734 if (fepriv->state & FESTATE_RETUNE) {
0735 dev_dbg(fe->dvb->device, "%s: Retune requested, FESTAT_RETUNE\n", __func__);
0736 fepriv->state = FESTATE_TUNED;
0737 }
0738
0739
0740
0741
0742 if (fepriv->algo_status & DVBFE_ALGO_SEARCH_AGAIN) {
0743 if (fe->ops.search) {
0744 fepriv->algo_status = fe->ops.search(fe);
0745
0746
0747
0748 } else {
0749 fepriv->algo_status &= ~DVBFE_ALGO_SEARCH_AGAIN;
0750 }
0751 }
0752
0753 if (fepriv->algo_status != DVBFE_ALGO_SEARCH_SUCCESS) {
0754 fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
0755 fepriv->delay = HZ / 2;
0756 }
0757 dtv_property_legacy_params_sync(fe, c, &fepriv->parameters_out);
0758 fe->ops.read_status(fe, &s);
0759 if (s != fepriv->status) {
0760 dvb_frontend_add_event(fe, s);
0761 fepriv->status = s;
0762 if (!(s & FE_HAS_LOCK)) {
0763 fepriv->delay = HZ / 10;
0764 fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
0765 } else {
0766 fepriv->delay = 60 * HZ;
0767 }
0768 }
0769 break;
0770 default:
0771 dev_dbg(fe->dvb->device, "%s: UNDEFINED ALGO !\n", __func__);
0772 break;
0773 }
0774 } else {
0775 dvb_frontend_swzigzag(fe);
0776 }
0777 }
0778
0779 if (dvb_powerdown_on_sleep) {
0780 if (fe->ops.set_voltage)
0781 fe->ops.set_voltage(fe, SEC_VOLTAGE_OFF);
0782 if (fe->ops.tuner_ops.sleep) {
0783 if (fe->ops.i2c_gate_ctrl)
0784 fe->ops.i2c_gate_ctrl(fe, 1);
0785 fe->ops.tuner_ops.sleep(fe);
0786 if (fe->ops.i2c_gate_ctrl)
0787 fe->ops.i2c_gate_ctrl(fe, 0);
0788 }
0789 if (fe->ops.sleep)
0790 fe->ops.sleep(fe);
0791 }
0792
0793 fepriv->thread = NULL;
0794 if (kthread_should_stop())
0795 fe->exit = DVB_FE_DEVICE_REMOVED;
0796 else
0797 fe->exit = DVB_FE_NO_EXIT;
0798 mb();
0799
0800 if (semheld)
0801 up(&fepriv->sem);
0802 dvb_frontend_wakeup(fe);
0803 return 0;
0804 }
0805
0806 static void dvb_frontend_stop(struct dvb_frontend *fe)
0807 {
0808 struct dvb_frontend_private *fepriv = fe->frontend_priv;
0809
0810 dev_dbg(fe->dvb->device, "%s:\n", __func__);
0811
0812 if (fe->exit != DVB_FE_DEVICE_REMOVED)
0813 fe->exit = DVB_FE_NORMAL_EXIT;
0814 mb();
0815
0816 if (!fepriv->thread)
0817 return;
0818
0819 kthread_stop(fepriv->thread);
0820
0821 sema_init(&fepriv->sem, 1);
0822 fepriv->state = FESTATE_IDLE;
0823
0824
0825 if (fepriv->thread)
0826 dev_warn(fe->dvb->device,
0827 "dvb_frontend_stop: warning: thread %p won't exit\n",
0828 fepriv->thread);
0829 }
0830
0831
0832
0833
0834
0835
0836
0837
0838 void dvb_frontend_sleep_until(ktime_t *waketime, u32 add_usec)
0839 {
0840 s32 delta;
0841
0842 *waketime = ktime_add_us(*waketime, add_usec);
0843 delta = ktime_us_delta(ktime_get_boottime(), *waketime);
0844 if (delta > 2500) {
0845 msleep((delta - 1500) / 1000);
0846 delta = ktime_us_delta(ktime_get_boottime(), *waketime);
0847 }
0848 if (delta > 0)
0849 udelay(delta);
0850 }
0851 EXPORT_SYMBOL(dvb_frontend_sleep_until);
0852
0853 static int dvb_frontend_start(struct dvb_frontend *fe)
0854 {
0855 int ret;
0856 struct dvb_frontend_private *fepriv = fe->frontend_priv;
0857 struct task_struct *fe_thread;
0858
0859 dev_dbg(fe->dvb->device, "%s:\n", __func__);
0860
0861 if (fepriv->thread) {
0862 if (fe->exit == DVB_FE_NO_EXIT)
0863 return 0;
0864 else
0865 dvb_frontend_stop(fe);
0866 }
0867
0868 if (signal_pending(current))
0869 return -EINTR;
0870 if (down_interruptible(&fepriv->sem))
0871 return -EINTR;
0872
0873 fepriv->state = FESTATE_IDLE;
0874 fe->exit = DVB_FE_NO_EXIT;
0875 fepriv->thread = NULL;
0876 mb();
0877
0878 fe_thread = kthread_run(dvb_frontend_thread, fe,
0879 "kdvb-ad-%i-fe-%i", fe->dvb->num, fe->id);
0880 if (IS_ERR(fe_thread)) {
0881 ret = PTR_ERR(fe_thread);
0882 dev_warn(fe->dvb->device,
0883 "dvb_frontend_start: failed to start kthread (%d)\n",
0884 ret);
0885 up(&fepriv->sem);
0886 return ret;
0887 }
0888 fepriv->thread = fe_thread;
0889 return 0;
0890 }
0891
0892 static void dvb_frontend_get_frequency_limits(struct dvb_frontend *fe,
0893 u32 *freq_min, u32 *freq_max,
0894 u32 *tolerance)
0895 {
0896 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
0897 u32 tuner_min = fe->ops.tuner_ops.info.frequency_min_hz;
0898 u32 tuner_max = fe->ops.tuner_ops.info.frequency_max_hz;
0899 u32 frontend_min = fe->ops.info.frequency_min_hz;
0900 u32 frontend_max = fe->ops.info.frequency_max_hz;
0901
0902 *freq_min = max(frontend_min, tuner_min);
0903
0904 if (frontend_max == 0)
0905 *freq_max = tuner_max;
0906 else if (tuner_max == 0)
0907 *freq_max = frontend_max;
0908 else
0909 *freq_max = min(frontend_max, tuner_max);
0910
0911 if (*freq_min == 0 || *freq_max == 0)
0912 dev_warn(fe->dvb->device,
0913 "DVB: adapter %i frontend %u frequency limits undefined - fix the driver\n",
0914 fe->dvb->num, fe->id);
0915
0916 dev_dbg(fe->dvb->device, "frequency interval: tuner: %u...%u, frontend: %u...%u",
0917 tuner_min, tuner_max, frontend_min, frontend_max);
0918
0919
0920 switch (c->delivery_system) {
0921 case SYS_DVBS:
0922 case SYS_DVBS2:
0923 case SYS_TURBO:
0924 case SYS_ISDBS:
0925 *freq_min /= kHz;
0926 *freq_max /= kHz;
0927 if (tolerance)
0928 *tolerance = fe->ops.info.frequency_tolerance_hz / kHz;
0929
0930 break;
0931 default:
0932 if (tolerance)
0933 *tolerance = fe->ops.info.frequency_tolerance_hz;
0934 break;
0935 }
0936 }
0937
0938 static u32 dvb_frontend_get_stepsize(struct dvb_frontend *fe)
0939 {
0940 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
0941 u32 fe_step = fe->ops.info.frequency_stepsize_hz;
0942 u32 tuner_step = fe->ops.tuner_ops.info.frequency_step_hz;
0943 u32 step = max(fe_step, tuner_step);
0944
0945 switch (c->delivery_system) {
0946 case SYS_DVBS:
0947 case SYS_DVBS2:
0948 case SYS_TURBO:
0949 case SYS_ISDBS:
0950 step /= kHz;
0951 break;
0952 default:
0953 break;
0954 }
0955
0956 return step;
0957 }
0958
0959 static int dvb_frontend_check_parameters(struct dvb_frontend *fe)
0960 {
0961 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
0962 u32 freq_min;
0963 u32 freq_max;
0964
0965
0966 dvb_frontend_get_frequency_limits(fe, &freq_min, &freq_max, NULL);
0967 if ((freq_min && c->frequency < freq_min) ||
0968 (freq_max && c->frequency > freq_max)) {
0969 dev_warn(fe->dvb->device, "DVB: adapter %i frontend %i frequency %u out of range (%u..%u)\n",
0970 fe->dvb->num, fe->id, c->frequency,
0971 freq_min, freq_max);
0972 return -EINVAL;
0973 }
0974
0975
0976 switch (c->delivery_system) {
0977 case SYS_DVBS:
0978 case SYS_DVBS2:
0979 case SYS_TURBO:
0980 case SYS_DVBC_ANNEX_A:
0981 case SYS_DVBC_ANNEX_C:
0982 if ((fe->ops.info.symbol_rate_min &&
0983 c->symbol_rate < fe->ops.info.symbol_rate_min) ||
0984 (fe->ops.info.symbol_rate_max &&
0985 c->symbol_rate > fe->ops.info.symbol_rate_max)) {
0986 dev_warn(fe->dvb->device, "DVB: adapter %i frontend %i symbol rate %u out of range (%u..%u)\n",
0987 fe->dvb->num, fe->id, c->symbol_rate,
0988 fe->ops.info.symbol_rate_min,
0989 fe->ops.info.symbol_rate_max);
0990 return -EINVAL;
0991 }
0992 break;
0993 default:
0994 break;
0995 }
0996
0997 return 0;
0998 }
0999
1000 static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
1001 {
1002 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1003 int i;
1004 u32 delsys;
1005
1006 delsys = c->delivery_system;
1007 memset(c, 0, offsetof(struct dtv_frontend_properties, strength));
1008 c->delivery_system = delsys;
1009
1010 dev_dbg(fe->dvb->device, "%s: Clearing cache for delivery system %d\n",
1011 __func__, c->delivery_system);
1012
1013 c->transmission_mode = TRANSMISSION_MODE_AUTO;
1014 c->bandwidth_hz = 0;
1015 c->guard_interval = GUARD_INTERVAL_AUTO;
1016 c->hierarchy = HIERARCHY_AUTO;
1017 c->symbol_rate = 0;
1018 c->code_rate_HP = FEC_AUTO;
1019 c->code_rate_LP = FEC_AUTO;
1020 c->fec_inner = FEC_AUTO;
1021 c->rolloff = ROLLOFF_AUTO;
1022 c->voltage = SEC_VOLTAGE_OFF;
1023 c->sectone = SEC_TONE_OFF;
1024 c->pilot = PILOT_AUTO;
1025
1026 c->isdbt_partial_reception = 0;
1027 c->isdbt_sb_mode = 0;
1028 c->isdbt_sb_subchannel = 0;
1029 c->isdbt_sb_segment_idx = 0;
1030 c->isdbt_sb_segment_count = 0;
1031 c->isdbt_layer_enabled = 7;
1032 for (i = 0; i < 3; i++) {
1033 c->layer[i].fec = FEC_AUTO;
1034 c->layer[i].modulation = QAM_AUTO;
1035 c->layer[i].interleaving = 0;
1036 c->layer[i].segment_count = 0;
1037 }
1038
1039 c->stream_id = NO_STREAM_ID_FILTER;
1040 c->scrambling_sequence_index = 0;
1041
1042 switch (c->delivery_system) {
1043 case SYS_DVBS:
1044 case SYS_DVBS2:
1045 case SYS_TURBO:
1046 c->modulation = QPSK;
1047 c->rolloff = ROLLOFF_35;
1048 break;
1049 case SYS_ATSC:
1050 c->modulation = VSB_8;
1051 break;
1052 case SYS_ISDBS:
1053 c->symbol_rate = 28860000;
1054 c->rolloff = ROLLOFF_35;
1055 c->bandwidth_hz = c->symbol_rate / 100 * 135;
1056 break;
1057 default:
1058 c->modulation = QAM_AUTO;
1059 break;
1060 }
1061
1062 c->lna = LNA_AUTO;
1063
1064 return 0;
1065 }
1066
1067 #define _DTV_CMD(n) \
1068 [n] = #n
1069
1070 static char *dtv_cmds[DTV_MAX_COMMAND + 1] = {
1071 _DTV_CMD(DTV_TUNE),
1072 _DTV_CMD(DTV_CLEAR),
1073
1074
1075 _DTV_CMD(DTV_FREQUENCY),
1076 _DTV_CMD(DTV_BANDWIDTH_HZ),
1077 _DTV_CMD(DTV_MODULATION),
1078 _DTV_CMD(DTV_INVERSION),
1079 _DTV_CMD(DTV_DISEQC_MASTER),
1080 _DTV_CMD(DTV_SYMBOL_RATE),
1081 _DTV_CMD(DTV_INNER_FEC),
1082 _DTV_CMD(DTV_VOLTAGE),
1083 _DTV_CMD(DTV_TONE),
1084 _DTV_CMD(DTV_PILOT),
1085 _DTV_CMD(DTV_ROLLOFF),
1086 _DTV_CMD(DTV_DELIVERY_SYSTEM),
1087 _DTV_CMD(DTV_HIERARCHY),
1088 _DTV_CMD(DTV_CODE_RATE_HP),
1089 _DTV_CMD(DTV_CODE_RATE_LP),
1090 _DTV_CMD(DTV_GUARD_INTERVAL),
1091 _DTV_CMD(DTV_TRANSMISSION_MODE),
1092 _DTV_CMD(DTV_INTERLEAVING),
1093
1094 _DTV_CMD(DTV_ISDBT_PARTIAL_RECEPTION),
1095 _DTV_CMD(DTV_ISDBT_SOUND_BROADCASTING),
1096 _DTV_CMD(DTV_ISDBT_SB_SUBCHANNEL_ID),
1097 _DTV_CMD(DTV_ISDBT_SB_SEGMENT_IDX),
1098 _DTV_CMD(DTV_ISDBT_SB_SEGMENT_COUNT),
1099 _DTV_CMD(DTV_ISDBT_LAYER_ENABLED),
1100 _DTV_CMD(DTV_ISDBT_LAYERA_FEC),
1101 _DTV_CMD(DTV_ISDBT_LAYERA_MODULATION),
1102 _DTV_CMD(DTV_ISDBT_LAYERA_SEGMENT_COUNT),
1103 _DTV_CMD(DTV_ISDBT_LAYERA_TIME_INTERLEAVING),
1104 _DTV_CMD(DTV_ISDBT_LAYERB_FEC),
1105 _DTV_CMD(DTV_ISDBT_LAYERB_MODULATION),
1106 _DTV_CMD(DTV_ISDBT_LAYERB_SEGMENT_COUNT),
1107 _DTV_CMD(DTV_ISDBT_LAYERB_TIME_INTERLEAVING),
1108 _DTV_CMD(DTV_ISDBT_LAYERC_FEC),
1109 _DTV_CMD(DTV_ISDBT_LAYERC_MODULATION),
1110 _DTV_CMD(DTV_ISDBT_LAYERC_SEGMENT_COUNT),
1111 _DTV_CMD(DTV_ISDBT_LAYERC_TIME_INTERLEAVING),
1112
1113 _DTV_CMD(DTV_STREAM_ID),
1114 _DTV_CMD(DTV_DVBT2_PLP_ID_LEGACY),
1115 _DTV_CMD(DTV_SCRAMBLING_SEQUENCE_INDEX),
1116 _DTV_CMD(DTV_LNA),
1117
1118
1119 _DTV_CMD(DTV_DISEQC_SLAVE_REPLY),
1120 _DTV_CMD(DTV_API_VERSION),
1121
1122 _DTV_CMD(DTV_ENUM_DELSYS),
1123
1124 _DTV_CMD(DTV_ATSCMH_PARADE_ID),
1125 _DTV_CMD(DTV_ATSCMH_RS_FRAME_ENSEMBLE),
1126
1127 _DTV_CMD(DTV_ATSCMH_FIC_VER),
1128 _DTV_CMD(DTV_ATSCMH_NOG),
1129 _DTV_CMD(DTV_ATSCMH_TNOG),
1130 _DTV_CMD(DTV_ATSCMH_SGN),
1131 _DTV_CMD(DTV_ATSCMH_PRC),
1132 _DTV_CMD(DTV_ATSCMH_RS_FRAME_MODE),
1133 _DTV_CMD(DTV_ATSCMH_RS_CODE_MODE_PRI),
1134 _DTV_CMD(DTV_ATSCMH_RS_CODE_MODE_SEC),
1135 _DTV_CMD(DTV_ATSCMH_SCCC_BLOCK_MODE),
1136 _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_A),
1137 _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_B),
1138 _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_C),
1139 _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_D),
1140
1141
1142 _DTV_CMD(DTV_STAT_SIGNAL_STRENGTH),
1143 _DTV_CMD(DTV_STAT_CNR),
1144 _DTV_CMD(DTV_STAT_PRE_ERROR_BIT_COUNT),
1145 _DTV_CMD(DTV_STAT_PRE_TOTAL_BIT_COUNT),
1146 _DTV_CMD(DTV_STAT_POST_ERROR_BIT_COUNT),
1147 _DTV_CMD(DTV_STAT_POST_TOTAL_BIT_COUNT),
1148 _DTV_CMD(DTV_STAT_ERROR_BLOCK_COUNT),
1149 _DTV_CMD(DTV_STAT_TOTAL_BLOCK_COUNT),
1150 };
1151
1152 static char *dtv_cmd_name(u32 cmd)
1153 {
1154 cmd = array_index_nospec(cmd, DTV_MAX_COMMAND);
1155 return dtv_cmds[cmd];
1156 }
1157
1158
1159
1160
1161
1162 static int dtv_property_cache_sync(struct dvb_frontend *fe,
1163 struct dtv_frontend_properties *c,
1164 const struct dvb_frontend_parameters *p)
1165 {
1166 c->frequency = p->frequency;
1167 c->inversion = p->inversion;
1168
1169 switch (dvbv3_type(c->delivery_system)) {
1170 case DVBV3_QPSK:
1171 dev_dbg(fe->dvb->device, "%s: Preparing QPSK req\n", __func__);
1172 c->symbol_rate = p->u.qpsk.symbol_rate;
1173 c->fec_inner = p->u.qpsk.fec_inner;
1174 break;
1175 case DVBV3_QAM:
1176 dev_dbg(fe->dvb->device, "%s: Preparing QAM req\n", __func__);
1177 c->symbol_rate = p->u.qam.symbol_rate;
1178 c->fec_inner = p->u.qam.fec_inner;
1179 c->modulation = p->u.qam.modulation;
1180 break;
1181 case DVBV3_OFDM:
1182 dev_dbg(fe->dvb->device, "%s: Preparing OFDM req\n", __func__);
1183
1184 switch (p->u.ofdm.bandwidth) {
1185 case BANDWIDTH_10_MHZ:
1186 c->bandwidth_hz = 10000000;
1187 break;
1188 case BANDWIDTH_8_MHZ:
1189 c->bandwidth_hz = 8000000;
1190 break;
1191 case BANDWIDTH_7_MHZ:
1192 c->bandwidth_hz = 7000000;
1193 break;
1194 case BANDWIDTH_6_MHZ:
1195 c->bandwidth_hz = 6000000;
1196 break;
1197 case BANDWIDTH_5_MHZ:
1198 c->bandwidth_hz = 5000000;
1199 break;
1200 case BANDWIDTH_1_712_MHZ:
1201 c->bandwidth_hz = 1712000;
1202 break;
1203 case BANDWIDTH_AUTO:
1204 c->bandwidth_hz = 0;
1205 }
1206
1207 c->code_rate_HP = p->u.ofdm.code_rate_HP;
1208 c->code_rate_LP = p->u.ofdm.code_rate_LP;
1209 c->modulation = p->u.ofdm.constellation;
1210 c->transmission_mode = p->u.ofdm.transmission_mode;
1211 c->guard_interval = p->u.ofdm.guard_interval;
1212 c->hierarchy = p->u.ofdm.hierarchy_information;
1213 break;
1214 case DVBV3_ATSC:
1215 dev_dbg(fe->dvb->device, "%s: Preparing ATSC req\n", __func__);
1216 c->modulation = p->u.vsb.modulation;
1217 if (c->delivery_system == SYS_ATSCMH)
1218 break;
1219 if ((c->modulation == VSB_8) || (c->modulation == VSB_16))
1220 c->delivery_system = SYS_ATSC;
1221 else
1222 c->delivery_system = SYS_DVBC_ANNEX_B;
1223 break;
1224 case DVBV3_UNKNOWN:
1225 dev_err(fe->dvb->device,
1226 "%s: doesn't know how to handle a DVBv3 call to delivery system %i\n",
1227 __func__, c->delivery_system);
1228 return -EINVAL;
1229 }
1230
1231 return 0;
1232 }
1233
1234
1235
1236
1237 static int
1238 dtv_property_legacy_params_sync(struct dvb_frontend *fe,
1239 const struct dtv_frontend_properties *c,
1240 struct dvb_frontend_parameters *p)
1241 {
1242 p->frequency = c->frequency;
1243 p->inversion = c->inversion;
1244
1245 switch (dvbv3_type(c->delivery_system)) {
1246 case DVBV3_UNKNOWN:
1247 dev_err(fe->dvb->device,
1248 "%s: doesn't know how to handle a DVBv3 call to delivery system %i\n",
1249 __func__, c->delivery_system);
1250 return -EINVAL;
1251 case DVBV3_QPSK:
1252 dev_dbg(fe->dvb->device, "%s: Preparing QPSK req\n", __func__);
1253 p->u.qpsk.symbol_rate = c->symbol_rate;
1254 p->u.qpsk.fec_inner = c->fec_inner;
1255 break;
1256 case DVBV3_QAM:
1257 dev_dbg(fe->dvb->device, "%s: Preparing QAM req\n", __func__);
1258 p->u.qam.symbol_rate = c->symbol_rate;
1259 p->u.qam.fec_inner = c->fec_inner;
1260 p->u.qam.modulation = c->modulation;
1261 break;
1262 case DVBV3_OFDM:
1263 dev_dbg(fe->dvb->device, "%s: Preparing OFDM req\n", __func__);
1264 switch (c->bandwidth_hz) {
1265 case 10000000:
1266 p->u.ofdm.bandwidth = BANDWIDTH_10_MHZ;
1267 break;
1268 case 8000000:
1269 p->u.ofdm.bandwidth = BANDWIDTH_8_MHZ;
1270 break;
1271 case 7000000:
1272 p->u.ofdm.bandwidth = BANDWIDTH_7_MHZ;
1273 break;
1274 case 6000000:
1275 p->u.ofdm.bandwidth = BANDWIDTH_6_MHZ;
1276 break;
1277 case 5000000:
1278 p->u.ofdm.bandwidth = BANDWIDTH_5_MHZ;
1279 break;
1280 case 1712000:
1281 p->u.ofdm.bandwidth = BANDWIDTH_1_712_MHZ;
1282 break;
1283 case 0:
1284 default:
1285 p->u.ofdm.bandwidth = BANDWIDTH_AUTO;
1286 }
1287 p->u.ofdm.code_rate_HP = c->code_rate_HP;
1288 p->u.ofdm.code_rate_LP = c->code_rate_LP;
1289 p->u.ofdm.constellation = c->modulation;
1290 p->u.ofdm.transmission_mode = c->transmission_mode;
1291 p->u.ofdm.guard_interval = c->guard_interval;
1292 p->u.ofdm.hierarchy_information = c->hierarchy;
1293 break;
1294 case DVBV3_ATSC:
1295 dev_dbg(fe->dvb->device, "%s: Preparing VSB req\n", __func__);
1296 p->u.vsb.modulation = c->modulation;
1297 break;
1298 }
1299 return 0;
1300 }
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312 static int dtv_get_frontend(struct dvb_frontend *fe,
1313 struct dtv_frontend_properties *c,
1314 struct dvb_frontend_parameters *p_out)
1315 {
1316 int r;
1317
1318 if (fe->ops.get_frontend) {
1319 r = fe->ops.get_frontend(fe, c);
1320 if (unlikely(r < 0))
1321 return r;
1322 if (p_out)
1323 dtv_property_legacy_params_sync(fe, c, p_out);
1324 return 0;
1325 }
1326
1327
1328 return 0;
1329 }
1330
1331 static int dvb_frontend_handle_ioctl(struct file *file,
1332 unsigned int cmd, void *parg);
1333
1334 static int dtv_property_process_get(struct dvb_frontend *fe,
1335 const struct dtv_frontend_properties *c,
1336 struct dtv_property *tvp,
1337 struct file *file)
1338 {
1339 int ncaps;
1340 unsigned int len = 1;
1341
1342 switch (tvp->cmd) {
1343 case DTV_ENUM_DELSYS:
1344 ncaps = 0;
1345 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1346 tvp->u.buffer.data[ncaps] = fe->ops.delsys[ncaps];
1347 ncaps++;
1348 }
1349 tvp->u.buffer.len = ncaps;
1350 len = ncaps;
1351 break;
1352 case DTV_FREQUENCY:
1353 tvp->u.data = c->frequency;
1354 break;
1355 case DTV_MODULATION:
1356 tvp->u.data = c->modulation;
1357 break;
1358 case DTV_BANDWIDTH_HZ:
1359 tvp->u.data = c->bandwidth_hz;
1360 break;
1361 case DTV_INVERSION:
1362 tvp->u.data = c->inversion;
1363 break;
1364 case DTV_SYMBOL_RATE:
1365 tvp->u.data = c->symbol_rate;
1366 break;
1367 case DTV_INNER_FEC:
1368 tvp->u.data = c->fec_inner;
1369 break;
1370 case DTV_PILOT:
1371 tvp->u.data = c->pilot;
1372 break;
1373 case DTV_ROLLOFF:
1374 tvp->u.data = c->rolloff;
1375 break;
1376 case DTV_DELIVERY_SYSTEM:
1377 tvp->u.data = c->delivery_system;
1378 break;
1379 case DTV_VOLTAGE:
1380 tvp->u.data = c->voltage;
1381 break;
1382 case DTV_TONE:
1383 tvp->u.data = c->sectone;
1384 break;
1385 case DTV_API_VERSION:
1386 tvp->u.data = (DVB_API_VERSION << 8) | DVB_API_VERSION_MINOR;
1387 break;
1388 case DTV_CODE_RATE_HP:
1389 tvp->u.data = c->code_rate_HP;
1390 break;
1391 case DTV_CODE_RATE_LP:
1392 tvp->u.data = c->code_rate_LP;
1393 break;
1394 case DTV_GUARD_INTERVAL:
1395 tvp->u.data = c->guard_interval;
1396 break;
1397 case DTV_TRANSMISSION_MODE:
1398 tvp->u.data = c->transmission_mode;
1399 break;
1400 case DTV_HIERARCHY:
1401 tvp->u.data = c->hierarchy;
1402 break;
1403 case DTV_INTERLEAVING:
1404 tvp->u.data = c->interleaving;
1405 break;
1406
1407
1408 case DTV_ISDBT_PARTIAL_RECEPTION:
1409 tvp->u.data = c->isdbt_partial_reception;
1410 break;
1411 case DTV_ISDBT_SOUND_BROADCASTING:
1412 tvp->u.data = c->isdbt_sb_mode;
1413 break;
1414 case DTV_ISDBT_SB_SUBCHANNEL_ID:
1415 tvp->u.data = c->isdbt_sb_subchannel;
1416 break;
1417 case DTV_ISDBT_SB_SEGMENT_IDX:
1418 tvp->u.data = c->isdbt_sb_segment_idx;
1419 break;
1420 case DTV_ISDBT_SB_SEGMENT_COUNT:
1421 tvp->u.data = c->isdbt_sb_segment_count;
1422 break;
1423 case DTV_ISDBT_LAYER_ENABLED:
1424 tvp->u.data = c->isdbt_layer_enabled;
1425 break;
1426 case DTV_ISDBT_LAYERA_FEC:
1427 tvp->u.data = c->layer[0].fec;
1428 break;
1429 case DTV_ISDBT_LAYERA_MODULATION:
1430 tvp->u.data = c->layer[0].modulation;
1431 break;
1432 case DTV_ISDBT_LAYERA_SEGMENT_COUNT:
1433 tvp->u.data = c->layer[0].segment_count;
1434 break;
1435 case DTV_ISDBT_LAYERA_TIME_INTERLEAVING:
1436 tvp->u.data = c->layer[0].interleaving;
1437 break;
1438 case DTV_ISDBT_LAYERB_FEC:
1439 tvp->u.data = c->layer[1].fec;
1440 break;
1441 case DTV_ISDBT_LAYERB_MODULATION:
1442 tvp->u.data = c->layer[1].modulation;
1443 break;
1444 case DTV_ISDBT_LAYERB_SEGMENT_COUNT:
1445 tvp->u.data = c->layer[1].segment_count;
1446 break;
1447 case DTV_ISDBT_LAYERB_TIME_INTERLEAVING:
1448 tvp->u.data = c->layer[1].interleaving;
1449 break;
1450 case DTV_ISDBT_LAYERC_FEC:
1451 tvp->u.data = c->layer[2].fec;
1452 break;
1453 case DTV_ISDBT_LAYERC_MODULATION:
1454 tvp->u.data = c->layer[2].modulation;
1455 break;
1456 case DTV_ISDBT_LAYERC_SEGMENT_COUNT:
1457 tvp->u.data = c->layer[2].segment_count;
1458 break;
1459 case DTV_ISDBT_LAYERC_TIME_INTERLEAVING:
1460 tvp->u.data = c->layer[2].interleaving;
1461 break;
1462
1463
1464 case DTV_STREAM_ID:
1465 case DTV_DVBT2_PLP_ID_LEGACY:
1466 tvp->u.data = c->stream_id;
1467 break;
1468
1469
1470 case DTV_SCRAMBLING_SEQUENCE_INDEX:
1471 tvp->u.data = c->scrambling_sequence_index;
1472 break;
1473
1474
1475 case DTV_ATSCMH_FIC_VER:
1476 tvp->u.data = fe->dtv_property_cache.atscmh_fic_ver;
1477 break;
1478 case DTV_ATSCMH_PARADE_ID:
1479 tvp->u.data = fe->dtv_property_cache.atscmh_parade_id;
1480 break;
1481 case DTV_ATSCMH_NOG:
1482 tvp->u.data = fe->dtv_property_cache.atscmh_nog;
1483 break;
1484 case DTV_ATSCMH_TNOG:
1485 tvp->u.data = fe->dtv_property_cache.atscmh_tnog;
1486 break;
1487 case DTV_ATSCMH_SGN:
1488 tvp->u.data = fe->dtv_property_cache.atscmh_sgn;
1489 break;
1490 case DTV_ATSCMH_PRC:
1491 tvp->u.data = fe->dtv_property_cache.atscmh_prc;
1492 break;
1493 case DTV_ATSCMH_RS_FRAME_MODE:
1494 tvp->u.data = fe->dtv_property_cache.atscmh_rs_frame_mode;
1495 break;
1496 case DTV_ATSCMH_RS_FRAME_ENSEMBLE:
1497 tvp->u.data = fe->dtv_property_cache.atscmh_rs_frame_ensemble;
1498 break;
1499 case DTV_ATSCMH_RS_CODE_MODE_PRI:
1500 tvp->u.data = fe->dtv_property_cache.atscmh_rs_code_mode_pri;
1501 break;
1502 case DTV_ATSCMH_RS_CODE_MODE_SEC:
1503 tvp->u.data = fe->dtv_property_cache.atscmh_rs_code_mode_sec;
1504 break;
1505 case DTV_ATSCMH_SCCC_BLOCK_MODE:
1506 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_block_mode;
1507 break;
1508 case DTV_ATSCMH_SCCC_CODE_MODE_A:
1509 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_a;
1510 break;
1511 case DTV_ATSCMH_SCCC_CODE_MODE_B:
1512 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_b;
1513 break;
1514 case DTV_ATSCMH_SCCC_CODE_MODE_C:
1515 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_c;
1516 break;
1517 case DTV_ATSCMH_SCCC_CODE_MODE_D:
1518 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_d;
1519 break;
1520
1521 case DTV_LNA:
1522 tvp->u.data = c->lna;
1523 break;
1524
1525
1526 case DTV_STAT_SIGNAL_STRENGTH:
1527 tvp->u.st = c->strength;
1528 if (tvp->u.buffer.len > MAX_DTV_STATS * sizeof(u32))
1529 tvp->u.buffer.len = MAX_DTV_STATS * sizeof(u32);
1530 len = tvp->u.buffer.len;
1531 break;
1532 case DTV_STAT_CNR:
1533 tvp->u.st = c->cnr;
1534 if (tvp->u.buffer.len > MAX_DTV_STATS * sizeof(u32))
1535 tvp->u.buffer.len = MAX_DTV_STATS * sizeof(u32);
1536 len = tvp->u.buffer.len;
1537 break;
1538 case DTV_STAT_PRE_ERROR_BIT_COUNT:
1539 tvp->u.st = c->pre_bit_error;
1540 if (tvp->u.buffer.len > MAX_DTV_STATS * sizeof(u32))
1541 tvp->u.buffer.len = MAX_DTV_STATS * sizeof(u32);
1542 len = tvp->u.buffer.len;
1543 break;
1544 case DTV_STAT_PRE_TOTAL_BIT_COUNT:
1545 tvp->u.st = c->pre_bit_count;
1546 if (tvp->u.buffer.len > MAX_DTV_STATS * sizeof(u32))
1547 tvp->u.buffer.len = MAX_DTV_STATS * sizeof(u32);
1548 len = tvp->u.buffer.len;
1549 break;
1550 case DTV_STAT_POST_ERROR_BIT_COUNT:
1551 tvp->u.st = c->post_bit_error;
1552 if (tvp->u.buffer.len > MAX_DTV_STATS * sizeof(u32))
1553 tvp->u.buffer.len = MAX_DTV_STATS * sizeof(u32);
1554 len = tvp->u.buffer.len;
1555 break;
1556 case DTV_STAT_POST_TOTAL_BIT_COUNT:
1557 tvp->u.st = c->post_bit_count;
1558 if (tvp->u.buffer.len > MAX_DTV_STATS * sizeof(u32))
1559 tvp->u.buffer.len = MAX_DTV_STATS * sizeof(u32);
1560 len = tvp->u.buffer.len;
1561 break;
1562 case DTV_STAT_ERROR_BLOCK_COUNT:
1563 tvp->u.st = c->block_error;
1564 if (tvp->u.buffer.len > MAX_DTV_STATS * sizeof(u32))
1565 tvp->u.buffer.len = MAX_DTV_STATS * sizeof(u32);
1566 len = tvp->u.buffer.len;
1567 break;
1568 case DTV_STAT_TOTAL_BLOCK_COUNT:
1569 tvp->u.st = c->block_count;
1570 if (tvp->u.buffer.len > MAX_DTV_STATS * sizeof(u32))
1571 tvp->u.buffer.len = MAX_DTV_STATS * sizeof(u32);
1572 len = tvp->u.buffer.len;
1573 break;
1574 default:
1575 dev_dbg(fe->dvb->device,
1576 "%s: FE property %d doesn't exist\n",
1577 __func__, tvp->cmd);
1578 return -EINVAL;
1579 }
1580
1581 if (len < 1)
1582 len = 1;
1583
1584 dev_dbg(fe->dvb->device,
1585 "%s: GET cmd 0x%08x (%s) len %d: %*ph\n",
1586 __func__, tvp->cmd, dtv_cmd_name(tvp->cmd),
1587 tvp->u.buffer.len, tvp->u.buffer.len, tvp->u.buffer.data);
1588
1589 return 0;
1590 }
1591
1592 static int dtv_set_frontend(struct dvb_frontend *fe);
1593
1594 static bool is_dvbv3_delsys(u32 delsys)
1595 {
1596 return (delsys == SYS_DVBT) || (delsys == SYS_DVBC_ANNEX_A) ||
1597 (delsys == SYS_DVBS) || (delsys == SYS_ATSC);
1598 }
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610 static int emulate_delivery_system(struct dvb_frontend *fe, u32 delsys)
1611 {
1612 int i;
1613 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1614
1615 c->delivery_system = delsys;
1616
1617
1618
1619
1620 if (c->delivery_system == SYS_ISDBT) {
1621 dev_dbg(fe->dvb->device,
1622 "%s: Using defaults for SYS_ISDBT\n",
1623 __func__);
1624
1625 if (!c->bandwidth_hz)
1626 c->bandwidth_hz = 6000000;
1627
1628 c->isdbt_partial_reception = 0;
1629 c->isdbt_sb_mode = 0;
1630 c->isdbt_sb_subchannel = 0;
1631 c->isdbt_sb_segment_idx = 0;
1632 c->isdbt_sb_segment_count = 0;
1633 c->isdbt_layer_enabled = 7;
1634 for (i = 0; i < 3; i++) {
1635 c->layer[i].fec = FEC_AUTO;
1636 c->layer[i].modulation = QAM_AUTO;
1637 c->layer[i].interleaving = 0;
1638 c->layer[i].segment_count = 0;
1639 }
1640 }
1641 dev_dbg(fe->dvb->device, "%s: change delivery system on cache to %d\n",
1642 __func__, c->delivery_system);
1643
1644 return 0;
1645 }
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664 static int dvbv5_set_delivery_system(struct dvb_frontend *fe,
1665 u32 desired_system)
1666 {
1667 int ncaps;
1668 u32 delsys = SYS_UNDEFINED;
1669 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1670 enum dvbv3_emulation_type type;
1671
1672
1673
1674
1675
1676
1677
1678 if (desired_system == SYS_UNDEFINED)
1679 desired_system = fe->ops.delsys[0];
1680
1681
1682
1683
1684
1685
1686 ncaps = 0;
1687 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1688 if (fe->ops.delsys[ncaps] == desired_system) {
1689 c->delivery_system = desired_system;
1690 dev_dbg(fe->dvb->device,
1691 "%s: Changing delivery system to %d\n",
1692 __func__, desired_system);
1693 return 0;
1694 }
1695 ncaps++;
1696 }
1697
1698
1699
1700
1701
1702
1703
1704
1705 if (!is_dvbv3_delsys(desired_system)) {
1706 dev_dbg(fe->dvb->device,
1707 "%s: Delivery system %d not supported.\n",
1708 __func__, desired_system);
1709 return -EINVAL;
1710 }
1711
1712 type = dvbv3_type(desired_system);
1713
1714
1715
1716
1717
1718 ncaps = 0;
1719 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1720 if (dvbv3_type(fe->ops.delsys[ncaps]) == type)
1721 delsys = fe->ops.delsys[ncaps];
1722 ncaps++;
1723 }
1724
1725
1726 if (delsys == SYS_UNDEFINED) {
1727 dev_dbg(fe->dvb->device,
1728 "%s: Delivery system %d not supported on emulation mode.\n",
1729 __func__, desired_system);
1730 return -EINVAL;
1731 }
1732
1733 dev_dbg(fe->dvb->device,
1734 "%s: Using delivery system %d emulated as if it were %d\n",
1735 __func__, delsys, desired_system);
1736
1737 return emulate_delivery_system(fe, desired_system);
1738 }
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768 static int dvbv3_set_delivery_system(struct dvb_frontend *fe)
1769 {
1770 int ncaps;
1771 u32 delsys = SYS_UNDEFINED;
1772 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1773
1774
1775 if (c->delivery_system == SYS_UNDEFINED)
1776 c->delivery_system = fe->ops.delsys[0];
1777
1778
1779
1780
1781
1782 if (is_dvbv3_delsys(c->delivery_system)) {
1783 dev_dbg(fe->dvb->device,
1784 "%s: Using delivery system to %d\n",
1785 __func__, c->delivery_system);
1786 return 0;
1787 }
1788
1789
1790
1791
1792
1793 ncaps = 0;
1794 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1795 if (dvbv3_type(fe->ops.delsys[ncaps]) != DVBV3_UNKNOWN) {
1796 delsys = fe->ops.delsys[ncaps];
1797 break;
1798 }
1799 ncaps++;
1800 }
1801 if (delsys == SYS_UNDEFINED) {
1802 dev_dbg(fe->dvb->device,
1803 "%s: Couldn't find a delivery system that works with FE_SET_FRONTEND\n",
1804 __func__);
1805 return -EINVAL;
1806 }
1807 return emulate_delivery_system(fe, delsys);
1808 }
1809
1810 static void prepare_tuning_algo_parameters(struct dvb_frontend *fe)
1811 {
1812 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1813 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1814 struct dvb_frontend_tune_settings fetunesettings = { 0 };
1815
1816
1817 if (fe->ops.get_tune_settings && (fe->ops.get_tune_settings(fe, &fetunesettings) == 0)) {
1818 fepriv->min_delay = (fetunesettings.min_delay_ms * HZ) / 1000;
1819 fepriv->max_drift = fetunesettings.max_drift;
1820 fepriv->step_size = fetunesettings.step_size;
1821 } else {
1822
1823 switch (c->delivery_system) {
1824 case SYS_DVBS:
1825 case SYS_DVBS2:
1826 case SYS_ISDBS:
1827 case SYS_TURBO:
1828 case SYS_DVBC_ANNEX_A:
1829 case SYS_DVBC_ANNEX_C:
1830 fepriv->min_delay = HZ / 20;
1831 fepriv->step_size = c->symbol_rate / 16000;
1832 fepriv->max_drift = c->symbol_rate / 2000;
1833 break;
1834 case SYS_DVBT:
1835 case SYS_DVBT2:
1836 case SYS_ISDBT:
1837 case SYS_DTMB:
1838 fepriv->min_delay = HZ / 20;
1839 fepriv->step_size = dvb_frontend_get_stepsize(fe) * 2;
1840 fepriv->max_drift = fepriv->step_size + 1;
1841 break;
1842 default:
1843
1844
1845
1846
1847 fepriv->min_delay = HZ / 20;
1848 fepriv->step_size = 0;
1849 fepriv->max_drift = 0;
1850 break;
1851 }
1852 }
1853 if (dvb_override_tune_delay > 0)
1854 fepriv->min_delay = (dvb_override_tune_delay * HZ) / 1000;
1855 }
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871 static int dtv_property_process_set(struct dvb_frontend *fe,
1872 struct file *file,
1873 u32 cmd, u32 data)
1874 {
1875 int r = 0;
1876 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1877
1878
1879 if (!cmd || cmd > DTV_MAX_COMMAND)
1880 dev_warn(fe->dvb->device, "%s: SET cmd 0x%08x undefined\n",
1881 __func__, cmd);
1882 else
1883 dev_dbg(fe->dvb->device,
1884 "%s: SET cmd 0x%08x (%s) to 0x%08x\n",
1885 __func__, cmd, dtv_cmd_name(cmd), data);
1886 switch (cmd) {
1887 case DTV_CLEAR:
1888
1889
1890
1891
1892 dvb_frontend_clear_cache(fe);
1893 break;
1894 case DTV_TUNE:
1895
1896
1897
1898
1899 dev_dbg(fe->dvb->device,
1900 "%s: Setting the frontend from property cache\n",
1901 __func__);
1902
1903 r = dtv_set_frontend(fe);
1904 break;
1905 case DTV_FREQUENCY:
1906 c->frequency = data;
1907 break;
1908 case DTV_MODULATION:
1909 c->modulation = data;
1910 break;
1911 case DTV_BANDWIDTH_HZ:
1912 c->bandwidth_hz = data;
1913 break;
1914 case DTV_INVERSION:
1915 c->inversion = data;
1916 break;
1917 case DTV_SYMBOL_RATE:
1918 c->symbol_rate = data;
1919 break;
1920 case DTV_INNER_FEC:
1921 c->fec_inner = data;
1922 break;
1923 case DTV_PILOT:
1924 c->pilot = data;
1925 break;
1926 case DTV_ROLLOFF:
1927 c->rolloff = data;
1928 break;
1929 case DTV_DELIVERY_SYSTEM:
1930 r = dvbv5_set_delivery_system(fe, data);
1931 break;
1932 case DTV_VOLTAGE:
1933 c->voltage = data;
1934 r = dvb_frontend_handle_ioctl(file, FE_SET_VOLTAGE,
1935 (void *)c->voltage);
1936 break;
1937 case DTV_TONE:
1938 c->sectone = data;
1939 r = dvb_frontend_handle_ioctl(file, FE_SET_TONE,
1940 (void *)c->sectone);
1941 break;
1942 case DTV_CODE_RATE_HP:
1943 c->code_rate_HP = data;
1944 break;
1945 case DTV_CODE_RATE_LP:
1946 c->code_rate_LP = data;
1947 break;
1948 case DTV_GUARD_INTERVAL:
1949 c->guard_interval = data;
1950 break;
1951 case DTV_TRANSMISSION_MODE:
1952 c->transmission_mode = data;
1953 break;
1954 case DTV_HIERARCHY:
1955 c->hierarchy = data;
1956 break;
1957 case DTV_INTERLEAVING:
1958 c->interleaving = data;
1959 break;
1960
1961
1962 case DTV_ISDBT_PARTIAL_RECEPTION:
1963 c->isdbt_partial_reception = data;
1964 break;
1965 case DTV_ISDBT_SOUND_BROADCASTING:
1966 c->isdbt_sb_mode = data;
1967 break;
1968 case DTV_ISDBT_SB_SUBCHANNEL_ID:
1969 c->isdbt_sb_subchannel = data;
1970 break;
1971 case DTV_ISDBT_SB_SEGMENT_IDX:
1972 c->isdbt_sb_segment_idx = data;
1973 break;
1974 case DTV_ISDBT_SB_SEGMENT_COUNT:
1975 c->isdbt_sb_segment_count = data;
1976 break;
1977 case DTV_ISDBT_LAYER_ENABLED:
1978 c->isdbt_layer_enabled = data;
1979 break;
1980 case DTV_ISDBT_LAYERA_FEC:
1981 c->layer[0].fec = data;
1982 break;
1983 case DTV_ISDBT_LAYERA_MODULATION:
1984 c->layer[0].modulation = data;
1985 break;
1986 case DTV_ISDBT_LAYERA_SEGMENT_COUNT:
1987 c->layer[0].segment_count = data;
1988 break;
1989 case DTV_ISDBT_LAYERA_TIME_INTERLEAVING:
1990 c->layer[0].interleaving = data;
1991 break;
1992 case DTV_ISDBT_LAYERB_FEC:
1993 c->layer[1].fec = data;
1994 break;
1995 case DTV_ISDBT_LAYERB_MODULATION:
1996 c->layer[1].modulation = data;
1997 break;
1998 case DTV_ISDBT_LAYERB_SEGMENT_COUNT:
1999 c->layer[1].segment_count = data;
2000 break;
2001 case DTV_ISDBT_LAYERB_TIME_INTERLEAVING:
2002 c->layer[1].interleaving = data;
2003 break;
2004 case DTV_ISDBT_LAYERC_FEC:
2005 c->layer[2].fec = data;
2006 break;
2007 case DTV_ISDBT_LAYERC_MODULATION:
2008 c->layer[2].modulation = data;
2009 break;
2010 case DTV_ISDBT_LAYERC_SEGMENT_COUNT:
2011 c->layer[2].segment_count = data;
2012 break;
2013 case DTV_ISDBT_LAYERC_TIME_INTERLEAVING:
2014 c->layer[2].interleaving = data;
2015 break;
2016
2017
2018 case DTV_STREAM_ID:
2019 case DTV_DVBT2_PLP_ID_LEGACY:
2020 c->stream_id = data;
2021 break;
2022
2023
2024 case DTV_SCRAMBLING_SEQUENCE_INDEX:
2025 c->scrambling_sequence_index = data;
2026 break;
2027
2028
2029 case DTV_ATSCMH_PARADE_ID:
2030 fe->dtv_property_cache.atscmh_parade_id = data;
2031 break;
2032 case DTV_ATSCMH_RS_FRAME_ENSEMBLE:
2033 fe->dtv_property_cache.atscmh_rs_frame_ensemble = data;
2034 break;
2035
2036 case DTV_LNA:
2037 c->lna = data;
2038 if (fe->ops.set_lna)
2039 r = fe->ops.set_lna(fe);
2040 if (r < 0)
2041 c->lna = LNA_AUTO;
2042 break;
2043
2044 default:
2045 return -EINVAL;
2046 }
2047
2048 return r;
2049 }
2050
2051 static int dvb_frontend_do_ioctl(struct file *file, unsigned int cmd,
2052 void *parg)
2053 {
2054 struct dvb_device *dvbdev = file->private_data;
2055 struct dvb_frontend *fe = dvbdev->priv;
2056 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2057 int err;
2058
2059 dev_dbg(fe->dvb->device, "%s: (%d)\n", __func__, _IOC_NR(cmd));
2060 if (down_interruptible(&fepriv->sem))
2061 return -ERESTARTSYS;
2062
2063 if (fe->exit != DVB_FE_NO_EXIT) {
2064 up(&fepriv->sem);
2065 return -ENODEV;
2066 }
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081 if ((file->f_flags & O_ACCMODE) == O_RDONLY
2082 && (_IOC_DIR(cmd) != _IOC_READ
2083 || cmd == FE_GET_EVENT
2084 || cmd == FE_DISEQC_RECV_SLAVE_REPLY)) {
2085 up(&fepriv->sem);
2086 return -EPERM;
2087 }
2088
2089 err = dvb_frontend_handle_ioctl(file, cmd, parg);
2090
2091 up(&fepriv->sem);
2092 return err;
2093 }
2094
2095 static long dvb_frontend_ioctl(struct file *file, unsigned int cmd,
2096 unsigned long arg)
2097 {
2098 struct dvb_device *dvbdev = file->private_data;
2099
2100 if (!dvbdev)
2101 return -ENODEV;
2102
2103 return dvb_usercopy(file, cmd, arg, dvb_frontend_do_ioctl);
2104 }
2105
2106 #ifdef CONFIG_COMPAT
2107 struct compat_dtv_property {
2108 __u32 cmd;
2109 __u32 reserved[3];
2110 union {
2111 __u32 data;
2112 struct dtv_fe_stats st;
2113 struct {
2114 __u8 data[32];
2115 __u32 len;
2116 __u32 reserved1[3];
2117 compat_uptr_t reserved2;
2118 } buffer;
2119 } u;
2120 int result;
2121 } __attribute__ ((packed));
2122
2123 struct compat_dtv_properties {
2124 __u32 num;
2125 compat_uptr_t props;
2126 };
2127
2128 #define COMPAT_FE_SET_PROPERTY _IOW('o', 82, struct compat_dtv_properties)
2129 #define COMPAT_FE_GET_PROPERTY _IOR('o', 83, struct compat_dtv_properties)
2130
2131 static int dvb_frontend_handle_compat_ioctl(struct file *file, unsigned int cmd,
2132 unsigned long arg)
2133 {
2134 struct dvb_device *dvbdev = file->private_data;
2135 struct dvb_frontend *fe = dvbdev->priv;
2136 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2137 int i, err = 0;
2138
2139 if (cmd == COMPAT_FE_SET_PROPERTY) {
2140 struct compat_dtv_properties prop, *tvps = NULL;
2141 struct compat_dtv_property *tvp = NULL;
2142
2143 if (copy_from_user(&prop, compat_ptr(arg), sizeof(prop)))
2144 return -EFAULT;
2145
2146 tvps = ∝
2147
2148
2149
2150
2151
2152 if (!tvps->num || (tvps->num > DTV_IOCTL_MAX_MSGS))
2153 return -EINVAL;
2154
2155 tvp = memdup_user(compat_ptr(tvps->props), tvps->num * sizeof(*tvp));
2156 if (IS_ERR(tvp))
2157 return PTR_ERR(tvp);
2158
2159 for (i = 0; i < tvps->num; i++) {
2160 err = dtv_property_process_set(fe, file,
2161 (tvp + i)->cmd,
2162 (tvp + i)->u.data);
2163 if (err < 0) {
2164 kfree(tvp);
2165 return err;
2166 }
2167 }
2168 kfree(tvp);
2169 } else if (cmd == COMPAT_FE_GET_PROPERTY) {
2170 struct compat_dtv_properties prop, *tvps = NULL;
2171 struct compat_dtv_property *tvp = NULL;
2172 struct dtv_frontend_properties getp = fe->dtv_property_cache;
2173
2174 if (copy_from_user(&prop, compat_ptr(arg), sizeof(prop)))
2175 return -EFAULT;
2176
2177 tvps = ∝
2178
2179
2180
2181
2182
2183 if (!tvps->num || (tvps->num > DTV_IOCTL_MAX_MSGS))
2184 return -EINVAL;
2185
2186 tvp = memdup_user(compat_ptr(tvps->props), tvps->num * sizeof(*tvp));
2187 if (IS_ERR(tvp))
2188 return PTR_ERR(tvp);
2189
2190
2191
2192
2193
2194
2195
2196 if (fepriv->state != FESTATE_IDLE) {
2197 err = dtv_get_frontend(fe, &getp, NULL);
2198 if (err < 0) {
2199 kfree(tvp);
2200 return err;
2201 }
2202 }
2203 for (i = 0; i < tvps->num; i++) {
2204 err = dtv_property_process_get(
2205 fe, &getp, (struct dtv_property *)(tvp + i), file);
2206 if (err < 0) {
2207 kfree(tvp);
2208 return err;
2209 }
2210 }
2211
2212 if (copy_to_user((void __user *)compat_ptr(tvps->props), tvp,
2213 tvps->num * sizeof(struct compat_dtv_property))) {
2214 kfree(tvp);
2215 return -EFAULT;
2216 }
2217 kfree(tvp);
2218 }
2219
2220 return err;
2221 }
2222
2223 static long dvb_frontend_compat_ioctl(struct file *file, unsigned int cmd,
2224 unsigned long arg)
2225 {
2226 struct dvb_device *dvbdev = file->private_data;
2227 struct dvb_frontend *fe = dvbdev->priv;
2228 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2229 int err;
2230
2231 if (cmd == COMPAT_FE_SET_PROPERTY || cmd == COMPAT_FE_GET_PROPERTY) {
2232 if (down_interruptible(&fepriv->sem))
2233 return -ERESTARTSYS;
2234
2235 err = dvb_frontend_handle_compat_ioctl(file, cmd, arg);
2236
2237 up(&fepriv->sem);
2238 return err;
2239 }
2240
2241 return dvb_frontend_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
2242 }
2243 #endif
2244
2245 static int dtv_set_frontend(struct dvb_frontend *fe)
2246 {
2247 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2248 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
2249 u32 rolloff = 0;
2250
2251 if (dvb_frontend_check_parameters(fe) < 0)
2252 return -EINVAL;
2253
2254
2255
2256
2257
2258
2259 dtv_property_legacy_params_sync(fe, c, &fepriv->parameters_out);
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280 switch (c->delivery_system) {
2281 case SYS_ATSC:
2282 case SYS_DVBC_ANNEX_B:
2283 c->bandwidth_hz = 6000000;
2284 break;
2285 case SYS_DVBC_ANNEX_A:
2286 rolloff = 115;
2287 break;
2288 case SYS_DVBC_ANNEX_C:
2289 rolloff = 113;
2290 break;
2291 case SYS_DVBS:
2292 case SYS_TURBO:
2293 case SYS_ISDBS:
2294 rolloff = 135;
2295 break;
2296 case SYS_DVBS2:
2297 switch (c->rolloff) {
2298 case ROLLOFF_20:
2299 rolloff = 120;
2300 break;
2301 case ROLLOFF_25:
2302 rolloff = 125;
2303 break;
2304 default:
2305 case ROLLOFF_35:
2306 rolloff = 135;
2307 }
2308 break;
2309 default:
2310 break;
2311 }
2312 if (rolloff)
2313 c->bandwidth_hz = mult_frac(c->symbol_rate, rolloff, 100);
2314
2315
2316 if (dvb_force_auto_inversion)
2317 c->inversion = INVERSION_AUTO;
2318
2319
2320
2321
2322
2323 if (c->hierarchy == HIERARCHY_NONE && c->code_rate_LP == FEC_NONE)
2324 c->code_rate_LP = FEC_AUTO;
2325
2326 prepare_tuning_algo_parameters(fe);
2327
2328 fepriv->state = FESTATE_RETUNE;
2329
2330
2331 fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
2332
2333 dvb_frontend_clear_events(fe);
2334 dvb_frontend_add_event(fe, 0);
2335 dvb_frontend_wakeup(fe);
2336 fepriv->status = 0;
2337
2338 return 0;
2339 }
2340
2341 static int dvb_get_property(struct dvb_frontend *fe, struct file *file,
2342 struct dtv_properties *tvps)
2343 {
2344 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2345 struct dtv_property *tvp = NULL;
2346 struct dtv_frontend_properties getp;
2347 int i, err;
2348
2349 memcpy(&getp, &fe->dtv_property_cache, sizeof(getp));
2350
2351 dev_dbg(fe->dvb->device, "%s: properties.num = %d\n",
2352 __func__, tvps->num);
2353 dev_dbg(fe->dvb->device, "%s: properties.props = %p\n",
2354 __func__, tvps->props);
2355
2356
2357
2358
2359
2360 if (!tvps->num || tvps->num > DTV_IOCTL_MAX_MSGS)
2361 return -EINVAL;
2362
2363 tvp = memdup_user((void __user *)tvps->props, tvps->num * sizeof(*tvp));
2364 if (IS_ERR(tvp))
2365 return PTR_ERR(tvp);
2366
2367
2368
2369
2370
2371
2372
2373 if (fepriv->state != FESTATE_IDLE) {
2374 err = dtv_get_frontend(fe, &getp, NULL);
2375 if (err < 0)
2376 goto out;
2377 }
2378 for (i = 0; i < tvps->num; i++) {
2379 err = dtv_property_process_get(fe, &getp,
2380 tvp + i, file);
2381 if (err < 0)
2382 goto out;
2383 }
2384
2385 if (copy_to_user((void __user *)tvps->props, tvp,
2386 tvps->num * sizeof(struct dtv_property))) {
2387 err = -EFAULT;
2388 goto out;
2389 }
2390
2391 err = 0;
2392 out:
2393 kfree(tvp);
2394 return err;
2395 }
2396
2397 static int dvb_get_frontend(struct dvb_frontend *fe,
2398 struct dvb_frontend_parameters *p_out)
2399 {
2400 struct dtv_frontend_properties getp;
2401
2402
2403
2404
2405
2406
2407
2408 memcpy(&getp, &fe->dtv_property_cache, sizeof(getp));
2409
2410 return dtv_get_frontend(fe, &getp, p_out);
2411 }
2412
2413 static int dvb_frontend_handle_ioctl(struct file *file,
2414 unsigned int cmd, void *parg)
2415 {
2416 struct dvb_device *dvbdev = file->private_data;
2417 struct dvb_frontend *fe = dvbdev->priv;
2418 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2419 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
2420 int i, err = -ENOTSUPP;
2421
2422 dev_dbg(fe->dvb->device, "%s:\n", __func__);
2423
2424 switch (cmd) {
2425 case FE_SET_PROPERTY: {
2426 struct dtv_properties *tvps = parg;
2427 struct dtv_property *tvp = NULL;
2428
2429 dev_dbg(fe->dvb->device, "%s: properties.num = %d\n",
2430 __func__, tvps->num);
2431 dev_dbg(fe->dvb->device, "%s: properties.props = %p\n",
2432 __func__, tvps->props);
2433
2434
2435
2436
2437
2438 if (!tvps->num || (tvps->num > DTV_IOCTL_MAX_MSGS))
2439 return -EINVAL;
2440
2441 tvp = memdup_user((void __user *)tvps->props, tvps->num * sizeof(*tvp));
2442 if (IS_ERR(tvp))
2443 return PTR_ERR(tvp);
2444
2445 for (i = 0; i < tvps->num; i++) {
2446 err = dtv_property_process_set(fe, file,
2447 (tvp + i)->cmd,
2448 (tvp + i)->u.data);
2449 if (err < 0) {
2450 kfree(tvp);
2451 return err;
2452 }
2453 }
2454 kfree(tvp);
2455 err = 0;
2456 break;
2457 }
2458 case FE_GET_PROPERTY:
2459 err = dvb_get_property(fe, file, parg);
2460 break;
2461
2462 case FE_GET_INFO: {
2463 struct dvb_frontend_info *info = parg;
2464 memset(info, 0, sizeof(*info));
2465
2466 strscpy(info->name, fe->ops.info.name, sizeof(info->name));
2467 info->symbol_rate_min = fe->ops.info.symbol_rate_min;
2468 info->symbol_rate_max = fe->ops.info.symbol_rate_max;
2469 info->symbol_rate_tolerance = fe->ops.info.symbol_rate_tolerance;
2470 info->caps = fe->ops.info.caps;
2471 info->frequency_stepsize = dvb_frontend_get_stepsize(fe);
2472 dvb_frontend_get_frequency_limits(fe, &info->frequency_min,
2473 &info->frequency_max,
2474 &info->frequency_tolerance);
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487 switch (dvbv3_type(c->delivery_system)) {
2488 case DVBV3_QPSK:
2489 info->type = FE_QPSK;
2490 break;
2491 case DVBV3_ATSC:
2492 info->type = FE_ATSC;
2493 break;
2494 case DVBV3_QAM:
2495 info->type = FE_QAM;
2496 break;
2497 case DVBV3_OFDM:
2498 info->type = FE_OFDM;
2499 break;
2500 default:
2501 dev_err(fe->dvb->device,
2502 "%s: doesn't know how to handle a DVBv3 call to delivery system %i\n",
2503 __func__, c->delivery_system);
2504 info->type = FE_OFDM;
2505 }
2506 dev_dbg(fe->dvb->device, "%s: current delivery system on cache: %d, V3 type: %d\n",
2507 __func__, c->delivery_system, info->type);
2508
2509
2510 if (!(fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT))
2511 info->caps |= FE_CAN_INVERSION_AUTO;
2512 err = 0;
2513 break;
2514 }
2515
2516 case FE_READ_STATUS: {
2517 enum fe_status *status = parg;
2518
2519
2520
2521 if (fepriv->state == FESTATE_RETUNE ||
2522 fepriv->state == FESTATE_ERROR) {
2523 err = 0;
2524 *status = 0;
2525 break;
2526 }
2527
2528 if (fe->ops.read_status)
2529 err = fe->ops.read_status(fe, status);
2530 break;
2531 }
2532
2533 case FE_DISEQC_RESET_OVERLOAD:
2534 if (fe->ops.diseqc_reset_overload) {
2535 err = fe->ops.diseqc_reset_overload(fe);
2536 fepriv->state = FESTATE_DISEQC;
2537 fepriv->status = 0;
2538 }
2539 break;
2540
2541 case FE_DISEQC_SEND_MASTER_CMD:
2542 if (fe->ops.diseqc_send_master_cmd) {
2543 struct dvb_diseqc_master_cmd *cmd = parg;
2544
2545 if (cmd->msg_len > sizeof(cmd->msg)) {
2546 err = -EINVAL;
2547 break;
2548 }
2549 err = fe->ops.diseqc_send_master_cmd(fe, cmd);
2550 fepriv->state = FESTATE_DISEQC;
2551 fepriv->status = 0;
2552 }
2553 break;
2554
2555 case FE_DISEQC_SEND_BURST:
2556 if (fe->ops.diseqc_send_burst) {
2557 err = fe->ops.diseqc_send_burst(fe, (long)parg);
2558 fepriv->state = FESTATE_DISEQC;
2559 fepriv->status = 0;
2560 }
2561 break;
2562
2563 case FE_SET_TONE:
2564 if (fe->ops.set_tone) {
2565 fepriv->tone = (long)parg;
2566 err = fe->ops.set_tone(fe, fepriv->tone);
2567 fepriv->state = FESTATE_DISEQC;
2568 fepriv->status = 0;
2569 }
2570 break;
2571
2572 case FE_SET_VOLTAGE:
2573 if (fe->ops.set_voltage) {
2574 fepriv->voltage = (long)parg;
2575 err = fe->ops.set_voltage(fe, fepriv->voltage);
2576 fepriv->state = FESTATE_DISEQC;
2577 fepriv->status = 0;
2578 }
2579 break;
2580
2581 case FE_DISEQC_RECV_SLAVE_REPLY:
2582 if (fe->ops.diseqc_recv_slave_reply)
2583 err = fe->ops.diseqc_recv_slave_reply(fe, parg);
2584 break;
2585
2586 case FE_ENABLE_HIGH_LNB_VOLTAGE:
2587 if (fe->ops.enable_high_lnb_voltage)
2588 err = fe->ops.enable_high_lnb_voltage(fe, (long)parg);
2589 break;
2590
2591 case FE_SET_FRONTEND_TUNE_MODE:
2592 fepriv->tune_mode_flags = (unsigned long)parg;
2593 err = 0;
2594 break;
2595
2596
2597 case FE_DISHNETWORK_SEND_LEGACY_CMD:
2598 if (fe->ops.dishnetwork_send_legacy_command) {
2599 err = fe->ops.dishnetwork_send_legacy_command(fe,
2600 (unsigned long)parg);
2601 fepriv->state = FESTATE_DISEQC;
2602 fepriv->status = 0;
2603 } else if (fe->ops.set_voltage) {
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620 unsigned long swcmd = ((unsigned long)parg) << 1;
2621 ktime_t nexttime;
2622 ktime_t tv[10];
2623 int i;
2624 u8 last = 1;
2625
2626 if (dvb_frontend_debug)
2627 dprintk("switch command: 0x%04lx\n",
2628 swcmd);
2629 nexttime = ktime_get_boottime();
2630 if (dvb_frontend_debug)
2631 tv[0] = nexttime;
2632
2633
2634
2635 fe->ops.set_voltage(fe, SEC_VOLTAGE_18);
2636 dvb_frontend_sleep_until(&nexttime, 32000);
2637
2638 for (i = 0; i < 9; i++) {
2639 if (dvb_frontend_debug)
2640 tv[i + 1] = ktime_get_boottime();
2641 if ((swcmd & 0x01) != last) {
2642
2643 fe->ops.set_voltage(fe, (last) ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18);
2644 last = (last) ? 0 : 1;
2645 }
2646 swcmd = swcmd >> 1;
2647 if (i != 8)
2648 dvb_frontend_sleep_until(&nexttime, 8000);
2649 }
2650 if (dvb_frontend_debug) {
2651 dprintk("(adapter %d): switch delay (should be 32k followed by all 8k)\n",
2652 fe->dvb->num);
2653 for (i = 1; i < 10; i++)
2654 pr_info("%d: %d\n", i,
2655 (int)ktime_us_delta(tv[i], tv[i - 1]));
2656 }
2657 err = 0;
2658 fepriv->state = FESTATE_DISEQC;
2659 fepriv->status = 0;
2660 }
2661 break;
2662
2663
2664
2665 case FE_READ_BER:
2666 if (fe->ops.read_ber) {
2667 if (fepriv->thread)
2668 err = fe->ops.read_ber(fe, parg);
2669 else
2670 err = -EAGAIN;
2671 }
2672 break;
2673
2674 case FE_READ_SIGNAL_STRENGTH:
2675 if (fe->ops.read_signal_strength) {
2676 if (fepriv->thread)
2677 err = fe->ops.read_signal_strength(fe, parg);
2678 else
2679 err = -EAGAIN;
2680 }
2681 break;
2682
2683 case FE_READ_SNR:
2684 if (fe->ops.read_snr) {
2685 if (fepriv->thread)
2686 err = fe->ops.read_snr(fe, parg);
2687 else
2688 err = -EAGAIN;
2689 }
2690 break;
2691
2692 case FE_READ_UNCORRECTED_BLOCKS:
2693 if (fe->ops.read_ucblocks) {
2694 if (fepriv->thread)
2695 err = fe->ops.read_ucblocks(fe, parg);
2696 else
2697 err = -EAGAIN;
2698 }
2699 break;
2700
2701
2702
2703 case FE_SET_FRONTEND:
2704 err = dvbv3_set_delivery_system(fe);
2705 if (err)
2706 break;
2707
2708 err = dtv_property_cache_sync(fe, c, parg);
2709 if (err)
2710 break;
2711 err = dtv_set_frontend(fe);
2712 break;
2713
2714 case FE_GET_EVENT:
2715 err = dvb_frontend_get_event(fe, parg, file->f_flags);
2716 break;
2717
2718 case FE_GET_FRONTEND:
2719 err = dvb_get_frontend(fe, parg);
2720 break;
2721
2722 default:
2723 return -ENOTSUPP;
2724 }
2725
2726 return err;
2727 }
2728
2729 static __poll_t dvb_frontend_poll(struct file *file, struct poll_table_struct *wait)
2730 {
2731 struct dvb_device *dvbdev = file->private_data;
2732 struct dvb_frontend *fe = dvbdev->priv;
2733 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2734
2735 dev_dbg_ratelimited(fe->dvb->device, "%s:\n", __func__);
2736
2737 poll_wait(file, &fepriv->events.wait_queue, wait);
2738
2739 if (fepriv->events.eventw != fepriv->events.eventr)
2740 return (EPOLLIN | EPOLLRDNORM | EPOLLPRI);
2741
2742 return 0;
2743 }
2744
2745 static int dvb_frontend_open(struct inode *inode, struct file *file)
2746 {
2747 struct dvb_device *dvbdev = file->private_data;
2748 struct dvb_frontend *fe = dvbdev->priv;
2749 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2750 struct dvb_adapter *adapter = fe->dvb;
2751 int ret;
2752
2753 dev_dbg(fe->dvb->device, "%s:\n", __func__);
2754 if (fe->exit == DVB_FE_DEVICE_REMOVED)
2755 return -ENODEV;
2756
2757 if (adapter->mfe_shared) {
2758 mutex_lock(&adapter->mfe_lock);
2759
2760 if (!adapter->mfe_dvbdev)
2761 adapter->mfe_dvbdev = dvbdev;
2762
2763 else if (adapter->mfe_dvbdev != dvbdev) {
2764 struct dvb_device
2765 *mfedev = adapter->mfe_dvbdev;
2766 struct dvb_frontend
2767 *mfe = mfedev->priv;
2768 struct dvb_frontend_private
2769 *mfepriv = mfe->frontend_priv;
2770 int mferetry = (dvb_mfe_wait_time << 1);
2771
2772 mutex_unlock(&adapter->mfe_lock);
2773 while (mferetry-- && (mfedev->users != -1 ||
2774 mfepriv->thread)) {
2775 if (msleep_interruptible(500)) {
2776 if (signal_pending(current))
2777 return -EINTR;
2778 }
2779 }
2780
2781 mutex_lock(&adapter->mfe_lock);
2782 if (adapter->mfe_dvbdev != dvbdev) {
2783 mfedev = adapter->mfe_dvbdev;
2784 mfe = mfedev->priv;
2785 mfepriv = mfe->frontend_priv;
2786 if (mfedev->users != -1 ||
2787 mfepriv->thread) {
2788 mutex_unlock(&adapter->mfe_lock);
2789 return -EBUSY;
2790 }
2791 adapter->mfe_dvbdev = dvbdev;
2792 }
2793 }
2794 }
2795
2796 if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) {
2797 if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0)
2798 goto err0;
2799
2800
2801
2802
2803
2804
2805
2806 fepriv->reinitialise = 1;
2807 }
2808
2809 if ((ret = dvb_generic_open(inode, file)) < 0)
2810 goto err1;
2811
2812 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
2813
2814 fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
2815 fepriv->tone = -1;
2816 fepriv->voltage = -1;
2817
2818 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
2819 mutex_lock(&fe->dvb->mdev_lock);
2820 if (fe->dvb->mdev) {
2821 mutex_lock(&fe->dvb->mdev->graph_mutex);
2822 if (fe->dvb->mdev->enable_source)
2823 ret = fe->dvb->mdev->enable_source(
2824 dvbdev->entity,
2825 &fepriv->pipe);
2826 mutex_unlock(&fe->dvb->mdev->graph_mutex);
2827 if (ret) {
2828 mutex_unlock(&fe->dvb->mdev_lock);
2829 dev_err(fe->dvb->device,
2830 "Tuner is busy. Error %d\n", ret);
2831 goto err2;
2832 }
2833 }
2834 mutex_unlock(&fe->dvb->mdev_lock);
2835 #endif
2836 ret = dvb_frontend_start(fe);
2837 if (ret)
2838 goto err3;
2839
2840
2841 fepriv->events.eventr = fepriv->events.eventw = 0;
2842 }
2843
2844 dvb_frontend_get(fe);
2845
2846 if (adapter->mfe_shared)
2847 mutex_unlock(&adapter->mfe_lock);
2848 return ret;
2849
2850 err3:
2851 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
2852 mutex_lock(&fe->dvb->mdev_lock);
2853 if (fe->dvb->mdev) {
2854 mutex_lock(&fe->dvb->mdev->graph_mutex);
2855 if (fe->dvb->mdev->disable_source)
2856 fe->dvb->mdev->disable_source(dvbdev->entity);
2857 mutex_unlock(&fe->dvb->mdev->graph_mutex);
2858 }
2859 mutex_unlock(&fe->dvb->mdev_lock);
2860 err2:
2861 #endif
2862 dvb_generic_release(inode, file);
2863 err1:
2864 if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl)
2865 fe->ops.ts_bus_ctrl(fe, 0);
2866 err0:
2867 if (adapter->mfe_shared)
2868 mutex_unlock(&adapter->mfe_lock);
2869 return ret;
2870 }
2871
2872 static int dvb_frontend_release(struct inode *inode, struct file *file)
2873 {
2874 struct dvb_device *dvbdev = file->private_data;
2875 struct dvb_frontend *fe = dvbdev->priv;
2876 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2877 int ret;
2878
2879 dev_dbg(fe->dvb->device, "%s:\n", __func__);
2880
2881 if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
2882 fepriv->release_jiffies = jiffies;
2883 mb();
2884 }
2885
2886 ret = dvb_generic_release(inode, file);
2887
2888 if (dvbdev->users == -1) {
2889 wake_up(&fepriv->wait_queue);
2890 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
2891 mutex_lock(&fe->dvb->mdev_lock);
2892 if (fe->dvb->mdev) {
2893 mutex_lock(&fe->dvb->mdev->graph_mutex);
2894 if (fe->dvb->mdev->disable_source)
2895 fe->dvb->mdev->disable_source(dvbdev->entity);
2896 mutex_unlock(&fe->dvb->mdev->graph_mutex);
2897 }
2898 mutex_unlock(&fe->dvb->mdev_lock);
2899 #endif
2900 if (fe->exit != DVB_FE_NO_EXIT)
2901 wake_up(&dvbdev->wait_queue);
2902 if (fe->ops.ts_bus_ctrl)
2903 fe->ops.ts_bus_ctrl(fe, 0);
2904 }
2905
2906 dvb_frontend_put(fe);
2907
2908 return ret;
2909 }
2910
2911 static const struct file_operations dvb_frontend_fops = {
2912 .owner = THIS_MODULE,
2913 .unlocked_ioctl = dvb_frontend_ioctl,
2914 #ifdef CONFIG_COMPAT
2915 .compat_ioctl = dvb_frontend_compat_ioctl,
2916 #endif
2917 .poll = dvb_frontend_poll,
2918 .open = dvb_frontend_open,
2919 .release = dvb_frontend_release,
2920 .llseek = noop_llseek,
2921 };
2922
2923 int dvb_frontend_suspend(struct dvb_frontend *fe)
2924 {
2925 int ret = 0;
2926
2927 dev_dbg(fe->dvb->device, "%s: adap=%d fe=%d\n", __func__, fe->dvb->num,
2928 fe->id);
2929
2930 if (fe->ops.tuner_ops.suspend)
2931 ret = fe->ops.tuner_ops.suspend(fe);
2932 else if (fe->ops.tuner_ops.sleep)
2933 ret = fe->ops.tuner_ops.sleep(fe);
2934
2935 if (fe->ops.suspend)
2936 ret = fe->ops.suspend(fe);
2937 else if (fe->ops.sleep)
2938 ret = fe->ops.sleep(fe);
2939
2940 return ret;
2941 }
2942 EXPORT_SYMBOL(dvb_frontend_suspend);
2943
2944 int dvb_frontend_resume(struct dvb_frontend *fe)
2945 {
2946 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2947 int ret = 0;
2948
2949 dev_dbg(fe->dvb->device, "%s: adap=%d fe=%d\n", __func__, fe->dvb->num,
2950 fe->id);
2951
2952 fe->exit = DVB_FE_DEVICE_RESUME;
2953 if (fe->ops.resume)
2954 ret = fe->ops.resume(fe);
2955 else if (fe->ops.init)
2956 ret = fe->ops.init(fe);
2957
2958 if (fe->ops.tuner_ops.resume)
2959 ret = fe->ops.tuner_ops.resume(fe);
2960 else if (fe->ops.tuner_ops.init)
2961 ret = fe->ops.tuner_ops.init(fe);
2962
2963 if (fe->ops.set_tone && fepriv->tone != -1)
2964 fe->ops.set_tone(fe, fepriv->tone);
2965 if (fe->ops.set_voltage && fepriv->voltage != -1)
2966 fe->ops.set_voltage(fe, fepriv->voltage);
2967
2968 fe->exit = DVB_FE_NO_EXIT;
2969 fepriv->state = FESTATE_RETUNE;
2970 dvb_frontend_wakeup(fe);
2971
2972 return ret;
2973 }
2974 EXPORT_SYMBOL(dvb_frontend_resume);
2975
2976 int dvb_register_frontend(struct dvb_adapter *dvb,
2977 struct dvb_frontend *fe)
2978 {
2979 struct dvb_frontend_private *fepriv;
2980 const struct dvb_device dvbdev_template = {
2981 .users = ~0,
2982 .writers = 1,
2983 .readers = (~0) - 1,
2984 .fops = &dvb_frontend_fops,
2985 #if defined(CONFIG_MEDIA_CONTROLLER_DVB)
2986 .name = fe->ops.info.name,
2987 #endif
2988 };
2989
2990 dev_dbg(dvb->device, "%s:\n", __func__);
2991
2992 if (mutex_lock_interruptible(&frontend_mutex))
2993 return -ERESTARTSYS;
2994
2995 fe->frontend_priv = kzalloc(sizeof(struct dvb_frontend_private), GFP_KERNEL);
2996 if (!fe->frontend_priv) {
2997 mutex_unlock(&frontend_mutex);
2998 return -ENOMEM;
2999 }
3000 fepriv = fe->frontend_priv;
3001
3002 kref_init(&fe->refcount);
3003
3004
3005
3006
3007
3008
3009 dvb_frontend_get(fe);
3010
3011 sema_init(&fepriv->sem, 1);
3012 init_waitqueue_head(&fepriv->wait_queue);
3013 init_waitqueue_head(&fepriv->events.wait_queue);
3014 mutex_init(&fepriv->events.mtx);
3015 fe->dvb = dvb;
3016 fepriv->inversion = INVERSION_OFF;
3017
3018 dev_info(fe->dvb->device,
3019 "DVB: registering adapter %i frontend %i (%s)...\n",
3020 fe->dvb->num, fe->id, fe->ops.info.name);
3021
3022 dvb_register_device(fe->dvb, &fepriv->dvbdev, &dvbdev_template,
3023 fe, DVB_DEVICE_FRONTEND, 0);
3024
3025
3026
3027
3028
3029
3030 fe->dtv_property_cache.delivery_system = fe->ops.delsys[0];
3031 dvb_frontend_clear_cache(fe);
3032
3033 mutex_unlock(&frontend_mutex);
3034 return 0;
3035 }
3036 EXPORT_SYMBOL(dvb_register_frontend);
3037
3038 int dvb_unregister_frontend(struct dvb_frontend *fe)
3039 {
3040 struct dvb_frontend_private *fepriv = fe->frontend_priv;
3041
3042 dev_dbg(fe->dvb->device, "%s:\n", __func__);
3043
3044 mutex_lock(&frontend_mutex);
3045 dvb_frontend_stop(fe);
3046 dvb_remove_device(fepriv->dvbdev);
3047
3048
3049 mutex_unlock(&frontend_mutex);
3050 dvb_frontend_put(fe);
3051 return 0;
3052 }
3053 EXPORT_SYMBOL(dvb_unregister_frontend);
3054
3055 static void dvb_frontend_invoke_release(struct dvb_frontend *fe,
3056 void (*release)(struct dvb_frontend *fe))
3057 {
3058 if (release) {
3059 release(fe);
3060 #ifdef CONFIG_MEDIA_ATTACH
3061 dvb_detach(release);
3062 #endif
3063 }
3064 }
3065
3066 void dvb_frontend_detach(struct dvb_frontend *fe)
3067 {
3068 dvb_frontend_invoke_release(fe, fe->ops.release_sec);
3069 dvb_frontend_invoke_release(fe, fe->ops.tuner_ops.release);
3070 dvb_frontend_invoke_release(fe, fe->ops.analog_ops.release);
3071 dvb_frontend_put(fe);
3072 }
3073 EXPORT_SYMBOL(dvb_frontend_detach);