* [PATCH 10/12] tm6000: bugfix usb DVB transfer @ 2010-02-05 23:06 stefan.ringel 2010-02-05 23:06 ` [PATCH 11/12] tm6000: bugfix firmware xc3028L-v36.fw used with Zarlink and DTV78 or DTV8 no shift stefan.ringel 0 siblings, 1 reply; 7+ messages in thread From: stefan.ringel @ 2010-02-05 23:06 UTC (permalink / raw) To: linux-media; +Cc: mchehab, dheitmueller, Stefan Ringel From: Stefan Ringel <stefan.ringel@arcor.de> Signed-off-by: Stefan Ringel <stefan.ringel@arcor.de> --- drivers/staging/tm6000/tm6000-dvb.c | 125 ++++++++++++++++++++++------------- 1 files changed, 79 insertions(+), 46 deletions(-) diff --git a/drivers/staging/tm6000/tm6000-dvb.c b/drivers/staging/tm6000/tm6000-dvb.c index fdbee30..055a58f 100644 --- a/drivers/staging/tm6000/tm6000-dvb.c +++ b/drivers/staging/tm6000/tm6000-dvb.c @@ -17,7 +17,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include <linux/kernel.h> #include <linux/usb.h> +#include <compat.h> #include "tm6000.h" #include "tm6000-regs.h" @@ -30,13 +32,58 @@ #include "tuner-xc2028.h" +static void inline print_err_status (struct tm6000_core *dev, + int packet, int status) +{ + char *errmsg = "Unknown"; + + switch(status) { + case -ENOENT: + errmsg = "unlinked synchronuously"; + break; + case -ECONNRESET: + errmsg = "unlinked asynchronuously"; + break; + case -ENOSR: + errmsg = "Buffer error (overrun)"; + break; + case -EPIPE: + errmsg = "Stalled (device not responding)"; + break; + case -EOVERFLOW: + errmsg = "Babble (bad cable?)"; + break; + case -EPROTO: + errmsg = "Bit-stuff error (bad cable?)"; + break; + case -EILSEQ: + errmsg = "CRC/Timeout (could be anything)"; + break; + case -ETIME: + errmsg = "Device does not respond"; + break; + } + if (packet<0) { + dprintk(dev, 1, "URB status %d [%s].\n", + status, errmsg); + } else { + dprintk(dev, 1, "URB packet %d, status %d [%s].\n", + packet, status, errmsg); + } +} + + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +static void tm6000_urb_received(struct urb *urb, struct pt_regs *ptregs) +#else static void tm6000_urb_received(struct urb *urb) +#endif { int ret; struct tm6000_core* dev = urb->context; - if(urb->status != 0){ - printk(KERN_ERR "tm6000: status != 0\n"); + if(urb->status != 0) { + print_err_status (dev,0,urb->status); } else if(urb->actual_length>0){ dvb_dmx_swfilter(&dev->dvb->demux, urb->transfer_buffer, @@ -56,49 +103,37 @@ static void tm6000_urb_received(struct urb *urb) int tm6000_start_stream(struct tm6000_core *dev) { int ret; - unsigned int pipe, maxPaketSize; + unsigned int pipe, size; struct tm6000_dvb *dvb = dev->dvb; printk(KERN_INFO "tm6000: got start stream request %s\n",__FUNCTION__); tm6000_init_digital_mode(dev); -/* - ret = tm6000_set_led_status(tm6000_dev, 0x1); - if(ret < 0) { - return -1; - } -*/ - dvb->bulk_urb = usb_alloc_urb(0, GFP_KERNEL); if(dvb->bulk_urb == NULL) { printk(KERN_ERR "tm6000: couldn't allocate urb\n"); return -ENOMEM; } - maxPaketSize = dev->bulk_in->desc.wMaxPacketSize; + pipe = usb_rcvbulkpipe(dev->udev, dev->bulk_in->desc.bEndpointAddress + & USB_ENDPOINT_NUMBER_MASK); + + size = usb_maxpacket(dev->udev, pipe, usb_pipeout(pipe)); + size = size * 15; /* 512 x 8 or 12 or 15 */ - dvb->bulk_urb->transfer_buffer = kzalloc(maxPaketSize, GFP_KERNEL); + dvb->bulk_urb->transfer_buffer = kzalloc(size, GFP_KERNEL); if(dvb->bulk_urb->transfer_buffer == NULL) { usb_free_urb(dvb->bulk_urb); printk(KERN_ERR "tm6000: couldn't allocate transfer buffer!\n"); return -ENOMEM; } - pipe = usb_rcvbulkpipe(dev->udev, dev->bulk_in->desc.bEndpointAddress - & USB_ENDPOINT_NUMBER_MASK); - usb_fill_bulk_urb(dvb->bulk_urb, dev->udev, pipe, dvb->bulk_urb->transfer_buffer, - maxPaketSize, + size, tm6000_urb_received, dev); - ret = usb_set_interface(dev->udev, 0, 1); - if(ret < 0) { - printk(KERN_ERR "tm6000: error %i in %s during set interface\n", ret, __FUNCTION__); - return ret; - } - ret = usb_clear_halt(dev->udev, pipe); if(ret < 0) { printk(KERN_ERR "tm6000: error %i in %s during pipe reset\n",ret,__FUNCTION__); @@ -108,14 +143,13 @@ int tm6000_start_stream(struct tm6000_core *dev) printk(KERN_ERR "tm6000: pipe resetted\n"); } -// mutex_lock(&tm6000_driver.open_close_mutex); +/* mutex_lock(&tm6000_driver.open_close_mutex); */ ret = usb_submit_urb(dvb->bulk_urb, GFP_KERNEL); - -// mutex_unlock(&tm6000_driver.open_close_mutex); +/* mutex_unlock(&tm6000_driver.open_close_mutex); */ if (ret) { printk(KERN_ERR "tm6000: submit of urb failed (error=%i)\n",ret); - + kfree(dvb->bulk_urb->transfer_buffer); usb_free_urb(dvb->bulk_urb); return ret; @@ -126,18 +160,12 @@ int tm6000_start_stream(struct tm6000_core *dev) void tm6000_stop_stream(struct tm6000_core *dev) { - int ret; struct tm6000_dvb *dvb = dev->dvb; -// tm6000_set_led_status(tm6000_dev, 0x0); - - ret = usb_set_interface(dev->udev, 0, 0); - if(ret < 0) { - printk(KERN_ERR "tm6000: error %i in %s during set interface\n",ret,__FUNCTION__); - } - if(dvb->bulk_urb) { + printk (KERN_INFO "urb killing\n"); usb_kill_urb(dvb->bulk_urb); + printk (KERN_INFO "urb buffer free\n"); kfree(dvb->bulk_urb->transfer_buffer); usb_free_urb(dvb->bulk_urb); dvb->bulk_urb = NULL; @@ -154,7 +182,7 @@ int tm6000_start_feed(struct dvb_demux_feed *feed) mutex_lock(&dvb->mutex); if(dvb->streams == 0) { dvb->streams = 1; -// mutex_init(&tm6000_dev->streaming_mutex); +/* mutex_init(&tm6000_dev->streming_mutex); */ tm6000_start_stream(dev); } else { @@ -173,14 +201,16 @@ int tm6000_stop_feed(struct dvb_demux_feed *feed) { printk(KERN_INFO "tm6000: got stop feed request %s\n",__FUNCTION__); mutex_lock(&dvb->mutex); - --dvb->streams; - if(0 == dvb->streams) { + printk (KERN_INFO "stream %#x\n", dvb->streams); + --(dvb->streams); + if(dvb->streams == 0) { + printk (KERN_INFO "stop stream\n"); tm6000_stop_stream(dev); -// mutex_destroy(&tm6000_dev->streaming_mutex); +/* mutex_destroy(&tm6000_dev->streaming_mutex); */ } mutex_unlock(&dvb->mutex); -// mutex_destroy(&tm6000_dev->streaming_mutex); +/* mutex_destroy(&tm6000_dev->streaming_mutex); */ return 0; } @@ -191,13 +221,16 @@ int tm6000_dvb_attach_frontend(struct tm6000_core *dev) if(dev->caps.has_zl10353) { struct zl10353_config config = - {.demod_address = dev->demod_addr >> 1, + {.demod_address = dev->demod_addr, .no_tuner = 1, -// .input_frequency = 0x19e9, -// .r56_agc_targets = 0x1c, + .parallel_ts = 1, + .if2 = 45700, + .disable_i2c_gate_ctrl = 1, + .tm6000 = 1, }; dvb->frontend = pseudo_zl10353_attach(dev, &config, +/* dvb->frontend = dvb_attach (zl10353_attach, &config, */ &dev->i2c_adap); } else { @@ -259,8 +292,8 @@ int tm6000_dvb_register(struct tm6000_core *dev) dvb->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING; dvb->demux.priv = dev; - dvb->demux.filternum = 256; - dvb->demux.feednum = 256; + dvb->demux.filternum = 5; /* 256; */ + dvb->demux.feednum = 5; /* 256; */ dvb->demux.start_feed = tm6000_start_feed; dvb->demux.stop_feed = tm6000_stop_feed; dvb->demux.write_to_decoder = NULL; @@ -308,7 +341,7 @@ void tm6000_dvb_unregister(struct tm6000_core *dev) usb_free_urb(bulk_urb); } -// mutex_lock(&tm6000_driver.open_close_mutex); +/* mutex_lock(&tm6000_driver.open_close_mutex); */ if(dvb->frontend) { dvb_frontend_detach(dvb->frontend); dvb_unregister_frontend(dvb->frontend); @@ -318,6 +351,6 @@ void tm6000_dvb_unregister(struct tm6000_core *dev) dvb_dmx_release(&dvb->demux); dvb_unregister_adapter(&dvb->adapter); mutex_destroy(&dvb->mutex); -// mutex_unlock(&tm6000_driver.open_close_mutex); +/* mutex_unlock(&tm6000_driver.open_close_mutex); */ } -- 1.6.4.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 11/12] tm6000: bugfix firmware xc3028L-v36.fw used with Zarlink and DTV78 or DTV8 no shift 2010-02-05 23:06 [PATCH 10/12] tm6000: bugfix usb DVB transfer stefan.ringel @ 2010-02-05 23:06 ` stefan.ringel 2010-02-05 23:06 ` [PATCH 12/12] tm6000: add a different set param values stefan.ringel 2010-02-08 11:27 ` [PATCH 11/12] tm6000: bugfix firmware xc3028L-v36.fw used with Zarlink and DTV78 or DTV8 no shift Mauro Carvalho Chehab 0 siblings, 2 replies; 7+ messages in thread From: stefan.ringel @ 2010-02-05 23:06 UTC (permalink / raw) To: linux-media; +Cc: mchehab, dheitmueller, Stefan Ringel From: Stefan Ringel <stefan.ringel@arcor.de> Signed-off-by: Stefan Ringel <stefan.ringel@arcor.de> --- drivers/media/common/tuners/tuner-xc2028.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) diff --git a/drivers/media/common/tuners/tuner-xc2028.c b/drivers/media/common/tuners/tuner-xc2028.c index ed50168..fcf19cc 100644 --- a/drivers/media/common/tuners/tuner-xc2028.c +++ b/drivers/media/common/tuners/tuner-xc2028.c @@ -1114,7 +1114,12 @@ static int xc2028_set_params(struct dvb_frontend *fe, /* All S-code tables need a 200kHz shift */ if (priv->ctrl.demod) { - demod = priv->ctrl.demod + 200; + if ((strcmp (priv->ctrl.fname, "xc3028L-v36.fw") == 0) && + (priv->ctrl.demod == XC3028_FE_ZARLINK456) && + ((type & DTV78) || (type & DTV8))) + demod = priv->ctrl.demod; + else + demod = priv->ctrl.demod + 200; /* * The DTV7 S-code table needs a 700 kHz shift. * Thanks to Terry Wu <terrywu2009@gmail.com> for reporting this -- 1.6.4.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 12/12] tm6000: add a different set param values 2010-02-05 23:06 ` [PATCH 11/12] tm6000: bugfix firmware xc3028L-v36.fw used with Zarlink and DTV78 or DTV8 no shift stefan.ringel @ 2010-02-05 23:06 ` stefan.ringel 2010-02-08 11:27 ` [PATCH 11/12] tm6000: bugfix firmware xc3028L-v36.fw used with Zarlink and DTV78 or DTV8 no shift Mauro Carvalho Chehab 1 sibling, 0 replies; 7+ messages in thread From: stefan.ringel @ 2010-02-05 23:06 UTC (permalink / raw) To: linux-media; +Cc: mchehab, dheitmueller, Stefan Ringel From: Stefan Ringel <stefan.ringel@arcor.de> Signed-off-by: Stefan Ringel <stefan.ringel@arcor.de> --- drivers/staging/tm6000/hack.c | 160 ++++++++++++++++++++++++++++++++++++++++- 1 files changed, 157 insertions(+), 3 deletions(-) diff --git a/drivers/staging/tm6000/hack.c b/drivers/staging/tm6000/hack.c index f181fce..bb4100b 100644 --- a/drivers/staging/tm6000/hack.c +++ b/drivers/staging/tm6000/hack.c @@ -37,7 +37,6 @@ static inline int tm6000_snd_control_msg(struct tm6000_core *dev, __u8 request, static int pseudo_zl10353_pll(struct tm6000_core *tm6000_dev, struct dvb_frontend_parameters *p) { - int ret; u8 *data = kzalloc(50*sizeof(u8), GFP_KERNEL); printk(KERN_ALERT "should set frequency %u\n", p->frequency); @@ -51,7 +50,7 @@ printk(KERN_ALERT "and bandwith %u\n", p->u.ofdm.bandwidth); } // init ZL10353 - data[0] = 0x0b; +/* data[0] = 0x0b; ret = tm6000_snd_control_msg(tm6000_dev, 0x10, 0x501e, 0x00, data, 0x1); msleep(15); data[0] = 0x80; @@ -189,7 +188,162 @@ printk(KERN_ALERT "and bandwith %u\n", p->u.ofdm.bandwidth); msleep(15); break; } - +*/ + switch(p->u.ofdm.bandwidth) { + case BANDWIDTH_8_MHZ: + data[0] = 0x03; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x501e,0,data,1); + msleep(40); + data[0] = 0x44; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x511e,0,data,1); + msleep(40); + data[0] = 0x40; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x551e,0,data,1); + msleep(40); + data[0] = 0x46; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x521e,0,data,1); + msleep(40); + data[0] = 0x15; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x531e,0,data,1); + msleep(40); + data[0] = 0x0f; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x541e,0,data,1); + msleep(40); + data[0] = 0x80; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x551e,0,data,1); + msleep(40); + data[0] = 0x01; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0xea1e,0,data,1); + msleep(40); + data[0] = 0x00; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0xea1e,0,data,1); + msleep(40); + data[0] = 0x8b; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x631e,0,data,1); + msleep(40); + data[0] = 0x75; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0xcc1e,0,data,1); + msleep(40); + data[0] = 0xe6; //0x19; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x6c1e,0,data,1); + msleep(40); + data[0] = 0x09; //0xf7; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x6d1e,0,data,1); + msleep(40); + data[0] = 0x67; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x651e,0,data,1); + msleep(40); + data[0] = 0xe5; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x661e,0,data,1); + msleep(40); + data[0] = 0x75; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x5c1e,0,data,1); + msleep(40); + data[0] = 0x17; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x5f1e,0,data,1); + msleep(40); + data[0] = 0x40; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x5e1e,0,data,1); + msleep(40); + data[0] = 0x01; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x701e,0,data,1); + msleep(40); + break; + case BANDWIDTH_7_MHZ: + data[0] = 0x03; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x501e,0,data,1); + msleep(40); + data[0] = 0x44; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x511e,0,data,1); + msleep(40); + data[0] = 0x40; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x551e,0,data,1); + msleep(40); + data[0] = 0x46; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x521e,0,data,1); + msleep(40); + data[0] = 0x15; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x531e,0,data,1); + msleep(40); + data[0] = 0x0f; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x541e,0,data,1); + msleep(40); + data[0] = 0x80; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x551e,0,data,1); + msleep(40); + data[0] = 0x01; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0xea1e,0,data,1); + msleep(40); + data[0] = 0x00; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0xea1e,0,data,1); + msleep(40); + data[0] = 0x83; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x631e,0,data,1); + msleep(40); + data[0] = 0xa3; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0xcc1e,0,data,1); + msleep(40); + data[0] = 0xe6; //0x19; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x6c1e,0,data,1); + msleep(40); + data[0] = 0x09; //0xf7; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x6d1e,0,data,1); + msleep(40); + data[0] = 0x5a; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x651e,0,data,1); + msleep(40); + data[0] = 0xe9; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x661e,0,data,1); + msleep(40); + data[0] = 0x86; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x5c1e,0,data,1); + msleep(40); + data[0] = 0x17; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x5f1e,0,data,1); + msleep(40); + data[0] = 0x40; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x5e1e,0,data,1); + msleep(40); + data[0] = 0x01; + tm6000_read_write_usb(tm6000_dev,0x40,0x10,0x701e,0,data,1); + msleep(40); + break; + default: + printk(KERN_ALERT "tm6000: bandwidth not supported\n"); + } + + tm6000_read_write_usb(tm6000_dev,0xc0,0x10,0x051f,0,data,2); + printk(KERN_INFO "buf %#x %#x \n", data[0], data[1]); + msleep(40); + + tm6000_read_write_usb(tm6000_dev,0xc0,0x10,0x051f,0,data,2); + printk(KERN_INFO "buf %#x %#x \n", data[0], data[1]); + msleep(40); + + tm6000_read_write_usb(tm6000_dev,0xc0,0x10,0x051f,0,data,2); + printk(KERN_INFO "buf %#x %#x \n", data[0], data[1]); + msleep(40); + + tm6000_read_write_usb(tm6000_dev,0xc0,0x10,0x051f,0,data,2); + printk(KERN_INFO "buf %#x %#x \n", data[0], data[1]); + msleep(40); + + tm6000_read_write_usb(tm6000_dev,0xc0,0x10,0x051f,0,data,2); + printk(KERN_INFO "buf %#x %#x \n", data[0], data[1]); + msleep(40); + + tm6000_read_write_usb(tm6000_dev,0xc0,0x10,0x0f1f,0,data,2); + printk(KERN_INFO "buf %#x %#x \n", data[0], data[1]); + msleep(40); + + tm6000_read_write_usb(tm6000_dev,0xc0,0x10,0x091f,0,data,2); + printk(KERN_INFO "buf %#x %#x \n", data[0], data[1]); + msleep(40); + + tm6000_read_write_usb(tm6000_dev,0xc0,0x10,0x0b1f,0,data,2); + printk(KERN_INFO "buf %#x %#x \n", data[0], data[1]); + msleep(40); + kfree(data); return 0; -- 1.6.4.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 11/12] tm6000: bugfix firmware xc3028L-v36.fw used with Zarlink and DTV78 or DTV8 no shift 2010-02-05 23:06 ` [PATCH 11/12] tm6000: bugfix firmware xc3028L-v36.fw used with Zarlink and DTV78 or DTV8 no shift stefan.ringel 2010-02-05 23:06 ` [PATCH 12/12] tm6000: add a different set param values stefan.ringel @ 2010-02-08 11:27 ` Mauro Carvalho Chehab 2010-02-08 17:10 ` Stefan Ringel 1 sibling, 1 reply; 7+ messages in thread From: Mauro Carvalho Chehab @ 2010-02-08 11:27 UTC (permalink / raw) To: stefan.ringel; +Cc: linux-media stefan.ringel@arcor.de wrote: > From: Stefan Ringel <stefan.ringel@arcor.de> > > Signed-off-by: Stefan Ringel <stefan.ringel@arcor.de> > --- > drivers/media/common/tuners/tuner-xc2028.c | 7 ++++++- > 1 files changed, 6 insertions(+), 1 deletions(-) > > diff --git a/drivers/media/common/tuners/tuner-xc2028.c b/drivers/media/common/tuners/tuner-xc2028.c > index ed50168..fcf19cc 100644 > --- a/drivers/media/common/tuners/tuner-xc2028.c > +++ b/drivers/media/common/tuners/tuner-xc2028.c > @@ -1114,7 +1114,12 @@ static int xc2028_set_params(struct dvb_frontend *fe, > > /* All S-code tables need a 200kHz shift */ > if (priv->ctrl.demod) { > - demod = priv->ctrl.demod + 200; > + if ((strcmp (priv->ctrl.fname, "xc3028L-v36.fw") == 0) && > + (priv->ctrl.demod == XC3028_FE_ZARLINK456) && > + ((type & DTV78) || (type & DTV8))) > + demod = priv->ctrl.demod; > + else > + demod = priv->ctrl.demod + 200; > /* > * The DTV7 S-code table needs a 700 kHz shift. > * Thanks to Terry Wu <terrywu2009@gmail.com> for reporting this The idea behind this patch is right, but you should be testing it against priv->firm_version, instead comparing with a file name. Also, this will likely cause regressions on other drivers, since the offsets for v3.6 firmwares were handled on a different way on other drivers. I prefer to postpone this patch and the discussion behind it after having tm6000 driver ready, since it makes no sense to cause regressions or request changes on existing drivers due to a driver that is not ready yet. So, please hold your patch on your queue for now. My suggestion is that you should use git and have this patch on a separate branch where you do your tests, having a branch without this patch for upstream submission. -- Cheers, Mauro ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 11/12] tm6000: bugfix firmware xc3028L-v36.fw used with Zarlink and DTV78 or DTV8 no shift 2010-02-08 11:27 ` [PATCH 11/12] tm6000: bugfix firmware xc3028L-v36.fw used with Zarlink and DTV78 or DTV8 no shift Mauro Carvalho Chehab @ 2010-02-08 17:10 ` Stefan Ringel 2010-02-08 17:56 ` Mauro Carvalho Chehab 0 siblings, 1 reply; 7+ messages in thread From: Stefan Ringel @ 2010-02-08 17:10 UTC (permalink / raw) To: Mauro Carvalho Chehab; +Cc: linux-media [-- Attachment #1: Type: text/plain, Size: 2241 bytes --] Am 08.02.2010 12:27, schrieb Mauro Carvalho Chehab: > stefan.ringel@arcor.de wrote: > >> From: Stefan Ringel <stefan.ringel@arcor.de> >> >> Signed-off-by: Stefan Ringel <stefan.ringel@arcor.de> >> --- >> drivers/media/common/tuners/tuner-xc2028.c | 7 ++++++- >> 1 files changed, 6 insertions(+), 1 deletions(-) >> >> diff --git a/drivers/media/common/tuners/tuner-xc2028.c b/drivers/media/common/tuners/tuner-xc2028.c >> index ed50168..fcf19cc 100644 >> --- a/drivers/media/common/tuners/tuner-xc2028.c >> +++ b/drivers/media/common/tuners/tuner-xc2028.c >> @@ -1114,7 +1114,12 @@ static int xc2028_set_params(struct dvb_frontend *fe, >> >> /* All S-code tables need a 200kHz shift */ >> if (priv->ctrl.demod) { >> - demod = priv->ctrl.demod + 200; >> + if ((strcmp (priv->ctrl.fname, "xc3028L-v36.fw") == 0) && >> + (priv->ctrl.demod == XC3028_FE_ZARLINK456) && >> + ((type & DTV78) || (type & DTV8))) >> + demod = priv->ctrl.demod; >> + else >> + demod = priv->ctrl.demod + 200; >> /* >> * The DTV7 S-code table needs a 700 kHz shift. >> * Thanks to Terry Wu <terrywu2009@gmail.com> for reporting this >> > The idea behind this patch is right, but you should be testing it against > priv->firm_version, instead comparing with a file name. > > Also, this will likely cause regressions on other drivers, since the offsets for > v3.6 firmwares were handled on a different way on other drivers. I prefer to postpone > this patch and the discussion behind it after having tm6000 driver ready, since > it makes no sense to cause regressions or request changes on existing drivers due > to a driver that is not ready yet. > > So, please hold your patch on your queue for now. > > My suggestion is that you should use git and have this patch on a separate branch where you > do your tests, having a branch without this patch for upstream submission. > > In this firmware is for ZARLINK two parts, first for QAM, DTV6 and DTV7 with shift 200 kHz, and second for DTV78 and DTV8. I check the firmware 2.7 this use for ZARLINK for all this mode a 200 kHz shift. For the next source part it says that DTV7 have 700 kHz shift. That not for all firmware correct. -- Stefan Ringel <stefan.ringel@arcor.de> [-- Attachment #2: firmware-v27.txt --] [-- Type: text/plain, Size: 8020 bytes --] list action firmware file name: xc3028-v27.fw firmware name: xc2028 firmware version: 2.7 (519) standards: 80 Firmware 0, type: BASE FW F8MHZ (0x00000003), id: (0000000000000000), size: 8718 Firmware 1, type: BASE FW F8MHZ MTS (0x00000007), id: (0000000000000000), size: 8712 Firmware 2, type: BASE FW FM (0x00000401), id: (0000000000000000), size: 8562 Firmware 3, type: BASE FW FM INPUT1 (0x00000c01), id: (0000000000000000), size: 8576 Firmware 4, type: BASE FW (0x00000001), id: (0000000000000000), size: 8706 Firmware 5, type: BASE FW MTS (0x00000005), id: (0000000000000000), size: 8682 Firmware 6, type: STD FW (0x00000000), id: PAL/BG A2/A (0000000100000007), size: 161 Firmware 7, type: STD FW MTS (0x00000004), id: PAL/BG A2/A (0000000100000007), size: 169 Firmware 8, type: STD FW (0x00000000), id: PAL/BG A2/B (0000000200000007), size: 161 Firmware 9, type: STD FW MTS (0x00000004), id: PAL/BG A2/B (0000000200000007), size: 169 Firmware 10, type: STD FW (0x00000000), id: PAL/BG NICAM/A (0000000400000007), size: 161 Firmware 11, type: STD FW MTS (0x00000004), id: PAL/BG NICAM/A (0000000400000007), size: 169 Firmware 12, type: STD FW (0x00000000), id: PAL/BG NICAM/B (0000000800000007), size: 161 Firmware 13, type: STD FW MTS (0x00000004), id: PAL/BG NICAM/B (0000000800000007), size: 169 Firmware 14, type: STD FW (0x00000000), id: PAL/DK A2 (00000003000000e0), size: 161 Firmware 15, type: STD FW MTS (0x00000004), id: PAL/DK A2 (00000003000000e0), size: 169 Firmware 16, type: STD FW (0x00000000), id: PAL/DK NICAM (0000000c000000e0), size: 161 Firmware 17, type: STD FW MTS (0x00000004), id: PAL/DK NICAM (0000000c000000e0), size: 169 Firmware 18, type: STD FW (0x00000000), id: SECAM/K1 (0000000000200000), size: 161 Firmware 19, type: STD FW MTS (0x00000004), id: SECAM/K1 (0000000000200000), size: 169 Firmware 20, type: STD FW (0x00000000), id: SECAM/K3 (0000000004000000), size: 161 Firmware 21, type: STD FW MTS (0x00000004), id: SECAM/K3 (0000000004000000), size: 169 Firmware 22, type: STD FW D2633 DTV6 ATSC (0x00010030), id: (0000000000000000), size: 149 Firmware 23, type: STD FW D2620 DTV6 QAM (0x00000068), id: (0000000000000000), size: 149 Firmware 24, type: STD FW D2633 DTV6 QAM (0x00000070), id: (0000000000000000), size: 149 Firmware 25, type: STD FW D2620 DTV7 (0x00000088), id: (0000000000000000), size: 149 Firmware 26, type: STD FW D2633 DTV7 (0x00000090), id: (0000000000000000), size: 149 Firmware 27, type: STD FW D2620 DTV78 (0x00000108), id: (0000000000000000), size: 149 Firmware 28, type: STD FW D2633 DTV78 (0x00000110), id: (0000000000000000), size: 149 Firmware 29, type: STD FW D2620 DTV8 (0x00000208), id: (0000000000000000), size: 149 Firmware 30, type: STD FW D2633 DTV8 (0x00000210), id: (0000000000000000), size: 149 Firmware 31, type: STD FW FM (0x00000400), id: (0000000000000000), size: 135 Firmware 32, type: STD FW (0x00000000), id: PAL/I (0000000000000010), size: 161 Firmware 33, type: STD FW MTS (0x00000004), id: PAL/I (0000000000000010), size: 169 Firmware 34, type: STD FW (0x00000000), id: SECAM/L AM (0000001000400000), size: 169 Firmware 35, type: STD FW (0x00000000), id: SECAM/L NICAM (0000000c00400000), size: 161 Firmware 36, type: STD FW (0x00000000), id: SECAM/Lc (0000000000800000), size: 161 Firmware 37, type: STD FW (0x00000000), id: NTSC/M Kr (0000000000008000), size: 161 Firmware 38, type: STD FW LCD (0x00001000), id: NTSC/M Kr (0000000000008000), size: 161 Firmware 39, type: STD FW LCD NOGD (0x00003000), id: NTSC/M Kr (0000000000008000), size: 161 Firmware 40, type: STD FW MTS (0x00000004), id: NTSC/M Kr (0000000000008000), size: 169 Firmware 41, type: STD FW (0x00000000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161 Firmware 42, type: STD FW LCD (0x00001000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161 Firmware 43, type: STD FW LCD NOGD (0x00003000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161 Firmware 44, type: STD FW (0x00000000), id: NTSC/M Jp (0000000000002000), size: 161 Firmware 45, type: STD FW MTS (0x00000004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169 Firmware 46, type: STD FW MTS LCD (0x00001004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169 Firmware 47, type: STD FW MTS LCD NOGD (0x00003004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169 Firmware 48, type: SCODE FW HAS IF (0x60000000), IF = 3.28 MHz id: (0000000000000000), size: 192 Firmware 49, type: SCODE FW HAS IF (0x60000000), IF = 3.30 MHz id: (0000000000000000), size: 192 Firmware 50, type: SCODE FW HAS IF (0x60000000), IF = 3.44 MHz id: (0000000000000000), size: 192 Firmware 51, type: SCODE FW HAS IF (0x60000000), IF = 3.46 MHz id: (0000000000000000), size: 192 Firmware 52, type: SCODE FW DTV6 ATSC OREN36 HAS IF (0x60210020), IF = 3.80 MHz id: (0000000000000000), size: 192 Firmware 53, type: SCODE FW HAS IF (0x60000000), IF = 4.00 MHz id: (0000000000000000), size: 192 Firmware 54, type: SCODE FW DTV6 ATSC TOYOTA388 HAS IF (0x60410020), IF = 4.08 MHz id: (0000000000000000), size: 192 Firmware 55, type: SCODE FW HAS IF (0x60000000), IF = 4.20 MHz id: (0000000000000000), size: 192 Firmware 56, type: SCODE FW MONO HAS IF (0x60008000), IF = 4.32 MHz id: NTSC/M Kr (0000000000008000), size: 192 Firmware 57, type: SCODE FW HAS IF (0x60000000), IF = 4.45 MHz id: (0000000000000000), size: 192 Firmware 58, type: SCODE FW MTS LCD NOGD MONO IF HAS IF (0x6002b004), IF = 4.50 MHz id: NTSC PAL/M PAL/N (000000000000b700), size: 192 Firmware 59, type: SCODE FW LCD NOGD IF HAS IF (0x60023000), IF = 4.60 MHz id: NTSC/M Kr (0000000000008000), size: 192 Firmware 60, type: SCODE FW DTV6 QAM DTV7 DTV78 DTV8 ZARLINK456 HAS IF (0x620003e0), IF = 4.76 MHz id: (0000000000000000), size: 192 Firmware 61, type: SCODE FW HAS IF (0x60000000), IF = 4.94 MHz id: (0000000000000000), size: 192 Firmware 62, type: SCODE FW HAS IF (0x60000000), IF = 5.26 MHz id: (0000000000000000), size: 192 Firmware 63, type: SCODE FW MONO HAS IF (0x60008000), IF = 5.32 MHz id: PAL/BG A2 NICAM (0000000f00000007), size: 192 Firmware 64, type: SCODE FW DTV7 DTV78 DTV8 DIBCOM52 CHINA HAS IF (0x65000380), IF = 5.40 MHz id: (0000000000000000), size: 192 Firmware 65, type: SCODE FW DTV6 ATSC OREN538 HAS IF (0x60110020), IF = 5.58 MHz id: (0000000000000000), size: 192 Firmware 66, type: SCODE FW HAS IF (0x60000000), IF = 5.64 MHz id: PAL/BG A2 (0000000300000007), size: 192 Firmware 67, type: SCODE FW HAS IF (0x60000000), IF = 5.74 MHz id: PAL/BG NICAM (0000000c00000007), size: 192 Firmware 68, type: SCODE FW HAS IF (0x60000000), IF = 5.90 MHz id: (0000000000000000), size: 192 Firmware 69, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.00 MHz id: PAL/DK PAL/I SECAM/K3 SECAM/L SECAM/Lc NICAM (0000000c04c000f0), size: 192 Firmware 70, type: SCODE FW DTV6 QAM ATSC LG60 F6MHZ HAS IF (0x68050060), IF = 6.20 MHz id: (0000000000000000), size: 192 Firmware 71, type: SCODE FW HAS IF (0x60000000), IF = 6.24 MHz id: PAL/I (0000000000000010), size: 192 Firmware 72, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.32 MHz id: SECAM/K1 (0000000000200000), size: 192 Firmware 73, type: SCODE FW HAS IF (0x60000000), IF = 6.34 MHz id: SECAM/K1 (0000000000200000), size: 192 Firmware 74, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.50 MHz id: PAL/DK SECAM/K3 SECAM/L NICAM (0000000c044000e0), size: 192 Firmware 75, type: SCODE FW DTV6 ATSC ATI638 HAS IF (0x60090020), IF = 6.58 MHz id: (0000000000000000), size: 192 Firmware 76, type: SCODE FW HAS IF (0x60000000), IF = 6.60 MHz id: PAL/DK A2 (00000003000000e0), size: 192 Firmware 77, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.68 MHz id: PAL/DK A2 (00000003000000e0), size: 192 Firmware 78, type: SCODE FW DTV6 ATSC TOYOTA794 HAS IF (0x60810020), IF = 8.14 MHz id: (0000000000000000), size: 192 Firmware 79, type: SCODE FW HAS IF (0x60000000), IF = 8.20 MHz id: (0000000000000000), size: 192 [-- Attachment #3: firmware-v36.txt --] [-- Type: text/plain, Size: 8034 bytes --] list action firmware file name: xc3028L-v36.fw firmware name: xc2028 firmware version: 3.6 (774) standards: 81 Firmware 0, type: BASE FW F8MHZ (0x00000003), id: (0000000000000000), size: 9144 Firmware 1, type: BASE FW F8MHZ MTS (0x00000007), id: (0000000000000000), size: 9030 Firmware 2, type: BASE FW FM (0x00000401), id: (0000000000000000), size: 9054 Firmware 3, type: BASE FW FM INPUT1 (0x00000c01), id: (0000000000000000), size: 9068 Firmware 4, type: BASE FW (0x00000001), id: (0000000000000000), size: 9132 Firmware 5, type: BASE FW MTS (0x00000005), id: (0000000000000000), size: 9006 Firmware 6, type: STD FW (0x00000000), id: PAL/BG (0000000000000007), size: 161 Firmware 7, type: STD FW MTS (0x00000004), id: PAL/BG (0000000000000007), size: 169 Firmware 8, type: STD FW (0x00000000), id: PAL/BG (0000000000000007), size: 161 Firmware 9, type: STD FW MTS (0x00000004), id: PAL/BG (0000000000000007), size: 169 Firmware 10, type: STD FW (0x00000000), id: PAL/BG (0000000000000007), size: 161 Firmware 11, type: STD FW MTS (0x00000004), id: PAL/BG (0000000000000007), size: 169 Firmware 12, type: STD FW (0x00000000), id: PAL/BG (0000000000000007), size: 161 Firmware 13, type: STD FW MTS (0x00000004), id: PAL/BG (0000000000000007), size: 169 Firmware 14, type: STD FW (0x00000000), id: PAL/DK (00000000000000e0), size: 161 Firmware 15, type: STD FW MTS (0x00000004), id: PAL/DK (00000000000000e0), size: 169 Firmware 16, type: STD FW (0x00000000), id: PAL/DK (00000000000000e0), size: 161 Firmware 17, type: STD FW MTS (0x00000004), id: PAL/DK (00000000000000e0), size: 169 Firmware 18, type: STD FW (0x00000000), id: SECAM/K1 (0000000000200000), size: 161 Firmware 19, type: STD FW MTS (0x00000004), id: SECAM/K1 (0000000000200000), size: 169 Firmware 20, type: STD FW (0x00000000), id: SECAM/K3 (0000000004000000), size: 161 Firmware 21, type: STD FW MTS (0x00000004), id: SECAM/K3 (0000000004000000), size: 169 Firmware 22, type: STD FW D2633 DTV6 ATSC (0x00010030), id: (0000000000000000), size: 149 Firmware 23, type: STD FW D2620 DTV6 QAM (0x00000068), id: (0000000000000000), size: 149 Firmware 24, type: STD FW D2633 DTV6 QAM (0x00000070), id: (0000000000000000), size: 149 Firmware 25, type: STD FW D2620 DTV7 (0x00000088), id: (0000000000000000), size: 149 Firmware 26, type: STD FW D2633 DTV7 (0x00000090), id: (0000000000000000), size: 149 Firmware 27, type: STD FW D2620 DTV78 (0x00000108), id: (0000000000000000), size: 149 Firmware 28, type: STD FW D2633 DTV78 (0x00000110), id: (0000000000000000), size: 149 Firmware 29, type: STD FW D2620 DTV8 (0x00000208), id: (0000000000000000), size: 149 Firmware 30, type: STD FW D2633 DTV8 (0x00000210), id: (0000000000000000), size: 149 Firmware 31, type: STD FW FM (0x00000400), id: (0000000000000000), size: 135 Firmware 32, type: STD FW (0x00000000), id: PAL/I (0000000000000010), size: 161 Firmware 33, type: STD FW MTS (0x00000004), id: PAL/I (0000000000000010), size: 169 Firmware 34, type: STD FW (0x00000000), id: SECAM/L (0000000000400000), size: 161 Firmware 35, type: STD FW (0x00000000), id: SECAM/Lc (0000000000800000), size: 161 Firmware 36, type: STD FW (0x00000000), id: NTSC/M Kr (0000000000008000), size: 161 Firmware 37, type: STD FW LCD (0x00001000), id: NTSC/M Kr (0000000000008000), size: 161 Firmware 38, type: STD FW LCD NOGD (0x00003000), id: NTSC/M Kr (0000000000008000), size: 161 Firmware 39, type: STD FW MTS (0x00000004), id: NTSC/M Kr (0000000000008000), size: 169 Firmware 40, type: STD FW (0x00000000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161 Firmware 41, type: STD FW LCD (0x00001000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161 Firmware 42, type: STD FW LCD NOGD (0x00003000), id: NTSC PAL/M PAL/N (000000000000b700), size: 161 Firmware 43, type: STD FW (0x00000000), id: NTSC/M Jp (0000000000002000), size: 161 Firmware 44, type: STD FW MTS (0x00000004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169 Firmware 45, type: STD FW MTS LCD (0x00001004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169 Firmware 46, type: STD FW MTS LCD NOGD (0x00003004), id: NTSC PAL/M PAL/N (000000000000b700), size: 169 Firmware 47, type: SCODE FW HAS IF (0x60000000), IF = 3.28 MHz id: (0000000000000000), size: 192 Firmware 48, type: SCODE FW HAS IF (0x60000000), IF = 3.30 MHz id: (0000000000000000), size: 192 Firmware 49, type: SCODE FW HAS IF (0x60000000), IF = 3.44 MHz id: (0000000000000000), size: 192 Firmware 50, type: SCODE FW HAS IF (0x60000000), IF = 3.46 MHz id: (0000000000000000), size: 192 Firmware 51, type: SCODE FW DTV6 ATSC OREN36 HAS IF (0x60210020), IF = 3.80 MHz id: (0000000000000000), size: 192 Firmware 52, type: SCODE FW HAS IF (0x60000000), IF = 4.00 MHz id: (0000000000000000), size: 192 Firmware 53, type: SCODE FW DTV6 ATSC TOYOTA388 HAS IF (0x60410020), IF = 4.08 MHz id: (0000000000000000), size: 192 Firmware 54, type: SCODE FW HAS IF (0x60000000), IF = 4.20 MHz id: (0000000000000000), size: 192 Firmware 55, type: SCODE FW MONO HAS IF (0x60008000), IF = 4.32 MHz id: NTSC/M Kr (0000000000008000), size: 192 Firmware 56, type: SCODE FW HAS IF (0x60000000), IF = 4.45 MHz id: (0000000000000000), size: 192 Firmware 57, type: SCODE FW MTS LCD NOGD MONO IF HAS IF (0x6002b004), IF = 4.50 MHz id: NTSC PAL/M PAL/N (000000000000b700), size: 192 Firmware 58, type: SCODE FW DTV78 DTV8 ZARLINK456 HAS IF (0x62000300), IF = 4.56 MHz id: (0000000000000000), size: 192 Firmware 59, type: SCODE FW LCD NOGD IF HAS IF (0x60023000), IF = 4.60 MHz id: NTSC/M Kr (0000000000008000), size: 192 Firmware 60, type: SCODE FW DTV6 QAM DTV7 ZARLINK456 HAS IF (0x620000e0), IF = 4.76 MHz id: (0000000000000000), size: 192 Firmware 61, type: SCODE FW HAS IF (0x60000000), IF = 4.94 MHz id: (0000000000000000), size: 192 Firmware 62, type: SCODE FW DTV78 DTV8 DIBCOM52 HAS IF (0x61000300), IF = 5.20 MHz id: (0000000000000000), size: 192 Firmware 63, type: SCODE FW HAS IF (0x60000000), IF = 5.26 MHz id: (0000000000000000), size: 192 Firmware 64, type: SCODE FW MONO HAS IF (0x60008000), IF = 5.32 MHz id: PAL/BG (0000000000000007), size: 192 Firmware 65, type: SCODE FW DTV7 DTV8 DIBCOM52 CHINA HAS IF (0x65000280), IF = 5.40 MHz id: (0000000000000000), size: 192 Firmware 66, type: SCODE FW DTV6 ATSC OREN538 HAS IF (0x60110020), IF = 5.58 MHz id: (0000000000000000), size: 192 Firmware 67, type: SCODE FW HAS IF (0x60000000), IF = 5.64 MHz id: PAL/BG (0000000000000007), size: 192 Firmware 68, type: SCODE FW HAS IF (0x60000000), IF = 5.74 MHz id: PAL/BG (0000000000000007), size: 192 Firmware 69, type: SCODE FW HAS IF (0x60000000), IF = 5.90 MHz id: (0000000000000000), size: 192 Firmware 70, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.00 MHz id: PAL/DK PAL/I SECAM/K3 SECAM/L SECAM/Lc (0000000004c000f0), size: 192 Firmware 71, type: SCODE FW DTV6 QAM ATSC LG60 F6MHZ HAS IF (0x68050060), IF = 6.20 MHz id: (0000000000000000), size: 192 Firmware 72, type: SCODE FW HAS IF (0x60000000), IF = 6.24 MHz id: PAL/I (0000000000000010), size: 192 Firmware 73, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.32 MHz id: SECAM/K1 (0000000000200000), size: 192 Firmware 74, type: SCODE FW HAS IF (0x60000000), IF = 6.34 MHz id: SECAM/K1 (0000000000200000), size: 192 Firmware 75, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.50 MHz id: PAL/DK SECAM/K3 (00000000040000e0), size: 192 Firmware 76, type: SCODE FW DTV6 ATSC ATI638 HAS IF (0x60090020), IF = 6.58 MHz id: (0000000000000000), size: 192 Firmware 77, type: SCODE FW HAS IF (0x60000000), IF = 6.60 MHz id: PAL/DK (00000000000000e0), size: 192 Firmware 78, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.68 MHz id: PAL/DK (00000000000000e0), size: 192 Firmware 79, type: SCODE FW DTV6 ATSC TOYOTA794 HAS IF (0x60810020), IF = 8.14 MHz id: (0000000000000000), size: 192 Firmware 80, type: SCODE FW HAS IF (0x60000000), IF = 8.20 MHz id: (0000000000000000), size: 192 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 11/12] tm6000: bugfix firmware xc3028L-v36.fw used with Zarlink and DTV78 or DTV8 no shift 2010-02-08 17:10 ` Stefan Ringel @ 2010-02-08 17:56 ` Mauro Carvalho Chehab 0 siblings, 0 replies; 7+ messages in thread From: Mauro Carvalho Chehab @ 2010-02-08 17:56 UTC (permalink / raw) To: Stefan Ringel; +Cc: linux-media Stefan Ringel wrote: > Am 08.02.2010 12:27, schrieb Mauro Carvalho Chehab: >> stefan.ringel@arcor.de wrote: >> >>> From: Stefan Ringel <stefan.ringel@arcor.de> >>> >>> Signed-off-by: Stefan Ringel <stefan.ringel@arcor.de> >>> --- >>> drivers/media/common/tuners/tuner-xc2028.c | 7 ++++++- >>> 1 files changed, 6 insertions(+), 1 deletions(-) >>> >>> diff --git a/drivers/media/common/tuners/tuner-xc2028.c b/drivers/media/common/tuners/tuner-xc2028.c >>> index ed50168..fcf19cc 100644 >>> --- a/drivers/media/common/tuners/tuner-xc2028.c >>> +++ b/drivers/media/common/tuners/tuner-xc2028.c >>> @@ -1114,7 +1114,12 @@ static int xc2028_set_params(struct dvb_frontend *fe, >>> >>> /* All S-code tables need a 200kHz shift */ >>> if (priv->ctrl.demod) { >>> - demod = priv->ctrl.demod + 200; >>> + if ((strcmp (priv->ctrl.fname, "xc3028L-v36.fw") == 0) && >>> + (priv->ctrl.demod == XC3028_FE_ZARLINK456) && >>> + ((type & DTV78) || (type & DTV8))) >>> + demod = priv->ctrl.demod; >>> + else >>> + demod = priv->ctrl.demod + 200; >>> /* >>> * The DTV7 S-code table needs a 700 kHz shift. >>> * Thanks to Terry Wu <terrywu2009@gmail.com> for reporting this >>> >> The idea behind this patch is right, but you should be testing it against >> priv->firm_version, instead comparing with a file name. >> >> Also, this will likely cause regressions on other drivers, since the offsets for >> v3.6 firmwares were handled on a different way on other drivers. I prefer to postpone >> this patch and the discussion behind it after having tm6000 driver ready, since >> it makes no sense to cause regressions or request changes on existing drivers due >> to a driver that is not ready yet. >> >> So, please hold your patch on your queue for now. >> >> My suggestion is that you should use git and have this patch on a separate branch where you >> do your tests, having a branch without this patch for upstream submission. >> >> > In this firmware is for ZARLINK two parts, first for QAM, DTV6 and DTV7 > with shift 200 kHz, and second for DTV78 and DTV8. I check the firmware > 2.7 this use for ZARLINK for all this mode a 200 kHz shift. For the next > source part it says that DTV7 have 700 kHz shift. > That not for all firmware correct. > > >From what we know, the name "zarlink" for the firmware is bogus: the firmware has nothing special to work with zarlink, except for the IF offset. You may or select a firmware with -200 KHz IF offset or to do the adjustment by adding 200 KHz for firmwares up to 2.7. The problem is that the driver that originally added the v3.6 implemented it on a different place. So, we need to fix all the drivers at the patch that we're changing its behavior, to avoid breakages. -- Cheers, Mauro ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/12] tm6000: add Terratec Cinergy Hybrid XE @ 2010-02-05 22:48 stefan.ringel 2010-02-05 22:48 ` [PATCH 2/12] tm6000: avoid unregister the driver after success at tm6000_init_dev stefan.ringel 0 siblings, 1 reply; 7+ messages in thread From: stefan.ringel @ 2010-02-05 22:48 UTC (permalink / raw) To: linux-media; +Cc: mchehab, dheitmueller, Stefan Ringel From: Stefan Ringel <stefan.ringel@arcor.de> --- drivers/staging/tm6000/tm6000-cards.c | 22 +++++++++++++++++++++- 1 files changed, 21 insertions(+), 1 deletions(-) diff --git a/drivers/staging/tm6000/tm6000-cards.c b/drivers/staging/tm6000/tm6000-cards.c index c4db903..7f594a2 100644 --- a/drivers/staging/tm6000/tm6000-cards.c +++ b/drivers/staging/tm6000/tm6000-cards.c @@ -44,6 +44,10 @@ #define TM6000_BOARD_FREECOM_AND_SIMILAR 7 #define TM6000_BOARD_ADSTECH_MINI_DUAL_TV 8 #define TM6010_BOARD_HAUPPAUGE_900H 9 +#define TM6010_BOARD_BEHOLD_WANDER 10 +#define TM6010_BOARD_BEHOLD_VOYAGER 11 +#define TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE 12 + #define TM6000_MAXBOARDS 16 static unsigned int card[] = {[0 ... (TM6000_MAXBOARDS - 1)] = UNSET }; @@ -208,7 +212,21 @@ struct tm6000_board tm6000_boards[] = { }, .gpio_addr_tun_reset = TM6000_GPIO_2, }, - + [TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE] = { + .name = "Terratec Cinergy Hybrid XE", + .tuner_type = TUNER_XC2028, /* has a XC3028 */ + .tuner_addr = 0xc2 >> 1, + .demod_addr = 0x1e >> 1, + .type = TM6010, + .caps = { + .has_tuner = 1, + .has_dvb = 1, + .has_zl10353 = 1, + .has_eeprom = 1, + .has_remote = 1, + }, + .gpio_addr_tun_reset = TM6010_GPIO_2, + } }; /* table of devices that work with this driver */ @@ -221,6 +239,7 @@ struct usb_device_id tm6000_id_table [] = { { USB_DEVICE(0x2040, 0x6600), .driver_info = TM6010_BOARD_HAUPPAUGE_900H }, { USB_DEVICE(0x6000, 0xdec0), .driver_info = TM6010_BOARD_BEHOLD_WANDER }, { USB_DEVICE(0x6000, 0xdec1), .driver_info = TM6010_BOARD_BEHOLD_VOYAGER }, + { USB_DEVICE(0x0ccd, 0x0086), .driver_info = TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE }, { }, }; @@ -311,6 +330,7 @@ static void tm6000_config_tuner (struct tm6000_core *dev) switch(dev->model) { case TM6010_BOARD_HAUPPAUGE_900H: + case TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE: ctl.fname = "xc3028L-v36.fw"; break; default: -- 1.6.4.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/12] tm6000: avoid unregister the driver after success at tm6000_init_dev 2010-02-05 22:48 [PATCH 1/12] tm6000: add Terratec Cinergy Hybrid XE stefan.ringel @ 2010-02-05 22:48 ` stefan.ringel 2010-02-05 22:48 ` [PATCH 3/12] tm6000: clean the identifer string stefan.ringel 0 siblings, 1 reply; 7+ messages in thread From: stefan.ringel @ 2010-02-05 22:48 UTC (permalink / raw) To: linux-media; +Cc: mchehab, dheitmueller, Stefan Ringel From: Stefan Ringel <stefan.ringel@arcor.de> --- drivers/staging/tm6000/tm6000-cards.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/drivers/staging/tm6000/tm6000-cards.c b/drivers/staging/tm6000/tm6000-cards.c index 7f594a2..e697ce3 100644 --- a/drivers/staging/tm6000/tm6000-cards.c +++ b/drivers/staging/tm6000/tm6000-cards.c @@ -422,6 +422,7 @@ static int tm6000_init_dev(struct tm6000_core *dev) } #endif } + return 0; err2: v4l2_device_unregister(&dev->v4l2_dev); -- 1.6.4.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/12] tm6000: clean the identifer string 2010-02-05 22:48 ` [PATCH 2/12] tm6000: avoid unregister the driver after success at tm6000_init_dev stefan.ringel @ 2010-02-05 22:48 ` stefan.ringel 2010-02-05 22:48 ` [PATCH 4/12] tm6000: adding special usb request to quiting tuner transfer stefan.ringel 0 siblings, 1 reply; 7+ messages in thread From: stefan.ringel @ 2010-02-05 22:48 UTC (permalink / raw) To: linux-media; +Cc: mchehab, dheitmueller, Stefan Ringel From: Stefan Ringel <stefan.ringel@arcor.de> --- drivers/staging/tm6000/tm6000-cards.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/tm6000/tm6000-cards.c b/drivers/staging/tm6000/tm6000-cards.c index e697ce3..1167b01 100644 --- a/drivers/staging/tm6000/tm6000-cards.c +++ b/drivers/staging/tm6000/tm6000-cards.c @@ -480,7 +480,7 @@ static int tm6000_usb_probe(struct usb_interface *interface, /* Check to see next free device and mark as used */ nr=find_first_zero_bit(&tm6000_devused,TM6000_MAXBOARDS); if (nr >= TM6000_MAXBOARDS) { - printk ("tm6000: Supports only %i em28xx boards.\n",TM6000_MAXBOARDS); + printk ("tm6000: Supports only %i tm60xx boards.\n",TM6000_MAXBOARDS); usb_put_dev(usbdev); return -ENOMEM; } -- 1.6.4.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 4/12] tm6000: adding special usb request to quiting tuner transfer 2010-02-05 22:48 ` [PATCH 3/12] tm6000: clean the identifer string stefan.ringel @ 2010-02-05 22:48 ` stefan.ringel 2010-02-05 22:48 ` [PATCH 5/12] tm6000: update init table and sequence for tm6010 stefan.ringel 0 siblings, 1 reply; 7+ messages in thread From: stefan.ringel @ 2010-02-05 22:48 UTC (permalink / raw) To: linux-media; +Cc: mchehab, dheitmueller, Stefan Ringel From: Stefan Ringel <stefan.ringel@arcor.de> --- drivers/staging/tm6000/tm6000-i2c.c | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletions(-) diff --git a/drivers/staging/tm6000/tm6000-i2c.c b/drivers/staging/tm6000/tm6000-i2c.c index 4da10f5..3e43ad7 100644 --- a/drivers/staging/tm6000/tm6000-i2c.c +++ b/drivers/staging/tm6000/tm6000-i2c.c @@ -86,6 +86,11 @@ static int tm6000_i2c_xfer(struct i2c_adapter *i2c_adap, msgs[i].len == 1 ? 0 : msgs[i].buf[1], msgs[i + 1].buf, msgs[i + 1].len); i++; + + if ((dev->dev_type == TM6010) && (addr == 0xc2)) { + tm6000_set_reg(dev, 0x32, 0,0); + tm6000_set_reg(dev, 0x33, 0,0); + } if (i2c_debug >= 2) for (byte = 0; byte < msgs[i].len; byte++) printk(" %02x", msgs[i].buf[byte]); @@ -99,6 +104,12 @@ static int tm6000_i2c_xfer(struct i2c_adapter *i2c_adap, REQ_16_SET_GET_I2C_WR1_RDN, addr | msgs[i].buf[0] << 8, 0, msgs[i].buf + 1, msgs[i].len - 1); + + + if ((dev->dev_type == TM6010) && (addr == 0xc2)) { + tm6000_set_reg(dev, 0x32, 0,0); + tm6000_set_reg(dev, 0x33, 0,0); + } } if (i2c_debug >= 2) printk("\n"); @@ -198,7 +209,7 @@ static struct i2c_algorithm tm6000_algo = { static struct i2c_adapter tm6000_adap_template = { .owner = THIS_MODULE, - .class = I2C_CLASS_TV_ANALOG, + .class = I2C_CLASS_TV_ANALOG | I2C_CLASS_TV_DIGITAL, .name = "tm6000", .id = I2C_HW_B_TM6000, .algo = &tm6000_algo, -- 1.6.4.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 5/12] tm6000: update init table and sequence for tm6010 2010-02-05 22:48 ` [PATCH 4/12] tm6000: adding special usb request to quiting tuner transfer stefan.ringel @ 2010-02-05 22:48 ` stefan.ringel 2010-02-05 22:48 ` [PATCH 7/12] tm6000: add tuner callback for dvb frontend stefan.ringel 0 siblings, 1 reply; 7+ messages in thread From: stefan.ringel @ 2010-02-05 22:48 UTC (permalink / raw) To: linux-media; +Cc: mchehab, dheitmueller, Stefan Ringel From: Stefan Ringel <stefan.ringel@arcor.de> --- drivers/staging/tm6000/tm6000-core.c | 179 ++++++++++++++++++++++++---------- 1 files changed, 128 insertions(+), 51 deletions(-) diff --git a/drivers/staging/tm6000/tm6000-core.c b/drivers/staging/tm6000/tm6000-core.c index 7ec13d5..a2e2af5 100644 --- a/drivers/staging/tm6000/tm6000-core.c +++ b/drivers/staging/tm6000/tm6000-core.c @@ -414,7 +414,15 @@ struct reg_init tm6010_init_tab[] = { { REQ_07_SET_GET_AVREG, 0x3f, 0x00 }, { REQ_05_SET_GET_USBREG, 0x18, 0x00 }, - + + /* additional from Terratec Cinergy Hybrid XE */ + { REQ_07_SET_GET_AVREG, 0xdc, 0xaa }, + { REQ_07_SET_GET_AVREG, 0xdd, 0x30 }, + { REQ_07_SET_GET_AVREG, 0xde, 0x20 }, + { REQ_07_SET_GET_AVREG, 0xdf, 0xd0 }, + { REQ_04_EN_DISABLE_MCU_INT, 0x02, 0x00 }, + { REQ_07_SET_GET_AVREG, 0xd8, 0x2f }, + /* set remote wakeup key:any key wakeup */ { REQ_07_SET_GET_AVREG, 0xe5, 0xfe }, { REQ_07_SET_GET_AVREG, 0xda, 0xff }, @@ -424,6 +432,7 @@ int tm6000_init (struct tm6000_core *dev) { int board, rc=0, i, size; struct reg_init *tab; + u8 buf[40]; if (dev->dev_type == TM6010) { tab = tm6010_init_tab; @@ -444,61 +453,129 @@ int tm6000_init (struct tm6000_core *dev) } } - msleep(5); /* Just to be conservative */ - - /* Check board version - maybe 10Moons specific */ - board=tm6000_get_reg16 (dev, 0x40, 0, 0); - if (board >=0) { - printk (KERN_INFO "Board version = 0x%04x\n",board); - } else { - printk (KERN_ERR "Error %i while retrieving board version\n",board); - } - + /* hack */ if (dev->dev_type == TM6010) { - /* Turn xceive 3028 on */ - tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6010_GPIO_3, 0x01); - msleep(11); - } - - /* Reset GPIO1 and GPIO4. */ - for (i=0; i< 2; i++) { - rc = tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, - dev->tuner_reset_gpio, 0x00); - if (rc<0) { - printk (KERN_ERR "Error %i doing GPIO1 reset\n",rc); - return rc; - } - - msleep(10); /* Just to be conservative */ - rc = tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, - dev->tuner_reset_gpio, 0x01); - if (rc<0) { - printk (KERN_ERR "Error %i doing GPIO1 reset\n",rc); - return rc; - } - - msleep(10); - rc=tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_4, 0); - if (rc<0) { - printk (KERN_ERR "Error %i doing GPIO4 reset\n",rc); - return rc; - } - - msleep(10); - rc=tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_4, 1); - if (rc<0) { - printk (KERN_ERR "Error %i doing GPIO4 reset\n",rc); - return rc; - } - - if (!i) { - rc=tm6000_get_reg16(dev, 0x40,0,0); - if (rc>=0) { - printk ("board=%d\n", rc); + + msleep(15); + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, + TM6010_GPIO_4, 0); + msleep(15); + + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, + TM6010_GPIO_1, 0); + + msleep(50); + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, + TM6010_GPIO_1, 1); + + msleep(15); + tm6000_read_write_usb (dev, 0xc0, 0x0e, 0x0010, 0x4400, buf, 2); + + msleep(15); + tm6000_read_write_usb (dev, 0xc0, 0x10, 0xf432, 0x0000, buf, 2); + + msleep(15); + buf[0] = 0x12; + buf[1] = 0x34; + tm6000_read_write_usb (dev, 0x40, 0x10, 0xf432, 0x0000, buf, 2); + + msleep(15); + tm6000_read_write_usb (dev, 0xc0, 0x10, 0xf432, 0x0000, buf, 2); + + msleep(15); + tm6000_read_write_usb (dev, 0xc0, 0x10, 0x0032, 0x0000, buf, 2); + + msleep(15); + buf[0] = 0x00; + buf[1] = 0x01; + tm6000_read_write_usb (dev, 0x40, 0x10, 0xf332, 0x0000, buf, 2); + + msleep(15); + tm6000_read_write_usb (dev, 0xc0, 0x10, 0x00c0, 0x0000, buf, 39); + + msleep(15); + buf[0] = 0x00; + buf[1] = 0x00; + tm6000_read_write_usb (dev, 0x40, 0x10, 0xf332, 0x0000, buf, 2); + + msleep(15); + tm6000_read_write_usb (dev, 0xc0, 0x10, 0x7f1f, 0x0000, buf, 2); +// printk(KERN_INFO "buf %#x %#x \n", buf[0], buf [1]); + msleep(15); + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, + TM6010_GPIO_4, 1); + msleep(15); + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, + TM6010_GPIO_0, 1); + msleep(15); + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, + TM6010_GPIO_7, 0); + msleep(15); + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, + TM6010_GPIO_5, 1); + + msleep(15); + + for (i=0; i< size; i++) { + rc= tm6000_set_reg (dev, tab[i].req, tab[i].reg, tab[i].val); + if (rc<0) { + printk (KERN_ERR "Error %i while setting req %d, " + "reg %d to value %d\n", rc, + tab[i].req,tab[i].reg, tab[i].val); + return rc; } } + + msleep(15); + + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, + TM6010_GPIO_4, 0); + msleep(15); + + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, + TM6010_GPIO_1, 0); + + msleep(50); + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, + TM6010_GPIO_1, 1); + + msleep(15); + tm6000_read_write_usb (dev, 0xc0, 0x0e, 0x00c2, 0x0008, buf, 2); +// printk(KERN_INFO "buf %#x %#x \n", buf[0], buf[1]); + msleep(15); + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, + TM6010_GPIO_2, 1); + msleep(15); + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, + TM6010_GPIO_2, 0); + msleep(15); + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, + TM6010_GPIO_2, 1); + msleep(15); + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, + TM6010_GPIO_2, 1); + msleep(15); + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, + TM6010_GPIO_2, 0); + msleep(15); + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, + TM6010_GPIO_2, 1); + msleep(15); } + /* hack end */ + + msleep(5); /* Just to be conservative */ + /* Check board version - maybe 10Moons specific */ + if (dev->dev_type == TM5600) { + board=tm6000_get_reg16 (dev, 0x40, 0, 0); + if (board >=0) { + printk (KERN_INFO "Board version = 0x%04x\n",board); + } else { + printk (KERN_ERR "Error %i while retrieving board version\n",board); + } + } + msleep(50); return 0; -- 1.6.4.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 7/12] tm6000: add tuner callback for dvb frontend 2010-02-05 22:48 ` [PATCH 5/12] tm6000: update init table and sequence for tm6010 stefan.ringel @ 2010-02-05 22:48 ` stefan.ringel 2010-02-05 22:48 ` [PATCH 8/12] tm6000: add tuner parameter stefan.ringel 0 siblings, 1 reply; 7+ messages in thread From: stefan.ringel @ 2010-02-05 22:48 UTC (permalink / raw) To: linux-media; +Cc: mchehab, dheitmueller, Stefan Ringel From: Stefan Ringel <stefan.ringel@arcor.de> --- drivers/staging/tm6000/tm6000-cards.c | 2 +- drivers/staging/tm6000/tm6000-dvb.c | 3 ++- drivers/staging/tm6000/tm6000.h | 3 +++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/staging/tm6000/tm6000-cards.c b/drivers/staging/tm6000/tm6000-cards.c index 5cf5d58..4592397 100644 --- a/drivers/staging/tm6000/tm6000-cards.c +++ b/drivers/staging/tm6000/tm6000-cards.c @@ -245,7 +245,7 @@ struct usb_device_id tm6000_id_table [] = { /* Tuner callback to provide the proper gpio changes needed for xc2028 */ -static int tm6000_tuner_callback(void *ptr, int component, int command, int arg) +int tm6000_tuner_callback(void *ptr, int component, int command, int arg) { int rc=0; struct tm6000_core *dev = ptr; diff --git a/drivers/staging/tm6000/tm6000-dvb.c b/drivers/staging/tm6000/tm6000-dvb.c index e900d6d..fdbee30 100644 --- a/drivers/staging/tm6000/tm6000-dvb.c +++ b/drivers/staging/tm6000/tm6000-dvb.c @@ -235,7 +235,8 @@ int tm6000_dvb_register(struct tm6000_core *dev) .i2c_adap = &dev->i2c_adap, .i2c_addr = dev->tuner_addr, }; - + + dvb->frontend->callback = tm6000_tuner_callback; ret = dvb_register_frontend(&dvb->adapter, dvb->frontend); if (ret < 0) { printk(KERN_ERR diff --git a/drivers/staging/tm6000/tm6000.h b/drivers/staging/tm6000/tm6000.h index 877cbf6..d713c48 100644 --- a/drivers/staging/tm6000/tm6000.h +++ b/drivers/staging/tm6000/tm6000.h @@ -202,6 +202,9 @@ struct tm6000_fh { V4L2_STD_PAL_M|V4L2_STD_PAL_60|V4L2_STD_NTSC_M| \ V4L2_STD_NTSC_M_JP|V4L2_STD_SECAM +/* In tm6000-cards.c */ + +int tm6000_tuner_callback (void *ptr, int component, int command, int arg); /* In tm6000-core.c */ int tm6000_read_write_usb (struct tm6000_core *dev, u8 reqtype, u8 req, -- 1.6.4.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 8/12] tm6000: add tuner parameter 2010-02-05 22:48 ` [PATCH 7/12] tm6000: add tuner callback for dvb frontend stefan.ringel @ 2010-02-05 22:48 ` stefan.ringel 2010-02-05 22:48 ` [PATCH 9/12] tm6000: remove unused function stefan.ringel 0 siblings, 1 reply; 7+ messages in thread From: stefan.ringel @ 2010-02-05 22:48 UTC (permalink / raw) To: linux-media; +Cc: mchehab, dheitmueller, Stefan Ringel From: Stefan Ringel <stefan.ringel@arcor.de> --- drivers/staging/tm6000/tm6000-cards.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/staging/tm6000/tm6000-cards.c b/drivers/staging/tm6000/tm6000-cards.c index 4592397..f22f8ad 100644 --- a/drivers/staging/tm6000/tm6000-cards.c +++ b/drivers/staging/tm6000/tm6000-cards.c @@ -312,7 +312,7 @@ static void tm6000_config_tuner (struct tm6000_core *dev) memset(&tun_setup, 0, sizeof(tun_setup)); tun_setup.type = dev->tuner_type; tun_setup.addr = dev->tuner_addr; - tun_setup.mode_mask = T_ANALOG_TV | T_RADIO; + tun_setup.mode_mask = T_ANALOG_TV | T_RADIO | T_DIGITAL_TV; tun_setup.tuner_callback = tm6000_tuner_callback; v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_type_addr, &tun_setup); @@ -324,10 +324,12 @@ static void tm6000_config_tuner (struct tm6000_core *dev) memset(&xc2028_cfg, 0, sizeof(xc2028_cfg)); memset (&ctl,0,sizeof(ctl)); - ctl.mts = 1; - ctl.read_not_reliable = 1; + ctl.input1 = 1; + ctl.read_not_reliable = 0; ctl.msleep = 10; - + ctl.demod = XC3028_FE_ZARLINK456; + ctl.vhfbw7 = 1; + ctl.uhfbw8 = 1; xc2028_cfg.tuner = TUNER_XC2028; xc2028_cfg.priv = &ctl; -- 1.6.4.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 9/12] tm6000: remove unused function 2010-02-05 22:48 ` [PATCH 8/12] tm6000: add tuner parameter stefan.ringel @ 2010-02-05 22:48 ` stefan.ringel 2010-02-05 22:48 ` [PATCH 10/12] tm6000: bugfix usb DVB transfer stefan.ringel 0 siblings, 1 reply; 7+ messages in thread From: stefan.ringel @ 2010-02-05 22:48 UTC (permalink / raw) To: linux-media; +Cc: mchehab, dheitmueller, Stefan Ringel From: Stefan Ringel <stefan.ringel@arcor.de> --- drivers/staging/tm6000/tm6000.h | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/drivers/staging/tm6000/tm6000.h b/drivers/staging/tm6000/tm6000.h index d713c48..e88836d 100644 --- a/drivers/staging/tm6000/tm6000.h +++ b/drivers/staging/tm6000/tm6000.h @@ -212,7 +212,6 @@ int tm6000_read_write_usb (struct tm6000_core *dev, u8 reqtype, u8 req, int tm6000_get_reg (struct tm6000_core *dev, u8 req, u16 value, u16 index); int tm6000_set_reg (struct tm6000_core *dev, u8 req, u16 value, u16 index); int tm6000_init (struct tm6000_core *dev); -int tm6000_init_after_firmware (struct tm6000_core *dev); int tm6000_init_analog_mode (struct tm6000_core *dev); int tm6000_init_digital_mode (struct tm6000_core *dev); -- 1.6.4.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 10/12] tm6000: bugfix usb DVB transfer 2010-02-05 22:48 ` [PATCH 9/12] tm6000: remove unused function stefan.ringel @ 2010-02-05 22:48 ` stefan.ringel 2010-02-05 22:48 ` [PATCH 11/12] tm6000: bugfix firmware xc3028L-v36.fw used with Zarlink and DTV78 or DTV8 no shift stefan.ringel 0 siblings, 1 reply; 7+ messages in thread From: stefan.ringel @ 2010-02-05 22:48 UTC (permalink / raw) To: linux-media; +Cc: mchehab, dheitmueller, Stefan Ringel From: Stefan Ringel <stefan.ringel@arcor.de> --- drivers/staging/tm6000/tm6000-dvb.c | 125 ++++++++++++++++++++++------------- 1 files changed, 79 insertions(+), 46 deletions(-) diff --git a/drivers/staging/tm6000/tm6000-dvb.c b/drivers/staging/tm6000/tm6000-dvb.c index fdbee30..055a58f 100644 --- a/drivers/staging/tm6000/tm6000-dvb.c +++ b/drivers/staging/tm6000/tm6000-dvb.c @@ -17,7 +17,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include <linux/kernel.h> #include <linux/usb.h> +#include <compat.h> #include "tm6000.h" #include "tm6000-regs.h" @@ -30,13 +32,58 @@ #include "tuner-xc2028.h" +static void inline print_err_status (struct tm6000_core *dev, + int packet, int status) +{ + char *errmsg = "Unknown"; + + switch(status) { + case -ENOENT: + errmsg = "unlinked synchronuously"; + break; + case -ECONNRESET: + errmsg = "unlinked asynchronuously"; + break; + case -ENOSR: + errmsg = "Buffer error (overrun)"; + break; + case -EPIPE: + errmsg = "Stalled (device not responding)"; + break; + case -EOVERFLOW: + errmsg = "Babble (bad cable?)"; + break; + case -EPROTO: + errmsg = "Bit-stuff error (bad cable?)"; + break; + case -EILSEQ: + errmsg = "CRC/Timeout (could be anything)"; + break; + case -ETIME: + errmsg = "Device does not respond"; + break; + } + if (packet<0) { + dprintk(dev, 1, "URB status %d [%s].\n", + status, errmsg); + } else { + dprintk(dev, 1, "URB packet %d, status %d [%s].\n", + packet, status, errmsg); + } +} + + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +static void tm6000_urb_received(struct urb *urb, struct pt_regs *ptregs) +#else static void tm6000_urb_received(struct urb *urb) +#endif { int ret; struct tm6000_core* dev = urb->context; - if(urb->status != 0){ - printk(KERN_ERR "tm6000: status != 0\n"); + if(urb->status != 0) { + print_err_status (dev,0,urb->status); } else if(urb->actual_length>0){ dvb_dmx_swfilter(&dev->dvb->demux, urb->transfer_buffer, @@ -56,49 +103,37 @@ static void tm6000_urb_received(struct urb *urb) int tm6000_start_stream(struct tm6000_core *dev) { int ret; - unsigned int pipe, maxPaketSize; + unsigned int pipe, size; struct tm6000_dvb *dvb = dev->dvb; printk(KERN_INFO "tm6000: got start stream request %s\n",__FUNCTION__); tm6000_init_digital_mode(dev); -/* - ret = tm6000_set_led_status(tm6000_dev, 0x1); - if(ret < 0) { - return -1; - } -*/ - dvb->bulk_urb = usb_alloc_urb(0, GFP_KERNEL); if(dvb->bulk_urb == NULL) { printk(KERN_ERR "tm6000: couldn't allocate urb\n"); return -ENOMEM; } - maxPaketSize = dev->bulk_in->desc.wMaxPacketSize; + pipe = usb_rcvbulkpipe(dev->udev, dev->bulk_in->desc.bEndpointAddress + & USB_ENDPOINT_NUMBER_MASK); + + size = usb_maxpacket(dev->udev, pipe, usb_pipeout(pipe)); + size = size * 15; /* 512 x 8 or 12 or 15 */ - dvb->bulk_urb->transfer_buffer = kzalloc(maxPaketSize, GFP_KERNEL); + dvb->bulk_urb->transfer_buffer = kzalloc(size, GFP_KERNEL); if(dvb->bulk_urb->transfer_buffer == NULL) { usb_free_urb(dvb->bulk_urb); printk(KERN_ERR "tm6000: couldn't allocate transfer buffer!\n"); return -ENOMEM; } - pipe = usb_rcvbulkpipe(dev->udev, dev->bulk_in->desc.bEndpointAddress - & USB_ENDPOINT_NUMBER_MASK); - usb_fill_bulk_urb(dvb->bulk_urb, dev->udev, pipe, dvb->bulk_urb->transfer_buffer, - maxPaketSize, + size, tm6000_urb_received, dev); - ret = usb_set_interface(dev->udev, 0, 1); - if(ret < 0) { - printk(KERN_ERR "tm6000: error %i in %s during set interface\n", ret, __FUNCTION__); - return ret; - } - ret = usb_clear_halt(dev->udev, pipe); if(ret < 0) { printk(KERN_ERR "tm6000: error %i in %s during pipe reset\n",ret,__FUNCTION__); @@ -108,14 +143,13 @@ int tm6000_start_stream(struct tm6000_core *dev) printk(KERN_ERR "tm6000: pipe resetted\n"); } -// mutex_lock(&tm6000_driver.open_close_mutex); +/* mutex_lock(&tm6000_driver.open_close_mutex); */ ret = usb_submit_urb(dvb->bulk_urb, GFP_KERNEL); - -// mutex_unlock(&tm6000_driver.open_close_mutex); +/* mutex_unlock(&tm6000_driver.open_close_mutex); */ if (ret) { printk(KERN_ERR "tm6000: submit of urb failed (error=%i)\n",ret); - + kfree(dvb->bulk_urb->transfer_buffer); usb_free_urb(dvb->bulk_urb); return ret; @@ -126,18 +160,12 @@ int tm6000_start_stream(struct tm6000_core *dev) void tm6000_stop_stream(struct tm6000_core *dev) { - int ret; struct tm6000_dvb *dvb = dev->dvb; -// tm6000_set_led_status(tm6000_dev, 0x0); - - ret = usb_set_interface(dev->udev, 0, 0); - if(ret < 0) { - printk(KERN_ERR "tm6000: error %i in %s during set interface\n",ret,__FUNCTION__); - } - if(dvb->bulk_urb) { + printk (KERN_INFO "urb killing\n"); usb_kill_urb(dvb->bulk_urb); + printk (KERN_INFO "urb buffer free\n"); kfree(dvb->bulk_urb->transfer_buffer); usb_free_urb(dvb->bulk_urb); dvb->bulk_urb = NULL; @@ -154,7 +182,7 @@ int tm6000_start_feed(struct dvb_demux_feed *feed) mutex_lock(&dvb->mutex); if(dvb->streams == 0) { dvb->streams = 1; -// mutex_init(&tm6000_dev->streaming_mutex); +/* mutex_init(&tm6000_dev->streming_mutex); */ tm6000_start_stream(dev); } else { @@ -173,14 +201,16 @@ int tm6000_stop_feed(struct dvb_demux_feed *feed) { printk(KERN_INFO "tm6000: got stop feed request %s\n",__FUNCTION__); mutex_lock(&dvb->mutex); - --dvb->streams; - if(0 == dvb->streams) { + printk (KERN_INFO "stream %#x\n", dvb->streams); + --(dvb->streams); + if(dvb->streams == 0) { + printk (KERN_INFO "stop stream\n"); tm6000_stop_stream(dev); -// mutex_destroy(&tm6000_dev->streaming_mutex); +/* mutex_destroy(&tm6000_dev->streaming_mutex); */ } mutex_unlock(&dvb->mutex); -// mutex_destroy(&tm6000_dev->streaming_mutex); +/* mutex_destroy(&tm6000_dev->streaming_mutex); */ return 0; } @@ -191,13 +221,16 @@ int tm6000_dvb_attach_frontend(struct tm6000_core *dev) if(dev->caps.has_zl10353) { struct zl10353_config config = - {.demod_address = dev->demod_addr >> 1, + {.demod_address = dev->demod_addr, .no_tuner = 1, -// .input_frequency = 0x19e9, -// .r56_agc_targets = 0x1c, + .parallel_ts = 1, + .if2 = 45700, + .disable_i2c_gate_ctrl = 1, + .tm6000 = 1, }; dvb->frontend = pseudo_zl10353_attach(dev, &config, +/* dvb->frontend = dvb_attach (zl10353_attach, &config, */ &dev->i2c_adap); } else { @@ -259,8 +292,8 @@ int tm6000_dvb_register(struct tm6000_core *dev) dvb->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING; dvb->demux.priv = dev; - dvb->demux.filternum = 256; - dvb->demux.feednum = 256; + dvb->demux.filternum = 5; /* 256; */ + dvb->demux.feednum = 5; /* 256; */ dvb->demux.start_feed = tm6000_start_feed; dvb->demux.stop_feed = tm6000_stop_feed; dvb->demux.write_to_decoder = NULL; @@ -308,7 +341,7 @@ void tm6000_dvb_unregister(struct tm6000_core *dev) usb_free_urb(bulk_urb); } -// mutex_lock(&tm6000_driver.open_close_mutex); +/* mutex_lock(&tm6000_driver.open_close_mutex); */ if(dvb->frontend) { dvb_frontend_detach(dvb->frontend); dvb_unregister_frontend(dvb->frontend); @@ -318,6 +351,6 @@ void tm6000_dvb_unregister(struct tm6000_core *dev) dvb_dmx_release(&dvb->demux); dvb_unregister_adapter(&dvb->adapter); mutex_destroy(&dvb->mutex); -// mutex_unlock(&tm6000_driver.open_close_mutex); +/* mutex_unlock(&tm6000_driver.open_close_mutex); */ } -- 1.6.4.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 11/12] tm6000: bugfix firmware xc3028L-v36.fw used with Zarlink and DTV78 or DTV8 no shift 2010-02-05 22:48 ` [PATCH 10/12] tm6000: bugfix usb DVB transfer stefan.ringel @ 2010-02-05 22:48 ` stefan.ringel 0 siblings, 0 replies; 7+ messages in thread From: stefan.ringel @ 2010-02-05 22:48 UTC (permalink / raw) To: linux-media; +Cc: mchehab, dheitmueller, Stefan Ringel From: Stefan Ringel <stefan.ringel@arcor.de> --- drivers/media/common/tuners/tuner-xc2028.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) diff --git a/drivers/media/common/tuners/tuner-xc2028.c b/drivers/media/common/tuners/tuner-xc2028.c index ed50168..fcf19cc 100644 --- a/drivers/media/common/tuners/tuner-xc2028.c +++ b/drivers/media/common/tuners/tuner-xc2028.c @@ -1114,7 +1114,12 @@ static int xc2028_set_params(struct dvb_frontend *fe, /* All S-code tables need a 200kHz shift */ if (priv->ctrl.demod) { - demod = priv->ctrl.demod + 200; + if ((strcmp (priv->ctrl.fname, "xc3028L-v36.fw") == 0) && + (priv->ctrl.demod == XC3028_FE_ZARLINK456) && + ((type & DTV78) || (type & DTV8))) + demod = priv->ctrl.demod; + else + demod = priv->ctrl.demod + 200; /* * The DTV7 S-code table needs a 700 kHz shift. * Thanks to Terry Wu <terrywu2009@gmail.com> for reporting this -- 1.6.4.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2010-02-08 17:56 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-02-05 23:06 [PATCH 10/12] tm6000: bugfix usb DVB transfer stefan.ringel 2010-02-05 23:06 ` [PATCH 11/12] tm6000: bugfix firmware xc3028L-v36.fw used with Zarlink and DTV78 or DTV8 no shift stefan.ringel 2010-02-05 23:06 ` [PATCH 12/12] tm6000: add a different set param values stefan.ringel 2010-02-08 11:27 ` [PATCH 11/12] tm6000: bugfix firmware xc3028L-v36.fw used with Zarlink and DTV78 or DTV8 no shift Mauro Carvalho Chehab 2010-02-08 17:10 ` Stefan Ringel 2010-02-08 17:56 ` Mauro Carvalho Chehab -- strict thread matches above, loose matches on Subject: below -- 2010-02-05 22:48 [PATCH 1/12] tm6000: add Terratec Cinergy Hybrid XE stefan.ringel 2010-02-05 22:48 ` [PATCH 2/12] tm6000: avoid unregister the driver after success at tm6000_init_dev stefan.ringel 2010-02-05 22:48 ` [PATCH 3/12] tm6000: clean the identifer string stefan.ringel 2010-02-05 22:48 ` [PATCH 4/12] tm6000: adding special usb request to quiting tuner transfer stefan.ringel 2010-02-05 22:48 ` [PATCH 5/12] tm6000: update init table and sequence for tm6010 stefan.ringel 2010-02-05 22:48 ` [PATCH 7/12] tm6000: add tuner callback for dvb frontend stefan.ringel 2010-02-05 22:48 ` [PATCH 8/12] tm6000: add tuner parameter stefan.ringel 2010-02-05 22:48 ` [PATCH 9/12] tm6000: remove unused function stefan.ringel 2010-02-05 22:48 ` [PATCH 10/12] tm6000: bugfix usb DVB transfer stefan.ringel 2010-02-05 22:48 ` [PATCH 11/12] tm6000: bugfix firmware xc3028L-v36.fw used with Zarlink and DTV78 or DTV8 no shift stefan.ringel
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox