| From 6ca8f0b97473dcef3a754bab5239dcfcdd00b244 Mon Sep 17 00:00:00 2001 |
| From: Albert Comerma <albert.comerma@gmail.com> |
| Date: Sat, 29 Mar 2008 21:35:57 -0300 |
| Subject: V4L/DVB (7473): PATCH for various Dibcom based devices |
| |
| From: Albert Comerma <albert.comerma@gmail.com> |
| |
| patch 6ca8f0b97473dcef3a754bab5239dcfcdd00b244 upstream |
| |
| This patch introduces support for dvb-t for the following DiBcom based cards: |
| |
| - Terratec Cinergy HT USB XE (USB-ID: 0ccd:0058) |
| - Terratec Cinergy HT Express (USB-ID: 0ccd:0060) |
| - Pinnacle 320CX (USB-ID: 2304:022e) |
| - Pinnacle PCTV72e (USB-ID: 2304:0236) |
| - Pinnacle PCTV73e (USB-ID: 2304:0237) |
| - Yuan EC372S (USB-ID: 1164:1edc) |
| |
| Signed-off-by: Hans-Frieder Vogt <hfvogt@gmx.net> |
| Signed-off-by: Felix Apitzsch <F.Apitzsch@soz.uni-frankfurt.de> |
| Signed-off-by: Antti Palosaari <crope@iki.fi> |
| Signed-off-by: Albert Comerma <albert.comerma@gmail.com> |
| Signed-off-by: Patrick Boettcher <pb@linuxtv.org> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org> |
| Cc: Michel Morisot <mmorisot.abonnement@belcenter.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/media/dvb/dvb-usb/dib0700_devices.c | 259 ++++++++++++++++++++++++---- |
| drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 9 |
| 2 files changed, 238 insertions(+), 30 deletions(-) |
| |
| --- a/drivers/media/dvb/dvb-usb/dib0700_devices.c |
| +++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c |
| @@ -13,6 +13,7 @@ |
| #include "dib7000p.h" |
| #include "mt2060.h" |
| #include "mt2266.h" |
| +#include "tuner-xc2028.h" |
| #include "dib0070.h" |
| |
| static int force_lna_activation; |
| @@ -297,6 +298,149 @@ static int stk7700d_tuner_attach(struct |
| &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0;; |
| } |
| |
| +/* STK7700-PH: Digital/Analog Hybrid Tuner, e.h. Cinergy HT USB HE */ |
| +struct dibx000_agc_config xc3028_agc_config = { |
| + BAND_VHF | BAND_UHF, /* band_caps */ |
| + |
| + /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0, |
| + * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0, |
| + * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */ |
| + (0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | |
| + (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), /* setup */ |
| + |
| + 712, /* inv_gain */ |
| + 21, /* time_stabiliz */ |
| + |
| + 0, /* alpha_level */ |
| + 118, /* thlock */ |
| + |
| + 0, /* wbd_inv */ |
| + 2867, /* wbd_ref */ |
| + 0, /* wbd_sel */ |
| + 2, /* wbd_alpha */ |
| + |
| + 0, /* agc1_max */ |
| + 0, /* agc1_min */ |
| + 39718, /* agc2_max */ |
| + 9930, /* agc2_min */ |
| + 0, /* agc1_pt1 */ |
| + 0, /* agc1_pt2 */ |
| + 0, /* agc1_pt3 */ |
| + 0, /* agc1_slope1 */ |
| + 0, /* agc1_slope2 */ |
| + 0, /* agc2_pt1 */ |
| + 128, /* agc2_pt2 */ |
| + 29, /* agc2_slope1 */ |
| + 29, /* agc2_slope2 */ |
| + |
| + 17, /* alpha_mant */ |
| + 27, /* alpha_exp */ |
| + 23, /* beta_mant */ |
| + 51, /* beta_exp */ |
| + |
| + 1, /* perform_agc_softsplit */ |
| +}; |
| + |
| +/* PLL Configuration for COFDM BW_MHz = 8.00 with external clock = 30.00 */ |
| +struct dibx000_bandwidth_config xc3028_bw_config = { |
| + 60000, 30000, /* internal, sampling */ |
| + 1, 8, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass */ |
| + 0, 0, 1, 1, 0, /* misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, |
| + modulo */ |
| + (3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */ |
| + (1 << 25) | 5816102, /* ifreq = 5.200000 MHz */ |
| + 20452225, /* timf */ |
| + 30000000, /* xtal_hz */ |
| +}; |
| + |
| +static struct dib7000p_config stk7700ph_dib7700_xc3028_config = { |
| + .output_mpeg2_in_188_bytes = 1, |
| + .tuner_is_baseband = 1, |
| + |
| + .agc_config_count = 1, |
| + .agc = &xc3028_agc_config, |
| + .bw = &xc3028_bw_config, |
| + |
| + .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, |
| + .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, |
| + .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, |
| +}; |
| + |
| +static int stk7700ph_xc3028_callback(void *ptr, int command, int arg) |
| +{ |
| + struct dvb_usb_adapter *adap = ptr; |
| + |
| + switch (command) { |
| + case XC2028_TUNER_RESET: |
| + /* Send the tuner in then out of reset */ |
| + dib7000p_set_gpio(adap->fe, 8, 0, 0); msleep(10); |
| + dib7000p_set_gpio(adap->fe, 8, 0, 1); |
| + break; |
| + case XC2028_RESET_CLK: |
| + break; |
| + default: |
| + err("%s: unknown command %d, arg %d\n", __func__, |
| + command, arg); |
| + return -EINVAL; |
| + } |
| + return 0; |
| +} |
| + |
| +static struct xc2028_ctrl stk7700ph_xc3028_ctrl = { |
| + .fname = XC2028_DEFAULT_FIRMWARE, |
| + .max_len = 64, |
| + .demod = XC3028_FE_DIBCOM52, |
| +}; |
| + |
| +static struct xc2028_config stk7700ph_xc3028_config = { |
| + .i2c_addr = 0x61, |
| + .callback = stk7700ph_xc3028_callback, |
| + .ctrl = &stk7700ph_xc3028_ctrl, |
| +}; |
| + |
| +static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap) |
| +{ |
| + struct usb_device_descriptor *desc = &adap->dev->udev->descriptor; |
| + |
| + if (desc->idVendor == USB_VID_PINNACLE && |
| + desc->idProduct == USB_PID_PINNACLE_EXPRESSCARD_320CX) |
| + dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); |
| + else |
| + dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); |
| + msleep(20); |
| + dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); |
| + dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); |
| + dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); |
| + dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); |
| + msleep(10); |
| + dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); |
| + msleep(20); |
| + dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); |
| + msleep(10); |
| + |
| + dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, |
| + &stk7700ph_dib7700_xc3028_config); |
| + |
| + adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, |
| + &stk7700ph_dib7700_xc3028_config); |
| + |
| + return adap->fe == NULL ? -ENODEV : 0; |
| +} |
| + |
| +static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap) |
| +{ |
| + struct i2c_adapter *tun_i2c; |
| + |
| + tun_i2c = dib7000p_get_i2c_master(adap->fe, |
| + DIBX000_I2C_INTERFACE_TUNER, 1); |
| + |
| + stk7700ph_xc3028_config.i2c_adap = tun_i2c; |
| + stk7700ph_xc3028_config.video_dev = adap; |
| + |
| + return dvb_attach(xc2028_attach, adap->fe, &stk7700ph_xc3028_config) |
| + == NULL ? -ENODEV : 0; |
| +} |
| + |
| #define DEFAULT_RC_INTERVAL 150 |
| |
| static u8 rc_request[] = { REQUEST_POLL_RC, 0 }; |
| @@ -794,6 +938,10 @@ static struct dib7000p_config dib7070p_d |
| /* STK7070P */ |
| static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap) |
| { |
| + if (adap->dev->udev->descriptor.idVendor == USB_VID_PINNACLE && |
| + adap->dev->udev->descriptor.idProduct == USB_PID_PINNACLE_PCTV72E) |
| + dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); |
| + else |
| dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); |
| msleep(10); |
| dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); |
| @@ -808,9 +956,11 @@ static int stk7070p_frontend_attach(stru |
| msleep(10); |
| dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); |
| |
| - dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, &dib7070p_dib7000p_config); |
| + dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, |
| + &dib7070p_dib7000p_config); |
| |
| - adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &dib7070p_dib7000p_config); |
| + adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, |
| + &dib7070p_dib7000p_config); |
| return adap->fe == NULL ? -ENODEV : 0; |
| } |
| |
| @@ -878,34 +1028,41 @@ static int stk7070pd_frontend_attach1(st |
| /* DVB-USB and USB stuff follows */ |
| struct usb_device_id dib0700_usb_id_table[] = { |
| /* 0 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P) }, |
| - { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P_PC) }, |
| - |
| - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) }, |
| - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) }, |
| - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) }, |
| + { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P_PC) }, |
| + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) }, |
| + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) }, |
| + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) }, |
| /* 5 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) }, |
| - { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500) }, |
| - { USB_DEVICE(USB_VID_UNIWILL, USB_PID_UNIWILL_STK7700P) }, |
| - { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P) }, |
| - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) }, |
| + { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500) }, |
| + { USB_DEVICE(USB_VID_UNIWILL, USB_PID_UNIWILL_STK7700P) }, |
| + { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P) }, |
| + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) }, |
| /* 10 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_2) }, |
| - { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV2000E) }, |
| - { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) }, |
| - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) }, |
| - { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700D) }, |
| + { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV2000E) }, |
| + { USB_DEVICE(USB_VID_TERRATEC, |
| + USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) }, |
| + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) }, |
| + { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700D) }, |
| /* 15 */{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070P) }, |
| - { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DVB_T_FLASH) }, |
| - { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070PD) }, |
| - { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) }, |
| - { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500_PC) }, |
| + { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DVB_T_FLASH) }, |
| + { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070PD) }, |
| + { USB_DEVICE(USB_VID_PINNACLE, |
| + USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) }, |
| + { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500_PC) }, |
| /* 20 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_EXPRESS) }, |
| - { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U7000) }, |
| - { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) }, |
| - { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000) }, |
| - { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3100) }, |
| -/* 25 */ { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) }, |
| - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) }, |
| - { 0 } /* Terminating entry */ |
| + { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U7000) }, |
| + { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) }, |
| + { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000) }, |
| + { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3100) }, |
| +/* 25 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) }, |
| + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) }, |
| + { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_USB_XE) }, |
| + { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_EXPRESSCARD_320CX) }, |
| + { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV72E) }, |
| +/* 30 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73E) }, |
| + { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_EC372S) }, |
| + { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_EXPRESS) }, |
| + { 0 } /* Terminating entry */ |
| }; |
| MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table); |
| |
| @@ -1069,12 +1226,16 @@ struct dvb_usb_device_properties dib0700 |
| }, |
| }, |
| |
| - .num_device_descs = 1, |
| + .num_device_descs = 2, |
| .devices = { |
| { "ASUS My Cinema U3000 Mini DVBT Tuner", |
| { &dib0700_usb_id_table[23], NULL }, |
| { NULL }, |
| }, |
| + { "Yuan EC372S", |
| + { &dib0700_usb_id_table[31], NULL }, |
| + { NULL }, |
| + } |
| } |
| }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, |
| |
| @@ -1090,7 +1251,7 @@ struct dvb_usb_device_properties dib0700 |
| }, |
| }, |
| |
| - .num_device_descs = 6, |
| + .num_device_descs = 8, |
| .devices = { |
| { "DiBcom STK7070P reference design", |
| { &dib0700_usb_id_table[15], NULL }, |
| @@ -1116,6 +1277,14 @@ struct dvb_usb_device_properties dib0700 |
| { &dib0700_usb_id_table[26], NULL }, |
| { NULL }, |
| }, |
| + { "Pinnacle PCTV 72e", |
| + { &dib0700_usb_id_table[29], NULL }, |
| + { NULL }, |
| + }, |
| + { "Pinnacle PCTV 73e", |
| + { &dib0700_usb_id_table[30], NULL }, |
| + { NULL }, |
| + }, |
| }, |
| |
| .rc_interval = DEFAULT_RC_INTERVAL, |
| @@ -1155,6 +1324,40 @@ struct dvb_usb_device_properties dib0700 |
| { NULL }, |
| } |
| } |
| + }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, |
| + |
| + .num_adapters = 1, |
| + .adapter = { |
| + { |
| + .frontend_attach = stk7700ph_frontend_attach, |
| + .tuner_attach = stk7700ph_tuner_attach, |
| + |
| + DIB0700_DEFAULT_STREAMING_CONFIG(0x02), |
| + |
| + .size_of_priv = sizeof(struct |
| + dib0700_adapter_state), |
| + }, |
| + }, |
| + |
| + .num_device_descs = 3, |
| + .devices = { |
| + { "Terratec Cinergy HT USB XE", |
| + { &dib0700_usb_id_table[27], NULL }, |
| + { NULL }, |
| + }, |
| + { "Pinnacle Expresscard 320cx", |
| + { &dib0700_usb_id_table[28], NULL }, |
| + { NULL }, |
| + }, |
| + { "Terratec Cinergy HT Express", |
| + { &dib0700_usb_id_table[32], NULL }, |
| + { NULL }, |
| + }, |
| + }, |
| + .rc_interval = DEFAULT_RC_INTERVAL, |
| + .rc_key_map = dib0700_rc_keys, |
| + .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys), |
| + .rc_query = dib0700_rc_query |
| }, |
| }; |
| |
| --- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h |
| +++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h |
| @@ -46,8 +46,8 @@ |
| #define USB_VID_ULTIMA_ELECTRONIC 0x05d8 |
| #define USB_VID_UNIWILL 0x1584 |
| #define USB_VID_WIDEVIEW 0x14aa |
| -/* dom : pour gigabyte u7000 */ |
| #define USB_VID_GIGABYTE 0x1044 |
| +#define USB_VID_YUAN 0x1164 |
| |
| |
| /* Product IDs */ |
| @@ -135,9 +135,14 @@ |
| #define USB_PID_AVERMEDIA_VOLAR 0xa807 |
| #define USB_PID_AVERMEDIA_VOLAR_2 0xb808 |
| #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY 0x005a |
| +#define USB_PID_TERRATEC_CINERGY_HT_USB_XE 0x0058 |
| +#define USB_PID_TERRATEC_CINERGY_HT_EXPRESS 0x0060 |
| +#define USB_PID_PINNACLE_EXPRESSCARD_320CX 0x022e |
| #define USB_PID_PINNACLE_PCTV2000E 0x022c |
| #define USB_PID_PINNACLE_PCTV_DVB_T_FLASH 0x0228 |
| #define USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T 0x0229 |
| +#define USB_PID_PINNACLE_PCTV72E 0x0236 |
| +#define USB_PID_PINNACLE_PCTV73E 0x0237 |
| #define USB_PID_PCTV_200E 0x020e |
| #define USB_PID_PCTV_400E 0x020f |
| #define USB_PID_PCTV_450E 0x0222 |
| @@ -183,9 +188,9 @@ |
| #define USB_PID_OPERA1_WARM 0x3829 |
| #define USB_PID_LIFEVIEW_TV_WALKER_TWIN_COLD 0x0514 |
| #define USB_PID_LIFEVIEW_TV_WALKER_TWIN_WARM 0x0513 |
| -/* dom pour gigabyte u7000 */ |
| #define USB_PID_GIGABYTE_U7000 0x7001 |
| #define USB_PID_ASUS_U3000 0x171f |
| #define USB_PID_ASUS_U3100 0x173f |
| +#define USB_PID_YUAN_EC372S 0x1edc |
| |
| #endif |