Lines Matching refs:fe

136 static void dvb_frontend_wakeup(struct dvb_frontend *fe);
137 static int dtv_get_frontend(struct dvb_frontend *fe,
139 static int dtv_property_legacy_params_sync(struct dvb_frontend *fe,
142 static bool has_get_frontend(struct dvb_frontend *fe)
144 return fe->ops.get_frontend != NULL;
196 static void dvb_frontend_add_event(struct dvb_frontend *fe, fe_status_t status)
198 struct dvb_frontend_private *fepriv = fe->frontend_priv;
203 dev_dbg(fe->dvb->device, "%s:\n", __func__);
205 if ((status & FE_HAS_LOCK) && has_get_frontend(fe))
206 dtv_get_frontend(fe, &fepriv->parameters_out);
227 static int dvb_frontend_get_event(struct dvb_frontend *fe,
230 struct dvb_frontend_private *fepriv = fe->frontend_priv;
233 dev_dbg(fe->dvb->device, "%s:\n", __func__);
266 static void dvb_frontend_clear_events(struct dvb_frontend *fe)
268 struct dvb_frontend_private *fepriv = fe->frontend_priv;
276 static void dvb_frontend_init(struct dvb_frontend *fe)
278 dev_dbg(fe->dvb->device,
280 __func__, fe->dvb->num, fe->id, fe->ops.info.name);
282 if (fe->ops.init)
283 fe->ops.init(fe);
284 if (fe->ops.tuner_ops.init) {
285 if (fe->ops.i2c_gate_ctrl)
286 fe->ops.i2c_gate_ctrl(fe, 1);
287 fe->ops.tuner_ops.init(fe);
288 if (fe->ops.i2c_gate_ctrl)
289 fe->ops.i2c_gate_ctrl(fe, 0);
293 void dvb_frontend_reinitialise(struct dvb_frontend *fe)
295 struct dvb_frontend_private *fepriv = fe->frontend_priv;
298 dvb_frontend_wakeup(fe);
305 struct dvb_frontend *fe = fepriv->dvbdev->priv;
307 dev_dbg(fe->dvb->device, "%s:\n", __func__);
323 * @param fe The frontend concerned.
327 static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wrapped)
332 struct dvb_frontend_private *fepriv = fe->frontend_priv;
333 struct dtv_frontend_properties *c = &fe->dtv_property_cache, tmp;
338 autoinversion = ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
399 dev_dbg(fe->dvb->device, "%s: drift:%i inversion:%i auto_step:%i " \
410 if (fe->ops.set_frontend)
411 fe_set_err = fe->ops.set_frontend(fe);
425 static void dvb_frontend_swzigzag(struct dvb_frontend *fe)
429 struct dvb_frontend_private *fepriv = fe->frontend_priv;
430 struct dtv_frontend_properties *c = &fe->dtv_property_cache, tmp;
443 if (fe->ops.set_frontend)
444 retval = fe->ops.set_frontend(fe);
460 if (fe->ops.read_status)
461 fe->ops.read_status(fe, &s);
463 dvb_frontend_add_event(fe, s);
474 if ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
498 (fe->ops.info.caps & FE_CAN_RECOVER) && (fepriv->max_drift == 0)) {
527 retval = dvb_frontend_swzigzag_autotune(fe,
555 dvb_frontend_swzigzag_autotune(fe, 0);
559 static int dvb_frontend_is_exiting(struct dvb_frontend *fe)
561 struct dvb_frontend_private *fepriv = fe->frontend_priv;
563 if (fe->exit != DVB_FE_NO_EXIT)
574 static int dvb_frontend_should_wakeup(struct dvb_frontend *fe)
576 struct dvb_frontend_private *fepriv = fe->frontend_priv;
582 return dvb_frontend_is_exiting(fe);
585 static void dvb_frontend_wakeup(struct dvb_frontend *fe)
587 struct dvb_frontend_private *fepriv = fe->frontend_priv;
595 struct dvb_frontend *fe = data;
596 struct dvb_frontend_private *fepriv = fe->frontend_priv;
603 dev_dbg(fe->dvb->device, "%s:\n", __func__);
612 dvb_frontend_init(fe);
619 dvb_frontend_should_wakeup(fe) || kthread_should_stop()
623 if (kthread_should_stop() || dvb_frontend_is_exiting(fe)) {
627 fe->exit = DVB_FE_NORMAL_EXIT;
638 dvb_frontend_init(fe);
639 if (fe->ops.set_tone && fepriv->tone != -1)
640 fe->ops.set_tone(fe, fepriv->tone);
641 if (fe->ops.set_voltage && fepriv->voltage != -1)
642 fe->ops.set_voltage(fe, fepriv->voltage);
647 if (fe->ops.get_frontend_algo) {
648 algo = fe->ops.get_frontend_algo(fe);
651 dev_dbg(fe->dvb->device, "%s: Frontend ALGO = DVBFE_ALGO_HW\n", __func__);
654 dev_dbg(fe->dvb->device, "%s: Retune requested, FESTATE_RETUNE\n", __func__);
661 if (fe->ops.tune)
662 fe->ops.tune(fe, re_tune, fepriv->tune_mode_flags, &fepriv->delay, &s);
665 dev_dbg(fe->dvb->device, "%s: state changed, adding current state\n", __func__);
666 dvb_frontend_add_event(fe, s);
671 dev_dbg(fe->dvb->device, "%s: Frontend ALGO = DVBFE_ALGO_SW\n", __func__);
672 dvb_frontend_swzigzag(fe);
675 dev_dbg(fe->dvb->device, "%s: Frontend ALGO = DVBFE_ALGO_CUSTOM, state=%d\n", __func__, fepriv->state);
677 dev_dbg(fe->dvb->device, "%s: Retune requested, FESTAT_RETUNE\n", __func__);
685 if (fe->ops.search) {
686 fepriv->algo_status = fe->ops.search(fe);
699 dtv_property_legacy_params_sync(fe, &fepriv->parameters_out);
700 fe->ops.read_status(fe, &s);
702 dvb_frontend_add_event(fe, s); /* update event list */
713 dev_dbg(fe->dvb->device, "%s: UNDEFINED ALGO !\n", __func__);
717 dvb_frontend_swzigzag(fe);
722 if (fe->ops.set_voltage)
723 fe->ops.set_voltage(fe, SEC_VOLTAGE_OFF);
724 if (fe->ops.tuner_ops.sleep) {
725 if (fe->ops.i2c_gate_ctrl)
726 fe->ops.i2c_gate_ctrl(fe, 1);
727 fe->ops.tuner_ops.sleep(fe);
728 if (fe->ops.i2c_gate_ctrl)
729 fe->ops.i2c_gate_ctrl(fe, 0);
731 if (fe->ops.sleep)
732 fe->ops.sleep(fe);
737 fe->exit = DVB_FE_DEVICE_REMOVED;
739 fe->exit = DVB_FE_NO_EXIT;
744 dvb_frontend_wakeup(fe);
748 static void dvb_frontend_stop(struct dvb_frontend *fe)
750 struct dvb_frontend_private *fepriv = fe->frontend_priv;
752 dev_dbg(fe->dvb->device, "%s:\n", __func__);
754 if (fe->exit != DVB_FE_DEVICE_REMOVED)
755 fe->exit = DVB_FE_NORMAL_EXIT;
768 dev_warn(fe->dvb->device,
816 static int dvb_frontend_start(struct dvb_frontend *fe)
819 struct dvb_frontend_private *fepriv = fe->frontend_priv;
822 dev_dbg(fe->dvb->device, "%s:\n", __func__);
825 if (fe->exit == DVB_FE_NO_EXIT)
828 dvb_frontend_stop (fe);
837 fe->exit = DVB_FE_NO_EXIT;
841 fe_thread = kthread_run(dvb_frontend_thread, fe,
842 "kdvb-ad-%i-fe-%i", fe->dvb->num,fe->id);
845 dev_warn(fe->dvb->device,
855 static void dvb_frontend_get_frequency_limits(struct dvb_frontend *fe,
858 *freq_min = max(fe->ops.info.frequency_min, fe->ops.tuner_ops.info.frequency_min);
860 if (fe->ops.info.frequency_max == 0)
861 *freq_max = fe->ops.tuner_ops.info.frequency_max;
862 else if (fe->ops.tuner_ops.info.frequency_max == 0)
863 *freq_max = fe->ops.info.frequency_max;
865 *freq_max = min(fe->ops.info.frequency_max, fe->ops.tuner_ops.info.frequency_max);
868 dev_warn(fe->dvb->device, "DVB: adapter %i frontend %u frequency limits undefined - fix the driver\n",
869 fe->dvb->num, fe->id);
872 static int dvb_frontend_check_parameters(struct dvb_frontend *fe)
874 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
879 dvb_frontend_get_frequency_limits(fe, &freq_min, &freq_max);
882 dev_warn(fe->dvb->device, "DVB: adapter %i frontend %i frequency %u out of range (%u..%u)\n",
883 fe->dvb->num, fe->id, c->frequency,
895 if ((fe->ops.info.symbol_rate_min &&
896 c->symbol_rate < fe->ops.info.symbol_rate_min) ||
897 (fe->ops.info.symbol_rate_max &&
898 c->symbol_rate > fe->ops.info.symbol_rate_max)) {
899 dev_warn(fe->dvb->device, "DVB: adapter %i frontend %i symbol rate %u out of range (%u..%u)\n",
900 fe->dvb->num, fe->id, c->symbol_rate,
901 fe->ops.info.symbol_rate_min,
902 fe->ops.info.symbol_rate_max);
912 static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
914 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
924 dev_dbg(fe->dvb->device, "%s: Clearing cache for delivery system %d\n",
1069 static void dtv_property_dump(struct dvb_frontend *fe, struct dtv_property *tvp)
1074 dev_warn(fe->dvb->device, "%s: tvp.cmd = 0x%08x undefined\n",
1079 dev_dbg(fe->dvb->device, "%s: tvp.cmd = 0x%08x (%s)\n", __func__,
1083 dev_dbg(fe->dvb->device, "%s: tvp.u.buffer.len = 0x%02x\n",
1087 dev_dbg(fe->dvb->device,
1091 dev_dbg(fe->dvb->device, "%s: tvp.u.data = 0x%08x\n", __func__,
1100 static int dtv_property_cache_sync(struct dvb_frontend *fe,
1109 dev_dbg(fe->dvb->device, "%s: Preparing QPSK req\n", __func__);
1114 dev_dbg(fe->dvb->device, "%s: Preparing QAM req\n", __func__);
1120 dev_dbg(fe->dvb->device, "%s: Preparing OFDM req\n", __func__);
1153 dev_dbg(fe->dvb->device, "%s: Preparing ATSC req\n", __func__);
1163 dev_err(fe->dvb->device,
1175 static int dtv_property_legacy_params_sync(struct dvb_frontend *fe,
1178 const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1185 dev_err(fe->dvb->device,
1190 dev_dbg(fe->dvb->device, "%s: Preparing QPSK req\n", __func__);
1195 dev_dbg(fe->dvb->device, "%s: Preparing QAM req\n", __func__);
1201 dev_dbg(fe->dvb->device, "%s: Preparing OFDM req\n", __func__);
1233 dev_dbg(fe->dvb->device, "%s: Preparing VSB req\n", __func__);
1242 * @fe: struct dvb_frontend pointer
1250 static int dtv_get_frontend(struct dvb_frontend *fe,
1255 if (fe->ops.get_frontend) {
1256 r = fe->ops.get_frontend(fe);
1260 dtv_property_legacy_params_sync(fe, p_out);
1273 static int dtv_property_process_get(struct dvb_frontend *fe,
1283 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1284 tvp->u.buffer.data[ncaps] = fe->ops.delsys[ncaps];
1408 tvp->u.data = fe->dtv_property_cache.atscmh_fic_ver;
1411 tvp->u.data = fe->dtv_property_cache.atscmh_parade_id;
1414 tvp->u.data = fe->dtv_property_cache.atscmh_nog;
1417 tvp->u.data = fe->dtv_property_cache.atscmh_tnog;
1420 tvp->u.data = fe->dtv_property_cache.atscmh_sgn;
1423 tvp->u.data = fe->dtv_property_cache.atscmh_prc;
1426 tvp->u.data = fe->dtv_property_cache.atscmh_rs_frame_mode;
1429 tvp->u.data = fe->dtv_property_cache.atscmh_rs_frame_ensemble;
1432 tvp->u.data = fe->dtv_property_cache.atscmh_rs_code_mode_pri;
1435 tvp->u.data = fe->dtv_property_cache.atscmh_rs_code_mode_sec;
1438 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_block_mode;
1441 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_a;
1444 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_b;
1447 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_c;
1450 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_d;
1483 dev_dbg(fe->dvb->device,
1490 if (fe->ops.get_property) {
1491 r = fe->ops.get_property(fe, tvp);
1496 dtv_property_dump(fe, tvp);
1501 static int dtv_set_frontend(struct dvb_frontend *fe);
1515 * @fe: struct frontend;
1523 static int emulate_delivery_system(struct dvb_frontend *fe, u32 delsys)
1526 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1534 dev_dbg(fe->dvb->device,
1554 dev_dbg(fe->dvb->device, "%s: change delivery system on cache to %d\n",
1562 * @fe: frontend struct
1577 static int dvbv5_set_delivery_system(struct dvb_frontend *fe,
1582 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1592 desired_system = fe->ops.delsys[0];
1600 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1601 if (fe->ops.delsys[ncaps] == desired_system) {
1603 dev_dbg(fe->dvb->device,
1619 dev_dbg(fe->dvb->device,
1632 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1633 if (dvbv3_type(fe->ops.delsys[ncaps]) == type)
1634 delsys = fe->ops.delsys[ncaps];
1640 dev_dbg(fe->dvb->device,
1646 dev_dbg(fe->dvb->device,
1650 return emulate_delivery_system(fe, desired_system);
1655 * @fe: frontend struct
1681 static int dvbv3_set_delivery_system(struct dvb_frontend *fe)
1685 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1689 c->delivery_system = fe->ops.delsys[0];
1696 dev_dbg(fe->dvb->device,
1707 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1708 if (dvbv3_type(fe->ops.delsys[ncaps]) != DVBV3_UNKNOWN) {
1709 delsys = fe->ops.delsys[ncaps];
1715 dev_dbg(fe->dvb->device,
1720 return emulate_delivery_system(fe, delsys);
1723 static int dtv_property_process_set(struct dvb_frontend *fe,
1728 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1731 if (fe->ops.set_property) {
1732 r = fe->ops.set_property(fe, tvp);
1743 dvb_frontend_clear_cache(fe);
1751 dev_dbg(fe->dvb->device, "%s: Finalised property cache\n",
1754 r = dtv_set_frontend(fe);
1781 r = dvbv5_set_delivery_system(fe, tvp->u.data);
1876 fe->dtv_property_cache.atscmh_parade_id = tvp->u.data;
1879 fe->dtv_property_cache.atscmh_rs_frame_ensemble = tvp->u.data;
1884 if (fe->ops.set_lna)
1885 r = fe->ops.set_lna(fe);
1901 struct dvb_frontend *fe = dvbdev->priv;
1902 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1903 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1906 dev_dbg(fe->dvb->device, "%s: (%d)\n", __func__, _IOC_NR(cmd));
1910 if (fe->exit != DVB_FE_NO_EXIT) {
1937 struct dvb_frontend *fe = dvbdev->priv;
1938 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1939 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1946 dev_dbg(fe->dvb->device, "%s:\n", __func__);
1949 dev_dbg(fe->dvb->device, "%s: properties.num = %d\n", __func__, tvps->num);
1950 dev_dbg(fe->dvb->device, "%s: properties.props = %p\n", __func__, tvps->props);
1970 err = dtv_property_process_set(fe, tvp + i, file);
1977 dev_dbg(fe->dvb->device, "%s: Property cache is full, tuning\n", __func__);
1980 dev_dbg(fe->dvb->device, "%s: properties.num = %d\n", __func__, tvps->num);
1981 dev_dbg(fe->dvb->device, "%s: properties.props = %p\n", __func__, tvps->props);
2006 err = dtv_get_frontend(fe, NULL);
2011 err = dtv_property_process_get(fe, c, tvp + i, file);
2031 static int dtv_set_frontend(struct dvb_frontend *fe)
2033 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2034 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
2038 if (dvb_frontend_check_parameters(fe) < 0)
2046 dtv_property_legacy_params_sync(fe, &fepriv->parameters_out);
2115 if (fe->ops.get_tune_settings && (fe->ops.get_tune_settings(fe, &fetunesettings) == 0)) {
2137 fepriv->step_size = fe->ops.info.frequency_stepsize * 2;
2138 fepriv->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
2159 dvb_frontend_clear_events(fe);
2160 dvb_frontend_add_event(fe, 0);
2161 dvb_frontend_wakeup(fe);
2172 struct dvb_frontend *fe = dvbdev->priv;
2173 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2174 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
2181 memcpy(info, &fe->ops.info, sizeof(struct dvb_frontend_info));
2182 dvb_frontend_get_frequency_limits(fe, &info->frequency_min, &info->frequency_max);
2209 dev_err(fe->dvb->device,
2212 fe->ops.info.type = FE_OFDM;
2214 dev_dbg(fe->dvb->device, "%s: current delivery system on cache: %d, V3 type: %d\n",
2215 __func__, c->delivery_system, fe->ops.info.type);
2236 if (fe->ops.read_status)
2237 err = fe->ops.read_status(fe, status);
2242 if (fe->ops.read_ber) {
2244 err = fe->ops.read_ber(fe, (__u32 *) parg);
2251 if (fe->ops.read_signal_strength) {
2253 err = fe->ops.read_signal_strength(fe, (__u16 *) parg);
2260 if (fe->ops.read_snr) {
2262 err = fe->ops.read_snr(fe, (__u16 *) parg);
2269 if (fe->ops.read_ucblocks) {
2271 err = fe->ops.read_ucblocks(fe, (__u32 *) parg);
2278 if (fe->ops.diseqc_reset_overload) {
2279 err = fe->ops.diseqc_reset_overload(fe);
2286 if (fe->ops.diseqc_send_master_cmd) {
2287 err = fe->ops.diseqc_send_master_cmd(fe, (struct dvb_diseqc_master_cmd*) parg);
2294 if (fe->ops.diseqc_send_burst) {
2295 err = fe->ops.diseqc_send_burst(fe, (fe_sec_mini_cmd_t) parg);
2302 if (fe->ops.set_tone) {
2303 err = fe->ops.set_tone(fe, (fe_sec_tone_mode_t) parg);
2311 if (fe->ops.set_voltage) {
2312 err = fe->ops.set_voltage(fe, (fe_sec_voltage_t) parg);
2320 if (fe->ops.dishnetwork_send_legacy_command) {
2321 err = fe->ops.dishnetwork_send_legacy_command(fe, (unsigned long) parg);
2324 } else if (fe->ops.set_voltage) {
2354 fe->ops.set_voltage(fe, SEC_VOLTAGE_18);
2362 fe->ops.set_voltage(fe, (last) ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18);
2371 __func__, fe->dvb->num);
2382 if (fe->ops.diseqc_recv_slave_reply)
2383 err = fe->ops.diseqc_recv_slave_reply(fe, (struct dvb_diseqc_slave_reply*) parg);
2387 if (fe->ops.enable_high_lnb_voltage)
2388 err = fe->ops.enable_high_lnb_voltage(fe, (long) parg);
2392 err = dvbv3_set_delivery_system(fe);
2396 err = dtv_property_cache_sync(fe, c, parg);
2399 err = dtv_set_frontend(fe);
2402 err = dvb_frontend_get_event (fe, parg, file->f_flags);
2406 err = dtv_get_frontend(fe, parg);
2422 struct dvb_frontend *fe = dvbdev->priv;
2423 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2425 dev_dbg_ratelimited(fe->dvb->device, "%s:\n", __func__);
2438 struct dvb_frontend *fe = dvbdev->priv;
2439 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2440 struct dvb_adapter *adapter = fe->dvb;
2443 dev_dbg(fe->dvb->device, "%s:\n", __func__);
2444 if (fe->exit == DVB_FE_DEVICE_REMOVED)
2486 if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) {
2487 if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0)
2508 ret = dvb_frontend_start (fe);
2523 if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl)
2524 fe->ops.ts_bus_ctrl(fe, 0);
2534 struct dvb_frontend *fe = dvbdev->priv;
2535 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2538 dev_dbg(fe->dvb->device, "%s:\n", __func__);
2549 if (fe->exit != DVB_FE_NO_EXIT)
2551 if (fe->ops.ts_bus_ctrl)
2552 fe->ops.ts_bus_ctrl(fe, 0);
2567 int dvb_frontend_suspend(struct dvb_frontend *fe)
2571 dev_dbg(fe->dvb->device, "%s: adap=%d fe=%d\n", __func__, fe->dvb->num,
2572 fe->id);
2574 if (fe->ops.tuner_ops.suspend)
2575 ret = fe->ops.tuner_ops.suspend(fe);
2576 else if (fe->ops.tuner_ops.sleep)
2577 ret = fe->ops.tuner_ops.sleep(fe);
2579 if (fe->ops.sleep)
2580 ret = fe->ops.sleep(fe);
2586 int dvb_frontend_resume(struct dvb_frontend *fe)
2588 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2591 dev_dbg(fe->dvb->device, "%s: adap=%d fe=%d\n", __func__, fe->dvb->num,
2592 fe->id);
2594 fe->exit = DVB_FE_DEVICE_RESUME;
2595 if (fe->ops.init)
2596 ret = fe->ops.init(fe);
2598 if (fe->ops.tuner_ops.resume)
2599 ret = fe->ops.tuner_ops.resume(fe);
2600 else if (fe->ops.tuner_ops.init)
2601 ret = fe->ops.tuner_ops.init(fe);
2603 fe->exit = DVB_FE_NO_EXIT;
2605 dvb_frontend_wakeup(fe);
2612 struct dvb_frontend* fe)
2628 fe->frontend_priv = kzalloc(sizeof(struct dvb_frontend_private), GFP_KERNEL);
2629 if (fe->frontend_priv == NULL) {
2633 fepriv = fe->frontend_priv;
2639 fe->dvb = dvb;
2642 dev_info(fe->dvb->device,
2644 fe->dvb->num, fe->id, fe->ops.info.name);
2646 dvb_register_device (fe->dvb, &fepriv->dvbdev, &dvbdev_template,
2647 fe, DVB_DEVICE_FRONTEND);
2654 fe->dtv_property_cache.delivery_system = fe->ops.delsys[0];
2655 dvb_frontend_clear_cache(fe);
2662 int dvb_unregister_frontend(struct dvb_frontend* fe)
2664 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2665 dev_dbg(fe->dvb->device, "%s:\n", __func__);
2668 dvb_frontend_stop (fe);
2678 /* fe is invalid now */
2686 void dvb_frontend_detach(struct dvb_frontend* fe)
2690 if (fe->ops.release_sec) {
2691 fe->ops.release_sec(fe);
2692 dvb_detach(fe->ops.release_sec);
2694 if (fe->ops.tuner_ops.release) {
2695 fe->ops.tuner_ops.release(fe);
2696 dvb_detach(fe->ops.tuner_ops.release);
2698 if (fe->ops.analog_ops.release) {
2699 fe->ops.analog_ops.release(fe);
2700 dvb_detach(fe->ops.analog_ops.release);
2702 ptr = (void*)fe->ops.release;
2704 fe->ops.release(fe);
2709 void dvb_frontend_detach(struct dvb_frontend* fe)
2711 if (fe->ops.release_sec)
2712 fe->ops.release_sec(fe);
2713 if (fe->ops.tuner_ops.release)
2714 fe->ops.tuner_ops.release(fe);
2715 if (fe->ops.analog_ops.release)
2716 fe->ops.analog_ops.release(fe);
2717 if (fe->ops.release)
2718 fe->ops.release(fe);