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 <[email protected]>
>
>
> 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 <[email protected]>");
> -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 [email protected]
> 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html