Commit f8731f4d authored by Olivier Grenie's avatar Olivier Grenie Committed by Mauro Carvalho Chehab

V4L/DVB (13049): dib8000: SNR in 10th of dB

dib7000p/dib8000: added pid filtering

dib8000: the SNR is in 10th of dB (not in dB)
dib7000p and dib8000: added the pid filtering. This feature is enabled by module option (dvb-usb module).
Signed-off-by: default avatarOlivier Grenie <olivier.grenie@dibcom.fr>
Signed-off-by: default avatarPatrick Boettcher <pboettcher@kernellabs.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 8171c205
...@@ -1252,6 +1252,16 @@ static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap) ...@@ -1252,6 +1252,16 @@ static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
return 0; return 0;
} }
static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
{
return dib7000p_pid_filter(adapter->fe, index, pid, onoff);
}
static int stk70x0p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
{
return dib7000p_pid_filter_ctrl(adapter->fe, onoff);
}
static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = { static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
60000, 15000, // internal, sampling 60000, 15000, // internal, sampling
1, 20, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass 1, 20, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
...@@ -1543,6 +1553,15 @@ static int dib807x_tuner_attach(struct dvb_usb_adapter *adap) ...@@ -1543,6 +1553,15 @@ static int dib807x_tuner_attach(struct dvb_usb_adapter *adap)
return 0; return 0;
} }
static int stk807x_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
{
return dib8000_pid_filter(adapter->fe, index, pid, onoff);
}
static int stk807x_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
{
return dib8000_pid_filter_ctrl(adapter->fe, onoff);
}
/* STK807x */ /* STK807x */
static int stk807x_frontend_attach(struct dvb_usb_adapter *adap) static int stk807x_frontend_attach(struct dvb_usb_adapter *adap)
...@@ -1938,6 +1957,10 @@ struct dvb_usb_device_properties dib0700_devices[] = { ...@@ -1938,6 +1957,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
.num_adapters = 1, .num_adapters = 1,
.adapter = { .adapter = {
{ {
.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
.pid_filter_count = 32,
.pid_filter = stk70x0p_pid_filter,
.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
.frontend_attach = stk7700p_frontend_attach, .frontend_attach = stk7700p_frontend_attach,
.tuner_attach = stk7700p_tuner_attach, .tuner_attach = stk7700p_tuner_attach,
...@@ -2019,11 +2042,19 @@ struct dvb_usb_device_properties dib0700_devices[] = { ...@@ -2019,11 +2042,19 @@ struct dvb_usb_device_properties dib0700_devices[] = {
.num_adapters = 2, .num_adapters = 2,
.adapter = { .adapter = {
{ {
.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
.pid_filter_count = 32,
.pid_filter = stk70x0p_pid_filter,
.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
.frontend_attach = stk7700d_frontend_attach, .frontend_attach = stk7700d_frontend_attach,
.tuner_attach = stk7700d_tuner_attach, .tuner_attach = stk7700d_tuner_attach,
DIB0700_DEFAULT_STREAMING_CONFIG(0x02), DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
}, { }, {
.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
.pid_filter_count = 32,
.pid_filter = stk70x0p_pid_filter,
.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
.frontend_attach = stk7700d_frontend_attach, .frontend_attach = stk7700d_frontend_attach,
.tuner_attach = stk7700d_tuner_attach, .tuner_attach = stk7700d_tuner_attach,
...@@ -2066,6 +2097,10 @@ struct dvb_usb_device_properties dib0700_devices[] = { ...@@ -2066,6 +2097,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
.num_adapters = 1, .num_adapters = 1,
.adapter = { .adapter = {
{ {
.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
.pid_filter_count = 32,
.pid_filter = stk70x0p_pid_filter,
.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
.frontend_attach = stk7700P2_frontend_attach, .frontend_attach = stk7700P2_frontend_attach,
.tuner_attach = stk7700d_tuner_attach, .tuner_attach = stk7700d_tuner_attach,
...@@ -2098,6 +2133,14 @@ struct dvb_usb_device_properties dib0700_devices[] = { ...@@ -2098,6 +2133,14 @@ struct dvb_usb_device_properties dib0700_devices[] = {
.num_adapters = 1, .num_adapters = 1,
.adapter = { .adapter = {
{ {
.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
.pid_filter_count = 32,
.pid_filter = stk70x0p_pid_filter,
.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
.pid_filter_count = 32,
.pid_filter = stk70x0p_pid_filter,
.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
.frontend_attach = stk7070p_frontend_attach, .frontend_attach = stk7070p_frontend_attach,
.tuner_attach = dib7070p_tuner_attach, .tuner_attach = dib7070p_tuner_attach,
...@@ -2200,6 +2243,10 @@ struct dvb_usb_device_properties dib0700_devices[] = { ...@@ -2200,6 +2243,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
.num_adapters = 2, .num_adapters = 2,
.adapter = { .adapter = {
{ {
.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
.pid_filter_count = 32,
.pid_filter = stk70x0p_pid_filter,
.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
.frontend_attach = stk7070pd_frontend_attach0, .frontend_attach = stk7070pd_frontend_attach0,
.tuner_attach = dib7070p_tuner_attach, .tuner_attach = dib7070p_tuner_attach,
...@@ -2207,6 +2254,10 @@ struct dvb_usb_device_properties dib0700_devices[] = { ...@@ -2207,6 +2254,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
.size_of_priv = sizeof(struct dib0700_adapter_state), .size_of_priv = sizeof(struct dib0700_adapter_state),
}, { }, {
.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
.pid_filter_count = 32,
.pid_filter = stk70x0p_pid_filter,
.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
.frontend_attach = stk7070pd_frontend_attach1, .frontend_attach = stk7070pd_frontend_attach1,
.tuner_attach = dib7070p_tuner_attach, .tuner_attach = dib7070p_tuner_attach,
...@@ -2253,6 +2304,10 @@ struct dvb_usb_device_properties dib0700_devices[] = { ...@@ -2253,6 +2304,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
.num_adapters = 1, .num_adapters = 1,
.adapter = { .adapter = {
{ {
.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
.pid_filter_count = 32,
.pid_filter = stk70x0p_pid_filter,
.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
.frontend_attach = stk7700ph_frontend_attach, .frontend_attach = stk7700ph_frontend_attach,
.tuner_attach = stk7700ph_tuner_attach, .tuner_attach = stk7700ph_tuner_attach,
...@@ -2365,6 +2420,10 @@ struct dvb_usb_device_properties dib0700_devices[] = { ...@@ -2365,6 +2420,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
.num_adapters = 1, .num_adapters = 1,
.adapter = { .adapter = {
{ {
.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
.pid_filter_count = 32,
.pid_filter = stk70x0p_pid_filter,
.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
.frontend_attach = stk7070p_frontend_attach, .frontend_attach = stk7070p_frontend_attach,
.tuner_attach = dib7770p_tuner_attach, .tuner_attach = dib7770p_tuner_attach,
...@@ -2396,6 +2455,10 @@ struct dvb_usb_device_properties dib0700_devices[] = { ...@@ -2396,6 +2455,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
.num_adapters = 1, .num_adapters = 1,
.adapter = { .adapter = {
{ {
.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
.pid_filter_count = 32,
.pid_filter = stk807x_pid_filter,
.pid_filter_ctrl = stk807x_pid_filter_ctrl,
.frontend_attach = stk807x_frontend_attach, .frontend_attach = stk807x_frontend_attach,
.tuner_attach = dib807x_tuner_attach, .tuner_attach = dib807x_tuner_attach,
...@@ -2427,6 +2490,10 @@ struct dvb_usb_device_properties dib0700_devices[] = { ...@@ -2427,6 +2490,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
.num_adapters = 2, .num_adapters = 2,
.adapter = { .adapter = {
{ {
.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
.pid_filter_count = 32,
.pid_filter = stk807x_pid_filter,
.pid_filter_ctrl = stk807x_pid_filter_ctrl,
.frontend_attach = stk807xpvr_frontend_attach0, .frontend_attach = stk807xpvr_frontend_attach0,
.tuner_attach = dib807x_tuner_attach, .tuner_attach = dib807x_tuner_attach,
...@@ -2436,6 +2503,10 @@ struct dvb_usb_device_properties dib0700_devices[] = { ...@@ -2436,6 +2503,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
sizeof(struct dib0700_adapter_state), sizeof(struct dib0700_adapter_state),
}, },
{ {
.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
.pid_filter_count = 32,
.pid_filter = stk807x_pid_filter,
.pid_filter_ctrl = stk807x_pid_filter_ctrl,
.frontend_attach = stk807xpvr_frontend_attach1, .frontend_attach = stk807xpvr_frontend_attach1,
.tuner_attach = dib807x_tuner_attach, .tuner_attach = dib807x_tuner_attach,
......
...@@ -1302,6 +1302,24 @@ struct i2c_adapter * dib7000p_get_i2c_master(struct dvb_frontend *demod, enum di ...@@ -1302,6 +1302,24 @@ struct i2c_adapter * dib7000p_get_i2c_master(struct dvb_frontend *demod, enum di
} }
EXPORT_SYMBOL(dib7000p_get_i2c_master); EXPORT_SYMBOL(dib7000p_get_i2c_master);
int dib7000p_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
{
struct dib7000p_state *state = fe->demodulator_priv;
u16 val = dib7000p_read_word(state, 235) & 0xffef;
val |= (onoff & 0x1) << 4;
dprintk("PID filter enabled %d", onoff);
return dib7000p_write_word(state, 235, val);
}
EXPORT_SYMBOL(dib7000p_pid_filter_ctrl);
int dib7000p_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
{
struct dib7000p_state *state = fe->demodulator_priv;
dprintk("PID filter: index %x, PID %d, OnOff %d", id, pid, onoff);
return dib7000p_write_word(state, 241 + id, onoff ? (1 << 13) | pid : 0);
}
EXPORT_SYMBOL(dib7000p_pid_filter);
int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib7000p_config cfg[]) int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib7000p_config cfg[])
{ {
struct dib7000p_state st = { .i2c_adap = i2c }; struct dib7000p_state st = { .i2c_adap = i2c };
......
...@@ -51,6 +51,8 @@ extern int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, ...@@ -51,6 +51,8 @@ extern int dib7000p_i2c_enumeration(struct i2c_adapter *i2c,
extern int dib7000p_set_gpio(struct dvb_frontend *, u8 num, u8 dir, u8 val); extern int dib7000p_set_gpio(struct dvb_frontend *, u8 num, u8 dir, u8 val);
extern int dib7000p_set_wbd_ref(struct dvb_frontend *, u16 value); extern int dib7000p_set_wbd_ref(struct dvb_frontend *, u16 value);
extern int dib7000pc_detection(struct i2c_adapter *i2c_adap); extern int dib7000pc_detection(struct i2c_adapter *i2c_adap);
extern int dib7000p_pid_filter(struct dvb_frontend *, u8 id, u16 pid, u8 onoff);
extern int dib7000p_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff);
#else #else
static inline static inline
struct dvb_frontend *dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dvb_frontend *dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr,
...@@ -95,6 +97,17 @@ static inline int dib7000pc_detection(struct i2c_adapter *i2c_adap) ...@@ -95,6 +97,17 @@ static inline int dib7000pc_detection(struct i2c_adapter *i2c_adap)
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
return -ENODEV; return -ENODEV;
} }
static inline int dib7000p_pid_filter(struct dvb_frontend *, u8 id, u16 pid, u8 onoff)
{
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
return -ENODEV;
}
static inline int dib7000p_pid_filter_ctrl(struct dvb_frontend *fe, uint8_t onoff)
{
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
return -ENODEV;
}
#endif #endif
#endif #endif
...@@ -2121,7 +2121,7 @@ static int dib8000_read_snr(struct dvb_frontend *fe, u16 * snr) ...@@ -2121,7 +2121,7 @@ static int dib8000_read_snr(struct dvb_frontend *fe, u16 * snr)
else else
result -= intlog10(2) * 10 * noise_exp - 100; result -= intlog10(2) * 10 * noise_exp - 100;
*snr = result / (1 << 24); *snr = result / ((1 << 24) / 10);
return 0; return 0;
} }
...@@ -2195,6 +2195,25 @@ struct i2c_adapter *dib8000_get_i2c_master(struct dvb_frontend *fe, enum dibx000 ...@@ -2195,6 +2195,25 @@ struct i2c_adapter *dib8000_get_i2c_master(struct dvb_frontend *fe, enum dibx000
EXPORT_SYMBOL(dib8000_get_i2c_master); EXPORT_SYMBOL(dib8000_get_i2c_master);
int dib8000_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
{
struct dib8000_state *st = fe->demodulator_priv;
u16 val = dib8000_read_word(st, 299) & 0xffef;
val |= (onoff & 0x1) << 4;
dprintk("pid filter enabled %d", onoff);
return dib8000_write_word(st, 299, val);
}
EXPORT_SYMBOL(dib8000_pid_filter_ctrl);
int dib8000_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
{
struct dib8000_state *st = fe->demodulator_priv;
dprintk("Index %x, PID %d, OnOff %d", id, pid, onoff);
return dib8000_write_word(st, 305 + id, onoff ? (1 << 13) | pid : 0);
}
EXPORT_SYMBOL(dib8000_pid_filter);
static const struct dvb_frontend_ops dib8000_ops = { static const struct dvb_frontend_ops dib8000_ops = {
.info = { .info = {
.name = "DiBcom 8000 ISDB-T", .name = "DiBcom 8000 ISDB-T",
......
...@@ -44,6 +44,8 @@ extern int dib8000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods, u ...@@ -44,6 +44,8 @@ extern int dib8000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods, u
extern int dib8000_set_gpio(struct dvb_frontend *, u8 num, u8 dir, u8 val); extern int dib8000_set_gpio(struct dvb_frontend *, u8 num, u8 dir, u8 val);
extern int dib8000_set_wbd_ref(struct dvb_frontend *, u16 value); extern int dib8000_set_wbd_ref(struct dvb_frontend *, u16 value);
extern int dib8000_pid_filter_ctrl(struct dvb_frontend *, u8 onoff);
extern int dib8000_pid_filter(struct dvb_frontend *, u8 id, u16 pid, u8 onoff);
#else #else
static inline struct dvb_frontend *dib8000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib8000_config *cfg) static inline struct dvb_frontend *dib8000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib8000_config *cfg)
{ {
...@@ -74,6 +76,18 @@ int dib8000_set_wbd_ref(struct dvb_frontend *fe, u16 value) ...@@ -74,6 +76,18 @@ int dib8000_set_wbd_ref(struct dvb_frontend *fe, u16 value)
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
return -ENODEV; return -ENODEV;
} }
int dib8000_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
{
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
return -ENODEV;
}
int dib8000_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
{
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
return -ENODEV;
}
#endif #endif
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment