diff -r 595fe1ec7511 linux/drivers/media/dvb/b2c2/flexcop.c --- a/linux/drivers/media/dvb/b2c2/flexcop.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/b2c2/flexcop.c Mon Jun 23 15:07:10 2008 -0700 @@ -49,8 +49,6 @@ MODULE_PARM_DESC(debug, "set debug level MODULE_PARM_DESC(debug, "set debug level (1=info,2=tuner,4=i2c,8=ts,16=sram,32=reg (|-able))." DEBSTATUS); #undef DEBSTATUS -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); - /* global zero for ibi values */ flexcop_ibi_value ibi_zero; @@ -68,10 +66,8 @@ static int flexcop_dvb_stop_feed(struct static int flexcop_dvb_init(struct flexcop_device *fc) { - int ret = dvb_register_adapter(&fc->dvb_adapter, - "FlexCop Digital TV device", fc->owner, - fc->dev, adapter_nr); - if (ret < 0) { + int ret; + if ((ret = dvb_register_adapter(&fc->dvb_adapter,"FlexCop Digital TV device",fc->owner,fc->dev)) < 0) { err("error registering DVB adapter"); return ret; } diff -r 595fe1ec7511 linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c --- a/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c Mon Jun 23 15:07:10 2008 -0700 @@ -40,8 +40,6 @@ static int debug; module_param(debug, int, 0644); MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off)."); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); #define dprintk( args... ) \ do { \ @@ -720,10 +718,7 @@ static int __devinit dvb_bt8xx_load_card { int result; - result = dvb_register_adapter(&card->dvb_adapter, card->card_name, - THIS_MODULE, &card->bt->dev->dev, - adapter_nr); - if (result < 0) { + if ((result = dvb_register_adapter(&card->dvb_adapter, card->card_name, THIS_MODULE, &card->bt->dev->dev)) < 0) { printk("dvb_bt8xx: dvb_register_adapter failed (errno = %d)\n", result); return result; } diff -r 595fe1ec7511 linux/drivers/media/dvb/cinergyT2/cinergyT2.c --- a/linux/drivers/media/dvb/cinergyT2/cinergyT2.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/cinergyT2/cinergyT2.c Mon Jun 23 15:07:10 2008 -0700 @@ -60,8 +60,6 @@ static int debug; static int debug; module_param_named(debug, debug, int, 0644); MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off)."); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,15) #define dprintk(level, args...) \ @@ -1008,10 +1006,7 @@ static int cinergyt2_probe (struct usb_i return -ENOMEM; } - err = dvb_register_adapter(&cinergyt2->adapter, DRIVER_NAME, - THIS_MODULE, &cinergyt2->udev->dev, - adapter_nr); - if (err < 0) { + if ((err = dvb_register_adapter(&cinergyt2->adapter, DRIVER_NAME, THIS_MODULE, &cinergyt2->udev->dev)) < 0) { kfree(cinergyt2); return err; } diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-core/dvb_frontend.c --- a/linux/drivers/media/dvb/dvb-core/dvb_frontend.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-core/dvb_frontend.c Mon Jun 23 15:07:10 2008 -0700 @@ -101,6 +101,7 @@ struct dvb_frontend_private { /* thread/frontend values */ struct dvb_device *dvbdev; struct dvb_frontend_parameters parameters; + struct dvb_frontend_parameters_new parameters_new; struct dvb_fe_events events; struct semaphore sem; struct list_head list_head; @@ -116,6 +117,8 @@ struct dvb_frontend_private { int tone; int voltage; + int current_standard_set; + fe_type_t current_standard; /* swzigzag values */ unsigned int state; unsigned int bending; @@ -267,13 +270,23 @@ static int dvb_frontend_swzigzag_autotun int autoinversion; int ready = 0; struct dvb_frontend_private *fepriv = fe->frontend_priv; - int original_inversion = fepriv->parameters.inversion; - u32 original_frequency = fepriv->parameters.frequency; + int original_inversion; + u32 original_frequency; + + if (fepriv->current_standard_set) { + original_inversion = fepriv->parameters_new.inversion; + original_frequency = fepriv->parameters_new.frequency; + } else { + original_inversion = fepriv->parameters.inversion; + original_frequency = fepriv->parameters.frequency; + } /* are we using autoinversion? */ autoinversion = ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) && - (fepriv->parameters.inversion == INVERSION_AUTO)); - + ((fepriv->current_standard_set && + fepriv->parameters_new.inversion == INVERSION_AUTO) || + (! fepriv->current_standard_set && + fepriv->parameters.inversion == INVERSION_AUTO))); /* setup parameters correctly */ while(!ready) { /* calculate the lnb_drift */ @@ -338,14 +351,24 @@ static int dvb_frontend_swzigzag_autotun fepriv->auto_step, fepriv->auto_sub_step, fepriv->started_auto_step); /* set the frontend itself */ - fepriv->parameters.frequency += fepriv->lnb_drift; - if (autoinversion) - fepriv->parameters.inversion = fepriv->inversion; - if (fe->ops.set_frontend) - fe->ops.set_frontend(fe, &fepriv->parameters); - - fepriv->parameters.frequency = original_frequency; - fepriv->parameters.inversion = original_inversion; + if (fepriv->current_standard_set) { + fepriv->parameters_new.frequency += fepriv->lnb_drift; + if (autoinversion) + fepriv->parameters_new.inversion = fepriv->inversion; + if (fe->ops.set_frontend2) + fe->ops.set_frontend2(fe, &fepriv->parameters_new); + fepriv->parameters_new.frequency = original_frequency; + fepriv->parameters_new.inversion = original_inversion; + } else { + fepriv->parameters.frequency += fepriv->lnb_drift; + if (autoinversion) + fepriv->parameters.inversion = fepriv->inversion; + if (fe->ops.set_frontend) + fe->ops.set_frontend(fe, &fepriv->parameters); + + fepriv->parameters.frequency = original_frequency; + fepriv->parameters.inversion = original_inversion; + } fepriv->auto_sub_step++; return 0; @@ -353,7 +376,7 @@ static int dvb_frontend_swzigzag_autotun static void dvb_frontend_swzigzag(struct dvb_frontend *fe) { - fe_status_t s = 0; + fe_status_t s; struct dvb_frontend_private *fepriv = fe->frontend_priv; /* if we've got no parameters, just keep idling */ @@ -366,8 +389,13 @@ static void dvb_frontend_swzigzag(struct /* in SCAN mode, we just set the frontend when asked and leave it alone */ if (fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT) { if (fepriv->state & FESTATE_RETUNE) { - if (fe->ops.set_frontend) - fe->ops.set_frontend(fe, &fepriv->parameters); + if (fepriv->current_standard_set) { + if (fe->ops.set_frontend2) + fe->ops.set_frontend2(fe, &fepriv->parameters_new); + } else { + if (fe->ops.set_frontend) + fe->ops.set_frontend(fe, &fepriv->parameters); + } fepriv->state = FESTATE_TUNED; } fepriv->delay = 3*HZ; @@ -987,18 +1015,21 @@ static int dvb_frontend_ioctl(struct ino /* default values */ switch(fe->ops.info.type) { case FE_QPSK: + case FE_DVB_S: fepriv->min_delay = HZ/20; fepriv->step_size = fepriv->parameters.u.qpsk.symbol_rate / 16000; fepriv->max_drift = fepriv->parameters.u.qpsk.symbol_rate / 2000; break; case FE_QAM: + case FE_DVB_C: fepriv->min_delay = HZ/20; fepriv->step_size = 0; /* no zigzag */ fepriv->max_drift = 0; break; case FE_OFDM: + case FE_DVB_T: fepriv->min_delay = HZ/20; fepriv->step_size = fe->ops.info.frequency_stepsize * 2; fepriv->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1; @@ -1007,6 +1038,9 @@ static int dvb_frontend_ioctl(struct ino fepriv->min_delay = HZ/20; fepriv->step_size = 0; fepriv->max_drift = 0; + break; + case FE_DVB_S2: + printk("dvb-core: ERROR FE_DVB_S2 is handled via FE_SET_FRONTEND2.\n"); break; } } @@ -1020,6 +1054,101 @@ static int dvb_frontend_ioctl(struct ino err = 0; break; } + case FE_SET_FRONTEND2: { + struct dvb_frontend_tune_settings fetunesettings; + struct dvb_frontend_parameters_new *castedparg; + + if (!fepriv->current_standard_set) { + err = -EINVAL; + break; + } + + castedparg = (struct dvb_frontend_parameters_new *)parg; + memcpy (&fepriv->parameters_new, parg, + sizeof (struct dvb_frontend_parameters_new)); + + memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings)); + + /* be sure struct union pointer is set - even if it is NULL */ + fetunesettings.parameters_new.u = castedparg->u; + + /* force auto frequency inversion if requested */ + if (dvb_force_auto_inversion) { + fepriv->parameters_new.inversion = INVERSION_AUTO; + fetunesettings.parameters_new.inversion = INVERSION_AUTO; + } + if (fe->ops.info.type == FE_DVB_T || fe->ops.info.type == FE_OFDM) { + /* without hierachical coding code_rate_LP is irrelevant, + * so we tolerate the otherwise invalid FEC_NONE setting */ + if (fepriv->parameters_new.u.ofdm.hierarchy_information == HIERARCHY_NONE && + fepriv->parameters_new.u.ofdm.code_rate_LP == FEC_NONE) + fepriv->parameters_new.u.ofdm.code_rate_LP = FEC_AUTO; + } + + /* get frontend-specific tuning settings */ + if (fe->ops.get_tune_settings && (fe->ops.get_tune_settings(fe, &fetunesettings) == 0)) { + fepriv->min_delay = (fetunesettings.min_delay_ms * HZ) / 1000; + fepriv->max_drift = fetunesettings.max_drift; + fepriv->step_size = fetunesettings.step_size; + } else { + /* default values */ + switch(fe->ops.info.type) { + case FE_DVB_S: + case FE_QPSK: + if (fepriv->current_standard != FE_DVB_S) { + err = -EINVAL; + break; + } + fepriv->min_delay = HZ/20; + fepriv->step_size = fepriv->parameters_new.u.qpsk.symbol_rate / 16000; + fepriv->max_drift = fepriv->parameters_new.u.qpsk.symbol_rate / 2000; + break; + case FE_DVB_C: + case FE_QAM: + if (fepriv->current_standard != FE_DVB_C) { + err = -EINVAL; + break; + } + fepriv->min_delay = HZ/20; + fepriv->step_size = 0; /* no zigzag */ + fepriv->max_drift = 0; + break; + case FE_DVB_T: + case FE_OFDM: + if (fepriv->current_standard != FE_DVB_T) { + err = -EINVAL; + break; + } + fepriv->min_delay = HZ/20; + fepriv->step_size = fe->ops.info.frequency_stepsize * 2; + fepriv->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1; + break; + case FE_ATSC: + printk("dvb-core: FE_ATSC not handled yet.\n"); + break; + case FE_DVB_S2: + if (fepriv->current_standard != FE_DVB_S2) { + err = -EINVAL; + break; + } + fepriv->min_delay = HZ/20; + fepriv->step_size = fepriv->parameters_new.u.qpsk2.symbol_rate / 16000; + fepriv->max_drift = fepriv->parameters_new.u.qpsk2.symbol_rate / 2000; + break; + + } + } + if (dvb_override_tune_delay > 0) + fepriv->min_delay = (dvb_override_tune_delay * HZ) / 1000; + + fepriv->state = FESTATE_RETUNE; + dvb_frontend_wakeup(fe); + dvb_frontend_add_event(fe, 0); + fepriv->status = 0; + err = 0; + /* if previously used delete old tuning params */ + break; + } case FE_GET_EVENT: err = dvb_frontend_get_event (fe, parg, file->f_flags); @@ -1031,6 +1160,48 @@ static int dvb_frontend_ioctl(struct ino err = fe->ops.get_frontend(fe, (struct dvb_frontend_parameters*) parg); } break; + case FE_GET_FRONTEND2: + if (!fepriv->current_standard) { + err = -EINVAL; + break; + } + if (fe->ops.get_frontend2) { + memcpy (parg, &fepriv->parameters_new, sizeof (struct dvb_frontend_parameters_new)); + err = fe->ops.get_frontend2(fe, (struct dvb_frontend_parameters_new*) parg); + } + break; + + case FE_SET_STANDARD: + /* + * current_standard_set and current_standard are reset + * this prevents user from ignoring return value and + * if current_standard would be kept as fallback, users may + * supply corrupted tuning data. + * if the new standard isn't supported no FE_SET_FRONTEND2 + * is possible. it will return EINVAL + */ + fepriv->current_standard_set = 0; + fepriv->current_standard = 0; + { + fe_type_t fetype = (fe_type_t) parg; + if (fetype != FE_DVB_S && fetype != FE_DVB_C && fetype != FE_DVB_T && fetype != FE_DVB_S2 && fetype != FE_ATSC) { + err = -EINVAL; + } else if (fe->ops.set_standard) { + err = fe->ops.set_standard(fe, fetype); + if (!err) { + fepriv->current_standard_set = 1; + fepriv->current_standard = fetype; + } + } + } + break; + + case FE_GET_EXTENDED_INFO: { + struct dvb_fe_caps_extended* info = parg; + memcpy(info, &fe->ops.extended_info, sizeof(struct dvb_fe_caps_extended)); + err = 0; + break; + } case FE_SET_FRONTEND_TUNE_MODE: fepriv->tune_mode_flags = (unsigned long) parg; @@ -1080,7 +1251,10 @@ static int dvb_frontend_open(struct inod fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT; fepriv->tone = -1; fepriv->voltage = -1; - + fepriv->current_standard_set = 0; + fepriv->current_standard = 0; + if (fe->ops.set_standard) + fe->ops.set_standard(fe, 0); ret = dvb_frontend_start (fe); if (ret) goto err2; diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-core/dvb_frontend.h --- a/linux/drivers/media/dvb/dvb-core/dvb_frontend.h Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-core/dvb_frontend.h Mon Jun 23 15:07:10 2008 -0700 @@ -48,6 +48,7 @@ struct dvb_frontend_tune_settings { int step_size; int max_drift; struct dvb_frontend_parameters parameters; + struct dvb_frontend_parameters_new parameters_new; }; struct dvb_frontend; @@ -128,6 +129,7 @@ struct dvb_frontend_ops { struct dvb_frontend_ops { struct dvb_frontend_info info; + struct dvb_fe_caps_extended extended_info; void (*release)(struct dvb_frontend* fe); void (*release_sec)(struct dvb_frontend* fe); @@ -167,6 +169,10 @@ struct dvb_frontend_ops { int (*enable_high_lnb_voltage)(struct dvb_frontend* fe, long arg); int (*dishnetwork_send_legacy_command)(struct dvb_frontend* fe, unsigned long cmd); int (*i2c_gate_ctrl)(struct dvb_frontend* fe, int enable); + int (*set_standard)(struct dvb_frontend* fe, fe_type_t type); + int (*get_extended_info)(struct dvb_frontend* fe, struct dvb_fe_caps_extended* extendedinfo); + int (*set_frontend2)(struct dvb_frontend* fe, struct dvb_frontend_parameters_new* params); + int (*get_frontend2)(struct dvb_frontend* fe, struct dvb_frontend_parameters_new* params); int (*ts_bus_ctrl)(struct dvb_frontend* fe, int acquire); struct dvb_tuner_ops tuner_ops; diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-core/dvbdev.c --- a/linux/drivers/media/dvb/dvb-core/dvbdev.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-core/dvbdev.c Mon Jun 23 15:07:10 2008 -0700 @@ -52,6 +52,7 @@ static const char * const dnames[] = { "net", "osd" }; +#define DVB_MAX_ADAPTERS 8 #define DVB_MAX_IDS 4 #define nums2minor(num,type,id) ((num << 6) | (id << 4) | type) #define MAX_DVB_MINORS (DVB_MAX_ADAPTERS*64) @@ -276,25 +277,18 @@ void dvb_unregister_device(struct dvb_de } EXPORT_SYMBOL(dvb_unregister_device); -static int dvbdev_check_free_adapter_num(int num) -{ - struct list_head *entry; - list_for_each(entry, &dvb_adapter_list) { - struct dvb_adapter *adap; - adap = list_entry(entry, struct dvb_adapter, list_head); - if (adap->num == num) - return 0; - } - return 1; -} static int dvbdev_get_free_adapter_num (void) { int num = 0; while (num < DVB_MAX_ADAPTERS) { - if (dvbdev_check_free_adapter_num(num)) - return num; + struct dvb_adapter *adap; + list_for_each_entry(adap, &dvb_adapter_list, list_head) + if (adap->num == num) + goto skip; + return num; +skip: num++; } @@ -302,28 +296,13 @@ static int dvbdev_get_free_adapter_num ( } -int dvb_register_adapter(struct dvb_adapter *adap, const char *name, - struct module *module, struct device *device, - short *adapter_nums) +int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct module *module, struct device *device) { - int i, num; + int num; mutex_lock(&dvbdev_register_lock); - for (i = 0; i < DVB_MAX_ADAPTERS; ++i) { - num = adapter_nums[i]; - if (num >= 0 && num < DVB_MAX_ADAPTERS) { - /* use the one the driver asked for */ - if (dvbdev_check_free_adapter_num(num)) - break; - } else { - num = dvbdev_get_free_adapter_num(); - break; - } - num = -1; - } - - if (num < 0) { + if ((num = dvbdev_get_free_adapter_num ()) < 0) { mutex_unlock(&dvbdev_register_lock); return -ENFILE; } diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-core/dvbdev.h --- a/linux/drivers/media/dvb/dvb-core/dvbdev.h Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-core/dvbdev.h Mon Jun 23 15:07:10 2008 -0700 @@ -31,10 +31,6 @@ #define DVB_MAJOR 212 -#define DVB_MAX_ADAPTERS 8 - -#define DVB_UNSET (-1) - #define DVB_DEVICE_VIDEO 0 #define DVB_DEVICE_AUDIO 1 #define DVB_DEVICE_SEC 2 @@ -45,11 +41,6 @@ #define DVB_DEVICE_NET 7 #define DVB_DEVICE_OSD 8 -#define DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr) \ - static short adapter_nr[] = \ - {[0 ... (DVB_MAX_ADAPTERS - 1)] = DVB_UNSET }; \ - module_param_array(adapter_nr, short, NULL, 0444); \ - MODULE_PARM_DESC(adapter_nr, "DVB adapter numbers") struct dvb_adapter { int num; @@ -87,9 +78,7 @@ struct dvb_device { }; -extern int dvb_register_adapter(struct dvb_adapter *adap, const char *name, - struct module *module, struct device *device, - short *adapter_nums); +extern int dvb_register_adapter (struct dvb_adapter *adap, const char *name, struct module *module, struct device *device); extern int dvb_unregister_adapter (struct dvb_adapter *adap); extern int dvb_register_device (struct dvb_adapter *adap, diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/Kconfig --- a/linux/drivers/media/dvb/dvb-usb/Kconfig Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/Kconfig Mon Jun 23 15:07:10 2008 -0700 @@ -183,13 +183,11 @@ config DVB_USB_VP702X DVB-S USB2.0 receivers. config DVB_USB_GP8PSK - tristate "GENPIX 8PSK->USB module support" + tristate "GENPIX DVB-s support" depends on DVB_USB help Say Y here to support the - GENPIX 8psk module - - DVB-S USB2.0 receivers. + GENPIX DVB-s USB2.0 receiver. config DVB_USB_NOVA_T_USB2 tristate "Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 support" diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/a800.c --- a/linux/drivers/media/dvb/dvb-usb/a800.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/a800.c Mon Jun 23 15:07:10 2008 -0700 @@ -18,9 +18,6 @@ static int debug; static int debug; module_param(debug, int, 0644); MODULE_PARM_DESC(debug, "set debugging level (rc=1 (or-able))." DVB_USB_DEBUG_STATUS); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); - #define deb_rc(args...) dprintk(debug,0x01,args) static int a800_power_ctrl(struct dvb_usb_device *d, int onoff) @@ -97,8 +94,7 @@ static int a800_probe(struct usb_interfa static int a800_probe(struct usb_interface *intf, const struct usb_device_id *id) { - return dvb_usb_device_init(intf, &a800_properties, - THIS_MODULE, NULL, adapter_nr); + return dvb_usb_device_init(intf,&a800_properties,THIS_MODULE,NULL); } /* do not change the order of the ID table */ diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/af9005.c --- a/linux/drivers/media/dvb/dvb-usb/af9005.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/af9005.c Mon Jun 23 15:07:10 2008 -0700 @@ -38,8 +38,6 @@ int dvb_usb_af9005_dump_eeprom = 0; int dvb_usb_af9005_dump_eeprom = 0; module_param_named(dump_eeprom, dvb_usb_af9005_dump_eeprom, int, 0); MODULE_PARM_DESC(dump_eeprom, "dump contents of the eeprom."); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); /* remote control decoder */ int (*rc_decode) (struct dvb_usb_device * d, u8 * data, int len, u32 * event, @@ -1022,8 +1020,7 @@ static int af9005_usb_probe(struct usb_i static int af9005_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) { - return dvb_usb_device_init(intf, &af9005_properties, - THIS_MODULE, NULL, adapter_nr); + return dvb_usb_device_init(intf, &af9005_properties, THIS_MODULE, NULL); } static struct usb_device_id af9005_usb_table[] = { diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/cxusb.c --- a/linux/drivers/media/dvb/dvb-usb/cxusb.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/cxusb.c Mon Jun 23 15:07:10 2008 -0700 @@ -39,9 +39,6 @@ static int dvb_usb_cxusb_debug; static int dvb_usb_cxusb_debug; module_param_named(debug, dvb_usb_cxusb_debug, int, 0644); MODULE_PARM_DESC(debug, "set debugging level (1=rc (or-able))." DVB_USB_DEBUG_STATUS); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); - #define deb_info(args...) dprintk(dvb_usb_cxusb_debug,0x01,args) #define deb_i2c(args...) if (d->udev->descriptor.idVendor == USB_VID_MEDION) \ dprintk(dvb_usb_cxusb_debug,0x01,args) @@ -494,14 +491,14 @@ static int dvico_bluebird_xc2028_callbac switch (command) { case XC2028_TUNER_RESET: - deb_info("%s: XC2028_TUNER_RESET %d\n", __func__, arg); + deb_info("%s: XC2028_TUNER_RESET %d\n", __FUNCTION__, arg); cxusb_bluebird_gpio_pulse(d, 0x01, 1); break; case XC2028_RESET_CLK: - deb_info("%s: XC2028_RESET_CLK %d\n", __func__, arg); + deb_info("%s: XC2028_RESET_CLK %d\n", __FUNCTION__, arg); break; default: - deb_info("%s: unknown command %d, arg %d\n", __func__, + deb_info("%s: unknown command %d, arg %d\n", __FUNCTION__, command, arg); return -EINVAL; } @@ -725,24 +722,16 @@ static int cxusb_probe(struct usb_interf static int cxusb_probe(struct usb_interface *intf, const struct usb_device_id *id) { - if (0 == dvb_usb_device_init(intf, &cxusb_medion_properties, - THIS_MODULE, NULL, adapter_nr) || - 0 == dvb_usb_device_init(intf, &cxusb_bluebird_lgh064f_properties, - THIS_MODULE, NULL, adapter_nr) || - 0 == dvb_usb_device_init(intf, &cxusb_bluebird_dee1601_properties, - THIS_MODULE, NULL, adapter_nr) || - 0 == dvb_usb_device_init(intf, &cxusb_bluebird_lgz201_properties, - THIS_MODULE, NULL, adapter_nr) || - 0 == dvb_usb_device_init(intf, &cxusb_bluebird_dtt7579_properties, - THIS_MODULE, NULL, adapter_nr) || - 0 == dvb_usb_device_init(intf, &cxusb_bluebird_dualdig4_properties, - THIS_MODULE, NULL, adapter_nr) || - 0 == dvb_usb_device_init(intf, &cxusb_bluebird_nano2_properties, - THIS_MODULE, NULL, adapter_nr) || - 0 == dvb_usb_device_init(intf, - &cxusb_bluebird_nano2_needsfirmware_properties, - THIS_MODULE, NULL, adapter_nr)) + if (dvb_usb_device_init(intf,&cxusb_medion_properties,THIS_MODULE,NULL) == 0 || + dvb_usb_device_init(intf,&cxusb_bluebird_lgh064f_properties,THIS_MODULE,NULL) == 0 || + dvb_usb_device_init(intf,&cxusb_bluebird_dee1601_properties,THIS_MODULE,NULL) == 0 || + dvb_usb_device_init(intf,&cxusb_bluebird_lgz201_properties,THIS_MODULE,NULL) == 0 || + dvb_usb_device_init(intf,&cxusb_bluebird_dtt7579_properties,THIS_MODULE,NULL) == 0 || + dvb_usb_device_init(intf,&cxusb_bluebird_dualdig4_properties,THIS_MODULE,NULL) == 0 || + dvb_usb_device_init(intf,&cxusb_bluebird_nano2_properties,THIS_MODULE,NULL) == 0 || + dvb_usb_device_init(intf,&cxusb_bluebird_nano2_needsfirmware_properties,THIS_MODULE,NULL) == 0) { return 0; + } return -EINVAL; } diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/dib0700_core.c --- a/linux/drivers/media/dvb/dvb-usb/dib0700_core.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/dib0700_core.c Mon Jun 23 15:07:10 2008 -0700 @@ -16,8 +16,6 @@ int dvb_usb_dib0700_ir_proto = 1; int dvb_usb_dib0700_ir_proto = 1; module_param(dvb_usb_dib0700_ir_proto, int, 0644); MODULE_PARM_DESC(dvb_usb_dib0700_ir_proto, "set ir protocol (0=NEC, 1=RC5 (default), 2=RC6)."); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); /* expecting rx buffer: request data[0] data[1] ... data[2] */ static int dib0700_ctrl_wr(struct dvb_usb_device *d, u8 *tx, u8 txlen) @@ -291,8 +289,7 @@ static int dib0700_probe(struct usb_inte #endif for (i = 0; i < dib0700_device_count; i++) - if (dvb_usb_device_init(intf, &dib0700_devices[i], THIS_MODULE, - &dev, adapter_nr) == 0) + if (dvb_usb_device_init(intf, &dib0700_devices[i], THIS_MODULE, &dev) == 0) { dib0700_rc_setup(dev); return 0; diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/dibusb-mb.c --- a/linux/drivers/media/dvb/dvb-usb/dibusb-mb.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/dibusb-mb.c Mon Jun 23 15:07:10 2008 -0700 @@ -13,8 +13,6 @@ * see Documentation/dvb/README.dvb-usb for more information */ #include "dibusb.h" - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); static int dib3000mb_i2c_gate_ctrl(struct dvb_frontend* fe, int enable) { @@ -109,14 +107,10 @@ static int dibusb_probe(struct usb_inter static int dibusb_probe(struct usb_interface *intf, const struct usb_device_id *id) { - if (0 == dvb_usb_device_init(intf, &dibusb1_1_properties, - THIS_MODULE, NULL, adapter_nr) || - 0 == dvb_usb_device_init(intf, &dibusb1_1_an2235_properties, - THIS_MODULE, NULL, adapter_nr) || - 0 == dvb_usb_device_init(intf, &dibusb2_0b_properties, - THIS_MODULE, NULL, adapter_nr) || - 0 == dvb_usb_device_init(intf, &artec_t1_usb2_properties, - THIS_MODULE, NULL, adapter_nr)) + if (dvb_usb_device_init(intf,&dibusb1_1_properties,THIS_MODULE,NULL) == 0 || + dvb_usb_device_init(intf,&dibusb1_1_an2235_properties,THIS_MODULE,NULL) == 0 || + dvb_usb_device_init(intf,&dibusb2_0b_properties,THIS_MODULE,NULL) == 0 || + dvb_usb_device_init(intf,&artec_t1_usb2_properties,THIS_MODULE,NULL) == 0) return 0; return -EINVAL; diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/dibusb-mc.c --- a/linux/drivers/media/dvb/dvb-usb/dibusb-mc.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/dibusb-mc.c Mon Jun 23 15:07:10 2008 -0700 @@ -14,16 +14,13 @@ */ #include "dibusb.h" -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); - /* USB Driver stuff */ static struct dvb_usb_device_properties dibusb_mc_properties; static int dibusb_mc_probe(struct usb_interface *intf, const struct usb_device_id *id) { - return dvb_usb_device_init(intf, &dibusb_mc_properties, THIS_MODULE, - NULL, adapter_nr); + return dvb_usb_device_init(intf,&dibusb_mc_properties,THIS_MODULE,NULL); } /* do not change the order of the ID table */ diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/digitv.c --- a/linux/drivers/media/dvb/dvb-usb/digitv.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/digitv.c Mon Jun 23 15:07:10 2008 -0700 @@ -20,9 +20,6 @@ static int dvb_usb_digitv_debug; static int dvb_usb_digitv_debug; module_param_named(debug,dvb_usb_digitv_debug, int, 0644); MODULE_PARM_DESC(debug, "set debugging level (1=rc (or-able))." DVB_USB_DEBUG_STATUS); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); - #define deb_rc(args...) dprintk(dvb_usb_digitv_debug,0x01,args) static int digitv_ctrl_msg(struct dvb_usb_device *d, @@ -259,9 +256,8 @@ static int digitv_probe(struct usb_inter const struct usb_device_id *id) { struct dvb_usb_device *d; - int ret = dvb_usb_device_init(intf, &digitv_properties, THIS_MODULE, &d, - adapter_nr); - if (ret == 0) { + int ret; + if ((ret = dvb_usb_device_init(intf,&digitv_properties,THIS_MODULE,&d)) == 0) { u8 b[4] = { 0 }; if (d != NULL) { /* do that only when the firmware is loaded */ diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/dtt200u.c --- a/linux/drivers/media/dvb/dvb-usb/dtt200u.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/dtt200u.c Mon Jun 23 15:07:10 2008 -0700 @@ -17,8 +17,6 @@ int dvb_usb_dtt200u_debug; int dvb_usb_dtt200u_debug; module_param_named(debug,dvb_usb_dtt200u_debug, int, 0644); MODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2 (or-able))." DVB_USB_DEBUG_STATUS); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); static int dtt200u_power_ctrl(struct dvb_usb_device *d, int onoff) { @@ -103,16 +101,11 @@ static int dtt200u_usb_probe(struct usb_ static int dtt200u_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) { - if (0 == dvb_usb_device_init(intf, &dtt200u_properties, - THIS_MODULE, NULL, adapter_nr) || - 0 == dvb_usb_device_init(intf, &wt220u_properties, - THIS_MODULE, NULL, adapter_nr) || - 0 == dvb_usb_device_init(intf, &wt220u_fc_properties, - THIS_MODULE, NULL, adapter_nr) || - 0 == dvb_usb_device_init(intf, &wt220u_zl0353_properties, - THIS_MODULE, NULL, adapter_nr) || - 0 == dvb_usb_device_init(intf, &wt220u_miglia_properties, - THIS_MODULE, NULL, adapter_nr)) + if (dvb_usb_device_init(intf,&dtt200u_properties,THIS_MODULE,NULL) == 0 || + dvb_usb_device_init(intf,&wt220u_properties,THIS_MODULE,NULL) == 0 || + dvb_usb_device_init(intf,&wt220u_fc_properties,THIS_MODULE,NULL) == 0 || + dvb_usb_device_init(intf,&wt220u_zl0353_properties,THIS_MODULE,NULL) == 0 || + dvb_usb_device_init(intf,&wt220u_miglia_properties,THIS_MODULE,NULL) == 0) return 0; return -ENODEV; diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/dvb-usb-common.h --- a/linux/drivers/media/dvb/dvb-usb/dvb-usb-common.h Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/dvb-usb-common.h Mon Jun 23 15:07:10 2008 -0700 @@ -40,8 +40,7 @@ extern int dvb_usb_i2c_init(struct dvb_u extern int dvb_usb_i2c_init(struct dvb_usb_device *); extern int dvb_usb_i2c_exit(struct dvb_usb_device *); -extern int dvb_usb_adapter_dvb_init(struct dvb_usb_adapter *adap, - short *adapter_nums); +extern int dvb_usb_adapter_dvb_init(struct dvb_usb_adapter *adap); extern int dvb_usb_adapter_dvb_exit(struct dvb_usb_adapter *adap); extern int dvb_usb_adapter_frontend_init(struct dvb_usb_adapter *adap); extern int dvb_usb_adapter_frontend_exit(struct dvb_usb_adapter *adap); diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c --- a/linux/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c Mon Jun 23 15:07:10 2008 -0700 @@ -77,13 +77,12 @@ static int dvb_usb_stop_feed(struct dvb_ return dvb_usb_ctrl_feed(dvbdmxfeed,0); } -int dvb_usb_adapter_dvb_init(struct dvb_usb_adapter *adap, short *adapter_nums) +int dvb_usb_adapter_dvb_init(struct dvb_usb_adapter *adap) { - int ret = dvb_register_adapter(&adap->dvb_adap, adap->dev->desc->name, - adap->dev->owner, &adap->dev->udev->dev, - adapter_nums); + int ret; - if (ret < 0) { + if ((ret = dvb_register_adapter(&adap->dvb_adap, adap->dev->desc->name, + adap->dev->owner, &adap->dev->udev->dev)) < 0) { deb_info("dvb_register_adapter failed: error %d", ret); goto err; } diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h --- a/linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h Mon Jun 23 15:07:10 2008 -0700 @@ -136,6 +136,8 @@ #define USB_PID_HAUPPAUGE_NOVA_TD_STICK 0x9580 #define USB_PID_AVERMEDIA_EXPRESS 0xb568 #define USB_PID_AVERMEDIA_VOLAR 0xa807 +#define USB_PID_GENPIX_8PSK_REV_2 0x0202 +#define USB_PID_GENPIX_SKYWALKER 0x0203 #define USB_PID_AVERMEDIA_VOLAR_2 0xb808 #define USB_PID_TECHNOTREND_CONNECT_S2400 0x3006 #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY 0x005a @@ -183,11 +185,8 @@ #define USB_PID_WINFAST_DTV_DONGLE_WARM 0x6026 #define USB_PID_WINFAST_DTV_DONGLE_STK7700P 0x6f00 #define USB_PID_WINFAST_DTV_DONGLE_STK7700P_2 0x6f01 -#define USB_PID_GENPIX_8PSK_REV_1_COLD 0x0200 -#define USB_PID_GENPIX_8PSK_REV_1_WARM 0x0201 -#define USB_PID_GENPIX_8PSK_REV_2 0x0202 -#define USB_PID_GENPIX_SKYWALKER_1 0x0203 -#define USB_PID_GENPIX_SKYWALKER_CW3K 0x0204 +#define USB_PID_GENPIX_8PSK_COLD 0x0200 +#define USB_PID_GENPIX_8PSK_WARM 0x0201 #define USB_PID_SIGMATEK_DVB_110 0x6610 #define USB_PID_MSI_DIGI_VOX_MINI_II 0x1513 #define USB_PID_OPERA1_COLD 0x2830 diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/dvb-usb-init.c --- a/linux/drivers/media/dvb/dvb-usb/dvb-usb-init.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/dvb-usb-init.c Mon Jun 23 15:07:10 2008 -0700 @@ -26,7 +26,7 @@ module_param_named(force_pid_filter_usag module_param_named(force_pid_filter_usage, dvb_usb_force_pid_filter_usage, int, 0444); MODULE_PARM_DESC(force_pid_filter_usage, "force all dvb-usb-devices to use a PID filter, if any (default: 0)."); -static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs) +static int dvb_usb_adapter_init(struct dvb_usb_device *d) { struct dvb_usb_adapter *adap; int ret,n; @@ -72,7 +72,7 @@ static int dvb_usb_adapter_init(struct d } if ((ret = dvb_usb_adapter_stream_init(adap)) || - (ret = dvb_usb_adapter_dvb_init(adap, adapter_nrs)) || + (ret = dvb_usb_adapter_dvb_init(adap)) || (ret = dvb_usb_adapter_frontend_init(adap))) { return ret; } @@ -122,7 +122,7 @@ static int dvb_usb_exit(struct dvb_usb_d return 0; } -static int dvb_usb_init(struct dvb_usb_device *d, short *adapter_nums) +static int dvb_usb_init(struct dvb_usb_device *d) { int ret = 0; @@ -143,7 +143,7 @@ static int dvb_usb_init(struct dvb_usb_d dvb_usb_device_power_ctrl(d, 1); if ((ret = dvb_usb_i2c_init(d)) || - (ret = dvb_usb_adapter_init(d, adapter_nums))) { + (ret = dvb_usb_adapter_init(d))) { dvb_usb_exit(d); return ret; } @@ -213,10 +213,8 @@ int dvb_usb_device_power_ctrl(struct dvb /* * USB */ -int dvb_usb_device_init(struct usb_interface *intf, - struct dvb_usb_device_properties *props, - struct module *owner, struct dvb_usb_device **du, - short *adapter_nums) +int dvb_usb_device_init(struct usb_interface *intf, struct dvb_usb_device_properties + *props, struct module *owner,struct dvb_usb_device **du) { struct usb_device *udev = interface_to_usbdev(intf); struct dvb_usb_device *d = NULL; @@ -256,7 +254,7 @@ int dvb_usb_device_init(struct usb_inter if (du != NULL) *du = d; - ret = dvb_usb_init(d, adapter_nums); + ret = dvb_usb_init(d); if (ret == 0) info("%s successfully initialized and connected.",desc->name); diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/dvb-usb.h --- a/linux/drivers/media/dvb/dvb-usb/dvb-usb.h Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/dvb-usb.h Mon Jun 23 15:07:10 2008 -0700 @@ -186,6 +186,7 @@ struct dvb_usb_adapter_properties { * @num_device_descs: number of struct dvb_usb_device_description in @devices * @devices: array of struct dvb_usb_device_description compatibles with these * properties. + * @device_version: called to find out the version number. */ #define MAX_NO_OF_ADAPTER_PER_DEVICE 2 struct dvb_usb_device_properties { @@ -227,6 +228,7 @@ struct dvb_usb_device_properties { int num_device_descs; struct dvb_usb_device_description devices[9]; + int (*device_version) (struct dvb_usb_device *, int *); }; /** @@ -387,10 +389,7 @@ struct dvb_usb_device { void *priv; }; -extern int dvb_usb_device_init(struct usb_interface *, - struct dvb_usb_device_properties *, - struct module *, struct dvb_usb_device **, - short *adapter_nums); +extern int dvb_usb_device_init(struct usb_interface *, struct dvb_usb_device_properties *, struct module *, struct dvb_usb_device **); extern void dvb_usb_device_exit(struct usb_interface *); /* the generic read/write method for device control */ diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/gp8psk-fe.c --- a/linux/drivers/media/dvb/dvb-usb/gp8psk-fe.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/gp8psk-fe.c Mon Jun 23 15:07:10 2008 -0700 @@ -1,12 +1,12 @@ -/* DVB USB compliant Linux driver for the - * - GENPIX 8pks/qpsk/DCII USB2.0 DVB-S module +/* DVB USB compliant Linux driver for these USB 2.0 DVB-S modules + * - GENPIX 8PSK-to-USB2 + * - GENPIX 8PSK-to-USB2 Rev.2 + * - GENPIX SkyWalker-1 * - * Copyright (C) 2006,2007 Alan Nisota (alannisota@gmail.com) - * Copyright (C) 2006,2007 Genpix Electronics (genpix@genpix-electronics.com) - * - * Thanks to GENPIX for the sample code used to implement this module. + * Copyright (C) 2007 Genpix Electronics (genpix@genpix-electronics.com) * * This module is based off the vp7045 and vp702x modules + * and original version of dvb-usb-gp8ps (written by Alan Nisota (c) 2006) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free @@ -16,7 +16,7 @@ */ #include "gp8psk.h" -struct gp8psk_fe_state { +struct gp_universal_fe_state { struct dvb_frontend fe; struct dvb_usb_device *d; u8 lock; @@ -25,22 +25,37 @@ struct gp8psk_fe_state { unsigned long status_check_interval; }; -static int gp8psk_fe_update_status(struct gp8psk_fe_state *st) +static int gp_universal_tuned_to_DCII(struct dvb_frontend* fe) +{ + struct gp_universal_fe_state *st = fe->demodulator_priv; + u8 status; + gp_universal_usb_in_op(st->d, GET_GENPIX_CONFIG, 0,0,&status,1); + return (status & bmDCtuned); +} + +static int gp_universal_set_tuner_mode(struct dvb_frontend* fe, int mode) +{ + struct gp_universal_fe_state *state = fe->demodulator_priv; + return gp_universal_usb_out_op(state->d, SET_GENPIX_CONFIG, mode,0,NULL,0); +} + +static int gp_universal_fe_update_status(struct gp_universal_fe_state *st) { u8 buf[6]; if (time_after(jiffies,st->next_status_check)) { - gp8psk_usb_in_op(st->d, GET_SIGNAL_LOCK, 0,0,&st->lock,1); - gp8psk_usb_in_op(st->d, GET_SIGNAL_STRENGTH, 0,0,buf,6); + gp_universal_usb_in_op(st->d, GET_SIGNAL_LOCK, 0,0,&st->lock,1); + gp_universal_usb_in_op(st->d, GET_SIGNAL_STRENGTH, 0,0,buf,6); st->snr = (buf[1]) << 8 | buf[0]; st->next_status_check = jiffies + (st->status_check_interval*HZ)/1000; } return 0; } -static int gp8psk_fe_read_status(struct dvb_frontend* fe, fe_status_t *status) + +static int gp_universal_fe_read_status(struct dvb_frontend* fe, fe_status_t *status) { - struct gp8psk_fe_state *st = fe->demodulator_priv; - gp8psk_fe_update_status(st); + struct gp_universal_fe_state *st = fe->demodulator_priv; + gp_universal_fe_update_status(st); if (st->lock) *status = FE_HAS_LOCK | FE_HAS_SYNC | FE_HAS_VITERBI | FE_HAS_SIGNAL | FE_HAS_CARRIER; @@ -54,8 +69,19 @@ static int gp8psk_fe_read_status(struct return 0; } +static int gp_universal_set_standard(struct dvb_frontend* fe, u32 type) +{ + (void) fe; + if (type == FE_DVB_S2 || type == FE_DVB_S) { + fe->ops.info.type = type; + return 0; + } else { + fe->ops.info.type = FE_QPSK; + return 1; + } +} /* not supported by this Frontend */ -static int gp8psk_fe_read_ber(struct dvb_frontend* fe, u32 *ber) +static int gp_universal_fe_read_ber(struct dvb_frontend* fe, u32 *ber) { (void) fe; *ber = 0; @@ -63,26 +89,26 @@ static int gp8psk_fe_read_ber(struct dvb } /* not supported by this Frontend */ -static int gp8psk_fe_read_unc_blocks(struct dvb_frontend* fe, u32 *unc) +static int gp_universal_fe_read_unc_blocks(struct dvb_frontend* fe, u32 *unc) { (void) fe; *unc = 0; return 0; } -static int gp8psk_fe_read_snr(struct dvb_frontend* fe, u16 *snr) +static int gp_universal_fe_read_snr(struct dvb_frontend* fe, u16 *snr) { - struct gp8psk_fe_state *st = fe->demodulator_priv; - gp8psk_fe_update_status(st); + struct gp_universal_fe_state *st = fe->demodulator_priv; + gp_universal_fe_update_status(st); /* snr is reported in dBu*256 */ *snr = st->snr; return 0; } -static int gp8psk_fe_read_signal_strength(struct dvb_frontend* fe, u16 *strength) +static int gp_universal_fe_read_signal_strength(struct dvb_frontend* fe, u16 *strength) { - struct gp8psk_fe_state *st = fe->demodulator_priv; - gp8psk_fe_update_status(st); + struct gp_universal_fe_state *st = fe->demodulator_priv; + gp_universal_fe_update_status(st); /* snr is reported in dBu*256 */ /* snr / 38.4 ~= 100% strength */ /* snr * 17 returns 100% strength as 65535 */ @@ -93,16 +119,16 @@ static int gp8psk_fe_read_signal_strengt return 0; } -static int gp8psk_fe_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings *tune) +static int gp_universal_fe_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings *tune) { - tune->min_delay_ms = 200; + tune->min_delay_ms = 800; return 0; } -static int gp8psk_fe_set_frontend(struct dvb_frontend* fe, - struct dvb_frontend_parameters *fep) +static int gp_universal_fe_set_frontend2(struct dvb_frontend* fe, + struct dvb_frontend_parameters_new *fep) { - struct gp8psk_fe_state *state = fe->demodulator_priv; + struct gp_universal_fe_state *state = fe->demodulator_priv; u8 cmd[10]; u32 freq = fep->frequency * 1000; @@ -112,16 +138,114 @@ static int gp8psk_fe_set_frontend(struct cmd[7] = (freq >> 24) & 0xff; switch(fe->ops.info.type) { + case FE_DVB_S: case FE_QPSK: + if (gp_product_id == USB_PID_GENPIX_8PSK_WARM) + if (gp_universal_tuned_to_DCII(fe)) + gp_universal_bcm4500_reload(state->d); cmd[0] = fep->u.qpsk.symbol_rate & 0xff; cmd[1] = (fep->u.qpsk.symbol_rate >> 8) & 0xff; cmd[2] = (fep->u.qpsk.symbol_rate >> 16) & 0xff; cmd[3] = (fep->u.qpsk.symbol_rate >> 24) & 0xff; cmd[8] = ADV_MOD_DVB_QPSK; - cmd[9] = 0x03; /*ADV_MOD_FEC_XXX*/ + cmd[9] = 5; + break; + case FE_DVB_S2: + cmd[0] = fep->u.qpsk2.symbol_rate & 0xff; + cmd[1] = (fep->u.qpsk2.symbol_rate >> 8) & 0xff; + cmd[2] = (fep->u.qpsk2.symbol_rate >> 16) & 0xff; + cmd[3] = (fep->u.qpsk2.symbol_rate >> 24) & 0xff; + switch (fep->u.qpsk2.modulation) { + case MOD_QPSK: + cmd[8] = ADV_MOD_DVB_QPSK; + if (gp_product_id == USB_PID_GENPIX_8PSK_WARM) + if (gp_universal_tuned_to_DCII(fe)) + gp_universal_bcm4500_reload(state->d); + switch (fep->u.qpsk.fec_inner) { + case FEC_1_2: cmd[9] = 0; break; + case FEC_2_3: cmd[9] = 1; break; + case FEC_3_4: cmd[9] = 2; break; + case FEC_5_6: cmd[9] = 3; break; + case FEC_7_8: cmd[9] = 4; break; + case FEC_AUTO: cmd[9] = 5; break; + default: cmd[9] = 5; break; + } + break; + case MOD_QPSK_TURBO: + cmd[8] = ADV_MOD_TURBO_QPSK; + switch (fep->u.qpsk2.fec_inner) { + case FEC_1_4: cmd[9] = 0; break; + case FEC_1_2: cmd[9] = 1; break; + case FEC_2_3: cmd[9] = 0; cmd[8] = ADV_MOD_TURBO_16QAM; break; + case FEC_3_4: cmd[9] = 2; break; + default: cmd[9] = 0; break; + } + break; + case MOD_8PSK_TURBO: + case MOD_8PSK: /* MOD_8PSK is for compatibility with DN */ + cmd[8] = ADV_MOD_TURBO_8PSK; + switch (fep->u.qpsk2.fec_inner) { + case FEC_2_3: cmd[9] = 0; break; + case FEC_3_4: cmd[9] = 1; break; + case FEC_3_5: cmd[9] = 2; break; + case FEC_5_6: cmd[9] = 3; break; + case FEC_8_9: cmd[9] = 4; break; + default: cmd[9] = 0; break; + } + break; + case MOD_16QAM_TURBO: + case MOD_QAM_16: /* MOD_QAM_16 is for compatibility with DN */ + cmd[8] = ADV_MOD_TURBO_16QAM; + cmd[9] = 0; + break; + case MOD_DCII_C_QPSK: + cmd[8] = ADV_MOD_DCII_C_QPSK; + goto fill_fec; + case MOD_DCII_I_QPSK: + cmd[8] = ADV_MOD_DCII_I_QPSK; + goto fill_fec; + case MOD_DCII_Q_QPSK: + cmd[8] = ADV_MOD_DCII_Q_QPSK; + goto fill_fec; + case MOD_DCII_C_OQPSK: + cmd[8] = ADV_MOD_DCII_C_OQPSK; +fill_fec: + switch (fep->u.qpsk2.fec_inner) { + case FEC_5_11: cmd[9] = 0; break; + case FEC_1_2: cmd[9] = 1; break; + case FEC_3_5: cmd[9] = 2; break; + case FEC_2_3: cmd[9] = 3; break; + case FEC_3_4: cmd[9] = 4; break; + case FEC_4_5: cmd[9] = 5; break; + case FEC_5_6: cmd[9] = 6; break; + case FEC_7_8: cmd[9] = 7; break; + case FEC_AUTO: cmd[9] = 8; break; + default: cmd[9] = 8; break; + } + break; + case MOD_DSS_QPSK: + cmd[8] = ADV_MOD_DSS_QPSK; + switch (fep->u.qpsk.fec_inner) { + case FEC_1_2: cmd[9] = 0; break; + case FEC_2_3: cmd[9] = 1; break; + case FEC_3_4: cmd[9] = 2; break; + case FEC_5_6: cmd[9] = 3; break; + case FEC_7_8: cmd[9] = 4; break; + case FEC_AUTO: cmd[9] = 5; break; + case FEC_6_7: cmd[9] = 6; break; + default: cmd[9] = 5; break; + } + break; + default: + info("WRONG modulation selected"); + cmd[8] = ADV_MOD_DVB_QPSK; + cmd[9] = 5; /* FEC_AUTO */ + break; + } break; default: // other modes are unsuported right now +// info("you should not be here"); cmd[0] = 0; cmd[1] = 0; cmd[2] = 0; @@ -131,7 +255,9 @@ static int gp8psk_fe_set_frontend(struct break; } - gp8psk_usb_out_op(state->d,TUNE_8PSK,0,0,cmd,10); + if (gp_product_id == USB_PID_GENPIX_8PSK_WARM) + gp_universal_set_tuner_mode(fe,0); + gp_universal_usb_out_op(state->d, TUNE_GENPIX, 0,0,cmd,10); state->lock = 0; state->next_status_check = jiffies; @@ -140,106 +266,111 @@ static int gp8psk_fe_set_frontend(struct return 0; } -static int gp8psk_fe_get_frontend(struct dvb_frontend* fe, +static int gp_universal_fe_set_frontend(struct dvb_frontend* fe, + struct dvb_frontend_parameters *fep) +{ + return gp_universal_fe_set_frontend2(fe, + (struct dvb_frontend_parameters_new *) fep); +} + + +static int gp_universal_fe_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *fep) { return 0; } -static int gp8psk_fe_send_diseqc_msg (struct dvb_frontend* fe, +static int gp_universal_fe_send_diseqc_msg (struct dvb_frontend* fe, struct dvb_diseqc_master_cmd *m) { - struct gp8psk_fe_state *st = fe->demodulator_priv; + struct gp_universal_fe_state *st = fe->demodulator_priv; - deb_fe("%s\n",__func__); + deb_fe("%s\n",__FUNCTION__); - if (gp8psk_usb_out_op(st->d,SEND_DISEQC_COMMAND, m->msg[0], 0, + if (gp_universal_usb_out_op(st->d,SEND_DISEQC_COMMAND, m->msg[0], 0, m->msg, m->msg_len)) { return -EINVAL; } return 0; } -static int gp8psk_fe_send_diseqc_burst (struct dvb_frontend* fe, +static int gp_universal_fe_send_diseqc_burst (struct dvb_frontend* fe, fe_sec_mini_cmd_t burst) { - struct gp8psk_fe_state *st = fe->demodulator_priv; + struct gp_universal_fe_state *st = fe->demodulator_priv; u8 cmd; - deb_fe("%s\n",__func__); + deb_fe("%s\n",__FUNCTION__); - /* These commands are certainly wrong */ cmd = (burst == SEC_MINI_A) ? 0x00 : 0x01; - - if (gp8psk_usb_out_op(st->d,SEND_DISEQC_COMMAND, cmd, 0, - &cmd, 0)) { + if (gp_universal_usb_out_op(st->d,SEND_DISEQC_COMMAND, cmd, 0, + NULL, 0)) { return -EINVAL; } return 0; } -static int gp8psk_fe_set_tone (struct dvb_frontend* fe, fe_sec_tone_mode_t tone) +static int gp_universal_fe_set_tone (struct dvb_frontend* fe, fe_sec_tone_mode_t tone) { - struct gp8psk_fe_state* state = fe->demodulator_priv; + struct gp_universal_fe_state* state = fe->demodulator_priv; - if (gp8psk_usb_out_op(state->d,SET_22KHZ_TONE, + if (gp_universal_usb_out_op(state->d,SET_22KHZ_TONE, (tone == SEC_TONE_ON), 0, NULL, 0)) { return -EINVAL; } return 0; } -static int gp8psk_fe_set_voltage (struct dvb_frontend* fe, fe_sec_voltage_t voltage) +static int gp_universal_fe_set_voltage (struct dvb_frontend* fe, fe_sec_voltage_t voltage) { - struct gp8psk_fe_state* state = fe->demodulator_priv; + struct gp_universal_fe_state* state = fe->demodulator_priv; - if (gp8psk_usb_out_op(state->d,SET_LNB_VOLTAGE, + if (gp_universal_usb_out_op(state->d,SET_LNB_VOLTAGE, voltage == SEC_VOLTAGE_18, 0, NULL, 0)) { return -EINVAL; } return 0; } -static int gp8psk_fe_enable_high_lnb_voltage(struct dvb_frontend* fe, long onoff) +static int gp_universal_fe_enable_high_lnb_voltage(struct dvb_frontend* fe, long onoff) { - struct gp8psk_fe_state* state = fe->demodulator_priv; - return gp8psk_usb_out_op(state->d, USE_EXTRA_VOLT, onoff, 0,NULL,0); + struct gp_universal_fe_state* state = fe->demodulator_priv; + return gp_universal_usb_out_op(state->d, USE_EXTRA_VOLT, onoff, 0,NULL,0); } -static int gp8psk_fe_send_legacy_dish_cmd (struct dvb_frontend* fe, unsigned long sw_cmd) +static int gp_universal_fe_send_legacy_dish_cmd (struct dvb_frontend* fe, unsigned long sw_cmd) { - struct gp8psk_fe_state* state = fe->demodulator_priv; + struct gp_universal_fe_state* state = fe->demodulator_priv; u8 cmd = sw_cmd & 0x7f; - if (gp8psk_usb_out_op(state->d,SET_DN_SWITCH, cmd, 0, + if (gp_universal_usb_out_op(state->d,SET_DN_SWITCH, cmd, 0, NULL, 0)) { return -EINVAL; } - if (gp8psk_usb_out_op(state->d,SET_LNB_VOLTAGE, !!(sw_cmd & 0x80), + if (gp_universal_usb_out_op(state->d,SET_LNB_VOLTAGE, !!(sw_cmd & 0x80), 0, NULL, 0)) { return -EINVAL; } - return 0; } -static void gp8psk_fe_release(struct dvb_frontend* fe) +static void gp_universal_fe_release(struct dvb_frontend* fe) { - struct gp8psk_fe_state *state = fe->demodulator_priv; + struct gp_universal_fe_state *state = fe->demodulator_priv; kfree(state); } -static struct dvb_frontend_ops gp8psk_fe_ops; +static struct dvb_frontend_ops gp_universal_fe_ops; -struct dvb_frontend * gp8psk_fe_attach(struct dvb_usb_device *d) +struct dvb_frontend * gp_universal_fe_attach(struct dvb_usb_device *d) { - struct gp8psk_fe_state *s = kzalloc(sizeof(struct gp8psk_fe_state), GFP_KERNEL); + struct gp_universal_fe_state *s = kzalloc(sizeof(struct gp_universal_fe_state), GFP_KERNEL); if (s == NULL) goto error; s->d = d; - memcpy(&s->fe.ops, &gp8psk_fe_ops, sizeof(struct dvb_frontend_ops)); + memcpy(&s->fe.ops, &gp_universal_fe_ops, sizeof(struct dvb_frontend_ops)); s->fe.demodulator_priv = s; goto success; @@ -250,41 +381,55 @@ success: } -static struct dvb_frontend_ops gp8psk_fe_ops = { +static struct dvb_frontend_ops gp_universal_fe_ops = { .info = { - .name = "Genpix 8psk-to-USB2 DVB-S", - .type = FE_QPSK, - .frequency_min = 800000, - .frequency_max = 2250000, + .name = "Genpix DVB-s", + .type = FE_DVB_S2, + .frequency_min = 760000, + .frequency_max = 2270000, .frequency_stepsize = 100, .symbol_rate_min = 1000000, .symbol_rate_max = 45000000, .symbol_rate_tolerance = 500, /* ppm */ .caps = FE_CAN_INVERSION_AUTO | - FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | - FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | - FE_CAN_QPSK + FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | + FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | + // FE_CAN_QAM_16 is for compatibility + // (Myth incorrectly detects Turbo-QPSK as plain QAM-16) + FE_CAN_QPSK | FE_CAN_QAM_16 | FE_HAS_EXTENDED_INFO }, + .extended_info = { + .caps = FE_CAN_FEC_1_4 | FE_CAN_FEC_5_11 | FE_CAN_FEC_3_5 | + // FE_CAN_8PSK is for compatibility + //(Myth incorrectly detectS Turbo-8PSK as plain 8PSK) + FE_CAN_8PSK | + FE_CAN_TURBO_FEC | FE_CAN_DCII | FE_CAN_DSS_QPSK, + .standards = FE_DVB_S | FE_DVB_S2 + }, + .set_standard = gp_universal_set_standard, - .release = gp8psk_fe_release, + .release = gp_universal_fe_release, .init = NULL, .sleep = NULL, - .set_frontend = gp8psk_fe_set_frontend, - .get_frontend = gp8psk_fe_get_frontend, - .get_tune_settings = gp8psk_fe_get_tune_settings, + .set_frontend = gp_universal_fe_set_frontend, + .get_frontend = gp_universal_fe_get_frontend, - .read_status = gp8psk_fe_read_status, - .read_ber = gp8psk_fe_read_ber, - .read_signal_strength = gp8psk_fe_read_signal_strength, - .read_snr = gp8psk_fe_read_snr, - .read_ucblocks = gp8psk_fe_read_unc_blocks, + .set_frontend2 = gp_universal_fe_set_frontend2, + .get_frontend2 = NULL, - .diseqc_send_master_cmd = gp8psk_fe_send_diseqc_msg, - .diseqc_send_burst = gp8psk_fe_send_diseqc_burst, - .set_tone = gp8psk_fe_set_tone, - .set_voltage = gp8psk_fe_set_voltage, - .dishnetwork_send_legacy_command = gp8psk_fe_send_legacy_dish_cmd, - .enable_high_lnb_voltage = gp8psk_fe_enable_high_lnb_voltage + .get_tune_settings = gp_universal_fe_get_tune_settings, + + .read_status = gp_universal_fe_read_status, + .read_ber = NULL, + .read_signal_strength = gp_universal_fe_read_signal_strength, + .read_snr = gp_universal_fe_read_snr, + .read_ucblocks = NULL, + .diseqc_send_master_cmd = gp_universal_fe_send_diseqc_msg, + .diseqc_send_burst = gp_universal_fe_send_diseqc_burst, + .set_tone = gp_universal_fe_set_tone, + .set_voltage = gp_universal_fe_set_voltage, + .dishnetwork_send_legacy_command = gp_universal_fe_send_legacy_dish_cmd, + .enable_high_lnb_voltage = gp_universal_fe_enable_high_lnb_voltage }; diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/gp8psk.c --- a/linux/drivers/media/dvb/dvb-usb/gp8psk.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/gp8psk.c Mon Jun 23 15:07:10 2008 -0700 @@ -1,12 +1,12 @@ -/* DVB USB compliant Linux driver for the - * - GENPIX 8pks/qpsk/DCII USB2.0 DVB-S module +/* DVB USB compliant Linux driver for these USB 2.0 DVB-S modules + * - GENPIX 8PSK-to-USB2 + * - GENPIX 8PSK-to-USB2 Rev.2 + * - GENPIX SkyWalker-1 * - * Copyright (C) 2006,2007 Alan Nisota (alannisota@gmail.com) - * Copyright (C) 2006,2007 Genpix Electronics (genpix@genpix-electronics.com) - * - * Thanks to GENPIX for the sample code used to implement this module. + * Copyright (C) 2007 Genpix Electronics (genpix@genpix-electronics.com) * * This module is based off the vp7045 and vp702x modules + * and original version of dvb-usb-gp8ps (written by Alan Nisota (c) 2006) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free @@ -17,14 +17,13 @@ #include "gp8psk.h" /* debug */ -static char bcm4500_firmware[] = "dvb-usb-gp8psk-02.fw"; -int dvb_usb_gp8psk_debug; -module_param_named(debug,dvb_usb_gp8psk_debug, int, 0644); +static char bcm4500_firmware[] = "dvb-gp8psk-02.fw"; +int dvb_usb_gp_universal_debug; +int gp_product_id; +module_param_named(debug,dvb_usb_gp_universal_debug, int, 0644); MODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2,rc=4 (or-able))." DVB_USB_DEBUG_STATUS); -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); - -int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen) +int gp_universal_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen) { int ret = 0,try = 0; @@ -43,7 +42,7 @@ int gp8psk_usb_in_op(struct dvb_usb_devi } if (ret < 0 || ret != blen) { - warn("usb in %d operation failed.", req); + warn("usb in operation failed."); ret = -EIO; } else ret = 0; @@ -56,7 +55,7 @@ int gp8psk_usb_in_op(struct dvb_usb_devi return ret; } -int gp8psk_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, +int gp_universal_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen) { int ret; @@ -82,7 +81,7 @@ int gp8psk_usb_out_op(struct dvb_usb_dev return ret; } -static int gp8psk_load_bcm4500fw(struct dvb_usb_device *d) +static int gp_universal_load_bcm4500fw(struct dvb_usb_device *d) { int ret; const struct firmware *fw = NULL; @@ -96,11 +95,10 @@ static int gp8psk_load_bcm4500fw(struct } ret = -EINVAL; + if (gp_universal_usb_out_op(d, LOAD_BCM4500,1,0,NULL, 0)) + goto out_rel_fw; - if (gp8psk_usb_out_op(d, LOAD_BCM4500,1,0,NULL, 0)) - goto out_rel_fw; - - info("downloading bcm4500 firmware from file '%s'",bcm4500_firmware); + info("downloaidng bcm4500 firmware from file '%s'",bcm4500_firmware); ptr = fw->data; buf = kmalloc(64, GFP_KERNEL | GFP_DMA); @@ -129,115 +127,112 @@ out_rel_fw: return ret; } -static int gp8psk_power_ctrl(struct dvb_usb_device *d, int onoff) +static int gp_universal_power_ctrl(struct dvb_usb_device *d, int onoff) { u8 status, buf; - int gp_product_id = le16_to_cpu(d->udev->descriptor.idProduct); - if (onoff) { - gp8psk_usb_in_op(d, GET_8PSK_CONFIG,0,0,&status,1); - if (! (status & bm8pskStarted)) { /* started */ - if(gp_product_id == USB_PID_GENPIX_SKYWALKER_CW3K) - gp8psk_usb_out_op(d, CW3K_INIT, 1, 0, NULL, 0); - if (gp8psk_usb_in_op(d, BOOT_8PSK, 1, 0, &buf, 1)) - return -EINVAL; - } - - if (gp_product_id == USB_PID_GENPIX_8PSK_REV_1_WARM) - if (! (status & bm8pskFW_Loaded)) /* BCM4500 firmware loaded */ - if(gp8psk_load_bcm4500fw(d)) - return -EINVAL; - - if (! (status & bmIntersilOn)) /* LNB Power */ - if (gp8psk_usb_in_op(d, START_INTERSIL, 1, 0, - &buf, 1)) + gp_universal_usb_in_op(d, GET_GENPIX_CONFIG,0,0,&status,1); + if (! (status & bmTunerEnabled)) /* started */ + if (gp_universal_usb_in_op(d, START_TUNER, 1, 0, &buf, 1)) return -EINVAL; - /* Set DVB mode to 1 */ - if (gp_product_id == USB_PID_GENPIX_8PSK_REV_1_WARM) - if (gp8psk_usb_out_op(d, SET_DVB_MODE, 1, 0, NULL, 0)) - return -EINVAL; + if (gp_product_id == USB_PID_GENPIX_8PSK_WARM) + if (! (status & bmFW_Loaded)) /* BCM4500 firmware loaded */ + if (gp_universal_load_bcm4500fw(d)) + return EINVAL; + + if (! (status & bmLNBPowerOn)) /* LNB Power */ + if (gp_universal_usb_in_op(d, ENABLE_LNB_POWER, 1, 0, + &buf, 1)) + return EINVAL; + + if (gp_product_id == USB_PID_GENPIX_8PSK_WARM) + if (gp_universal_usb_out_op(d, SET_DVB_MODE, 1, 0, NULL, 0)) + return EINVAL; /* Abort possible TS (if previous tune crashed) */ - if (gp8psk_usb_out_op(d, ARM_TRANSFER, 0, 0, NULL, 0)) - return -EINVAL; + if (gp_universal_usb_out_op(d, ARM_TRANSFER, 0, 0, NULL, 0)) + return EINVAL; } else { /* Turn off LNB power */ - if (gp8psk_usb_in_op(d, START_INTERSIL, 0, 0, &buf, 1)) + if (gp_universal_usb_in_op(d, ENABLE_LNB_POWER, 0, 0, &buf, 1)) + return EINVAL; + /* Turn off tuner power */ + if (gp_universal_usb_in_op(d, START_TUNER, 0, 0, &buf, 1)) return -EINVAL; - /* Turn off 8psk power */ - if (gp8psk_usb_in_op(d, BOOT_8PSK, 0, 0, &buf, 1)) - return -EINVAL; - if(gp_product_id == USB_PID_GENPIX_SKYWALKER_CW3K) - gp8psk_usb_out_op(d, CW3K_INIT, 0, 0, NULL, 0); } return 0; } -#if 0 -int gp8psk_bcm4500_reload(struct dvb_usb_device *d) +int gp_universal_bcm4500_reload(struct dvb_usb_device *d) { u8 buf; - int gp_product_id = le16_to_cpu(d->udev->descriptor.idProduct); /* Turn off 8psk power */ - if (gp8psk_usb_in_op(d, BOOT_8PSK, 0, 0, &buf, 1)) + if (gp_universal_usb_in_op(d, START_TUNER, 0, 0, &buf, 1)) return -EINVAL; /* Turn On 8psk power */ - if (gp8psk_usb_in_op(d, BOOT_8PSK, 1, 0, &buf, 1)) + if (gp_universal_usb_in_op(d, START_TUNER, 1, 0, &buf, 1)) return -EINVAL; /* load BCM4500 firmware */ - if (gp_product_id == USB_PID_GENPIX_8PSK_REV_1_WARM) - if (gp8psk_load_bcm4500fw(d)) + if (gp_product_id == USB_PID_GENPIX_8PSK_WARM) + if (gp_universal_load_bcm4500fw(d)) return EINVAL; return 0; } -#endif /* 0 */ -static int gp8psk_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) +static int gp_universal_get_fpga_version(struct dvb_usb_device *d, int *version) { - return gp8psk_usb_out_op(adap->dev, ARM_TRANSFER, onoff, 0 , NULL, 0); -} - -static int gp8psk_frontend_attach(struct dvb_usb_adapter *adap) -{ - adap->fe = gp8psk_fe_attach(adap->dev); + u8 cmd; + if (gp_universal_usb_in_op(d, GET_FPGA_VERSION, 0,0,&cmd,1) != 0) + *version = 0; + else + *version = cmd; return 0; } -static struct dvb_usb_device_properties gp8psk_properties; +static int gp_universal_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) +{ + return gp_universal_usb_out_op(adap->dev, ARM_TRANSFER, onoff, 0 , NULL, 0); +} -static int gp8psk_usb_probe(struct usb_interface *intf, +static int gp_universal_frontend_attach(struct dvb_usb_adapter *adap) +{ + adap->fe = gp_universal_fe_attach(adap->dev); + return 0; +} + +static struct dvb_usb_device_properties gp_universal_properties; + +static int gp_universal_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) { - int ret; + int ret; struct usb_device *udev = interface_to_usbdev(intf); - ret = dvb_usb_device_init(intf, &gp8psk_properties, - THIS_MODULE, NULL, adapter_nr); + ret = dvb_usb_device_init(intf,&gp_universal_properties,THIS_MODULE,NULL); if (ret == 0) { - info("found Genpix USB device pID = %x (hex)", - le16_to_cpu(udev->descriptor.idProduct)); + gp_product_id = le16_to_cpu(udev->descriptor.idProduct); + info("found Genpix USB device pID = %x (hex)",gp_product_id); } return ret; } -static struct usb_device_id gp8psk_usb_table [] = { - { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_8PSK_REV_1_COLD) }, - { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_8PSK_REV_1_WARM) }, +static struct usb_device_id gp_universal_usb_table [] = { + { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_8PSK_COLD) }, + { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_8PSK_WARM) }, { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_8PSK_REV_2) }, - { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_SKYWALKER_1) }, - { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_SKYWALKER_CW3K) }, + { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_SKYWALKER) }, { 0 }, }; -MODULE_DEVICE_TABLE(usb, gp8psk_usb_table); +MODULE_DEVICE_TABLE(usb, gp_universal_usb_table); -static struct dvb_usb_device_properties gp8psk_properties = { +static struct dvb_usb_device_properties gp_universal_properties = { .usb_ctrl = CYPRESS_FX2, - .firmware = "dvb-usb-gp8psk-01.fw", + .firmware = "dvb-gp8psk-01.fw", .num_adapters = 1, .adapter = { { - .streaming_ctrl = gp8psk_streaming_ctrl, - .frontend_attach = gp8psk_frontend_attach, + .streaming_ctrl = gp_universal_streaming_ctrl, + .frontend_attach = gp_universal_frontend_attach, /* parameter for the MPEG2-data transfer */ .stream = { .type = USB_BULK, @@ -251,48 +246,45 @@ static struct dvb_usb_device_properties }, } }, - .power_ctrl = gp8psk_power_ctrl, + .power_ctrl = gp_universal_power_ctrl, .generic_bulk_ctrl_endpoint = 0x01, - .num_device_descs = 4, + .num_device_descs = 3, .devices = { - { .name = "Genpix 8PSK-to-USB2 Rev.1 DVB-S receiver", - .cold_ids = { &gp8psk_usb_table[0], NULL }, - .warm_ids = { &gp8psk_usb_table[1], NULL }, + { .name = "Genpix 8PSK-to-USB2 DVB-s receiver", + .cold_ids = { &gp_universal_usb_table[0], NULL }, + .warm_ids = { &gp_universal_usb_table[1], NULL }, }, - { .name = "Genpix 8PSK-to-USB2 Rev.2 DVB-S receiver", + { .name = "Genpix 8PSK-to-USB2 Rev.2 DVB-s receiver", .cold_ids = { NULL }, - .warm_ids = { &gp8psk_usb_table[2], NULL }, + .warm_ids = { &gp_universal_usb_table[2], NULL }, }, - { .name = "Genpix SkyWalker-1 DVB-S receiver", + { .name = "Genpix SkyWalker-1 DVB-s receiver", .cold_ids = { NULL }, - .warm_ids = { &gp8psk_usb_table[3], NULL }, - }, - { .name = "Genpix SkyWalker-CW3K DVB-S receiver", - .cold_ids = { NULL }, - .warm_ids = { &gp8psk_usb_table[4], NULL }, + .warm_ids = { &gp_universal_usb_table[3], NULL }, }, { NULL }, - } + }, + .device_version = gp_universal_get_fpga_version, }; /* usb specific object needed to register this driver with the usb subsystem */ -static struct usb_driver gp8psk_usb_driver = { +static struct usb_driver gp_universal_usb_driver = { #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,15) .owner = THIS_MODULE, #endif - .name = "dvb_usb_gp8psk", - .probe = gp8psk_usb_probe, - .disconnect = dvb_usb_device_exit, - .id_table = gp8psk_usb_table, + .name = "dvb_usb_gp_universal", + .probe = gp_universal_usb_probe, + .disconnect = dvb_usb_device_exit, + .id_table = gp_universal_usb_table, }; /* module stuff */ -static int __init gp8psk_usb_module_init(void) +static int __init gp_universal_usb_module_init(void) { int result; - if ((result = usb_register(&gp8psk_usb_driver))) { + if ((result = usb_register(&gp_universal_usb_driver))) { err("usb_register failed. (%d)",result); return result; } @@ -300,16 +292,16 @@ static int __init gp8psk_usb_module_init return 0; } -static void __exit gp8psk_usb_module_exit(void) +static void __exit gp_universal_usb_module_exit(void) { /* deregister this driver from the USB subsystem */ - usb_deregister(&gp8psk_usb_driver); + usb_deregister(&gp_universal_usb_driver); } -module_init(gp8psk_usb_module_init); -module_exit(gp8psk_usb_module_exit); +module_init(gp_universal_usb_module_init); +module_exit(gp_universal_usb_module_exit); -MODULE_AUTHOR("Alan Nisota "); -MODULE_DESCRIPTION("Driver for Genpix 8psk-to-USB2 DVB-S"); +MODULE_AUTHOR("Genpix "); +MODULE_DESCRIPTION("Universal Driver for Genpix advanced DVB-S receivers"); MODULE_VERSION("1.1"); MODULE_LICENSE("GPL"); diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/gp8psk.h --- a/linux/drivers/media/dvb/dvb-usb/gp8psk.h Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/gp8psk.h Mon Jun 23 15:07:10 2008 -0700 @@ -1,12 +1,12 @@ -/* DVB USB compliant Linux driver for the - * - GENPIX 8pks/qpsk/DCII USB2.0 DVB-S module +/* DVB USB compliant Linux driver for these USB 2.0 DVB-S modules + * - GENPIX 8PSK-to-USB2 + * - GENPIX 8PSK-to-USB2 Rev.2 + * - GENPIX SkyWalker-1 * - * Copyright (C) 2006 Alan Nisota (alannisota@gmail.com) - * Copyright (C) 2006,2007 Alan Nisota (alannisota@gmail.com) - * - * Thanks to GENPIX for the sample code used to implement this module. + * Copyright (C) 2007 Genpix Electronics (genpix@genpix-electronics.com) * * This module is based off the vp7045 and vp702x modules + * and original version of dvb-usb-gp8ps (written by Alan Nisota (c) 2006) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free @@ -14,83 +14,64 @@ * * see Documentation/dvb/README.dvb-usb for more information */ -#ifndef _DVB_USB_GP8PSK_H_ -#define _DVB_USB_GP8PSK_H_ +#ifndef _DVB_USB_GENPIX_H_ +#define _DVB_USB_GENPIX_H_ -#define DVB_USB_LOG_PREFIX "gp8psk" +#define DVB_USB_LOG_PREFIX "gp_universal" #include "dvb-usb.h" -extern int dvb_usb_gp8psk_debug; -#define deb_info(args...) dprintk(dvb_usb_gp8psk_debug,0x01,args) -#define deb_xfer(args...) dprintk(dvb_usb_gp8psk_debug,0x02,args) -#define deb_rc(args...) dprintk(dvb_usb_gp8psk_debug,0x04,args) -#define deb_fe(args...) dprintk(dvb_usb_gp8psk_debug,0x08,args) -/* gp8psk commands */ +extern int gp_product_id; +extern int dvb_usb_gp_universal_debug; +#define deb_info(args...) dprintk(dvb_usb_gp_universal_debug,0x01,args) +#define deb_xfer(args...) dprintk(dvb_usb_gp_universal_debug,0x02,args) +#define deb_rc(args...) dprintk(dvb_usb_gp_universal_debug,0x04,args) +#define deb_fe(args...) dprintk(dvb_usb_gp_universal_debug,0x08,args) -/* Twinhan Vendor requests */ -#define TH_COMMAND_IN 0xC0 -#define TH_COMMAND_OUT 0xC1 +/* gp_universal commands */ -/* gp8psk commands */ +#define GET_GENPIX_CONFIG 0x80 // in +#define SET_GENPIX_CONFIG 0x81 +#define ARM_TRANSFER 0x85 +#define TUNE_GENPIX 0x86 +#define GET_SIGNAL_STRENGTH 0x87 // in +#define LOAD_BCM4500 0x88 +#define START_TUNER 0x89 // in +#define ENABLE_LNB_POWER 0x8A // in +#define SET_LNB_VOLTAGE 0x8B +#define SET_22KHZ_TONE 0x8C +#define SEND_DISEQC_COMMAND 0x8D +#define SET_DVB_MODE 0x8E +#define SET_DN_SWITCH 0x8F +#define GET_SIGNAL_LOCK 0x90 // in +#define GET_FW_VERSION 0x92 // in +#define GET_SERIAL_NUMBER 0x93 // in +#define USE_EXTRA_VOLT 0x94 +#define GET_FPGA_VERSION 0x95 // in -#define GET_8PSK_CONFIG 0x80 /* in */ -#define SET_8PSK_CONFIG 0x81 -#define I2C_WRITE 0x83 -#define I2C_READ 0x84 -#define ARM_TRANSFER 0x85 -#define TUNE_8PSK 0x86 -#define GET_SIGNAL_STRENGTH 0x87 /* in */ -#define LOAD_BCM4500 0x88 -#define BOOT_8PSK 0x89 /* in */ -#define START_INTERSIL 0x8A /* in */ -#define SET_LNB_VOLTAGE 0x8B -#define SET_22KHZ_TONE 0x8C -#define SEND_DISEQC_COMMAND 0x8D -#define SET_DVB_MODE 0x8E -#define SET_DN_SWITCH 0x8F -#define GET_SIGNAL_LOCK 0x90 /* in */ -#define GET_SERIAL_NUMBER 0x93 /* in */ -#define USE_EXTRA_VOLT 0x94 -#define CW3K_INIT 0x9d - -/* PSK_configuration bits */ -#define bm8pskStarted 0x01 -#define bm8pskFW_Loaded 0x02 -#define bmIntersilOn 0x04 -#define bmDVBmode 0x08 -#define bm22kHz 0x10 -#define bmSEL18V 0x20 -#define bmDCtuned 0x40 -#define bmArmed 0x80 +/* gp_universal_configuration bits */ +#define bmTunerEnabled 0x01 +#define bmFW_Loaded 0x02 +#define bmLNBPowerOn 0x04 +#define bm22kHz 0x10 +#define bmSEL18V 0x20 +#define bmDCtuned 0x40 +#define bmArmed 0x80 /* Satellite modulation modes */ -#define ADV_MOD_DVB_QPSK 0 /* DVB-S QPSK */ -#define ADV_MOD_TURBO_QPSK 1 /* Turbo QPSK */ -#define ADV_MOD_TURBO_8PSK 2 /* Turbo 8PSK (also used for Trellis 8PSK) */ -#define ADV_MOD_TURBO_16QAM 3 /* Turbo 16QAM (also used for Trellis 8PSK) */ +#define ADV_MOD_DVB_QPSK 0 /* DVB-S QPSK */ +#define ADV_MOD_TURBO_QPSK 1 /* Turbo QPSK */ +#define ADV_MOD_TURBO_8PSK 2 /* Turbo 8PSK (also used for Trellis 8PSK) */ +#define ADV_MOD_TURBO_16QAM 3 /* Turbo 16QAM (also used for Trellis 8PSK) */ +#define ADV_MOD_DCII_C_QPSK 4 /* Digicipher II Combo */ +#define ADV_MOD_DCII_I_QPSK 5 /* Digicipher II I-stream */ +#define ADV_MOD_DCII_Q_QPSK 6 /* Digicipher II Q-stream */ +#define ADV_MOD_DCII_C_OQPSK 7 /* Digicipher II offset QPSK */ +#define ADV_MOD_DSS_QPSK 8 /* DSS (DIRECTV) QPSK */ +#define ADV_MOD_DVB_BPSK 9 /* DVB-S BPSK */ -#define ADV_MOD_DCII_C_QPSK 4 /* Digicipher II Combo */ -#define ADV_MOD_DCII_I_QPSK 5 /* Digicipher II I-stream */ -#define ADV_MOD_DCII_Q_QPSK 6 /* Digicipher II Q-stream */ -#define ADV_MOD_DCII_C_OQPSK 7 /* Digicipher II offset QPSK */ -#define ADV_MOD_DSS_QPSK 8 /* DSS (DIRECTV) QPSK */ -#define ADV_MOD_DVB_BPSK 9 /* DVB-S BPSK */ - -#define GET_USB_SPEED 0x07 - #define USB_SPEED_LOW 0 - #define USB_SPEED_FULL 1 - #define USB_SPEED_HIGH 2 - -#define RESET_FX2 0x13 - -#define FW_VERSION_READ 0x0B -#define VENDOR_STRING_READ 0x0C -#define PRODUCT_STRING_READ 0x0D -#define FW_BCD_VERSION_READ 0x14 - -extern struct dvb_frontend * gp8psk_fe_attach(struct dvb_usb_device *d); -extern int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen); -extern int gp8psk_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, - u16 index, u8 *b, int blen); +extern struct dvb_frontend * gp_universal_fe_attach(struct dvb_usb_device *d); +extern int gp_universal_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen); +extern int gp_universal_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen); +extern int gp_universal_bcm4500_reload(struct dvb_usb_device *d); #endif diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/m920x.c --- a/linux/drivers/media/dvb/dvb-usb/m920x.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/m920x.c Mon Jun 23 15:07:10 2008 -0700 @@ -22,8 +22,6 @@ static int dvb_usb_m920x_debug; static int dvb_usb_m920x_debug; module_param_named(debug,dvb_usb_m920x_debug, int, 0644); MODULE_PARM_DESC(debug, "set debugging level (1=rc (or-able))." DVB_USB_DEBUG_STATUS); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); static int m920x_set_filter(struct dvb_usb_device *d, int type, int idx, int pid); @@ -480,7 +478,7 @@ static struct qt1010_config m920x_qt1010 /* Callbacks for DVB USB */ static int m920x_mt352_frontend_attach(struct dvb_usb_adapter *adap) { - deb("%s\n",__func__); + deb("%s\n",__FUNCTION__); if ((adap->fe = dvb_attach(mt352_attach, &m920x_mt352_config, @@ -492,7 +490,7 @@ static int m920x_mt352_frontend_attach(s static int m920x_tda10046_08_frontend_attach(struct dvb_usb_adapter *adap) { - deb("%s\n",__func__); + deb("%s\n",__FUNCTION__); if ((adap->fe = dvb_attach(tda10046_attach, &m920x_tda10046_08_config, @@ -504,7 +502,7 @@ static int m920x_tda10046_08_frontend_at static int m920x_tda10046_0b_frontend_attach(struct dvb_usb_adapter *adap) { - deb("%s\n",__func__); + deb("%s\n",__FUNCTION__); if ((adap->fe = dvb_attach(tda10046_attach, &m920x_tda10046_0b_config, @@ -516,7 +514,7 @@ static int m920x_tda10046_0b_frontend_at static int m920x_qt1010_tuner_attach(struct dvb_usb_adapter *adap) { - deb("%s\n",__func__); + deb("%s\n",__FUNCTION__); if (dvb_attach(qt1010_attach, adap->fe, &adap->dev->i2c_adap, &m920x_qt1010_config) == NULL) return -ENODEV; @@ -526,7 +524,7 @@ static int m920x_qt1010_tuner_attach(str static int m920x_tda8275_60_tuner_attach(struct dvb_usb_adapter *adap) { - deb("%s\n",__func__); + deb("%s\n",__FUNCTION__); if (dvb_attach(tda827x_attach, adap->fe, 0x60, &adap->dev->i2c_adap, NULL) == NULL) return -ENODEV; @@ -536,7 +534,7 @@ static int m920x_tda8275_60_tuner_attach static int m920x_tda8275_61_tuner_attach(struct dvb_usb_adapter *adap) { - deb("%s\n",__func__); + deb("%s\n",__FUNCTION__); if (dvb_attach(tda827x_attach, adap->fe, 0x61, &adap->dev->i2c_adap, NULL) == NULL) return -ENODEV; @@ -621,31 +619,27 @@ static int m920x_probe(struct usb_interf * multi-tuner device */ - ret = dvb_usb_device_init(intf, &megasky_properties, - THIS_MODULE, &d, adapter_nr); - if (ret == 0) { + if ((ret = dvb_usb_device_init(intf, &megasky_properties, + THIS_MODULE, &d)) == 0) { rc_init_seq = megasky_rc_init; goto found; } - ret = dvb_usb_device_init(intf, &digivox_mini_ii_properties, - THIS_MODULE, &d, adapter_nr); - if (ret == 0) { + if ((ret = dvb_usb_device_init(intf, &digivox_mini_ii_properties, + THIS_MODULE, &d)) == 0) { /* No remote control, so no rc_init_seq */ goto found; } /* This configures both tuners on the TV Walker Twin */ - ret = dvb_usb_device_init(intf, &tvwalkertwin_properties, - THIS_MODULE, &d, adapter_nr); - if (ret == 0) { + if ((ret = dvb_usb_device_init(intf, &tvwalkertwin_properties, + THIS_MODULE, &d)) == 0) { rc_init_seq = tvwalkertwin_rc_init; goto found; } - ret = dvb_usb_device_init(intf, &dposh_properties, - THIS_MODULE, &d, adapter_nr); - if (ret == 0) { + if ((ret = dvb_usb_device_init(intf, &dposh_properties, + THIS_MODULE, &d)) == 0) { /* Remote controller not supported yet. */ goto found; } diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/nova-t-usb2.c --- a/linux/drivers/media/dvb/dvb-usb/nova-t-usb2.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/nova-t-usb2.c Mon Jun 23 15:07:10 2008 -0700 @@ -14,8 +14,6 @@ static int debug; static int debug; module_param(debug, int, 0644); MODULE_PARM_DESC(debug, "set debugging level (1=rc,2=eeprom (|-able))." DVB_USB_DEBUG_STATUS); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); #define deb_rc(args...) dprintk(debug,0x01,args) #define deb_ee(args...) dprintk(debug,0x02,args) @@ -144,8 +142,7 @@ static int nova_t_probe(struct usb_inter static int nova_t_probe(struct usb_interface *intf, const struct usb_device_id *id) { - return dvb_usb_device_init(intf, &nova_t_properties, - THIS_MODULE, NULL, adapter_nr); + return dvb_usb_device_init(intf,&nova_t_properties,THIS_MODULE,NULL); } /* do not change the order of the ID table */ diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/opera1.c --- a/linux/drivers/media/dvb/dvb-usb/opera1.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/opera1.c Mon Jun 23 15:07:10 2008 -0700 @@ -45,9 +45,6 @@ MODULE_PARM_DESC(debug, MODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2,pll=4,ts=8,err=16,rc=32,fw=64 (or-able))." DVB_USB_DEBUG_STATUS); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); - #if 0 struct mutex mymutex; #endif @@ -562,8 +559,7 @@ static int opera1_probe(struct usb_inter return -EINVAL; } - if (0 != dvb_usb_device_init(intf, &opera1_properties, - THIS_MODULE, NULL, adapter_nr)) + if (dvb_usb_device_init(intf, &opera1_properties, THIS_MODULE, NULL) != 0) return -EINVAL; return 0; } diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/ttusb2.c --- a/linux/drivers/media/dvb/dvb-usb/ttusb2.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/ttusb2.c Mon Jun 23 15:07:10 2008 -0700 @@ -36,8 +36,6 @@ static int dvb_usb_ttusb2_debug; #define deb_info(args...) dprintk(dvb_usb_ttusb2_debug,0x01,args) module_param_named(debug,dvb_usb_ttusb2_debug, int, 0644); MODULE_PARM_DESC(debug, "set debugging level (1=info (or-able))." DVB_USB_DEBUG_STATUS); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); struct ttusb2_state { u8 id; @@ -190,10 +188,8 @@ static int ttusb2_probe(struct usb_inter static int ttusb2_probe(struct usb_interface *intf, const struct usb_device_id *id) { - if (0 == dvb_usb_device_init(intf, &ttusb2_properties, - THIS_MODULE, NULL, adapter_nr) || - 0 == dvb_usb_device_init(intf, &ttusb2_properties_s2400, - THIS_MODULE, NULL, adapter_nr)) + if (dvb_usb_device_init(intf, &ttusb2_properties, THIS_MODULE, NULL) == 0 || + dvb_usb_device_init(intf, &ttusb2_properties_s2400, THIS_MODULE, NULL) == 0) return 0; return -ENODEV; } diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/umt-010.c --- a/linux/drivers/media/dvb/dvb-usb/umt-010.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/umt-010.c Mon Jun 23 15:07:10 2008 -0700 @@ -12,8 +12,6 @@ #include "dibusb.h" #include "mt352.h" - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); static int umt_mt352_demod_init(struct dvb_frontend *fe) { @@ -77,8 +75,7 @@ static int umt_probe(struct usb_interfac static int umt_probe(struct usb_interface *intf, const struct usb_device_id *id) { - if (0 == dvb_usb_device_init(intf, &umt_properties, - THIS_MODULE, NULL, adapter_nr)) + if (dvb_usb_device_init(intf,&umt_properties,THIS_MODULE,NULL) == 0) return 0; return -EINVAL; } diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/vp702x-fe.c --- a/linux/drivers/media/dvb/dvb-usb/vp702x-fe.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/vp702x-fe.c Mon Jun 23 15:07:10 2008 -0700 @@ -67,7 +67,7 @@ static int vp702x_fe_read_status(struct { struct vp702x_fe_state *st = fe->demodulator_priv; vp702x_fe_refresh_state(st); - deb_fe("%s\n",__func__); + deb_fe("%s\n",__FUNCTION__); if (st->lock == 0) *status = FE_HAS_LOCK | FE_HAS_SYNC | FE_HAS_VITERBI | FE_HAS_SIGNAL | FE_HAS_CARRIER; @@ -121,7 +121,7 @@ static int vp702x_fe_read_snr(struct dvb static int vp702x_fe_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings *tune) { - deb_fe("%s\n",__func__); + deb_fe("%s\n",__FUNCTION__); tune->min_delay_ms = 2000; return 0; } @@ -183,21 +183,21 @@ static int vp702x_fe_init(struct dvb_fro static int vp702x_fe_init(struct dvb_frontend *fe) { struct vp702x_fe_state *st = fe->demodulator_priv; - deb_fe("%s\n",__func__); + deb_fe("%s\n",__FUNCTION__); vp702x_usb_in_op(st->d, RESET_TUNER, 0, 0, NULL, 0); return 0; } static int vp702x_fe_sleep(struct dvb_frontend *fe) { - deb_fe("%s\n",__func__); + deb_fe("%s\n",__FUNCTION__); return 0; } static int vp702x_fe_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *fep) { - deb_fe("%s\n",__func__); + deb_fe("%s\n",__FUNCTION__); return 0; } @@ -208,7 +208,7 @@ static int vp702x_fe_send_diseqc_msg (st u8 cmd[8],ibuf[10]; memset(cmd,0,8); - deb_fe("%s\n",__func__); + deb_fe("%s\n",__FUNCTION__); if (m->msg_len > 4) return -EINVAL; @@ -230,7 +230,7 @@ static int vp702x_fe_send_diseqc_msg (st static int vp702x_fe_send_diseqc_burst (struct dvb_frontend* fe, fe_sec_mini_cmd_t burst) { - deb_fe("%s\n",__func__); + deb_fe("%s\n",__FUNCTION__); return 0; } @@ -238,7 +238,7 @@ static int vp702x_fe_set_tone(struct dvb { struct vp702x_fe_state *st = fe->demodulator_priv; u8 ibuf[10]; - deb_fe("%s\n",__func__); + deb_fe("%s\n",__FUNCTION__); st->tone_mode = tone; @@ -263,7 +263,7 @@ static int vp702x_fe_set_voltage (struct { struct vp702x_fe_state *st = fe->demodulator_priv; u8 ibuf[10]; - deb_fe("%s\n",__func__); + deb_fe("%s\n",__FUNCTION__); st->voltage = voltage; diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/vp702x.c --- a/linux/drivers/media/dvb/dvb-usb/vp702x.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/vp702x.c Mon Jun 23 15:07:10 2008 -0700 @@ -20,8 +20,6 @@ int dvb_usb_vp702x_debug; int dvb_usb_vp702x_debug; module_param_named(debug,dvb_usb_vp702x_debug, int, 0644); MODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2,rc=4 (or-able))." DVB_USB_DEBUG_STATUS); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); struct vp702x_state { int pid_filter_count; @@ -287,8 +285,7 @@ static int vp702x_usb_probe(struct usb_i static int vp702x_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) { - return dvb_usb_device_init(intf, &vp702x_properties, - THIS_MODULE, NULL, adapter_nr); + return dvb_usb_device_init(intf,&vp702x_properties,THIS_MODULE,NULL); } static struct usb_device_id vp702x_usb_table [] = { diff -r 595fe1ec7511 linux/drivers/media/dvb/dvb-usb/vp7045.c --- a/linux/drivers/media/dvb/dvb-usb/vp7045.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/vp7045.c Mon Jun 23 15:07:10 2008 -0700 @@ -18,9 +18,6 @@ static int dvb_usb_vp7045_debug; static int dvb_usb_vp7045_debug; module_param_named(debug,dvb_usb_vp7045_debug, int, 0644); MODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2,rc=4 (or-able))." DVB_USB_DEBUG_STATUS); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); - #define deb_info(args...) dprintk(dvb_usb_vp7045_debug,0x01,args) #define deb_xfer(args...) dprintk(dvb_usb_vp7045_debug,0x02,args) #define deb_rc(args...) dprintk(dvb_usb_vp7045_debug,0x04,args) @@ -230,8 +227,7 @@ static int vp7045_usb_probe(struct usb_i static int vp7045_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) { - return dvb_usb_device_init(intf, &vp7045_properties, - THIS_MODULE, NULL, adapter_nr); + return dvb_usb_device_init(intf,&vp7045_properties,THIS_MODULE,NULL); } static struct usb_device_id vp7045_usb_table [] = { diff -r 595fe1ec7511 linux/drivers/media/dvb/pluto2/pluto2.c --- a/linux/drivers/media/dvb/pluto2/pluto2.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/pluto2/pluto2.c Mon Jun 23 15:07:10 2008 -0700 @@ -38,8 +38,6 @@ #include "dvb_net.h" #include "dvbdev.h" #include "tda1004x.h" - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); #define DRIVER_NAME "pluto2" @@ -668,8 +666,7 @@ static int __devinit pluto2_probe(struct goto err_pluto_hw_exit; /* dvb */ - ret = dvb_register_adapter(&pluto->dvb_adapter, DRIVER_NAME, - THIS_MODULE, &pdev->dev, adapter_nr); + ret = dvb_register_adapter(&pluto->dvb_adapter, DRIVER_NAME, THIS_MODULE, &pdev->dev); if (ret < 0) goto err_i2c_del_adapter; diff -r 595fe1ec7511 linux/drivers/media/dvb/ttpci/av7110.c --- a/linux/drivers/media/dvb/ttpci/av7110.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/ttpci/av7110.c Mon Jun 23 15:07:11 2008 -0700 @@ -112,8 +112,6 @@ MODULE_PARM_DESC(wss_cfg_16_9, "WSS 16:9 MODULE_PARM_DESC(wss_cfg_16_9, "WSS 16:9 - default 0x0007 - bit 15: disable, 14: burst mode, 13..0: wss data"); module_param(tv_standard, int, 0444); MODULE_PARM_DESC(tv_standard, "TV standard: 0 PAL (default), 1 NTSC"); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); static void restart_feeds(struct av7110 *av7110); @@ -2463,7 +2461,7 @@ static int __devinit av7110_attach(struc goto err_kfree_0; ret = dvb_register_adapter(&av7110->dvb_adapter, av7110->card_name, - THIS_MODULE, &dev->pci->dev, adapter_nr); + THIS_MODULE, &dev->pci->dev); if (ret < 0) goto err_put_firmware_1; diff -r 595fe1ec7511 linux/drivers/media/dvb/ttpci/budget-core.c --- a/linux/drivers/media/dvb/ttpci/budget-core.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/ttpci/budget-core.c Mon Jun 23 15:07:11 2008 -0700 @@ -56,8 +56,6 @@ module_param_named(bufsize, dma_buffer_s module_param_named(bufsize, dma_buffer_size, int, 0444); MODULE_PARM_DESC(debug, "Turn on/off budget debugging (default:off)."); MODULE_PARM_DESC(bufsize, "DMA buffer size in KB, default: 188, min: 188, max: 1410 (Activy: 564)"); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); /**************************************************************************** * TT budget / WinTV Nova @@ -473,10 +471,9 @@ int ttpci_budget_init(struct budget *bud budget->buffer_width, budget->buffer_height); printk("%s: dma buffer size %u\n", budget->dev->name, budget->buffer_size); - ret = dvb_register_adapter(&budget->dvb_adapter, budget->card->name, - owner, &budget->dev->pci->dev, adapter_nr); - if (ret < 0) + if ((ret = dvb_register_adapter(&budget->dvb_adapter, budget->card->name, owner, &budget->dev->pci->dev)) < 0) { return ret; + } /* set dd1 stream a & b */ saa7146_write(dev, DD1_STREAM_B, 0x00000000); diff -r 595fe1ec7511 linux/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c --- a/linux/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c Mon Jun 23 15:07:11 2008 -0700 @@ -59,10 +59,9 @@ */ static int debug; + module_param(debug, int, 0644); MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off)."); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); #define dprintk(x...) do { if (debug) printk(KERN_DEBUG x); } while (0) @@ -1682,10 +1681,7 @@ static int ttusb_probe(struct usb_interf mutex_unlock(&ttusb->semi2c); - result = dvb_register_adapter(&ttusb->adapter, - "Technotrend/Hauppauge Nova-USB", - THIS_MODULE, &udev->dev, adapter_nr); - if (result < 0) { + if ((result = dvb_register_adapter(&ttusb->adapter, "Technotrend/Hauppauge Nova-USB", THIS_MODULE, &udev->dev)) < 0) { ttusb_free_iso_urbs(ttusb); kfree(ttusb); return result; diff -r 595fe1ec7511 linux/drivers/media/dvb/ttusb-dec/ttusb_dec.c --- a/linux/drivers/media/dvb/ttusb-dec/ttusb_dec.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/dvb/ttusb-dec/ttusb_dec.c Mon Jun 23 15:07:11 2008 -0700 @@ -54,8 +54,6 @@ MODULE_PARM_DESC(output_pva, "Output PVA MODULE_PARM_DESC(output_pva, "Output PVA from dvr device (default:off)"); module_param(enable_rc, int, 0644); MODULE_PARM_DESC(enable_rc, "Turn on/off IR remote control(default: off)"); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); #define dprintk if (debug) printk @@ -1459,9 +1457,7 @@ static int ttusb_dec_init_dvb(struct ttu dprintk("%s\n", __func__); if ((result = dvb_register_adapter(&dec->adapter, - dec->model_name, THIS_MODULE, - &dec->udev->dev, - adapter_nr)) < 0) { + dec->model_name, THIS_MODULE, &dec->udev->dev)) < 0) { printk("%s: dvb_register_adapter failed: error %d\n", __func__, result); diff -r 595fe1ec7511 linux/drivers/media/video/cx23885/cx23885-dvb.c --- a/linux/drivers/media/video/cx23885/cx23885-dvb.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/video/cx23885/cx23885-dvb.c Mon Jun 23 15:07:11 2008 -0700 @@ -55,8 +55,6 @@ static unsigned int alt_tuner; static unsigned int alt_tuner; module_param(alt_tuner, int, 0644); MODULE_PARM_DESC(alt_tuner, "Enable alternate tuner configuration"); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); /* ------------------------------------------------------------------ */ @@ -499,7 +497,7 @@ static int dvb_register(struct cx23885_t /* register everything */ return videobuf_dvb_register(&port->dvb, THIS_MODULE, port, - &dev->pci->dev, adapter_nr); + &dev->pci->dev); } int cx23885_dvb_register(struct cx23885_tsport *port) diff -r 595fe1ec7511 linux/drivers/media/video/cx88/cx88-dvb.c --- a/linux/drivers/media/video/cx88/cx88-dvb.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/video/cx88/cx88-dvb.c Mon Jun 23 15:07:11 2008 -0700 @@ -58,8 +58,6 @@ static unsigned int debug; static unsigned int debug; module_param(debug, int, 0644); MODULE_PARM_DESC(debug,"enable debug messages [dvb]"); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); #define dprintk(level,fmt, arg...) if (debug >= level) \ printk(KERN_DEBUG "%s/2-dvb: " fmt, core->name, ## arg) @@ -910,8 +908,7 @@ static int dvb_register(struct cx8802_de cx88_call_i2c_clients(core, TUNER_SET_STANDBY, NULL); /* register everything */ - return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev, - &dev->pci->dev, adapter_nr); + return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev, &dev->pci->dev); frontend_detach: if (dev->dvb.frontend) { diff -r 595fe1ec7511 linux/drivers/media/video/saa7134/saa7134-dvb.c --- a/linux/drivers/media/video/saa7134/saa7134-dvb.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/video/saa7134/saa7134-dvb.c Mon Jun 23 15:07:11 2008 -0700 @@ -64,8 +64,6 @@ static int debug; static int debug; module_param(debug, int, 0644); MODULE_PARM_DESC(debug, "Turn on/off module debugging (default:off)."); - -DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); #define dprintk(fmt, arg...) do { if (debug) \ printk(KERN_DEBUG "%s/dvb: " fmt, dev->name , ## arg); } while(0) @@ -1323,8 +1321,7 @@ static int dvb_init(struct saa7134_dev * } /* register everything else */ - ret = videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev, &dev->pci->dev, - adapter_nr); + ret = videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev, &dev->pci->dev); /* this sequence is necessary to make the tda1004x load its firmware * and to enter analog mode of hybrid boards diff -r 595fe1ec7511 linux/drivers/media/video/videobuf-dvb.c --- a/linux/drivers/media/video/videobuf-dvb.c Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/drivers/media/video/videobuf-dvb.c Mon Jun 23 15:07:11 2008 -0700 @@ -146,16 +146,14 @@ int videobuf_dvb_register(struct videobu int videobuf_dvb_register(struct videobuf_dvb *dvb, struct module *module, void *adapter_priv, - struct device *device, - short *adapter_nr) + struct device *device) { int result; mutex_init(&dvb->lock); /* register adapter */ - result = dvb_register_adapter(&dvb->adapter, dvb->name, module, device, - adapter_nr); + result = dvb_register_adapter(&dvb->adapter, dvb->name, module, device); if (result < 0) { printk(KERN_WARNING "%s: dvb_register_adapter failed (errno = %d)\n", dvb->name, result); diff -r 595fe1ec7511 linux/include/linux/dvb/frontend.h --- a/linux/include/linux/dvb/frontend.h Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/include/linux/dvb/frontend.h Mon Jun 23 15:07:11 2008 -0700 @@ -28,14 +28,23 @@ #include - +/** + * Usage of fe_type_t enumerations: + * Don't use FE_QPSK, FE_QAM, FE_OFDM any longer in new applications. + * If the FE_HAS_EXTENDED_INFO is set within the fe_caps, + * applications should ignore the fe_type_t returned by the FE_GET_INFO ioctl. + * + */ typedef enum fe_type { - FE_QPSK, - FE_QAM, - FE_OFDM, - FE_ATSC + FE_QPSK = 0, + FE_QAM = 1, + FE_OFDM = 2, + FE_ATSC = 3, + FE_DVB_S = (1 << 2), + FE_DVB_C = (1 << 3), + FE_DVB_T = (1 << 4), + FE_DVB_S2 = (1 << 5), } fe_type_t; - typedef enum fe_caps { FE_IS_STUPID = 0, @@ -62,11 +71,22 @@ typedef enum fe_caps { FE_CAN_HIERARCHY_AUTO = 0x100000, FE_CAN_8VSB = 0x200000, FE_CAN_16VSB = 0x400000, + FE_HAS_EXTENDED_INFO = 0x10000000, FE_NEEDS_BENDING = 0x20000000, // not supported anymore, don't use (frontend requires frequency bending) FE_CAN_RECOVER = 0x40000000, // frontend can recover from a cable unplug automatically FE_CAN_MUTE_TS = 0x80000000 // frontend can stop spurious TS data output } fe_caps_t; +typedef enum fe_caps_extended { + FE_CAN_FEC_1_4 = 0x1, + FE_CAN_FEC_5_11 = 0x2, + FE_CAN_FEC_3_5 = 0x4, + FE_CAN_FEC_9_10 = 0x8, + FE_CAN_8PSK = 0x10, + FE_CAN_TURBO_FEC = 0x20, + FE_CAN_DCII = 0x40, + FE_CAN_DSS_QPSK = 0x80 +} fe_caps_extended_t; struct dvb_frontend_info { char name[128]; @@ -82,7 +102,6 @@ struct dvb_frontend_info { fe_caps_t caps; }; - /** * Check out the DiSEqC bus spec available on http://www.eutelsat.org/ for * the meaning of this struct... @@ -126,9 +145,9 @@ typedef enum fe_status { FE_HAS_SYNC = 0x08, /* found sync bytes */ FE_HAS_LOCK = 0x10, /* everything's working... */ FE_TIMEDOUT = 0x20, /* no lock within the last ~2 seconds */ - FE_REINIT = 0x40 /* frontend was reinitialized, */ -} fe_status_t; /* application is recommended to reset */ - /* DiSEqC, tone and parameters */ + FE_REINIT = 0x40 /* legacy cruft, do not use */ +} fe_status_t; + typedef enum fe_spectral_inversion { INVERSION_OFF, @@ -147,21 +166,55 @@ typedef enum fe_code_rate { FEC_6_7, FEC_7_8, FEC_8_9, - FEC_AUTO + FEC_AUTO, + FEC_1_4, + FEC_5_11, + FEC_3_5, + FEC_9_10 } fe_code_rate_t; typedef enum fe_modulation { - QPSK, - QAM_16, - QAM_32, - QAM_64, - QAM_128, - QAM_256, - QAM_AUTO, - VSB_8, - VSB_16 + MOD_QPSK = 0, + QPSK = 0, + MOD_QAM_16 = 1, + QAM_16 = 1, + MOD_QAM_32 = 2, + QAM_32 = 2, + MOD_QAM_64 = 3, + QAM_64 = 3, + MOD_QAM_128 = 4, + QAM_128 = 4, + MOD_QAM_256 = 5, + QAM_256 = 5, + MOD_QAM_AUTO = 6, + QAM_AUTO = 6, + MOD_8VSB = 7, + VSB_8 = 7, + MOD_16VSB = 8, + VSB_16 = 8, + MOD_2VSB = 9, + MOD_4VSB = 10, + MOD_BPSK = 11, + MOD_16APSK = 12, + MOD_32APSK = 13, + MOD_8PSK = 14, + MOD_16PSK = 15, + MOD_QPSK_TURBO = 16, + MOD_8PSK_TURBO = 17, + MOD_16QAM_TURBO = 18, + MOD_DCII_C_QPSK = 19, + MOD_DCII_I_QPSK = 20, + MOD_DCII_Q_QPSK = 21, + MOD_DCII_C_OQPSK = 22, + MOD_DSS_QPSK = 23, } fe_modulation_t; + +typedef enum fe_rolloff_factor { + ROLLOFF_ALPHA_0_35, + ROLLOFF_ALPHA_0_25, + ROLLOFF_ALPHA_0_20 +} fe_rolloff_factor_t; typedef enum fe_transmit_mode { TRANSMISSION_MODE_2K, @@ -194,23 +247,33 @@ typedef enum fe_hierarchy { HIERARCHY_AUTO } fe_hierarchy_t; +/** + * this struct will be filled by the FE_GET_EXTENDED_INFO ioctl. + * it is a extension to the normal frontend capabilities and provided + * if the dvb_fe_info.caps is having the FE_HAS_EXTENDED_INFO bit set. + */ +struct dvb_fe_caps_extended { + __u32 caps; /* supported fecs and modulations */ + __u32 standards; /* supported frontend_types */ +}; -struct dvb_qpsk_parameters { - __u32 symbol_rate; /* symbol rate in Symbols per second */ + +struct dvb_dvbs_parameters { + __u32 symbol_rate; /* symbol rate in symbols per second */ fe_code_rate_t fec_inner; /* forward error correction (see above) */ }; -struct dvb_qam_parameters { - __u32 symbol_rate; /* symbol rate in Symbols per second */ +struct dvb_dvbc_parameters { + __u32 symbol_rate; /* symbol rate in symbols per second */ fe_code_rate_t fec_inner; /* forward error correction (see above) */ fe_modulation_t modulation; /* modulation type (see above) */ }; -struct dvb_vsb_parameters { +struct dvb_atsc_parameters { fe_modulation_t modulation; /* modulation type (see above) */ }; -struct dvb_ofdm_parameters { +struct dvb_dvbt_parameters { fe_bandwidth_t bandwidth; fe_code_rate_t code_rate_HP; /* high priority stream code rate */ fe_code_rate_t code_rate_LP; /* low priority stream code rate */ @@ -220,25 +283,75 @@ struct dvb_ofdm_parameters { fe_hierarchy_t hierarchy_information; }; +struct dvb_dvbs2_parameters { + __u32 symbol_rate; /* symbol rate in symbols per second */ + fe_code_rate_t fec_inner; /* forward error correction (see above) */ + fe_modulation_t modulation; /* modulation type (see above) */ + fe_rolloff_factor_t rolloff_factor; /* rolloff factor needed for dvb-s2 */ +}; +/* The following structure is used to allocate enough space in the union + for future expansion. +*/ +struct dvb_private_parameters { + __u32 priv[64]; +}; + +#define dvb_qpsk_parameters dvb_dvbs_parameters +#define dvb_qam_parameters dvb_dvbc_parameters +#define dvb_ofdm_parameters dvb_dvbt_parameters +#define dvb_vsb_parameters dvb_atsc_parameters + +/* just kept for backwards binary compatibility + * deprecated for usage in actual applications + */ struct dvb_frontend_parameters { __u32 frequency; /* (absolute) frequency in Hz for QAM/OFDM/ATSC */ /* intermediate frequency in kHz for QPSK */ fe_spectral_inversion_t inversion; union { - struct dvb_qpsk_parameters qpsk; - struct dvb_qam_parameters qam; - struct dvb_ofdm_parameters ofdm; - struct dvb_vsb_parameters vsb; + struct dvb_dvbs_parameters qpsk; + struct dvb_dvbc_parameters qam; + struct dvb_dvbt_parameters ofdm; + struct dvb_atsc_parameters vsb; } u; +};// __attribute((__deprecated__)); + +typedef union { + struct dvb_dvbs_parameters qpsk; + struct dvb_dvbc_parameters qam; + struct dvb_dvbt_parameters ofdm; + struct dvb_atsc_parameters vsb; + struct dvb_dvbs2_parameters qpsk2; + struct dvb_private_parameters priv; +} frontend_parameters_union; + +struct dvb_frontend_parameters_new { + __u32 frequency; /* (absolute) frequency in Hz for QAM/OFDM/ATSC */ + /* intermediate frequency in kHz for QPSK */ + fe_spectral_inversion_t inversion; + frontend_parameters_union u; }; +/** + * Important: + * FE_GET_EVENT and struct dvb_frontend_event + * are deprecated due to: + * FE_GET_EVENT is a mis-designed ioctl + * informations within dvb_frontend_event will + * always return stale information. + * Applications should: + * - open the frontend device with O_NONBLOCK + * - poll() for events + * - FE_GET_EVENT all pending events to clear the POLLPRI status, + * and throw them away + * - FE_READ_STATUS etc. to get current information + */ struct dvb_frontend_event { fe_status_t status; struct dvb_frontend_parameters parameters; -}; - +}; // __attribute((__deprecated__)); /** * When set, this flag will disable any zigzagging or other "normal" tuning @@ -267,9 +380,36 @@ struct dvb_frontend_event { #define FE_READ_SNR _IOR('o', 72, __u16) #define FE_READ_UNCORRECTED_BLOCKS _IOR('o', 73, __u32) +#define FE_SET_FRONTEND2 _IOW('o', 84, struct dvb_frontend_parameters_new) +#define FE_GET_FRONTEND2 _IOR('o', 85, struct dvb_frontend_parameters_new) + +/** + * next two IOCTLs are deprecated for further use in applications + */ #define FE_SET_FRONTEND _IOW('o', 76, struct dvb_frontend_parameters) #define FE_GET_FRONTEND _IOR('o', 77, struct dvb_frontend_parameters) + + #define FE_SET_FRONTEND_TUNE_MODE _IO('o', 81) /* unsigned int */ + +/** + * use to set the FE_STANDARD - if a tuner supports more than one type. + * e.g. DVB-C/T or DVB-S/S2 combi frontends. after FE_SET_STANDARD was set, + * the drivers has to make sure still to reflect the standards available, + * but capabilities should be adjusted to the selected standard + */ +#define FE_SET_STANDARD _IO('o', 82) /* fe_type_t */ + +/** + * used to query the extended frontend capabilities (see above for details) + */ +#define FE_GET_EXTENDED_INFO _IOR('o', 83, struct dvb_fe_caps_extended) + +/** + * FE_GET_EVENT is deprecated for applications. + * you should use FE_READ_STATUS and if needed the FE_GET_FRONTEND_NEW + * IOCTLs. + */ #define FE_GET_EVENT _IOR('o', 78, struct dvb_frontend_event) #define FE_DISHNETWORK_SEND_LEGACY_CMD _IO('o', 80) /* unsigned int */ diff -r 595fe1ec7511 linux/include/media/videobuf-dvb.h --- a/linux/include/media/videobuf-dvb.h Sun Jun 22 14:11:13 2008 +0200 +++ b/linux/include/media/videobuf-dvb.h Mon Jun 23 15:07:11 2008 -0700 @@ -35,8 +35,7 @@ int videobuf_dvb_register(struct videobu int videobuf_dvb_register(struct videobuf_dvb *dvb, struct module *module, void *adapter_priv, - struct device *device, - short *adapter_nr); + struct device *device); void videobuf_dvb_unregister(struct videobuf_dvb *dvb); /*