|
@@ -24,7 +24,6 @@
|
|
|
|
|
|
#include "rtl2830.h"
|
|
|
#include "rtl2832.h"
|
|
|
-#include "rtl2832_sdr.h"
|
|
|
|
|
|
#include "qt1010.h"
|
|
|
#include "mt2060.h"
|
|
@@ -36,6 +35,45 @@
|
|
|
#include "tua9001.h"
|
|
|
#include "r820t.h"
|
|
|
|
|
|
+/*
|
|
|
+ * RTL2832_SDR module is in staging. That logic is added in order to avoid any
|
|
|
+ * hard dependency to drivers/staging/ directory as we want compile mainline
|
|
|
+ * driver even whole staging directory is missing.
|
|
|
+ */
|
|
|
+#include <media/v4l2-subdev.h>
|
|
|
+
|
|
|
+#if IS_ENABLED(CONFIG_DVB_RTL2832_SDR)
|
|
|
+struct dvb_frontend *rtl2832_sdr_attach(struct dvb_frontend *fe,
|
|
|
+ struct i2c_adapter *i2c, const struct rtl2832_config *cfg,
|
|
|
+ struct v4l2_subdev *sd);
|
|
|
+#else
|
|
|
+static inline struct dvb_frontend *rtl2832_sdr_attach(struct dvb_frontend *fe,
|
|
|
+ struct i2c_adapter *i2c, const struct rtl2832_config *cfg,
|
|
|
+ struct v4l2_subdev *sd)
|
|
|
+{
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifdef CONFIG_MEDIA_ATTACH
|
|
|
+#define dvb_attach_sdr(FUNCTION, ARGS...) ({ \
|
|
|
+ void *__r = NULL; \
|
|
|
+ typeof(&FUNCTION) __a = symbol_request(FUNCTION); \
|
|
|
+ if (__a) { \
|
|
|
+ __r = (void *) __a(ARGS); \
|
|
|
+ if (__r == NULL) \
|
|
|
+ symbol_put(FUNCTION); \
|
|
|
+ } \
|
|
|
+ __r; \
|
|
|
+})
|
|
|
+
|
|
|
+#else
|
|
|
+#define dvb_attach_sdr(FUNCTION, ARGS...) ({ \
|
|
|
+ FUNCTION(ARGS); \
|
|
|
+})
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
static int rtl28xxu_disable_rc;
|
|
|
module_param_named(disable_rc, rtl28xxu_disable_rc, int, 0644);
|
|
|
MODULE_PARM_DESC(disable_rc, "disable RTL2832U remote controller");
|
|
@@ -908,7 +946,7 @@ static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
|
|
|
adap->fe[0]->ops.tuner_ops.get_rf_strength;
|
|
|
|
|
|
/* attach SDR */
|
|
|
- dvb_attach(rtl2832_sdr_attach, adap->fe[0], &d->i2c_adap,
|
|
|
+ dvb_attach_sdr(rtl2832_sdr_attach, adap->fe[0], &d->i2c_adap,
|
|
|
&rtl28xxu_rtl2832_fc0012_config, NULL);
|
|
|
break;
|
|
|
case TUNER_RTL2832_FC0013:
|
|
@@ -920,7 +958,7 @@ static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
|
|
|
adap->fe[0]->ops.tuner_ops.get_rf_strength;
|
|
|
|
|
|
/* attach SDR */
|
|
|
- dvb_attach(rtl2832_sdr_attach, adap->fe[0], &d->i2c_adap,
|
|
|
+ dvb_attach_sdr(rtl2832_sdr_attach, adap->fe[0], &d->i2c_adap,
|
|
|
&rtl28xxu_rtl2832_fc0013_config, NULL);
|
|
|
break;
|
|
|
case TUNER_RTL2832_E4000: {
|
|
@@ -951,7 +989,7 @@ static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
|
|
|
i2c_set_adapdata(i2c_adap_internal, d);
|
|
|
|
|
|
/* attach SDR */
|
|
|
- dvb_attach(rtl2832_sdr_attach, adap->fe[0],
|
|
|
+ dvb_attach_sdr(rtl2832_sdr_attach, adap->fe[0],
|
|
|
i2c_adap_internal,
|
|
|
&rtl28xxu_rtl2832_e4000_config, sd);
|
|
|
}
|
|
@@ -982,7 +1020,7 @@ static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
|
|
|
adap->fe[0]->ops.tuner_ops.get_rf_strength;
|
|
|
|
|
|
/* attach SDR */
|
|
|
- dvb_attach(rtl2832_sdr_attach, adap->fe[0], &d->i2c_adap,
|
|
|
+ dvb_attach_sdr(rtl2832_sdr_attach, adap->fe[0], &d->i2c_adap,
|
|
|
&rtl28xxu_rtl2832_r820t_config, NULL);
|
|
|
break;
|
|
|
case TUNER_RTL2832_R828D:
|