Lines Matching refs:fe

131 static void dvb_frontend_invoke_release(struct dvb_frontend *fe,
132 void (*release)(struct dvb_frontend *fe));
134 static void __dvb_frontend_free(struct dvb_frontend *fe)
136 struct dvb_frontend_private *fepriv = fe->frontend_priv;
141 dvb_frontend_invoke_release(fe, fe->ops.release);
148 struct dvb_frontend *fe =
151 __dvb_frontend_free(fe);
154 static void dvb_frontend_put(struct dvb_frontend *fe)
157 if (fe->ops.detach)
158 fe->ops.detach(fe);
163 if (fe->frontend_priv)
164 kref_put(&fe->refcount, dvb_frontend_free);
166 __dvb_frontend_free(fe);
169 static void dvb_frontend_get(struct dvb_frontend *fe)
171 kref_get(&fe->refcount);
174 static void dvb_frontend_wakeup(struct dvb_frontend *fe);
175 static int dtv_get_frontend(struct dvb_frontend *fe,
179 dtv_property_legacy_params_sync(struct dvb_frontend *fe,
183 static bool has_get_frontend(struct dvb_frontend *fe)
185 return fe->ops.get_frontend;
237 static void dvb_frontend_add_event(struct dvb_frontend *fe,
240 struct dvb_frontend_private *fepriv = fe->frontend_priv;
241 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
246 dev_dbg(fe->dvb->device, "%s:\n", __func__);
248 if ((status & FE_HAS_LOCK) && has_get_frontend(fe))
249 dtv_get_frontend(fe, c, &fepriv->parameters_out);
282 static int dvb_frontend_get_event(struct dvb_frontend *fe,
285 struct dvb_frontend_private *fepriv = fe->frontend_priv;
288 dev_dbg(fe->dvb->device, "%s:\n", __func__);
324 static void dvb_frontend_clear_events(struct dvb_frontend *fe)
326 struct dvb_frontend_private *fepriv = fe->frontend_priv;
334 static void dvb_frontend_init(struct dvb_frontend *fe)
336 dev_dbg(fe->dvb->device,
338 __func__, fe->dvb->num, fe->id, fe->ops.info.name);
340 if (fe->ops.init)
341 fe->ops.init(fe);
342 if (fe->ops.tuner_ops.init) {
343 if (fe->ops.i2c_gate_ctrl)
344 fe->ops.i2c_gate_ctrl(fe, 1);
345 fe->ops.tuner_ops.init(fe);
346 if (fe->ops.i2c_gate_ctrl)
347 fe->ops.i2c_gate_ctrl(fe, 0);
351 void dvb_frontend_reinitialise(struct dvb_frontend *fe)
353 struct dvb_frontend_private *fepriv = fe->frontend_priv;
356 dvb_frontend_wakeup(fe);
363 struct dvb_frontend *fe = fepriv->dvbdev->priv;
365 dev_dbg(fe->dvb->device, "%s:\n", __func__);
382 * @fe: The frontend concerned.
388 static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wrapped)
393 struct dvb_frontend_private *fepriv = fe->frontend_priv;
394 struct dtv_frontend_properties *c = &fe->dtv_property_cache, tmp;
399 autoinversion = ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
460 dev_dbg(fe->dvb->device,
471 if (fe->ops.set_frontend)
472 fe_set_err = fe->ops.set_frontend(fe);
486 static void dvb_frontend_swzigzag(struct dvb_frontend *fe)
490 struct dvb_frontend_private *fepriv = fe->frontend_priv;
491 struct dtv_frontend_properties *c = &fe->dtv_property_cache, tmp;
494 dev_warn_once(fe->dvb->device,
508 if (fe->ops.set_frontend)
509 retval = fe->ops.set_frontend(fe);
525 if (fe->ops.read_status)
526 fe->ops.read_status(fe, &s);
528 dvb_frontend_add_event(fe, s);
539 if ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
563 (fe->ops.info.caps & FE_CAN_RECOVER) && (fepriv->max_drift == 0)) {
592 retval = dvb_frontend_swzigzag_autotune(fe,
620 dvb_frontend_swzigzag_autotune(fe, 0);
624 static int dvb_frontend_is_exiting(struct dvb_frontend *fe)
626 struct dvb_frontend_private *fepriv = fe->frontend_priv;
628 if (fe->exit != DVB_FE_NO_EXIT)
639 static int dvb_frontend_should_wakeup(struct dvb_frontend *fe)
641 struct dvb_frontend_private *fepriv = fe->frontend_priv;
647 return dvb_frontend_is_exiting(fe);
650 static void dvb_frontend_wakeup(struct dvb_frontend *fe)
652 struct dvb_frontend_private *fepriv = fe->frontend_priv;
660 struct dvb_frontend *fe = data;
661 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
662 struct dvb_frontend_private *fepriv = fe->frontend_priv;
668 dev_dbg(fe->dvb->device, "%s:\n", __func__);
677 dvb_frontend_init(fe);
683 dvb_frontend_should_wakeup(fe) ||
687 if (kthread_should_stop() || dvb_frontend_is_exiting(fe)) {
691 fe->exit = DVB_FE_NORMAL_EXIT;
699 dvb_frontend_init(fe);
700 if (fe->ops.set_tone && fepriv->tone != -1)
701 fe->ops.set_tone(fe, fepriv->tone);
702 if (fe->ops.set_voltage && fepriv->voltage != -1)
703 fe->ops.set_voltage(fe, fepriv->voltage);
708 if (fe->ops.get_frontend_algo) {
709 algo = fe->ops.get_frontend_algo(fe);
712 dev_dbg(fe->dvb->device, "%s: Frontend ALGO = DVBFE_ALGO_HW\n", __func__);
715 dev_dbg(fe->dvb->device, "%s: Retune requested, FESTATE_RETUNE\n", __func__);
722 if (fe->ops.tune)
723 fe->ops.tune(fe, re_tune, fepriv->tune_mode_flags, &fepriv->delay, &s);
726 dev_dbg(fe->dvb->device, "%s: state changed, adding current state\n", __func__);
727 dvb_frontend_add_event(fe, s);
732 dev_dbg(fe->dvb->device, "%s: Frontend ALGO = DVBFE_ALGO_SW\n", __func__);
733 dvb_frontend_swzigzag(fe);
736 dev_dbg(fe->dvb->device, "%s: Frontend ALGO = DVBFE_ALGO_CUSTOM, state=%d\n", __func__, fepriv->state);
738 dev_dbg(fe->dvb->device, "%s: Retune requested, FESTAT_RETUNE\n", __func__);
746 if (fe->ops.search) {
747 fepriv->algo_status = fe->ops.search(fe);
760 dtv_property_legacy_params_sync(fe, c, &fepriv->parameters_out);
761 fe->ops.read_status(fe, &s);
763 dvb_frontend_add_event(fe, s); /* update event list */
774 dev_dbg(fe->dvb->device, "%s: UNDEFINED ALGO !\n", __func__);
778 dvb_frontend_swzigzag(fe);
783 if (fe->ops.set_voltage)
784 fe->ops.set_voltage(fe, SEC_VOLTAGE_OFF);
785 if (fe->ops.tuner_ops.sleep) {
786 if (fe->ops.i2c_gate_ctrl)
787 fe->ops.i2c_gate_ctrl(fe, 1);
788 fe->ops.tuner_ops.sleep(fe);
789 if (fe->ops.i2c_gate_ctrl)
790 fe->ops.i2c_gate_ctrl(fe, 0);
792 if (fe->ops.sleep)
793 fe->ops.sleep(fe);
798 fe->exit = DVB_FE_DEVICE_REMOVED;
800 fe->exit = DVB_FE_NO_EXIT;
805 dvb_frontend_wakeup(fe);
809 static void dvb_frontend_stop(struct dvb_frontend *fe)
811 struct dvb_frontend_private *fepriv = fe->frontend_priv;
813 dev_dbg(fe->dvb->device, "%s:\n", __func__);
815 if (fe->exit != DVB_FE_DEVICE_REMOVED)
816 fe->exit = DVB_FE_NORMAL_EXIT;
829 dev_warn(fe->dvb->device,
856 static int dvb_frontend_start(struct dvb_frontend *fe)
859 struct dvb_frontend_private *fepriv = fe->frontend_priv;
862 dev_dbg(fe->dvb->device, "%s:\n", __func__);
865 if (fe->exit == DVB_FE_NO_EXIT)
868 dvb_frontend_stop(fe);
877 fe->exit = DVB_FE_NO_EXIT;
881 fe_thread = kthread_run(dvb_frontend_thread, fe,
882 "kdvb-ad-%i-fe-%i", fe->dvb->num, fe->id);
885 dev_warn(fe->dvb->device,
895 static void dvb_frontend_get_frequency_limits(struct dvb_frontend *fe,
899 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
900 u32 tuner_min = fe->ops.tuner_ops.info.frequency_min_hz;
901 u32 tuner_max = fe->ops.tuner_ops.info.frequency_max_hz;
902 u32 frontend_min = fe->ops.info.frequency_min_hz;
903 u32 frontend_max = fe->ops.info.frequency_max_hz;
915 dev_warn(fe->dvb->device,
917 fe->dvb->num, fe->id);
919 dev_dbg(fe->dvb->device, "frequency interval: tuner: %u...%u, frontend: %u...%u",
932 *tolerance = fe->ops.info.frequency_tolerance_hz / kHz;
937 *tolerance = fe->ops.info.frequency_tolerance_hz;
942 static u32 dvb_frontend_get_stepsize(struct dvb_frontend *fe)
944 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
945 u32 fe_step = fe->ops.info.frequency_stepsize_hz;
946 u32 tuner_step = fe->ops.tuner_ops.info.frequency_step_hz;
964 static int dvb_frontend_check_parameters(struct dvb_frontend *fe)
966 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
971 dvb_frontend_get_frequency_limits(fe, &freq_min, &freq_max, NULL);
974 dev_warn(fe->dvb->device, "DVB: adapter %i frontend %i frequency %u out of range (%u..%u)\n",
975 fe->dvb->num, fe->id, c->frequency,
988 if ((fe->ops.info.symbol_rate_min &&
989 c->symbol_rate < fe->ops.info.symbol_rate_min) ||
990 (fe->ops.info.symbol_rate_max &&
991 c->symbol_rate > fe->ops.info.symbol_rate_max)) {
992 dev_warn(fe->dvb->device, "DVB: adapter %i frontend %i symbol rate %u out of range (%u..%u)\n",
993 fe->dvb->num, fe->id, c->symbol_rate,
994 fe->ops.info.symbol_rate_min,
995 fe->ops.info.symbol_rate_max);
1006 static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
1008 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1016 dev_dbg(fe->dvb->device, "%s: Clearing cache for delivery system %d\n",
1172 static int dtv_property_cache_sync(struct dvb_frontend *fe,
1181 dev_dbg(fe->dvb->device, "%s: Preparing QPSK req\n", __func__);
1186 dev_dbg(fe->dvb->device, "%s: Preparing QAM req\n", __func__);
1192 dev_dbg(fe->dvb->device, "%s: Preparing OFDM req\n", __func__);
1225 dev_dbg(fe->dvb->device, "%s: Preparing ATSC req\n", __func__);
1235 dev_err(fe->dvb->device,
1248 dtv_property_legacy_params_sync(struct dvb_frontend *fe,
1257 dev_err(fe->dvb->device,
1262 dev_dbg(fe->dvb->device, "%s: Preparing QPSK req\n", __func__);
1267 dev_dbg(fe->dvb->device, "%s: Preparing QAM req\n", __func__);
1273 dev_dbg(fe->dvb->device, "%s: Preparing OFDM req\n", __func__);
1305 dev_dbg(fe->dvb->device, "%s: Preparing VSB req\n", __func__);
1314 * @fe: struct dvb_frontend pointer
1322 static int dtv_get_frontend(struct dvb_frontend *fe,
1328 if (fe->ops.get_frontend) {
1329 r = fe->ops.get_frontend(fe, c);
1333 dtv_property_legacy_params_sync(fe, c, p_out);
1344 static int dtv_property_process_get(struct dvb_frontend *fe,
1355 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1356 tvp->u.buffer.data[ncaps] = fe->ops.delsys[ncaps];
1486 tvp->u.data = fe->dtv_property_cache.atscmh_fic_ver;
1489 tvp->u.data = fe->dtv_property_cache.atscmh_parade_id;
1492 tvp->u.data = fe->dtv_property_cache.atscmh_nog;
1495 tvp->u.data = fe->dtv_property_cache.atscmh_tnog;
1498 tvp->u.data = fe->dtv_property_cache.atscmh_sgn;
1501 tvp->u.data = fe->dtv_property_cache.atscmh_prc;
1504 tvp->u.data = fe->dtv_property_cache.atscmh_rs_frame_mode;
1507 tvp->u.data = fe->dtv_property_cache.atscmh_rs_frame_ensemble;
1510 tvp->u.data = fe->dtv_property_cache.atscmh_rs_code_mode_pri;
1513 tvp->u.data = fe->dtv_property_cache.atscmh_rs_code_mode_sec;
1516 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_block_mode;
1519 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_a;
1522 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_b;
1525 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_c;
1528 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_d;
1585 dev_dbg(fe->dvb->device,
1594 dev_dbg(fe->dvb->device,
1602 static int dtv_set_frontend(struct dvb_frontend *fe);
1612 * @fe: struct frontend;
1620 static int emulate_delivery_system(struct dvb_frontend *fe, u32 delsys)
1623 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1631 dev_dbg(fe->dvb->device,
1651 dev_dbg(fe->dvb->device, "%s: change delivery system on cache to %d\n",
1659 * @fe: frontend struct
1674 static int dvbv5_set_delivery_system(struct dvb_frontend *fe,
1679 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1689 desired_system = fe->ops.delsys[0];
1697 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1698 if (fe->ops.delsys[ncaps] == desired_system) {
1700 dev_dbg(fe->dvb->device,
1716 dev_dbg(fe->dvb->device,
1729 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1730 if (dvbv3_type(fe->ops.delsys[ncaps]) == type)
1731 delsys = fe->ops.delsys[ncaps];
1737 dev_dbg(fe->dvb->device,
1743 dev_dbg(fe->dvb->device,
1747 return emulate_delivery_system(fe, desired_system);
1752 * @fe: frontend struct
1778 static int dvbv3_set_delivery_system(struct dvb_frontend *fe)
1782 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1786 c->delivery_system = fe->ops.delsys[0];
1793 dev_dbg(fe->dvb->device,
1804 while (ncaps < MAX_DELSYS && fe->ops.delsys[ncaps]) {
1805 if (dvbv3_type(fe->ops.delsys[ncaps]) != DVBV3_UNKNOWN) {
1806 delsys = fe->ops.delsys[ncaps];
1812 dev_dbg(fe->dvb->device,
1817 return emulate_delivery_system(fe, delsys);
1820 static void prepare_tuning_algo_parameters(struct dvb_frontend *fe)
1822 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1823 struct dvb_frontend_private *fepriv = fe->frontend_priv;
1827 if (fe->ops.get_tune_settings && (fe->ops.get_tune_settings(fe, &fetunesettings) == 0)) {
1850 fepriv->step_size = dvb_frontend_get_stepsize(fe) * 2;
1870 * @fe: Pointer to &struct dvb_frontend
1882 static int dtv_property_process_set(struct dvb_frontend *fe,
1887 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1891 dev_warn(fe->dvb->device, "%s: SET cmd 0x%08x undefined\n",
1894 dev_dbg(fe->dvb->device,
1903 dvb_frontend_clear_cache(fe);
1910 dev_dbg(fe->dvb->device,
1914 r = dtv_set_frontend(fe);
1941 r = dvbv5_set_delivery_system(fe, data);
2041 fe->dtv_property_cache.atscmh_parade_id = data;
2044 fe->dtv_property_cache.atscmh_rs_frame_ensemble = data;
2049 if (fe->ops.set_lna)
2050 r = fe->ops.set_lna(fe);
2066 struct dvb_frontend *fe = dvbdev->priv;
2067 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2070 dev_dbg(fe->dvb->device, "%s: (%d)\n", __func__, _IOC_NR(cmd));
2074 if (fe->exit != DVB_FE_NO_EXIT) {
2146 struct dvb_frontend *fe = dvbdev->priv;
2147 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2172 err = dtv_property_process_set(fe, file,
2184 struct dtv_frontend_properties getp = fe->dtv_property_cache;
2210 err = dtv_get_frontend(fe, &getp, NULL);
2218 fe, &getp, (struct dtv_property *)(tvp + i), file);
2240 struct dvb_frontend *fe = dvbdev->priv;
2241 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2258 static int dtv_set_frontend(struct dvb_frontend *fe)
2260 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2261 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
2264 if (dvb_frontend_check_parameters(fe) < 0)
2272 dtv_property_legacy_params_sync(fe, c, &fepriv->parameters_out);
2342 prepare_tuning_algo_parameters(fe);
2349 dvb_frontend_clear_events(fe);
2350 dvb_frontend_add_event(fe, 0);
2351 dvb_frontend_wakeup(fe);
2357 static int dvb_get_property(struct dvb_frontend *fe, struct file *file,
2360 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2365 memcpy(&getp, &fe->dtv_property_cache, sizeof(getp));
2367 dev_dbg(fe->dvb->device, "%s: properties.num = %d\n",
2369 dev_dbg(fe->dvb->device, "%s: properties.props = %p\n",
2391 err = dtv_get_frontend(fe, &getp, NULL);
2396 err = dtv_property_process_get(fe, &getp,
2414 static int dvb_get_frontend(struct dvb_frontend *fe,
2425 memcpy(&getp, &fe->dtv_property_cache, sizeof(getp));
2427 return dtv_get_frontend(fe, &getp, p_out);
2434 struct dvb_frontend *fe = dvbdev->priv;
2435 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2436 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
2439 dev_dbg(fe->dvb->device, "%s:\n", __func__);
2446 dev_dbg(fe->dvb->device, "%s: properties.num = %d\n",
2448 dev_dbg(fe->dvb->device, "%s: properties.props = %p\n",
2464 err = dtv_property_process_set(fe, file,
2477 err = dvb_get_property(fe, file, parg);
2484 strscpy(info->name, fe->ops.info.name, sizeof(info->name));
2485 info->symbol_rate_min = fe->ops.info.symbol_rate_min;
2486 info->symbol_rate_max = fe->ops.info.symbol_rate_max;
2487 info->symbol_rate_tolerance = fe->ops.info.symbol_rate_tolerance;
2488 info->caps = fe->ops.info.caps;
2489 info->frequency_stepsize = dvb_frontend_get_stepsize(fe);
2490 dvb_frontend_get_frequency_limits(fe, &info->frequency_min,
2519 dev_err(fe->dvb->device,
2524 dev_dbg(fe->dvb->device, "%s: current delivery system on cache: %d, V3 type: %d\n",
2546 if (fe->ops.read_status)
2547 err = fe->ops.read_status(fe, status);
2552 if (fe->ops.diseqc_reset_overload) {
2553 err = fe->ops.diseqc_reset_overload(fe);
2560 if (fe->ops.diseqc_send_master_cmd) {
2567 err = fe->ops.diseqc_send_master_cmd(fe, cmd);
2574 if (fe->ops.diseqc_send_burst) {
2575 err = fe->ops.diseqc_send_burst(fe, (long)parg);
2582 if (fe->ops.set_tone) {
2584 err = fe->ops.set_tone(fe, fepriv->tone);
2591 if (fe->ops.set_voltage) {
2593 err = fe->ops.set_voltage(fe, fepriv->voltage);
2600 if (fe->ops.diseqc_recv_slave_reply)
2601 err = fe->ops.diseqc_recv_slave_reply(fe, parg);
2605 if (fe->ops.enable_high_lnb_voltage)
2606 err = fe->ops.enable_high_lnb_voltage(fe, (long)parg);
2616 if (fe->ops.dishnetwork_send_legacy_command) {
2617 err = fe->ops.dishnetwork_send_legacy_command(fe,
2621 } else if (fe->ops.set_voltage) {
2653 fe->ops.set_voltage(fe, SEC_VOLTAGE_18);
2661 fe->ops.set_voltage(fe, (last) ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18);
2670 fe->dvb->num);
2684 if (fe->ops.read_ber) {
2686 err = fe->ops.read_ber(fe, parg);
2693 if (fe->ops.read_signal_strength) {
2695 err = fe->ops.read_signal_strength(fe, parg);
2702 if (fe->ops.read_snr) {
2704 err = fe->ops.read_snr(fe, parg);
2711 if (fe->ops.read_ucblocks) {
2713 err = fe->ops.read_ucblocks(fe, parg);
2722 err = dvbv3_set_delivery_system(fe);
2726 err = dtv_property_cache_sync(fe, c, parg);
2729 err = dtv_set_frontend(fe);
2733 err = dvb_frontend_get_event(fe, parg, file->f_flags);
2737 err = dvb_get_frontend(fe, parg);
2750 struct dvb_frontend *fe = dvbdev->priv;
2751 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2753 dev_dbg_ratelimited(fe->dvb->device, "%s:\n", __func__);
2766 struct dvb_frontend *fe = dvbdev->priv;
2767 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2768 struct dvb_adapter *adapter = fe->dvb;
2771 dev_dbg(fe->dvb->device, "%s:\n", __func__);
2772 if (fe->exit == DVB_FE_DEVICE_REMOVED)
2824 if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) {
2825 if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0)
2847 mutex_lock(&fe->dvb->mdev_lock);
2848 if (fe->dvb->mdev) {
2849 mutex_lock(&fe->dvb->mdev->graph_mutex);
2850 if (fe->dvb->mdev->enable_source)
2851 ret = fe->dvb->mdev->enable_source(
2854 mutex_unlock(&fe->dvb->mdev->graph_mutex);
2856 mutex_unlock(&fe->dvb->mdev_lock);
2857 dev_err(fe->dvb->device,
2862 mutex_unlock(&fe->dvb->mdev_lock);
2864 ret = dvb_frontend_start(fe);
2872 dvb_frontend_get(fe);
2880 mutex_lock(&fe->dvb->mdev_lock);
2881 if (fe->dvb->mdev) {
2882 mutex_lock(&fe->dvb->mdev->graph_mutex);
2883 if (fe->dvb->mdev->disable_source)
2884 fe->dvb->mdev->disable_source(dvbdev->entity);
2885 mutex_unlock(&fe->dvb->mdev->graph_mutex);
2887 mutex_unlock(&fe->dvb->mdev_lock);
2892 if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl)
2893 fe->ops.ts_bus_ctrl(fe, 0);
2903 struct dvb_frontend *fe = dvbdev->priv;
2904 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2907 dev_dbg(fe->dvb->device, "%s:\n", __func__);
2919 mutex_lock(&fe->dvb->mdev_lock);
2920 if (fe->dvb->mdev) {
2921 mutex_lock(&fe->dvb->mdev->graph_mutex);
2922 if (fe->dvb->mdev->disable_source)
2923 fe->dvb->mdev->disable_source(dvbdev->entity);
2924 mutex_unlock(&fe->dvb->mdev->graph_mutex);
2926 mutex_unlock(&fe->dvb->mdev_lock);
2928 if (fe->exit != DVB_FE_NO_EXIT)
2930 if (fe->ops.ts_bus_ctrl)
2931 fe->ops.ts_bus_ctrl(fe, 0);
2934 dvb_frontend_put(fe);
2951 int dvb_frontend_suspend(struct dvb_frontend *fe)
2955 dev_dbg(fe->dvb->device, "%s: adap=%d fe=%d\n", __func__, fe->dvb->num,
2956 fe->id);
2958 if (fe->ops.tuner_ops.suspend)
2959 ret = fe->ops.tuner_ops.suspend(fe);
2960 else if (fe->ops.tuner_ops.sleep)
2961 ret = fe->ops.tuner_ops.sleep(fe);
2963 if (fe->ops.suspend)
2964 ret = fe->ops.suspend(fe);
2965 else if (fe->ops.sleep)
2966 ret = fe->ops.sleep(fe);
2972 int dvb_frontend_resume(struct dvb_frontend *fe)
2974 struct dvb_frontend_private *fepriv = fe->frontend_priv;
2977 dev_dbg(fe->dvb->device, "%s: adap=%d fe=%d\n", __func__, fe->dvb->num,
2978 fe->id);
2980 fe->exit = DVB_FE_DEVICE_RESUME;
2981 if (fe->ops.resume)
2982 ret = fe->ops.resume(fe);
2983 else if (fe->ops.init)
2984 ret = fe->ops.init(fe);
2986 if (fe->ops.tuner_ops.resume)
2987 ret = fe->ops.tuner_ops.resume(fe);
2988 else if (fe->ops.tuner_ops.init)
2989 ret = fe->ops.tuner_ops.init(fe);
2991 if (fe->ops.set_tone && fepriv->tone != -1)
2992 fe->ops.set_tone(fe, fepriv->tone);
2993 if (fe->ops.set_voltage && fepriv->voltage != -1)
2994 fe->ops.set_voltage(fe, fepriv->voltage);
2996 fe->exit = DVB_FE_NO_EXIT;
2998 dvb_frontend_wakeup(fe);
3005 struct dvb_frontend *fe)
3014 .name = fe->ops.info.name,
3024 fe->frontend_priv = kzalloc(sizeof(struct dvb_frontend_private), GFP_KERNEL);
3025 if (!fe->frontend_priv) {
3029 fepriv = fe->frontend_priv;
3031 kref_init(&fe->refcount);
3038 dvb_frontend_get(fe);
3044 fe->dvb = dvb;
3047 dev_info(fe->dvb->device,
3049 fe->dvb->num, fe->id, fe->ops.info.name);
3051 ret = dvb_register_device(fe->dvb, &fepriv->dvbdev, &dvbdev_template,
3052 fe, DVB_DEVICE_FRONTEND, 0);
3054 dvb_frontend_put(fe);
3064 fe->dtv_property_cache.delivery_system = fe->ops.delsys[0];
3065 dvb_frontend_clear_cache(fe);
3072 int dvb_unregister_frontend(struct dvb_frontend *fe)
3074 struct dvb_frontend_private *fepriv = fe->frontend_priv;
3076 dev_dbg(fe->dvb->device, "%s:\n", __func__);
3079 dvb_frontend_stop(fe);
3082 /* fe is invalid now */
3084 dvb_frontend_put(fe);
3089 static void dvb_frontend_invoke_release(struct dvb_frontend *fe,
3090 void (*release)(struct dvb_frontend *fe))
3093 release(fe);
3100 void dvb_frontend_detach(struct dvb_frontend *fe)
3102 dvb_frontend_invoke_release(fe, fe->ops.release_sec);
3103 dvb_frontend_invoke_release(fe, fe->ops.tuner_ops.release);
3104 dvb_frontend_invoke_release(fe, fe->ops.analog_ops.release);
3105 dvb_frontend_put(fe);