Em 27-11-2010 11:13, Malcolm Priestley escreveu: > Driver Version v1.73 - Frontend attach change. > To stop double rc registration in multi tuner environment or firmware change. > > Signed-off-by: Malcolm Priestley <tvboxspy@xxxxxxxxx> > > > diff --git a/drivers/media/dvb/dvb-usb/lmedm04.c b/drivers/media/dvb/dvb-usb/lmedm04.c > index 1455c23..dc3172f 100644 > --- a/drivers/media/dvb/dvb-usb/lmedm04.c > +++ b/drivers/media/dvb/dvb-usb/lmedm04.c > @@ -584,6 +584,7 @@ static int lme2510_int_service(struct dvb_usb_adapter *adap) > ret = lme2510_int_read(adap); > if (ret < 0) { > rc_unregister_device(rc); > + info("INT Unable to start Interupt Service"); > return -ENODEV; > } > > @@ -674,7 +675,7 @@ static void lme_coldreset(struct usb_device *dev) > return; > } > > -static void lme_firmware_switch(struct usb_device *udev, int cold) > +static int lme_firmware_switch(struct usb_device *udev, int cold) > { > const struct firmware *fw = NULL; > char lme2510c_s7395[] = "dvb-usb-lme2510c-s7395.fw"; > @@ -685,7 +686,7 @@ static void lme_firmware_switch(struct usb_device *udev, int cold) > cold = (cold > 0) ? (cold & 1) : 0; > > if (udev->descriptor.idProduct == 0x1122) > - return; > + return 0; > > switch (dvb_usb_lme2510_firmware) { > case 0: > @@ -715,10 +716,12 @@ static void lme_firmware_switch(struct usb_device *udev, int cold) > > release_firmware(fw); > > - if (cold) > + if (cold) { > lme_coldreset(udev); > + return -ENODEV; > + } > > - return; > + return ret; > } > > static int lme2510_kill_urb(struct usb_data_stream *stream) > @@ -786,45 +789,43 @@ static int dm04_lme2510_set_voltage(struct dvb_frontend *fe, > return (ret < 0) ? -ENODEV : 0; > } > > +static int lme_name(struct dvb_usb_adapter *adap) > +{ > + struct lme2510_state *st = adap->dev->priv; > + const char *desc = adap->dev->desc->name; > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"}; > + char *name = adap->fe->ops.info.name; > + > + strcpy(name, desc); > + strcat(name, fe_name[st->tuner_config]); Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size. > + > + return 0; > +} > + > static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap) > { > - int ret = 0; > struct lme2510_state *st = adap->dev->priv; > > - /* Interupt Start */ > - ret = lme2510_int_service(adap); > - if (ret < 0) { > - info("INT Unable to start Interupt Service"); > - return -ENODEV; > - } > + int ret = 0; > > st->i2c_talk_onoff = 1; > - st->i2c_gate = 4; > > + st->i2c_gate = 4; > adap->fe = dvb_attach(tda10086_attach, &tda10086_config, > &adap->dev->i2c_adap); > > if (adap->fe) { > info("TUN Found Frontend TDA10086"); > - memcpy(&adap->fe->ops.info.name, > - &"DM04_LG_TDQY-P001F DVB-S", 24); > - adap->fe->ops.set_voltage = dm04_lme2510_set_voltage; > st->i2c_tuner_gate_w = 4; > st->i2c_tuner_gate_r = 4; > st->i2c_tuner_addr = 0xc0; > - if (dvb_attach(tda826x_attach, adap->fe, 0xc0, > - &adap->dev->i2c_adap, 1)) { > - info("TUN TDA8263 Found"); > - st->tuner_config = TUNER_LG; > - if (dvb_usb_lme2510_firmware != 1) { > - dvb_usb_lme2510_firmware = 1; > - lme_firmware_switch(adap->dev->udev, 1); > - } else /*stops LG/Sharp multi tuner problems*/ > - dvb_usb_lme2510_firmware = 0; > - return 0; > - } > - kfree(adap->fe); > - adap->fe = NULL; > + st->tuner_config = TUNER_LG; > + if (dvb_usb_lme2510_firmware != 1) { > + dvb_usb_lme2510_firmware = 1; > + ret = lme_firmware_switch(adap->dev->udev, 1); > + } else /*stops LG/Sharp multi tuner problems*/ > + dvb_usb_lme2510_firmware = 0; > + goto end; > } > > st->i2c_gate = 5; > @@ -833,28 +834,64 @@ static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap) > > if (adap->fe) { > info("FE Found Stv0288"); > - memcpy(&adap->fe->ops.info.name, > - &"DM04_SHARP:BS2F7HZ7395", 22); > - adap->fe->ops.set_voltage = dm04_lme2510_set_voltage; > st->i2c_tuner_gate_w = 4; > st->i2c_tuner_gate_r = 5; > st->i2c_tuner_addr = 0xc0; > - if (dvb_attach(ix2505v_attach , adap->fe, &lme_tuner, > - &adap->dev->i2c_adap)) { > - st->tuner_config = TUNER_S7395; > - info("TUN Sharp IX2505V silicon tuner"); > - if (dvb_usb_lme2510_firmware != 0) { > - dvb_usb_lme2510_firmware = 0; > - lme_firmware_switch(adap->dev->udev, 1); > - } > - return 0; > + st->tuner_config = TUNER_S7395; > + if (dvb_usb_lme2510_firmware != 0) { > + dvb_usb_lme2510_firmware = 0; > + ret = lme_firmware_switch(adap->dev->udev, 1); > } > + } else { > + info("DM04 Not Supported"); > + return -ENODEV; > + } > + > +end: if (ret) { > kfree(adap->fe); > adap->fe = NULL; > + return -ENODEV; > } > > - info("DM04 Not Supported"); > - return -ENODEV; > + adap->fe->ops.set_voltage = dm04_lme2510_set_voltage; > + ret = lme_name(adap); > + > + return ret; > +} > + > +static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap) > +{ > + struct lme2510_state *st = adap->dev->priv; > + char *tun_msg[] = {"", "TDA8263", "IX2505V"}; > + int ret = 0; > + > + switch (st->tuner_config) { > + case TUNER_LG: > + if (dvb_attach(tda826x_attach, adap->fe, 0xc0, > + &adap->dev->i2c_adap, 1)) > + ret = st->tuner_config; > + break; > + case TUNER_S7395: > + if (dvb_attach(ix2505v_attach , adap->fe, &lme_tuner, > + &adap->dev->i2c_adap)) > + ret = st->tuner_config; > + break; > + default: > + break; > + } > + > + if (ret) > + info("TUN Found %s tuner", tun_msg[ret]); > + else { > + info("TUN No tuner found --- reseting device"); > + lme_coldreset(adap->dev->udev); > + return -ENODEV; > + } > + > + /* Start the Interupt & Remote*/ > + ret = lme2510_int_service(adap); > + > + return ret; > } > > static int lme2510_powerup(struct dvb_usb_device *d, int onoff) > @@ -937,6 +974,7 @@ static struct dvb_usb_device_properties lme2510_properties = { > { > .streaming_ctrl = lme2510_streaming_ctrl, > .frontend_attach = dm04_lme2510_frontend_attach, > + .tuner_attach = dm04_lme2510_tuner, > /* parameter for the MPEG2-data transfer */ > .stream = { > .type = USB_BULK, > @@ -957,7 +995,7 @@ static struct dvb_usb_device_properties lme2510_properties = { > .generic_bulk_ctrl_endpoint = 0, > .num_device_descs = 1, > .devices = { > - { "DM04 LME2510 DVB-S USB 2.0", > + { "DM04_LME2510_DVB-S", > { &lme2510_table[0], NULL }, > }, > > @@ -975,6 +1013,7 @@ static struct dvb_usb_device_properties lme2510c_properties = { > { > .streaming_ctrl = lme2510_streaming_ctrl, > .frontend_attach = dm04_lme2510_frontend_attach, > + .tuner_attach = dm04_lme2510_tuner, > /* parameter for the MPEG2-data transfer */ > .stream = { > .type = USB_BULK, > @@ -995,7 +1034,7 @@ static struct dvb_usb_device_properties lme2510c_properties = { > .generic_bulk_ctrl_endpoint = 0, > .num_device_descs = 1, > .devices = { > - { "DM04 LME2510C USB2.0", > + { "DM04_LME2510C_DVB-S", > { &lme2510_table[1], NULL }, > }, > } > @@ -1041,7 +1080,7 @@ void lme2510_exit(struct usb_interface *intf) > } > > static struct usb_driver lme2510_driver = { > - .name = "LME2510C_DVBS", > + .name = "LME2510C_DVB-S", > .probe = lme2510_probe, > .disconnect = lme2510_exit, > .id_table = lme2510_table, > @@ -1069,6 +1108,6 @@ module_init(lme2510_module_init); > module_exit(lme2510_module_exit); > > MODULE_AUTHOR("Malcolm Priestley <tvboxspy@xxxxxxxxx>"); > -MODULE_DESCRIPTION("LM2510(C) DVB-S USB2.0"); > -MODULE_VERSION("1.71"); > +MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0"); > +MODULE_VERSION("1.73"); > MODULE_LICENSE("GPL"); > > -- > To unsubscribe from this list: send the line "unsubscribe linux-media" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html