diff options
Diffstat (limited to 'drivers/media/usb')
-rw-r--r-- | drivers/media/usb/dvb-usb-v2/rtl28xxu.c | 140 |
1 files changed, 94 insertions, 46 deletions
diff --git a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c index 5bc77745b737..821dcbaba4ff 100644 --- a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c +++ b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c @@ -523,6 +523,16 @@ err: return ret; } +static int rtl28xxu_read_config(struct dvb_usb_device *d) +{ + struct rtl28xxu_dev *dev = d_to_priv(d); + + if (dev->chip_id == CHIP_ID_RTL2831U) + return rtl2831u_read_config(d); + else + return rtl2832u_read_config(d); +} + static int rtl28xxu_identify_state(struct dvb_usb_device *d, const char **name) { struct rtl28xxu_dev *dev = d_to_priv(d); @@ -906,7 +916,17 @@ err: return ret; } -static int rtl2832u_frontend_detach(struct dvb_usb_adapter *adap) +static int rtl28xxu_frontend_attach(struct dvb_usb_adapter *adap) +{ + struct rtl28xxu_dev *dev = adap_to_priv(adap); + + if (dev->chip_id == CHIP_ID_RTL2831U) + return rtl2831u_frontend_attach(adap); + else + return rtl2832u_frontend_attach(adap); +} + +static int rtl28xxu_frontend_detach(struct dvb_usb_adapter *adap) { struct dvb_usb_device *d = adap_to_d(adap); struct rtl28xxu_dev *dev = d_to_priv(d); @@ -1172,7 +1192,17 @@ err: return ret; } -static int rtl2832u_tuner_detach(struct dvb_usb_adapter *adap) +static int rtl28xxu_tuner_attach(struct dvb_usb_adapter *adap) +{ + struct rtl28xxu_dev *dev = adap_to_priv(adap); + + if (dev->chip_id == CHIP_ID_RTL2831U) + return rtl2831u_tuner_attach(adap); + else + return rtl2832u_tuner_attach(adap); +} + +static int rtl28xxu_tuner_detach(struct dvb_usb_adapter *adap) { struct dvb_usb_device *d = adap_to_d(adap); struct rtl28xxu_dev *dev = d_to_priv(d); @@ -1350,7 +1380,17 @@ err: return ret; } -static int rtl2832u_frontend_ctrl(struct dvb_frontend *fe, int onoff) +static int rtl28xxu_power_ctrl(struct dvb_usb_device *d, int onoff) +{ + struct rtl28xxu_dev *dev = d_to_priv(d); + + if (dev->chip_id == CHIP_ID_RTL2831U) + return rtl2831u_power_ctrl(d, onoff); + else + return rtl2832u_power_ctrl(d, onoff); +} + +static int rtl28xxu_frontend_ctrl(struct dvb_frontend *fe, int onoff) { struct dvb_usb_device *d = fe_to_d(fe); struct rtl28xxu_dev *dev = fe_to_priv(fe); @@ -1360,6 +1400,9 @@ static int rtl2832u_frontend_ctrl(struct dvb_frontend *fe, int onoff) dev_dbg(&d->intf->dev, "fe=%d onoff=%d\n", fe->id, onoff); + if (dev->chip_id == CHIP_ID_RTL2831U) + return 0; + /* control internal demod ADC */ if (fe->id == 0 && onoff) val = 0x48; /* enable ADC */ @@ -1572,45 +1615,50 @@ static int rtl2832u_get_rc_config(struct dvb_usb_device *d, return 0; } -#else -#define rtl2831u_get_rc_config NULL -#define rtl2832u_get_rc_config NULL -#endif -static int rtl2831u_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff) +static int rtl28xxu_get_rc_config(struct dvb_usb_device *d, + struct dvb_usb_rc *rc) { - struct dvb_usb_device *d = adap_to_d(adap); struct rtl28xxu_dev *dev = d_to_priv(d); - struct rtl2830_platform_data *pdata = &dev->rtl2830_platform_data; - return pdata->pid_filter_ctrl(adap->fe[0], onoff); + if (dev->chip_id == CHIP_ID_RTL2831U) + return rtl2831u_get_rc_config(d, rc); + else + return rtl2832u_get_rc_config(d, rc); } +#else +#define rtl28xxu_get_rc_config NULL +#endif -static int rtl2832u_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff) +static int rtl28xxu_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff) { - struct dvb_usb_device *d = adap_to_d(adap); - struct rtl28xxu_dev *dev = d_to_priv(d); - struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data; + struct rtl28xxu_dev *dev = adap_to_priv(adap); - return pdata->pid_filter_ctrl(adap->fe[0], onoff); -} + if (dev->chip_id == CHIP_ID_RTL2831U) { + struct rtl2830_platform_data *pdata = &dev->rtl2830_platform_data; -static int rtl2831u_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onoff) -{ - struct dvb_usb_device *d = adap_to_d(adap); - struct rtl28xxu_dev *dev = d_to_priv(d); - struct rtl2830_platform_data *pdata = &dev->rtl2830_platform_data; + return pdata->pid_filter_ctrl(adap->fe[0], onoff); + } else { + struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data; - return pdata->pid_filter(adap->fe[0], index, pid, onoff); + return pdata->pid_filter_ctrl(adap->fe[0], onoff); + } } -static int rtl2832u_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onoff) +static int rtl28xxu_pid_filter(struct dvb_usb_adapter *adap, int index, + u16 pid, int onoff) { - struct dvb_usb_device *d = adap_to_d(adap); - struct rtl28xxu_dev *dev = d_to_priv(d); - struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data; + struct rtl28xxu_dev *dev = adap_to_priv(adap); + + if (dev->chip_id == CHIP_ID_RTL2831U) { + struct rtl2830_platform_data *pdata = &dev->rtl2830_platform_data; - return pdata->pid_filter(adap->fe[0], index, pid, onoff); + return pdata->pid_filter(adap->fe[0], index, pid, onoff); + } else { + struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data; + + return pdata->pid_filter(adap->fe[0], index, pid, onoff); + } } static const struct dvb_usb_device_properties rtl2831u_props = { @@ -1620,14 +1668,14 @@ static const struct dvb_usb_device_properties rtl2831u_props = { .size_of_priv = sizeof(struct rtl28xxu_dev), .identify_state = rtl28xxu_identify_state, - .power_ctrl = rtl2831u_power_ctrl, + .power_ctrl = rtl28xxu_power_ctrl, .i2c_algo = &rtl28xxu_i2c_algo, - .read_config = rtl2831u_read_config, - .frontend_attach = rtl2831u_frontend_attach, - .frontend_detach = rtl2832u_frontend_detach, - .tuner_attach = rtl2831u_tuner_attach, + .read_config = rtl28xxu_read_config, + .frontend_attach = rtl28xxu_frontend_attach, + .frontend_detach = rtl28xxu_frontend_detach, + .tuner_attach = rtl28xxu_tuner_attach, .init = rtl28xxu_init, - .get_rc_config = rtl2831u_get_rc_config, + .get_rc_config = rtl28xxu_get_rc_config, .num_adapters = 1, .adapter = { @@ -1636,8 +1684,8 @@ static const struct dvb_usb_device_properties rtl2831u_props = { DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, .pid_filter_count = 32, - .pid_filter_ctrl = rtl2831u_pid_filter_ctrl, - .pid_filter = rtl2831u_pid_filter, + .pid_filter_ctrl = rtl28xxu_pid_filter_ctrl, + .pid_filter = rtl28xxu_pid_filter, .stream = DVB_USB_STREAM_BULK(0x81, 6, 8 * 512), }, @@ -1651,16 +1699,16 @@ static const struct dvb_usb_device_properties rtl2832u_props = { .size_of_priv = sizeof(struct rtl28xxu_dev), .identify_state = rtl28xxu_identify_state, - .power_ctrl = rtl2832u_power_ctrl, - .frontend_ctrl = rtl2832u_frontend_ctrl, + .power_ctrl = rtl28xxu_power_ctrl, + .frontend_ctrl = rtl28xxu_frontend_ctrl, .i2c_algo = &rtl28xxu_i2c_algo, - .read_config = rtl2832u_read_config, - .frontend_attach = rtl2832u_frontend_attach, - .frontend_detach = rtl2832u_frontend_detach, - .tuner_attach = rtl2832u_tuner_attach, - .tuner_detach = rtl2832u_tuner_detach, + .read_config = rtl28xxu_read_config, + .frontend_attach = rtl28xxu_frontend_attach, + .frontend_detach = rtl28xxu_frontend_detach, + .tuner_attach = rtl28xxu_tuner_attach, + .tuner_detach = rtl28xxu_tuner_detach, .init = rtl28xxu_init, - .get_rc_config = rtl2832u_get_rc_config, + .get_rc_config = rtl28xxu_get_rc_config, .num_adapters = 1, .adapter = { @@ -1669,8 +1717,8 @@ static const struct dvb_usb_device_properties rtl2832u_props = { DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, .pid_filter_count = 32, - .pid_filter_ctrl = rtl2832u_pid_filter_ctrl, - .pid_filter = rtl2832u_pid_filter, + .pid_filter_ctrl = rtl28xxu_pid_filter_ctrl, + .pid_filter = rtl28xxu_pid_filter, .stream = DVB_USB_STREAM_BULK(0x81, 6, 8 * 512), }, |