* tm6000
@ 2010-05-05 4:50 Dmitri Belimov
2010-05-05 5:44 ` tm6000 Bee Hock Goh
0 siblings, 1 reply; 12+ messages in thread
From: Dmitri Belimov @ 2010-05-05 4:50 UTC (permalink / raw)
To: linux-media, mchehab, Stefan Ringel, Bee Hock Goh
Hi
At this moment I can start mplayer and see green field with some junk without crash.
Info from mplayer - received 497 frames, drop 69 incorrect frames.
Compile without support DVB-T for our cards.
Now try understand init process working drivers and diff with linux.
P.S. Linux kernel is 2.6.33
With my best regards, Dmitry.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: tm6000
2010-05-05 4:50 tm6000 Dmitri Belimov
@ 2010-05-05 5:44 ` Bee Hock Goh
2010-05-05 7:27 ` tm6000 Dmitri Belimov
0 siblings, 1 reply; 12+ messages in thread
From: Bee Hock Goh @ 2010-05-05 5:44 UTC (permalink / raw)
To: Dmitri Belimov; +Cc: linux-media, mchehab, Stefan Ringel
Did you comment off the code in the get_next_buff that clear the
previous frame data?
On Wed, May 5, 2010 at 12:50 PM, Dmitri Belimov <d.belimov@gmail.com> wrote:
> Hi
>
> At this moment I can start mplayer and see green field with some junk without crash.
> Info from mplayer - received 497 frames, drop 69 incorrect frames.
>
> Compile without support DVB-T for our cards.
>
> Now try understand init process working drivers and diff with linux.
>
> P.S. Linux kernel is 2.6.33
>
> With my best regards, Dmitry.
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: tm6000
2010-05-05 5:44 ` tm6000 Bee Hock Goh
@ 2010-05-05 7:27 ` Dmitri Belimov
2010-05-05 7:47 ` tm6000 Bee Hock Goh
2010-05-05 13:58 ` tm6000 Mauro Carvalho Chehab
0 siblings, 2 replies; 12+ messages in thread
From: Dmitri Belimov @ 2010-05-05 7:27 UTC (permalink / raw)
To: Bee Hock Goh; +Cc: linux-media, mchehab, Stefan Ringel
On Wed, 5 May 2010 13:44:38 +0800
Bee Hock Goh <beehock@gmail.com> wrote:
> Did you comment off the code in the get_next_buff that clear the
> previous frame data?
No.
Git tree + my last patch.
With my best regards, Dmitry.
> On Wed, May 5, 2010 at 12:50 PM, Dmitri Belimov <d.belimov@gmail.com>
> wrote:
> > Hi
> >
> > At this moment I can start mplayer and see green field with some
> > junk without crash. Info from mplayer - received 497 frames, drop
> > 69 incorrect frames.
> >
> > Compile without support DVB-T for our cards.
> >
> > Now try understand init process working drivers and diff with linux.
> >
> > P.S. Linux kernel is 2.6.33
> >
> > With my best regards, Dmitry.
> >
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: tm6000
2010-05-05 7:27 ` tm6000 Dmitri Belimov
@ 2010-05-05 7:47 ` Bee Hock Goh
2010-05-05 13:58 ` tm6000 Mauro Carvalho Chehab
1 sibling, 0 replies; 12+ messages in thread
From: Bee Hock Goh @ 2010-05-05 7:47 UTC (permalink / raw)
To: Dmitri Belimov; +Cc: linux-media, mchehab, Stefan Ringel
If you do that you will get some decent looking video.
On Wed, May 5, 2010 at 3:27 PM, Dmitri Belimov <d.belimov@gmail.com> wrote:
> On Wed, 5 May 2010 13:44:38 +0800
> Bee Hock Goh <beehock@gmail.com> wrote:
>
>> Did you comment off the code in the get_next_buff that clear the
>> previous frame data?
>
> No.
>
> Git tree + my last patch.
>
> With my best regards, Dmitry.
>
>> On Wed, May 5, 2010 at 12:50 PM, Dmitri Belimov <d.belimov@gmail.com>
>> wrote:
>> > Hi
>> >
>> > At this moment I can start mplayer and see green field with some
>> > junk without crash. Info from mplayer - received 497 frames, drop
>> > 69 incorrect frames.
>> >
>> > Compile without support DVB-T for our cards.
>> >
>> > Now try understand init process working drivers and diff with linux.
>> >
>> > P.S. Linux kernel is 2.6.33
>> >
>> > With my best regards, Dmitry.
>> >
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: tm6000
2010-05-05 7:27 ` tm6000 Dmitri Belimov
2010-05-05 7:47 ` tm6000 Bee Hock Goh
@ 2010-05-05 13:58 ` Mauro Carvalho Chehab
1 sibling, 0 replies; 12+ messages in thread
From: Mauro Carvalho Chehab @ 2010-05-05 13:58 UTC (permalink / raw)
To: Dmitri Belimov; +Cc: Bee Hock Goh, linux-media, Stefan Ringel
Dmitri Belimov wrote:
> On Wed, 5 May 2010 13:44:38 +0800
> Bee Hock Goh <beehock@gmail.com> wrote:
>
>> Did you comment off the code in the get_next_buff that clear the
>> previous frame data?
>
> No.
>
> Git tree + my last patch.
>
A "green" tree can happen due to lots of conditions, like:
1) it is not receiving data from xc3028 (or xc5000);
2) wrong gpio setup;
3) data sent too fast to tm6000;
4) need to add some new workarounds to another tm6000 firmware/hardware bug;
5) the device stopped answer and got disconnected from USB buffer;
6) signal were too weak after changing to some channel (it seems that the tm6000
chip stops reception with weak signals - I remember I had to add a code that
re-enables xc3028 every time a channel is changed due to this bug, since,
after disabled, even if the signal become strong, it keeps showing a green
screen);
7) you hit yet another bug on this device ;)
--
Cheers,
Mauro
^ permalink raw reply [flat|nested] 12+ messages in thread
* tm6000
@ 2010-05-18 7:35 Dmitri Belimov
0 siblings, 0 replies; 12+ messages in thread
From: Dmitri Belimov @ 2010-05-18 7:35 UTC (permalink / raw)
To: linux-media, mchehab, Stefan Ringel, Bee Hock Goh
Hi
tm6000 progress bar :-)
At this moment I can watch TV with mplayer without sound.
Our card based on the xc5000 and tm6010
It is possible with my last patch for xc5000 tuner.
Next task is a sound, check init process and stds settings.
P.S. Compile without support DVB-T frontend for our cards. Linux kernel is 2.6.33
With my best regards, Dmitry.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH] tm6000 fix i2c
@ 2010-04-23 0:48 Dmitri Belimov
2010-04-23 15:15 ` Stefan Ringel
0 siblings, 1 reply; 12+ messages in thread
From: Dmitri Belimov @ 2010-04-23 0:48 UTC (permalink / raw)
To: linux-media, Mauro Carvalho Chehab
[-- Attachment #1: Type: text/plain, Size: 5286 bytes --]
Hi
Rework I2C for read word from connected devices, now it works well.
Add new functions for read/write blocks.
diff -r 7c0b887911cf linux/drivers/staging/tm6000/tm6000-i2c.c
--- a/linux/drivers/staging/tm6000/tm6000-i2c.c Mon Apr 05 22:56:43 2010 -0400
+++ b/linux/drivers/staging/tm6000/tm6000-i2c.c Fri Apr 23 04:23:03 2010 +1000
@@ -24,6 +24,7 @@
#include <linux/kernel.h>
#include <linux/usb.h>
#include <linux/i2c.h>
+#include <linux/delay.h>
#include "compat.h"
#include "tm6000.h"
@@ -45,11 +46,39 @@
printk(KERN_DEBUG "%s at %s: " fmt, \
dev->name, __FUNCTION__ , ##args); } while (0)
+static void tm6000_i2c_reset(struct tm6000_core *dev)
+{
+ tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_CLK, 0);
+ msleep(15);
+ tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_CLK, 1);
+ msleep(15);
+}
+
static int tm6000_i2c_send_regs(struct tm6000_core *dev, unsigned char addr,
__u8 reg, char *buf, int len)
{
- return tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, buf, len);
+ int rc;
+ unsigned int tsleep;
+
+ if (!buf || len < 1 || len > 64)
+ return -1;
+
+ /* capture mutex */
+ rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | reg << 8, 0, buf, len);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ /* Calculate delay time, 14000us for 64 bytes */
+ tsleep = ((len * 200) + 200 + 1000) / 1000;
+ msleep(tsleep);
+
+ /* release mutex */
+ return rc;
}
/* Generic read - doesn't work fine with 16bit registers */
@@ -59,22 +88,30 @@
int rc;
u8 b[2];
- if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 == addr) && (reg % 2 == 0)) {
+ if (!buf || len < 1 || len > 64)
+ return -1;
+
+ /* capture mutex */
+ if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 == addr)
+ && (reg % 2 == 0)) {
/*
* Workaround an I2C bug when reading from zl10353
*/
reg -= 1;
len += 1;
- rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, b, len);
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | reg << 8, 0, b, len);
*buf = b[1];
} else {
- rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, buf, len);
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | reg << 8, 0, buf, len);
}
+ /* release mutex */
return rc;
}
@@ -85,8 +122,106 @@
static int tm6000_i2c_recv_regs16(struct tm6000_core *dev, unsigned char addr,
__u16 reg, char *buf, int len)
{
- return tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- REQ_14_SET_GET_I2C_WR2_RDN, addr, reg, buf, len);
+ int rc;
+ unsigned char ureg;
+
+ if (!buf || len != 2)
+ return -1;
+
+ /* capture mutex */
+ ureg = reg & 0xFF;
+ rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | (reg & 0xFF00), 0, &ureg, 1);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ msleep(1400 / 1000);
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
+ reg, 0, buf, len);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ /* release mutex */
+ return rc;
+}
+
+static int tm6000_i2c_read_sequence(struct tm6000_core *dev, unsigned char addr,
+ __u16 reg, char *buf, int len)
+{
+ int rc;
+
+ if (!buf || len < 1 || len > 64)
+ return -1;
+
+ /* capture mutex */
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
+ reg, 0, buf, len);
+ /* release mutex */
+ return rc;
+}
+
+static int tm6000_i2c_write_sequence(struct tm6000_core *dev,
+ unsigned char addr, __u16 reg, char *buf,
+ int len)
+{
+ int rc;
+ unsigned int tsleep;
+
+ if (!buf || len < 1 || len > 64)
+ return -1;
+
+ /* capture mutex */
+ rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | reg << 8, 0, buf+1, len-1);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ /* Calculate delay time, 13800us for 64 bytes */
+ tsleep = ((len * 200) + 1000) / 1000;
+ msleep(tsleep);
+
+ /* release mutex */
+ return rc;
+}
+
+static int tm6000_i2c_write_uni(struct tm6000_core *dev, unsigned char addr,
+ __u16 reg, char *buf, int len)
+{
+ int rc;
+ unsigned int tsleep;
+
+ if (!buf || len < 1 || len > 64)
+ return -1;
+
+ /* capture mutex */
+ rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_30_I2C_WRITE,
+ addr | reg << 8, 0, buf+1, len-1);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ /* Calculate delay time, 14800us for 64 bytes */
+ tsleep = ((len * 200) + 1000 + 1000) / 1000;
+ msleep(tsleep);
+
+ /* release mutex */
+ return rc;
}
static int tm6000_i2c_xfer(struct i2c_adapter *i2c_adap,
Signed-off-by: Beholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com>
With my best regards, Dmitry.
[-- Attachment #2: tm6000_i2c.patch --]
[-- Type: text/x-patch, Size: 5141 bytes --]
diff -r 7c0b887911cf linux/drivers/staging/tm6000/tm6000-i2c.c
--- a/linux/drivers/staging/tm6000/tm6000-i2c.c Mon Apr 05 22:56:43 2010 -0400
+++ b/linux/drivers/staging/tm6000/tm6000-i2c.c Fri Apr 23 04:23:03 2010 +1000
@@ -24,6 +24,7 @@
#include <linux/kernel.h>
#include <linux/usb.h>
#include <linux/i2c.h>
+#include <linux/delay.h>
#include "compat.h"
#include "tm6000.h"
@@ -45,11 +46,39 @@
printk(KERN_DEBUG "%s at %s: " fmt, \
dev->name, __FUNCTION__ , ##args); } while (0)
+static void tm6000_i2c_reset(struct tm6000_core *dev)
+{
+ tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_CLK, 0);
+ msleep(15);
+ tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_CLK, 1);
+ msleep(15);
+}
+
static int tm6000_i2c_send_regs(struct tm6000_core *dev, unsigned char addr,
__u8 reg, char *buf, int len)
{
- return tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, buf, len);
+ int rc;
+ unsigned int tsleep;
+
+ if (!buf || len < 1 || len > 64)
+ return -1;
+
+ /* capture mutex */
+ rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | reg << 8, 0, buf, len);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ /* Calculate delay time, 14000us for 64 bytes */
+ tsleep = ((len * 200) + 200 + 1000) / 1000;
+ msleep(tsleep);
+
+ /* release mutex */
+ return rc;
}
/* Generic read - doesn't work fine with 16bit registers */
@@ -59,22 +88,30 @@
int rc;
u8 b[2];
- if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 == addr) && (reg % 2 == 0)) {
+ if (!buf || len < 1 || len > 64)
+ return -1;
+
+ /* capture mutex */
+ if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 == addr)
+ && (reg % 2 == 0)) {
/*
* Workaround an I2C bug when reading from zl10353
*/
reg -= 1;
len += 1;
- rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, b, len);
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | reg << 8, 0, b, len);
*buf = b[1];
} else {
- rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, buf, len);
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | reg << 8, 0, buf, len);
}
+ /* release mutex */
return rc;
}
@@ -85,8 +122,106 @@
static int tm6000_i2c_recv_regs16(struct tm6000_core *dev, unsigned char addr,
__u16 reg, char *buf, int len)
{
- return tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- REQ_14_SET_GET_I2C_WR2_RDN, addr, reg, buf, len);
+ int rc;
+ unsigned char ureg;
+
+ if (!buf || len != 2)
+ return -1;
+
+ /* capture mutex */
+ ureg = reg & 0xFF;
+ rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | (reg & 0xFF00), 0, &ureg, 1);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ msleep(1400 / 1000);
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
+ reg, 0, buf, len);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ /* release mutex */
+ return rc;
+}
+
+static int tm6000_i2c_read_sequence(struct tm6000_core *dev, unsigned char addr,
+ __u16 reg, char *buf, int len)
+{
+ int rc;
+
+ if (!buf || len < 1 || len > 64)
+ return -1;
+
+ /* capture mutex */
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
+ reg, 0, buf, len);
+ /* release mutex */
+ return rc;
+}
+
+static int tm6000_i2c_write_sequence(struct tm6000_core *dev,
+ unsigned char addr, __u16 reg, char *buf,
+ int len)
+{
+ int rc;
+ unsigned int tsleep;
+
+ if (!buf || len < 1 || len > 64)
+ return -1;
+
+ /* capture mutex */
+ rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | reg << 8, 0, buf+1, len-1);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ /* Calculate delay time, 13800us for 64 bytes */
+ tsleep = ((len * 200) + 1000) / 1000;
+ msleep(tsleep);
+
+ /* release mutex */
+ return rc;
+}
+
+static int tm6000_i2c_write_uni(struct tm6000_core *dev, unsigned char addr,
+ __u16 reg, char *buf, int len)
+{
+ int rc;
+ unsigned int tsleep;
+
+ if (!buf || len < 1 || len > 64)
+ return -1;
+
+ /* capture mutex */
+ rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_30_I2C_WRITE,
+ addr | reg << 8, 0, buf+1, len-1);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ /* Calculate delay time, 14800us for 64 bytes */
+ tsleep = ((len * 200) + 1000 + 1000) / 1000;
+ msleep(tsleep);
+
+ /* release mutex */
+ return rc;
}
static int tm6000_i2c_xfer(struct i2c_adapter *i2c_adap,
Signed-off-by: Beholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com>
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH] tm6000 fix i2c
2010-04-23 0:48 [PATCH] tm6000 fix i2c Dmitri Belimov
@ 2010-04-23 15:15 ` Stefan Ringel
2010-04-26 0:25 ` Dmitri Belimov
0 siblings, 1 reply; 12+ messages in thread
From: Stefan Ringel @ 2010-04-23 15:15 UTC (permalink / raw)
To: Dmitri Belimov; +Cc: linux-media, Mauro Carvalho Chehab
Am 23.04.2010 02:48, schrieb Dmitri Belimov:
> Hi
>
> Rework I2C for read word from connected devices, now it works well.
> Add new functions for read/write blocks.
>
> diff -r 7c0b887911cf linux/drivers/staging/tm6000/tm6000-i2c.c
> --- a/linux/drivers/staging/tm6000/tm6000-i2c.c Mon Apr 05 22:56:43 2010 -0400
> +++ b/linux/drivers/staging/tm6000/tm6000-i2c.c Fri Apr 23 04:23:03 2010 +1000
> @@ -24,6 +24,7 @@
> #include <linux/kernel.h>
> #include <linux/usb.h>
> #include <linux/i2c.h>
> +#include <linux/delay.h>
>
> #include "compat.h"
> #include "tm6000.h"
> @@ -45,11 +46,39 @@
> printk(KERN_DEBUG "%s at %s: " fmt, \
> dev->name, __FUNCTION__ , ##args); } while (0)
>
> +static void tm6000_i2c_reset(struct tm6000_core *dev)
> +{
> + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_CLK, 0);
> + msleep(15);
> + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_CLK, 1);
> + msleep(15);
> +}
> +
> static int tm6000_i2c_send_regs(struct tm6000_core *dev, unsigned char addr,
> __u8 reg, char *buf, int len)
> {
> - return tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
> - REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, buf, len);
> + int rc;
> + unsigned int tsleep;
> +
> + if (!buf || len < 1 || len > 64)
> + return -1;
> +
> + /* capture mutex */
> + rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
> + addr | reg << 8, 0, buf, len);
> +
> + if (rc < 0) {
> + /* release mutex */
> + return rc;
> + }
> +
> + /* Calculate delay time, 14000us for 64 bytes */
> + tsleep = ((len * 200) + 200 + 1000) / 1000;
> + msleep(tsleep);
> +
> + /* release mutex */
> + return rc;
> }
>
> /* Generic read - doesn't work fine with 16bit registers */
> @@ -59,22 +88,30 @@
> int rc;
> u8 b[2];
>
> - if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 == addr) && (reg % 2 == 0)) {
> + if (!buf || len < 1 || len > 64)
> + return -1;
> +
> + /* capture mutex */
> + if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 == addr)
> + && (reg % 2 == 0)) {
> /*
> * Workaround an I2C bug when reading from zl10353
> */
> reg -= 1;
> len += 1;
>
> - rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
> - REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, b, len);
> + rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
> + addr | reg << 8, 0, b, len);
>
> *buf = b[1];
> } else {
> - rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
> - REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, buf, len);
> + rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
> + addr | reg << 8, 0, buf, len);
> }
>
> + /* release mutex */
> return rc;
> }
>
> @@ -85,8 +122,106 @@
> static int tm6000_i2c_recv_regs16(struct tm6000_core *dev, unsigned char addr,
> __u16 reg, char *buf, int len)
> {
> - return tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
> - REQ_14_SET_GET_I2C_WR2_RDN, addr, reg, buf, len);
> + int rc;
> + unsigned char ureg;
> +
> + if (!buf || len != 2)
> + return -1;
> +
> + /* capture mutex */
> + ureg = reg & 0xFF;
> + rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
> + addr | (reg & 0xFF00), 0, &ureg, 1);
> +
> + if (rc < 0) {
> + /* release mutex */
> + return rc;
> + }
> +
> + msleep(1400 / 1000);
> + rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
> + reg, 0, buf, len);
> +
>
not all can this request (chip revision 0xf3 and 0xf4 can it)
> + if (rc < 0) {
> + /* release mutex */
> + return rc;
> + }
> +
> + /* release mutex */
> + return rc;
> +}
> +
> +static int tm6000_i2c_read_sequence(struct tm6000_core *dev, unsigned char addr,
> + __u16 reg, char *buf, int len)
> +{
> + int rc;
> +
> + if (!buf || len < 1 || len > 64)
> + return -1;
> +
> + /* capture mutex */
> + rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
> + reg, 0, buf, len);
>
ditto
> + /* release mutex */
> + return rc;
> +}
> +
> +static int tm6000_i2c_write_sequence(struct tm6000_core *dev,
> + unsigned char addr, __u16 reg, char *buf,
> + int len)
> +{
> + int rc;
> + unsigned int tsleep;
> +
> + if (!buf || len < 1 || len > 64)
> + return -1;
> +
> + /* capture mutex */
> + rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
> + addr | reg << 8, 0, buf+1, len-1);
> +
> + if (rc < 0) {
> + /* release mutex */
> + return rc;
> + }
> +
> + /* Calculate delay time, 13800us for 64 bytes */
> + tsleep = ((len * 200) + 1000) / 1000;
> + msleep(tsleep);
> +
> + /* release mutex */
> + return rc;
> +}
> +
> +static int tm6000_i2c_write_uni(struct tm6000_core *dev, unsigned char addr,
> + __u16 reg, char *buf, int len)
> +{
> + int rc;
> + unsigned int tsleep;
> +
> + if (!buf || len < 1 || len > 64)
> + return -1;
> +
> + /* capture mutex */
> + rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_30_I2C_WRITE,
> + addr | reg << 8, 0, buf+1, len-1);
> +
> + if (rc < 0) {
> + /* release mutex */
> + return rc;
> + }
> +
> + /* Calculate delay time, 14800us for 64 bytes */
> + tsleep = ((len * 200) + 1000 + 1000) / 1000;
> + msleep(tsleep);
> +
> + /* release mutex */
> + return rc;
> }
>
> static int tm6000_i2c_xfer(struct i2c_adapter *i2c_adap,
>
> Signed-off-by: Beholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com>
>
>
> With my best regards, Dmitry.
--
Stefan Ringel <stefan.ringel@arcor.de>
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH] tm6000 fix i2c
2010-04-23 15:15 ` Stefan Ringel
@ 2010-04-26 0:25 ` Dmitri Belimov
2010-04-26 12:58 ` Bee Hock Goh
0 siblings, 1 reply; 12+ messages in thread
From: Dmitri Belimov @ 2010-04-26 0:25 UTC (permalink / raw)
To: Stefan Ringel; +Cc: linux-media, Mauro Carvalho Chehab, Bee Hock Goh
[-- Attachment #1: Type: text/plain, Size: 6472 bytes --]
Hi
Rework last I2C patch.
Set correct limit for I2C packet.
Use different method for the tm5600/tm6000 and tm6010 to read word.
Try this patch.
diff -r 7c0b887911cf linux/drivers/staging/tm6000/tm6000-i2c.c
--- a/linux/drivers/staging/tm6000/tm6000-i2c.c Mon Apr 05 22:56:43 2010 -0400
+++ b/linux/drivers/staging/tm6000/tm6000-i2c.c Mon Apr 26 04:15:56 2010 +1000
@@ -24,6 +24,7 @@
#include <linux/kernel.h>
#include <linux/usb.h>
#include <linux/i2c.h>
+#include <linux/delay.h>
#include "compat.h"
#include "tm6000.h"
@@ -45,11 +46,49 @@
printk(KERN_DEBUG "%s at %s: " fmt, \
dev->name, __FUNCTION__ , ##args); } while (0)
+static void tm6000_i2c_reset(struct tm6000_core *dev)
+{
+ tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_CLK, 0);
+ msleep(15);
+ tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_CLK, 1);
+ msleep(15);
+}
+
static int tm6000_i2c_send_regs(struct tm6000_core *dev, unsigned char addr,
__u8 reg, char *buf, int len)
{
- return tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, buf, len);
+ int rc;
+ unsigned int tsleep;
+ unsigned int i2c_packet_limit = 16;
+
+ if (dev->dev_type == TM6010)
+ i2c_packet_limit = 64;
+
+ if (!buf)
+ return -1;
+
+ if (len < 1 || len > i2c_packet_limit){
+ printk("Incorrect lenght of i2c packet = %d, limit set to %d\n",
+ len, i2c_packet_limit);
+ return -1;
+ }
+
+ /* capture mutex */
+ rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | reg << 8, 0, buf, len);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ /* Calculate delay time, 14000us for 64 bytes */
+ tsleep = ((len * 200) + 200 + 1000) / 1000;
+ msleep(tsleep);
+
+ /* release mutex */
+ return rc;
}
/* Generic read - doesn't work fine with 16bit registers */
@@ -58,23 +97,41 @@
{
int rc;
u8 b[2];
+ unsigned int i2c_packet_limit = 16;
- if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 == addr) && (reg % 2 == 0)) {
+ if (dev->dev_type == TM6010)
+ i2c_packet_limit = 64;
+
+ if (!buf)
+ return -1;
+
+ if (len < 1 || len > i2c_packet_limit){
+ printk("Incorrect lenght of i2c packet = %d, limit set to %d\n",
+ len, i2c_packet_limit);
+ return -1;
+ }
+
+ /* capture mutex */
+ if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 == addr)
+ && (reg % 2 == 0)) {
/*
* Workaround an I2C bug when reading from zl10353
*/
reg -= 1;
len += 1;
- rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, b, len);
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | reg << 8, 0, b, len);
*buf = b[1];
} else {
- rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, buf, len);
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | reg << 8, 0, buf, len);
}
+ /* release mutex */
return rc;
}
@@ -85,8 +142,137 @@
static int tm6000_i2c_recv_regs16(struct tm6000_core *dev, unsigned char addr,
__u16 reg, char *buf, int len)
{
- return tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- REQ_14_SET_GET_I2C_WR2_RDN, addr, reg, buf, len);
+ int rc;
+ unsigned char ureg;
+
+ if (!buf || len != 2)
+ return -1;
+
+ /* capture mutex */
+ if (dev->dev_type == TM6010){
+ ureg = reg & 0xFF;
+ rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | (reg & 0xFF00), 0, &ureg, 1);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ msleep(1400 / 1000);
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
+ reg, 0, buf, len);
+ }
+ else {
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_14_SET_GET_I2C_WR2_RDN,
+ addr, reg, buf, len);
+ }
+
+ /* release mutex */
+ return rc;
+}
+
+static int tm6000_i2c_read_sequence(struct tm6000_core *dev, unsigned char addr,
+ __u16 reg, char *buf, int len)
+{
+ int rc;
+
+ if (dev->dev_type != TM6010)
+ return -1;
+
+ if (!buf)
+ return -1;
+
+ if (len < 1 || len > 64){
+ printk("Incorrect lenght of i2c packet = %d, limit set to 64\n",
+ len);
+ return -1;
+ }
+
+ /* capture mutex */
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
+ reg, 0, buf, len);
+ /* release mutex */
+ return rc;
+}
+
+static int tm6000_i2c_write_sequence(struct tm6000_core *dev,
+ unsigned char addr, __u16 reg, char *buf,
+ int len)
+{
+ int rc;
+ unsigned int tsleep;
+ unsigned int i2c_packet_limit = 16;
+
+ if (dev->dev_type == TM6010)
+ i2c_packet_limit = 64;
+
+ if (!buf)
+ return -1;
+
+ if (len < 1 || len > i2c_packet_limit){
+ printk("Incorrect lenght of i2c packet = %d, limit set to %d\n",
+ len, i2c_packet_limit);
+ return -1;
+ }
+
+ /* capture mutex */
+ rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | reg << 8, 0, buf+1, len-1);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ /* Calculate delay time, 13800us for 64 bytes */
+ tsleep = ((len * 200) + 1000) / 1000;
+ msleep(tsleep);
+
+ /* release mutex */
+ return rc;
+}
+
+static int tm6000_i2c_write_uni(struct tm6000_core *dev, unsigned char addr,
+ __u16 reg, char *buf, int len)
+{
+ int rc;
+ unsigned int tsleep;
+ unsigned int i2c_packet_limit = 16;
+
+ if (dev->dev_type == TM6010)
+ i2c_packet_limit = 64;
+
+ if (!buf)
+ return -1;
+
+ if (len < 1 || len > i2c_packet_limit){
+ printk("Incorrect lenght of i2c packet = %d, limit set to %d\n",
+ len, i2c_packet_limit);
+ return -1;
+ }
+
+ /* capture mutex */
+ rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_30_I2C_WRITE,
+ addr | reg << 8, 0, buf+1, len-1);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ /* Calculate delay time, 14800us for 64 bytes */
+ tsleep = ((len * 200) + 1000 + 1000) / 1000;
+ msleep(tsleep);
+
+ /* release mutex */
+ return rc;
}
static int tm6000_i2c_xfer(struct i2c_adapter *i2c_adap,
With my best regards, Dmitry.
[-- Attachment #2: tm6000_i2c.patch --]
[-- Type: text/x-patch, Size: 6293 bytes --]
diff -r 7c0b887911cf linux/drivers/staging/tm6000/tm6000-i2c.c
--- a/linux/drivers/staging/tm6000/tm6000-i2c.c Mon Apr 05 22:56:43 2010 -0400
+++ b/linux/drivers/staging/tm6000/tm6000-i2c.c Mon Apr 26 04:15:56 2010 +1000
@@ -24,6 +24,7 @@
#include <linux/kernel.h>
#include <linux/usb.h>
#include <linux/i2c.h>
+#include <linux/delay.h>
#include "compat.h"
#include "tm6000.h"
@@ -45,11 +46,49 @@
printk(KERN_DEBUG "%s at %s: " fmt, \
dev->name, __FUNCTION__ , ##args); } while (0)
+static void tm6000_i2c_reset(struct tm6000_core *dev)
+{
+ tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_CLK, 0);
+ msleep(15);
+ tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_CLK, 1);
+ msleep(15);
+}
+
static int tm6000_i2c_send_regs(struct tm6000_core *dev, unsigned char addr,
__u8 reg, char *buf, int len)
{
- return tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, buf, len);
+ int rc;
+ unsigned int tsleep;
+ unsigned int i2c_packet_limit = 16;
+
+ if (dev->dev_type == TM6010)
+ i2c_packet_limit = 64;
+
+ if (!buf)
+ return -1;
+
+ if (len < 1 || len > i2c_packet_limit){
+ printk("Incorrect lenght of i2c packet = %d, limit set to %d\n",
+ len, i2c_packet_limit);
+ return -1;
+ }
+
+ /* capture mutex */
+ rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | reg << 8, 0, buf, len);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ /* Calculate delay time, 14000us for 64 bytes */
+ tsleep = ((len * 200) + 200 + 1000) / 1000;
+ msleep(tsleep);
+
+ /* release mutex */
+ return rc;
}
/* Generic read - doesn't work fine with 16bit registers */
@@ -58,23 +97,41 @@
{
int rc;
u8 b[2];
+ unsigned int i2c_packet_limit = 16;
- if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 == addr) && (reg % 2 == 0)) {
+ if (dev->dev_type == TM6010)
+ i2c_packet_limit = 64;
+
+ if (!buf)
+ return -1;
+
+ if (len < 1 || len > i2c_packet_limit){
+ printk("Incorrect lenght of i2c packet = %d, limit set to %d\n",
+ len, i2c_packet_limit);
+ return -1;
+ }
+
+ /* capture mutex */
+ if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 == addr)
+ && (reg % 2 == 0)) {
/*
* Workaround an I2C bug when reading from zl10353
*/
reg -= 1;
len += 1;
- rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, b, len);
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | reg << 8, 0, b, len);
*buf = b[1];
} else {
- rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, buf, len);
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | reg << 8, 0, buf, len);
}
+ /* release mutex */
return rc;
}
@@ -85,8 +142,137 @@
static int tm6000_i2c_recv_regs16(struct tm6000_core *dev, unsigned char addr,
__u16 reg, char *buf, int len)
{
- return tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- REQ_14_SET_GET_I2C_WR2_RDN, addr, reg, buf, len);
+ int rc;
+ unsigned char ureg;
+
+ if (!buf || len != 2)
+ return -1;
+
+ /* capture mutex */
+ if (dev->dev_type == TM6010){
+ ureg = reg & 0xFF;
+ rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | (reg & 0xFF00), 0, &ureg, 1);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ msleep(1400 / 1000);
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
+ reg, 0, buf, len);
+ }
+ else {
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_14_SET_GET_I2C_WR2_RDN,
+ addr, reg, buf, len);
+ }
+
+ /* release mutex */
+ return rc;
+}
+
+static int tm6000_i2c_read_sequence(struct tm6000_core *dev, unsigned char addr,
+ __u16 reg, char *buf, int len)
+{
+ int rc;
+
+ if (dev->dev_type != TM6010)
+ return -1;
+
+ if (!buf)
+ return -1;
+
+ if (len < 1 || len > 64){
+ printk("Incorrect lenght of i2c packet = %d, limit set to 64\n",
+ len);
+ return -1;
+ }
+
+ /* capture mutex */
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
+ reg, 0, buf, len);
+ /* release mutex */
+ return rc;
+}
+
+static int tm6000_i2c_write_sequence(struct tm6000_core *dev,
+ unsigned char addr, __u16 reg, char *buf,
+ int len)
+{
+ int rc;
+ unsigned int tsleep;
+ unsigned int i2c_packet_limit = 16;
+
+ if (dev->dev_type == TM6010)
+ i2c_packet_limit = 64;
+
+ if (!buf)
+ return -1;
+
+ if (len < 1 || len > i2c_packet_limit){
+ printk("Incorrect lenght of i2c packet = %d, limit set to %d\n",
+ len, i2c_packet_limit);
+ return -1;
+ }
+
+ /* capture mutex */
+ rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
+ addr | reg << 8, 0, buf+1, len-1);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ /* Calculate delay time, 13800us for 64 bytes */
+ tsleep = ((len * 200) + 1000) / 1000;
+ msleep(tsleep);
+
+ /* release mutex */
+ return rc;
+}
+
+static int tm6000_i2c_write_uni(struct tm6000_core *dev, unsigned char addr,
+ __u16 reg, char *buf, int len)
+{
+ int rc;
+ unsigned int tsleep;
+ unsigned int i2c_packet_limit = 16;
+
+ if (dev->dev_type == TM6010)
+ i2c_packet_limit = 64;
+
+ if (!buf)
+ return -1;
+
+ if (len < 1 || len > i2c_packet_limit){
+ printk("Incorrect lenght of i2c packet = %d, limit set to %d\n",
+ len, i2c_packet_limit);
+ return -1;
+ }
+
+ /* capture mutex */
+ rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, REQ_30_I2C_WRITE,
+ addr | reg << 8, 0, buf+1, len-1);
+
+ if (rc < 0) {
+ /* release mutex */
+ return rc;
+ }
+
+ /* Calculate delay time, 14800us for 64 bytes */
+ tsleep = ((len * 200) + 1000 + 1000) / 1000;
+ msleep(tsleep);
+
+ /* release mutex */
+ return rc;
}
static int tm6000_i2c_xfer(struct i2c_adapter *i2c_adap,
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH] tm6000 fix i2c
2010-04-26 0:25 ` Dmitri Belimov
@ 2010-04-26 12:58 ` Bee Hock Goh
2010-04-27 5:15 ` Dmitri Belimov
0 siblings, 1 reply; 12+ messages in thread
From: Bee Hock Goh @ 2010-04-26 12:58 UTC (permalink / raw)
To: Dmitri Belimov; +Cc: Stefan Ringel, linux-media, Mauro Carvalho Chehab
thanks. This is work fine on my tm5600.
btw, can you use the git tree? There is some codes update from Stefan
there for the tm6000-i2c that is still not sync with hg.
On Mon, Apr 26, 2010 at 8:25 AM, Dmitri Belimov <d.belimov@gmail.com> wrote:
> Hi
>
> Rework last I2C patch.
> Set correct limit for I2C packet.
> Use different method for the tm5600/tm6000 and tm6010 to read word.
>
> Try this patch.
>
> diff -r 7c0b887911cf linux/drivers/staging/tm6000/tm6000-i2c.c
> --- a/linux/drivers/staging/tm6000/tm6000-i2c.c Mon Apr 05 22:56:43 2010 -0400
> +++ b/linux/drivers/staging/tm6000/tm6000-i2c.c Mon Apr 26 04:15:56 2010 +1000
> @@ -24,6 +24,7 @@
> #include <linux/kernel.h>
> #include <linux/usb.h>
> #include <linux/i2c.h>
> +#include <linux/delay.h>
>
> #include "compat.h"
> #include "tm6000.h"
> @@ -45,11 +46,49 @@
> printk(KERN_DEBUG "%s at %s: " fmt, \
> dev->name, __FUNCTION__ , ##args); } while (0)
>
> +static void tm6000_i2c_reset(struct tm6000_core *dev)
> +{
> + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_CLK, 0);
> + msleep(15);
> + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_CLK, 1);
> + msleep(15);
> +}
> +
> static int tm6000_i2c_send_regs(struct tm6000_core *dev, unsigned char addr,
> __u8 reg, char *buf, int len)
> {
> - return tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
> - REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, buf, len);
> + int rc;
> + unsigned int tsleep;
> + unsigned int i2c_packet_limit = 16;
> +
> + if (dev->dev_type == TM6010)
> + i2c_packet_limit = 64;
> +
> + if (!buf)
> + return -1;
> +
> + if (len < 1 || len > i2c_packet_limit){
> + printk("Incorrect lenght of i2c packet = %d, limit set to %d\n",
> + len, i2c_packet_limit);
> + return -1;
> + }
> +
> + /* capture mutex */
> + rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
> + addr | reg << 8, 0, buf, len);
> +
> + if (rc < 0) {
> + /* release mutex */
> + return rc;
> + }
> +
> + /* Calculate delay time, 14000us for 64 bytes */
> + tsleep = ((len * 200) + 200 + 1000) / 1000;
> + msleep(tsleep);
> +
> + /* release mutex */
> + return rc;
> }
>
> /* Generic read - doesn't work fine with 16bit registers */
> @@ -58,23 +97,41 @@
> {
> int rc;
> u8 b[2];
> + unsigned int i2c_packet_limit = 16;
>
> - if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 == addr) && (reg % 2 == 0)) {
> + if (dev->dev_type == TM6010)
> + i2c_packet_limit = 64;
> +
> + if (!buf)
> + return -1;
> +
> + if (len < 1 || len > i2c_packet_limit){
> + printk("Incorrect lenght of i2c packet = %d, limit set to %d\n",
> + len, i2c_packet_limit);
> + return -1;
> + }
> +
> + /* capture mutex */
> + if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 == addr)
> + && (reg % 2 == 0)) {
> /*
> * Workaround an I2C bug when reading from zl10353
> */
> reg -= 1;
> len += 1;
>
> - rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
> - REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, b, len);
> + rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
> + addr | reg << 8, 0, b, len);
>
> *buf = b[1];
> } else {
> - rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
> - REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, buf, len);
> + rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
> + addr | reg << 8, 0, buf, len);
> }
>
> + /* release mutex */
> return rc;
> }
>
> @@ -85,8 +142,137 @@
> static int tm6000_i2c_recv_regs16(struct tm6000_core *dev, unsigned char addr,
> __u16 reg, char *buf, int len)
> {
> - return tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
> - REQ_14_SET_GET_I2C_WR2_RDN, addr, reg, buf, len);
> + int rc;
> + unsigned char ureg;
> +
> + if (!buf || len != 2)
> + return -1;
> +
> + /* capture mutex */
> + if (dev->dev_type == TM6010){
> + ureg = reg & 0xFF;
> + rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
> + addr | (reg & 0xFF00), 0, &ureg, 1);
> +
> + if (rc < 0) {
> + /* release mutex */
> + return rc;
> + }
> +
> + msleep(1400 / 1000);
> + rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
> + reg, 0, buf, len);
> + }
> + else {
> + rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_14_SET_GET_I2C_WR2_RDN,
> + addr, reg, buf, len);
> + }
> +
> + /* release mutex */
> + return rc;
> +}
> +
> +static int tm6000_i2c_read_sequence(struct tm6000_core *dev, unsigned char addr,
> + __u16 reg, char *buf, int len)
> +{
> + int rc;
> +
> + if (dev->dev_type != TM6010)
> + return -1;
> +
> + if (!buf)
> + return -1;
> +
> + if (len < 1 || len > 64){
> + printk("Incorrect lenght of i2c packet = %d, limit set to 64\n",
> + len);
> + return -1;
> + }
> +
> + /* capture mutex */
> + rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
> + reg, 0, buf, len);
> + /* release mutex */
> + return rc;
> +}
> +
> +static int tm6000_i2c_write_sequence(struct tm6000_core *dev,
> + unsigned char addr, __u16 reg, char *buf,
> + int len)
> +{
> + int rc;
> + unsigned int tsleep;
> + unsigned int i2c_packet_limit = 16;
> +
> + if (dev->dev_type == TM6010)
> + i2c_packet_limit = 64;
> +
> + if (!buf)
> + return -1;
> +
> + if (len < 1 || len > i2c_packet_limit){
> + printk("Incorrect lenght of i2c packet = %d, limit set to %d\n",
> + len, i2c_packet_limit);
> + return -1;
> + }
> +
> + /* capture mutex */
> + rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
> + addr | reg << 8, 0, buf+1, len-1);
> +
> + if (rc < 0) {
> + /* release mutex */
> + return rc;
> + }
> +
> + /* Calculate delay time, 13800us for 64 bytes */
> + tsleep = ((len * 200) + 1000) / 1000;
> + msleep(tsleep);
> +
> + /* release mutex */
> + return rc;
> +}
> +
> +static int tm6000_i2c_write_uni(struct tm6000_core *dev, unsigned char addr,
> + __u16 reg, char *buf, int len)
> +{
> + int rc;
> + unsigned int tsleep;
> + unsigned int i2c_packet_limit = 16;
> +
> + if (dev->dev_type == TM6010)
> + i2c_packet_limit = 64;
> +
> + if (!buf)
> + return -1;
> +
> + if (len < 1 || len > i2c_packet_limit){
> + printk("Incorrect lenght of i2c packet = %d, limit set to %d\n",
> + len, i2c_packet_limit);
> + return -1;
> + }
> +
> + /* capture mutex */
> + rc = tm6000_read_write_usb(dev, USB_DIR_OUT | USB_TYPE_VENDOR |
> + USB_RECIP_DEVICE, REQ_30_I2C_WRITE,
> + addr | reg << 8, 0, buf+1, len-1);
> +
> + if (rc < 0) {
> + /* release mutex */
> + return rc;
> + }
> +
> + /* Calculate delay time, 14800us for 64 bytes */
> + tsleep = ((len * 200) + 1000 + 1000) / 1000;
> + msleep(tsleep);
> +
> + /* release mutex */
> + return rc;
> }
>
> static int tm6000_i2c_xfer(struct i2c_adapter *i2c_adap,
>
>
> With my best regards, Dmitry.
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH] tm6000 fix i2c
2010-04-26 12:58 ` Bee Hock Goh
@ 2010-04-27 5:15 ` Dmitri Belimov
2010-04-27 6:07 ` Bee Hock Goh
0 siblings, 1 reply; 12+ messages in thread
From: Dmitri Belimov @ 2010-04-27 5:15 UTC (permalink / raw)
To: Bee Hock Goh; +Cc: Stefan Ringel, linux-media, Mauro Carvalho Chehab
On Mon, 26 Apr 2010 20:58:24 +0800
Bee Hock Goh <beehock@gmail.com> wrote:
> thanks. This is work fine on my tm5600.
Good news.
> btw, can you use the git tree? There is some codes update from Stefan
> there for the tm6000-i2c that is still not sync with hg.
no problemm. Give me access and URL.
With my best regards, Dmitry.
> On Mon, Apr 26, 2010 at 8:25 AM, Dmitri Belimov <d.belimov@gmail.com>
> wrote:
> > Hi
> >
> > Rework last I2C patch.
> > Set correct limit for I2C packet.
> > Use different method for the tm5600/tm6000 and tm6010 to read word.
> >
> > Try this patch.
> >
> > diff -r 7c0b887911cf linux/drivers/staging/tm6000/tm6000-i2c.c
> > --- a/linux/drivers/staging/tm6000/tm6000-i2c.c Mon Apr 05 22:56:43
> > 2010 -0400 +++ b/linux/drivers/staging/tm6000/tm6000-i2c.c Mon Apr
> > 26 04:15:56 2010 +1000 @@ -24,6 +24,7 @@
> > #include <linux/kernel.h>
> > #include <linux/usb.h>
> > #include <linux/i2c.h>
> > +#include <linux/delay.h>
> >
> > #include "compat.h"
> > #include "tm6000.h"
> > @@ -45,11 +46,49 @@
> > printk(KERN_DEBUG "%s at %s: " fmt, \
> > dev->name, __FUNCTION__ , ##args); } while
> > (0)
> >
> > +static void tm6000_i2c_reset(struct tm6000_core *dev)
> > +{
> > + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
> > TM6000_GPIO_CLK, 0);
> > + msleep(15);
> > + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
> > TM6000_GPIO_CLK, 1);
> > + msleep(15);
> > +}
> > +
> > static int tm6000_i2c_send_regs(struct tm6000_core *dev, unsigned
> > char addr, __u8 reg, char *buf, int len)
> > {
> > - return tm6000_read_write_usb(dev, USB_DIR_OUT |
> > USB_TYPE_VENDOR | USB_RECIP_DEVICE,
> > - REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0,
> > buf, len);
> > + int rc;
> > + unsigned int tsleep;
> > + unsigned int i2c_packet_limit = 16;
> > +
> > + if (dev->dev_type == TM6010)
> > + i2c_packet_limit = 64;
> > +
> > + if (!buf)
> > + return -1;
> > +
> > + if (len < 1 || len > i2c_packet_limit){
> > + printk("Incorrect lenght of i2c packet = %d, limit
> > set to %d\n",
> > + len, i2c_packet_limit);
> > + return -1;
> > + }
> > +
> > + /* capture mutex */
> > + rc = tm6000_read_write_usb(dev, USB_DIR_OUT |
> > USB_TYPE_VENDOR |
> > + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
> > + addr | reg << 8, 0, buf, len);
> > +
> > + if (rc < 0) {
> > + /* release mutex */
> > + return rc;
> > + }
> > +
> > + /* Calculate delay time, 14000us for 64 bytes */
> > + tsleep = ((len * 200) + 200 + 1000) / 1000;
> > + msleep(tsleep);
> > +
> > + /* release mutex */
> > + return rc;
> > }
> >
> > /* Generic read - doesn't work fine with 16bit registers */
> > @@ -58,23 +97,41 @@
> > {
> > int rc;
> > u8 b[2];
> > + unsigned int i2c_packet_limit = 16;
> >
> > - if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 ==
> > addr) && (reg % 2 == 0)) {
> > + if (dev->dev_type == TM6010)
> > + i2c_packet_limit = 64;
> > +
> > + if (!buf)
> > + return -1;
> > +
> > + if (len < 1 || len > i2c_packet_limit){
> > + printk("Incorrect lenght of i2c packet = %d, limit
> > set to %d\n",
> > + len, i2c_packet_limit);
> > + return -1;
> > + }
> > +
> > + /* capture mutex */
> > + if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 ==
> > addr)
> > + && (reg % 2 == 0)) {
> > /*
> > * Workaround an I2C bug when reading from zl10353
> > */
> > reg -= 1;
> > len += 1;
> >
> > - rc = tm6000_read_write_usb(dev, USB_DIR_IN |
> > USB_TYPE_VENDOR | USB_RECIP_DEVICE,
> > - REQ_16_SET_GET_I2C_WR1_RDN, addr | reg <<
> > 8, 0, b, len);
> > + rc = tm6000_read_write_usb(dev, USB_DIR_IN |
> > USB_TYPE_VENDOR |
> > + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
> > + addr | reg << 8, 0, b, len);
> >
> > *buf = b[1];
> > } else {
> > - rc = tm6000_read_write_usb(dev, USB_DIR_IN |
> > USB_TYPE_VENDOR | USB_RECIP_DEVICE,
> > - REQ_16_SET_GET_I2C_WR1_RDN, addr | reg <<
> > 8, 0, buf, len);
> > + rc = tm6000_read_write_usb(dev, USB_DIR_IN |
> > USB_TYPE_VENDOR |
> > + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
> > + addr | reg << 8, 0, buf, len);
> > }
> >
> > + /* release mutex */
> > return rc;
> > }
> >
> > @@ -85,8 +142,137 @@
> > static int tm6000_i2c_recv_regs16(struct tm6000_core *dev,
> > unsigned char addr, __u16 reg, char *buf, int len)
> > {
> > - return tm6000_read_write_usb(dev, USB_DIR_IN |
> > USB_TYPE_VENDOR | USB_RECIP_DEVICE,
> > - REQ_14_SET_GET_I2C_WR2_RDN, addr, reg, buf, len);
> > + int rc;
> > + unsigned char ureg;
> > +
> > + if (!buf || len != 2)
> > + return -1;
> > +
> > + /* capture mutex */
> > + if (dev->dev_type == TM6010){
> > + ureg = reg & 0xFF;
> > + rc = tm6000_read_write_usb(dev, USB_DIR_OUT |
> > USB_TYPE_VENDOR |
> > + USB_RECIP_DEVICE,
> > REQ_16_SET_GET_I2C_WR1_RDN,
> > + addr | (reg & 0xFF00), 0, &ureg, 1);
> > +
> > + if (rc < 0) {
> > + /* release mutex */
> > + return rc;
> > + }
> > +
> > + msleep(1400 / 1000);
> > + rc = tm6000_read_write_usb(dev, USB_DIR_IN |
> > USB_TYPE_VENDOR |
> > + USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
> > + reg, 0, buf, len);
> > + }
> > + else {
> > + rc = tm6000_read_write_usb(dev, USB_DIR_IN |
> > USB_TYPE_VENDOR |
> > + USB_RECIP_DEVICE,
> > REQ_14_SET_GET_I2C_WR2_RDN,
> > + addr, reg, buf, len);
> > + }
> > +
> > + /* release mutex */
> > + return rc;
> > +}
> > +
> > +static int tm6000_i2c_read_sequence(struct tm6000_core *dev,
> > unsigned char addr,
> > + __u16 reg, char *buf, int len)
> > +{
> > + int rc;
> > +
> > + if (dev->dev_type != TM6010)
> > + return -1;
> > +
> > + if (!buf)
> > + return -1;
> > +
> > + if (len < 1 || len > 64){
> > + printk("Incorrect lenght of i2c packet = %d, limit
> > set to 64\n",
> > + len);
> > + return -1;
> > + }
> > +
> > + /* capture mutex */
> > + rc = tm6000_read_write_usb(dev, USB_DIR_IN |
> > USB_TYPE_VENDOR |
> > + USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
> > + reg, 0, buf, len);
> > + /* release mutex */
> > + return rc;
> > +}
> > +
> > +static int tm6000_i2c_write_sequence(struct tm6000_core *dev,
> > + unsigned char addr, __u16 reg, char
> > *buf,
> > + int len)
> > +{
> > + int rc;
> > + unsigned int tsleep;
> > + unsigned int i2c_packet_limit = 16;
> > +
> > + if (dev->dev_type == TM6010)
> > + i2c_packet_limit = 64;
> > +
> > + if (!buf)
> > + return -1;
> > +
> > + if (len < 1 || len > i2c_packet_limit){
> > + printk("Incorrect lenght of i2c packet = %d, limit
> > set to %d\n",
> > + len, i2c_packet_limit);
> > + return -1;
> > + }
> > +
> > + /* capture mutex */
> > + rc = tm6000_read_write_usb(dev, USB_DIR_OUT |
> > USB_TYPE_VENDOR |
> > + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
> > + addr | reg << 8, 0, buf+1, len-1);
> > +
> > + if (rc < 0) {
> > + /* release mutex */
> > + return rc;
> > + }
> > +
> > + /* Calculate delay time, 13800us for 64 bytes */
> > + tsleep = ((len * 200) + 1000) / 1000;
> > + msleep(tsleep);
> > +
> > + /* release mutex */
> > + return rc;
> > +}
> > +
> > +static int tm6000_i2c_write_uni(struct tm6000_core *dev, unsigned
> > char addr,
> > + __u16 reg, char *buf, int len)
> > +{
> > + int rc;
> > + unsigned int tsleep;
> > + unsigned int i2c_packet_limit = 16;
> > +
> > + if (dev->dev_type == TM6010)
> > + i2c_packet_limit = 64;
> > +
> > + if (!buf)
> > + return -1;
> > +
> > + if (len < 1 || len > i2c_packet_limit){
> > + printk("Incorrect lenght of i2c packet = %d, limit
> > set to %d\n",
> > + len, i2c_packet_limit);
> > + return -1;
> > + }
> > +
> > + /* capture mutex */
> > + rc = tm6000_read_write_usb(dev, USB_DIR_OUT |
> > USB_TYPE_VENDOR |
> > + USB_RECIP_DEVICE, REQ_30_I2C_WRITE,
> > + addr | reg << 8, 0, buf+1, len-1);
> > +
> > + if (rc < 0) {
> > + /* release mutex */
> > + return rc;
> > + }
> > +
> > + /* Calculate delay time, 14800us for 64 bytes */
> > + tsleep = ((len * 200) + 1000 + 1000) / 1000;
> > + msleep(tsleep);
> > +
> > + /* release mutex */
> > + return rc;
> > }
> >
> > static int tm6000_i2c_xfer(struct i2c_adapter *i2c_adap,
> >
> >
> > With my best regards, Dmitry.
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH] tm6000 fix i2c
2010-04-27 5:15 ` Dmitri Belimov
@ 2010-04-27 6:07 ` Bee Hock Goh
2010-04-28 5:49 ` tm6000 Dmitri Belimov
0 siblings, 1 reply; 12+ messages in thread
From: Bee Hock Goh @ 2010-04-27 6:07 UTC (permalink / raw)
To: Dmitri Belimov; +Cc: Stefan Ringel, linux-media, Mauro Carvalho Chehab
wiki is your best friend. :)
http://www.linuxtv.org/wiki/index.php/Maintaining_Git_trees
http://www.linuxtv.org/wiki/index.php/Using_a_git_driver_development_tree
On Tue, Apr 27, 2010 at 1:15 PM, Dmitri Belimov <d.belimov@gmail.com> wrote:
> On Mon, 26 Apr 2010 20:58:24 +0800
> Bee Hock Goh <beehock@gmail.com> wrote:
>
>> thanks. This is work fine on my tm5600.
>
> Good news.
>
>> btw, can you use the git tree? There is some codes update from Stefan
>> there for the tm6000-i2c that is still not sync with hg.
>
> no problemm. Give me access and URL.
>
> With my best regards, Dmitry.
>
>> On Mon, Apr 26, 2010 at 8:25 AM, Dmitri Belimov <d.belimov@gmail.com>
>> wrote:
>> > Hi
>> >
>> > Rework last I2C patch.
>> > Set correct limit for I2C packet.
>> > Use different method for the tm5600/tm6000 and tm6010 to read word.
>> >
>> > Try this patch.
>> >
>> > diff -r 7c0b887911cf linux/drivers/staging/tm6000/tm6000-i2c.c
>> > --- a/linux/drivers/staging/tm6000/tm6000-i2c.c Mon Apr 05 22:56:43
>> > 2010 -0400 +++ b/linux/drivers/staging/tm6000/tm6000-i2c.c Mon Apr
>> > 26 04:15:56 2010 +1000 @@ -24,6 +24,7 @@
>> > #include <linux/kernel.h>
>> > #include <linux/usb.h>
>> > #include <linux/i2c.h>
>> > +#include <linux/delay.h>
>> >
>> > #include "compat.h"
>> > #include "tm6000.h"
>> > @@ -45,11 +46,49 @@
>> > printk(KERN_DEBUG "%s at %s: " fmt, \
>> > dev->name, __FUNCTION__ , ##args); } while
>> > (0)
>> >
>> > +static void tm6000_i2c_reset(struct tm6000_core *dev)
>> > +{
>> > + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
>> > TM6000_GPIO_CLK, 0);
>> > + msleep(15);
>> > + tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
>> > TM6000_GPIO_CLK, 1);
>> > + msleep(15);
>> > +}
>> > +
>> > static int tm6000_i2c_send_regs(struct tm6000_core *dev, unsigned
>> > char addr, __u8 reg, char *buf, int len)
>> > {
>> > - return tm6000_read_write_usb(dev, USB_DIR_OUT |
>> > USB_TYPE_VENDOR | USB_RECIP_DEVICE,
>> > - REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0,
>> > buf, len);
>> > + int rc;
>> > + unsigned int tsleep;
>> > + unsigned int i2c_packet_limit = 16;
>> > +
>> > + if (dev->dev_type == TM6010)
>> > + i2c_packet_limit = 64;
>> > +
>> > + if (!buf)
>> > + return -1;
>> > +
>> > + if (len < 1 || len > i2c_packet_limit){
>> > + printk("Incorrect lenght of i2c packet = %d, limit
>> > set to %d\n",
>> > + len, i2c_packet_limit);
>> > + return -1;
>> > + }
>> > +
>> > + /* capture mutex */
>> > + rc = tm6000_read_write_usb(dev, USB_DIR_OUT |
>> > USB_TYPE_VENDOR |
>> > + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
>> > + addr | reg << 8, 0, buf, len);
>> > +
>> > + if (rc < 0) {
>> > + /* release mutex */
>> > + return rc;
>> > + }
>> > +
>> > + /* Calculate delay time, 14000us for 64 bytes */
>> > + tsleep = ((len * 200) + 200 + 1000) / 1000;
>> > + msleep(tsleep);
>> > +
>> > + /* release mutex */
>> > + return rc;
>> > }
>> >
>> > /* Generic read - doesn't work fine with 16bit registers */
>> > @@ -58,23 +97,41 @@
>> > {
>> > int rc;
>> > u8 b[2];
>> > + unsigned int i2c_packet_limit = 16;
>> >
>> > - if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 ==
>> > addr) && (reg % 2 == 0)) {
>> > + if (dev->dev_type == TM6010)
>> > + i2c_packet_limit = 64;
>> > +
>> > + if (!buf)
>> > + return -1;
>> > +
>> > + if (len < 1 || len > i2c_packet_limit){
>> > + printk("Incorrect lenght of i2c packet = %d, limit
>> > set to %d\n",
>> > + len, i2c_packet_limit);
>> > + return -1;
>> > + }
>> > +
>> > + /* capture mutex */
>> > + if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 ==
>> > addr)
>> > + && (reg % 2 == 0)) {
>> > /*
>> > * Workaround an I2C bug when reading from zl10353
>> > */
>> > reg -= 1;
>> > len += 1;
>> >
>> > - rc = tm6000_read_write_usb(dev, USB_DIR_IN |
>> > USB_TYPE_VENDOR | USB_RECIP_DEVICE,
>> > - REQ_16_SET_GET_I2C_WR1_RDN, addr | reg <<
>> > 8, 0, b, len);
>> > + rc = tm6000_read_write_usb(dev, USB_DIR_IN |
>> > USB_TYPE_VENDOR |
>> > + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
>> > + addr | reg << 8, 0, b, len);
>> >
>> > *buf = b[1];
>> > } else {
>> > - rc = tm6000_read_write_usb(dev, USB_DIR_IN |
>> > USB_TYPE_VENDOR | USB_RECIP_DEVICE,
>> > - REQ_16_SET_GET_I2C_WR1_RDN, addr | reg <<
>> > 8, 0, buf, len);
>> > + rc = tm6000_read_write_usb(dev, USB_DIR_IN |
>> > USB_TYPE_VENDOR |
>> > + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
>> > + addr | reg << 8, 0, buf, len);
>> > }
>> >
>> > + /* release mutex */
>> > return rc;
>> > }
>> >
>> > @@ -85,8 +142,137 @@
>> > static int tm6000_i2c_recv_regs16(struct tm6000_core *dev,
>> > unsigned char addr, __u16 reg, char *buf, int len)
>> > {
>> > - return tm6000_read_write_usb(dev, USB_DIR_IN |
>> > USB_TYPE_VENDOR | USB_RECIP_DEVICE,
>> > - REQ_14_SET_GET_I2C_WR2_RDN, addr, reg, buf, len);
>> > + int rc;
>> > + unsigned char ureg;
>> > +
>> > + if (!buf || len != 2)
>> > + return -1;
>> > +
>> > + /* capture mutex */
>> > + if (dev->dev_type == TM6010){
>> > + ureg = reg & 0xFF;
>> > + rc = tm6000_read_write_usb(dev, USB_DIR_OUT |
>> > USB_TYPE_VENDOR |
>> > + USB_RECIP_DEVICE,
>> > REQ_16_SET_GET_I2C_WR1_RDN,
>> > + addr | (reg & 0xFF00), 0, &ureg, 1);
>> > +
>> > + if (rc < 0) {
>> > + /* release mutex */
>> > + return rc;
>> > + }
>> > +
>> > + msleep(1400 / 1000);
>> > + rc = tm6000_read_write_usb(dev, USB_DIR_IN |
>> > USB_TYPE_VENDOR |
>> > + USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
>> > + reg, 0, buf, len);
>> > + }
>> > + else {
>> > + rc = tm6000_read_write_usb(dev, USB_DIR_IN |
>> > USB_TYPE_VENDOR |
>> > + USB_RECIP_DEVICE,
>> > REQ_14_SET_GET_I2C_WR2_RDN,
>> > + addr, reg, buf, len);
>> > + }
>> > +
>> > + /* release mutex */
>> > + return rc;
>> > +}
>> > +
>> > +static int tm6000_i2c_read_sequence(struct tm6000_core *dev,
>> > unsigned char addr,
>> > + __u16 reg, char *buf, int len)
>> > +{
>> > + int rc;
>> > +
>> > + if (dev->dev_type != TM6010)
>> > + return -1;
>> > +
>> > + if (!buf)
>> > + return -1;
>> > +
>> > + if (len < 1 || len > 64){
>> > + printk("Incorrect lenght of i2c packet = %d, limit
>> > set to 64\n",
>> > + len);
>> > + return -1;
>> > + }
>> > +
>> > + /* capture mutex */
>> > + rc = tm6000_read_write_usb(dev, USB_DIR_IN |
>> > USB_TYPE_VENDOR |
>> > + USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
>> > + reg, 0, buf, len);
>> > + /* release mutex */
>> > + return rc;
>> > +}
>> > +
>> > +static int tm6000_i2c_write_sequence(struct tm6000_core *dev,
>> > + unsigned char addr, __u16 reg, char
>> > *buf,
>> > + int len)
>> > +{
>> > + int rc;
>> > + unsigned int tsleep;
>> > + unsigned int i2c_packet_limit = 16;
>> > +
>> > + if (dev->dev_type == TM6010)
>> > + i2c_packet_limit = 64;
>> > +
>> > + if (!buf)
>> > + return -1;
>> > +
>> > + if (len < 1 || len > i2c_packet_limit){
>> > + printk("Incorrect lenght of i2c packet = %d, limit
>> > set to %d\n",
>> > + len, i2c_packet_limit);
>> > + return -1;
>> > + }
>> > +
>> > + /* capture mutex */
>> > + rc = tm6000_read_write_usb(dev, USB_DIR_OUT |
>> > USB_TYPE_VENDOR |
>> > + USB_RECIP_DEVICE, REQ_16_SET_GET_I2C_WR1_RDN,
>> > + addr | reg << 8, 0, buf+1, len-1);
>> > +
>> > + if (rc < 0) {
>> > + /* release mutex */
>> > + return rc;
>> > + }
>> > +
>> > + /* Calculate delay time, 13800us for 64 bytes */
>> > + tsleep = ((len * 200) + 1000) / 1000;
>> > + msleep(tsleep);
>> > +
>> > + /* release mutex */
>> > + return rc;
>> > +}
>> > +
>> > +static int tm6000_i2c_write_uni(struct tm6000_core *dev, unsigned
>> > char addr,
>> > + __u16 reg, char *buf, int len)
>> > +{
>> > + int rc;
>> > + unsigned int tsleep;
>> > + unsigned int i2c_packet_limit = 16;
>> > +
>> > + if (dev->dev_type == TM6010)
>> > + i2c_packet_limit = 64;
>> > +
>> > + if (!buf)
>> > + return -1;
>> > +
>> > + if (len < 1 || len > i2c_packet_limit){
>> > + printk("Incorrect lenght of i2c packet = %d, limit
>> > set to %d\n",
>> > + len, i2c_packet_limit);
>> > + return -1;
>> > + }
>> > +
>> > + /* capture mutex */
>> > + rc = tm6000_read_write_usb(dev, USB_DIR_OUT |
>> > USB_TYPE_VENDOR |
>> > + USB_RECIP_DEVICE, REQ_30_I2C_WRITE,
>> > + addr | reg << 8, 0, buf+1, len-1);
>> > +
>> > + if (rc < 0) {
>> > + /* release mutex */
>> > + return rc;
>> > + }
>> > +
>> > + /* Calculate delay time, 14800us for 64 bytes */
>> > + tsleep = ((len * 200) + 1000 + 1000) / 1000;
>> > + msleep(tsleep);
>> > +
>> > + /* release mutex */
>> > + return rc;
>> > }
>> >
>> > static int tm6000_i2c_xfer(struct i2c_adapter *i2c_adap,
>> >
>> >
>> > With my best regards, Dmitry.
>
^ permalink raw reply [flat|nested] 12+ messages in thread* tm6000
2010-04-27 6:07 ` Bee Hock Goh
@ 2010-04-28 5:49 ` Dmitri Belimov
2010-04-28 7:32 ` tm6000 Bee Hock Goh
2010-04-28 12:14 ` tm6000 Mauro Carvalho Chehab
0 siblings, 2 replies; 12+ messages in thread
From: Dmitri Belimov @ 2010-04-28 5:49 UTC (permalink / raw)
To: Bee Hock Goh; +Cc: Stefan Ringel, linux-media, Mauro Carvalho Chehab
Hi
Anyone can watch TV with tm6000 module??
I try mplayer. My PC crashed inside copy_streams function after some time.
With my best regards, Dmitry.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: tm6000
2010-04-28 5:49 ` tm6000 Dmitri Belimov
@ 2010-04-28 7:32 ` Bee Hock Goh
2010-04-28 12:14 ` tm6000 Mauro Carvalho Chehab
1 sibling, 0 replies; 12+ messages in thread
From: Bee Hock Goh @ 2010-04-28 7:32 UTC (permalink / raw)
To: Dmitri Belimov; +Cc: Stefan Ringel, linux-media, Mauro Carvalho Chehab
its working fine on my tm5600. Run fine for more than 5mins without crashing.
But it does crashed everytime when its playing on the first channel
and I switch channel in mythtv. I am waiting for usb/serial cable to
arrive from ebay to find out why.
I hope to work on the audio part though.
On Wed, Apr 28, 2010 at 1:49 PM, Dmitri Belimov <d.belimov@gmail.com> wrote:
> Hi
>
> Anyone can watch TV with tm6000 module??
>
> I try mplayer. My PC crashed inside copy_streams function after some time.
>
> With my best regards, Dmitry.
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: tm6000
2010-04-28 5:49 ` tm6000 Dmitri Belimov
2010-04-28 7:32 ` tm6000 Bee Hock Goh
@ 2010-04-28 12:14 ` Mauro Carvalho Chehab
1 sibling, 0 replies; 12+ messages in thread
From: Mauro Carvalho Chehab @ 2010-04-28 12:14 UTC (permalink / raw)
To: Dmitri Belimov; +Cc: Bee Hock Goh, Stefan Ringel, linux-media
Dmitri Belimov wrote:
> Hi
>
> Anyone can watch TV with tm6000 module??
>
> I try mplayer. My PC crashed inside copy_streams function after some time.
>
> With my best regards, Dmitry.
It is still causing panic on my tests. Probably, the routine is still writing
something out of the buffer area.
--
Cheers,
Mauro
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH] tm6000: add new hybrid-stick
@ 2010-03-10 17:57 stefan.ringel
2010-03-14 7:11 ` Stefan Ringel
0 siblings, 1 reply; 12+ messages in thread
From: stefan.ringel @ 2010-03-10 17:57 UTC (permalink / raw)
To: linux-media; +Cc: mchehab, dheitmueller, Stefan Ringel
From: Stefan Ringel <stefan.ringel@arcor.de>
-add Hauppauge WinTV HVR 900H/WinTV USB2-Stick
vid/pid
0x2040/6601
0x2040/6610
0x2040/6611
-add Terratec Cinergy Hybrid-Stick
vid/pid
0x0ccd/0x00a5
-add Twinhan TU501(704D1)
vid/pid
0x13d3/0x3240
0x13d3/0x3241
0x13d3/0x3243
0x13d3/0x3264
Signed-off-by: Stefan Ringel <stefan.ringel@arcor.de>
---
drivers/staging/tm6000/tm6000-cards.c | 39 +++++++++++++++++++++++++++-----
1 files changed, 33 insertions(+), 6 deletions(-)
diff --git a/drivers/staging/tm6000/tm6000-cards.c b/drivers/staging/tm6000/tm6000-cards.c
index 83cb4b9..2053008 100644
--- a/drivers/staging/tm6000/tm6000-cards.c
+++ b/drivers/staging/tm6000/tm6000-cards.c
@@ -47,6 +47,7 @@
#define TM6010_BOARD_BEHOLD_WANDER 10
#define TM6010_BOARD_BEHOLD_VOYAGER 11
#define TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE 12
+#define TM6010_BOARD_TWINHAN_TU501 13
#define TM6000_MAXBOARDS 16
static unsigned int card[] = {[0 ... (TM6000_MAXBOARDS - 1)] = UNSET };
@@ -169,7 +170,7 @@ struct tm6000_board tm6000_boards[] = {
.gpio_addr_tun_reset = TM6000_GPIO_4,
},
[TM6010_BOARD_HAUPPAUGE_900H] = {
- .name = "Hauppauge HVR-900H",
+ .name = "Hauppauge WinTV HVR-900H / WinTV USB2-Stick",
.tuner_type = TUNER_XC2028, /* has a XC3028 */
.tuner_addr = 0xc2 >> 1,
.demod_addr = 0x1e >> 1,
@@ -180,7 +181,7 @@ struct tm6000_board tm6000_boards[] = {
.has_zl10353 = 1,
.has_eeprom = 1,
},
- .gpio_addr_tun_reset = TM6000_GPIO_2,
+ .gpio_addr_tun_reset = TM6010_GPIO_2,
},
[TM6010_BOARD_BEHOLD_WANDER] = {
.name = "Beholder Wander DVB-T/TV/FM USB2.0",
@@ -212,7 +213,22 @@ struct tm6000_board tm6000_boards[] = {
.gpio_addr_tun_reset = TM6000_GPIO_2,
},
[TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE] = {
- .name = "Terratec Cinergy Hybrid XE",
+ .name = "Terratec Cinergy Hybrid XE / Cinergy Hybrid-Stick",
+ .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,
+ },
+ [TM6010_BOARD_TWINHAN_TU501] = {
+ .name = "Twinhan TU501(704D1)",
.tuner_type = TUNER_XC2028, /* has a XC3028 */
.tuner_addr = 0xc2 >> 1,
.demod_addr = 0x1e >> 1,
@@ -236,9 +252,17 @@ struct usb_device_id tm6000_id_table [] = {
{ USB_DEVICE(0x14aa, 0x0620), .driver_info = TM6000_BOARD_FREECOM_AND_SIMILAR },
{ USB_DEVICE(0x06e1, 0xb339), .driver_info = TM6000_BOARD_ADSTECH_MINI_DUAL_TV },
{ USB_DEVICE(0x2040, 0x6600), .driver_info = TM6010_BOARD_HAUPPAUGE_900H },
+ { USB_DEVICE(0x2040, 0x6601), .driver_info = TM6010_BOARD_HAUPPAUGE_900H },
+ { USB_DEVICE(0x2040, 0x6610), .driver_info = TM6010_BOARD_HAUPPAUGE_900H },
+ { USB_DEVICE(0x2040, 0x6611), .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 },
+ { USB_DEVICE(0x0ccd, 0x00A5), .driver_info = TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE },
+ { USB_DEVICE(0x13d3, 0x3240), .driver_info = TM6010_BOARD_TWINHAN_TU501 },
+ { USB_DEVICE(0x13d3, 0x3241), .driver_info = TM6010_BOARD_TWINHAN_TU501 },
+ { USB_DEVICE(0x13d3, 0x3243), .driver_info = TM6010_BOARD_TWINHAN_TU501 },
+ { USB_DEVICE(0x13d3, 0x3264), .driver_info = TM6010_BOARD_TWINHAN_TU501 },
{ },
};
@@ -271,7 +295,9 @@ int tm6000_tuner_callback(void *ptr, int component, int command, int arg)
case 0:
/* newer tuner can faster reset */
switch (dev->model) {
+ case TM6010_BOARD_HAUPPAUGE_900H:
case TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE:
+ case TM6010_BOARD_TWINHAN_TU501:
tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
dev->tuner_reset_gpio, 0x01);
msleep(60);
@@ -328,11 +354,11 @@ int tm6000_cards_setup(struct tm6000_core *dev)
*/
switch (dev->model) {
case TM6010_BOARD_HAUPPAUGE_900H:
+ case TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE:
+ case TM6010_BOARD_TWINHAN_TU501:
/* Turn xceive 3028 on */
tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6010_GPIO_3, 0x01);
- msleep(11);
- break;
- case TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE:
+ msleep(15);
/* Turn zarlink zl10353 on */
tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6010_GPIO_4, 0x00);
msleep(15);
@@ -445,6 +471,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:
+ case TM6010_BOARD_TWINHAN_TU501:
ctl.fname = "xc3028L-v36.fw";
break;
default:
--
1.6.6.1
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH] tm6000: add new hybrid-stick
2010-03-10 17:57 [PATCH] tm6000: add new hybrid-stick stefan.ringel
@ 2010-03-14 7:11 ` Stefan Ringel
2010-03-14 18:26 ` Mauro Carvalho Chehab
0 siblings, 1 reply; 12+ messages in thread
From: Stefan Ringel @ 2010-03-14 7:11 UTC (permalink / raw)
To: stefan.ringel; +Cc: linux-media, mchehab
Mauro,
you have accepted my patch, but it's not applied.
best regards
Stefan Ringel
--
Stefan Ringel <stefan.ringel@arcor.de>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] tm6000: add new hybrid-stick
2010-03-14 7:11 ` Stefan Ringel
@ 2010-03-14 18:26 ` Mauro Carvalho Chehab
2010-03-14 20:19 ` Stefan Ringel
0 siblings, 1 reply; 12+ messages in thread
From: Mauro Carvalho Chehab @ 2010-03-14 18:26 UTC (permalink / raw)
To: Stefan Ringel; +Cc: linux-media
Stefan Ringel wrote:
> Mauro,
>
> you have accepted my patch, but it's not applied.
This patch were applied on my git tree on Mar, 11:
commit 50e3fe3b336fb2936f05bb9af752ef933c8b74aa
Author: Stefan Ringel <stefan.ringel@arcor.de>
AuthorDate: Wed Mar 10 14:57:57 2010 -0300
Commit: Mauro Carvalho Chehab <mchehab@redhat.com>
CommitDate: Thu Mar 11 07:41:43 2010 -0300
V4L/DVB: tm6000: add new hybrid-stick
That's why it were marked as applied. I have no idea when it were
backported to -hg, or if it is still on Douglas queue.
Cheers,
Mauro
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH] tm6000: add new hybrid-stick
2010-03-14 18:26 ` Mauro Carvalho Chehab
@ 2010-03-14 20:19 ` Stefan Ringel
2010-03-27 14:55 ` tm6000 Stefan Ringel
0 siblings, 1 reply; 12+ messages in thread
From: Stefan Ringel @ 2010-03-14 20:19 UTC (permalink / raw)
To: Mauro Carvalho Chehab; +Cc: linux-media
Am 14.03.2010 19:26, schrieb Mauro Carvalho Chehab:
> Stefan Ringel wrote:
>
>> Mauro,
>>
>> you have accepted my patch, but it's not applied.
>>
> This patch were applied on my git tree on Mar, 11:
>
> commit 50e3fe3b336fb2936f05bb9af752ef933c8b74aa
> Author: Stefan Ringel <stefan.ringel@arcor.de>
> AuthorDate: Wed Mar 10 14:57:57 2010 -0300
> Commit: Mauro Carvalho Chehab <mchehab@redhat.com>
> CommitDate: Thu Mar 11 07:41:43 2010 -0300
>
> V4L/DVB: tm6000: add new hybrid-stick
>
> That's why it were marked as applied. I have no idea when it were
> backported to -hg, or if it is still on Douglas queue.
>
> Cheers,
> Mauro
>
that is the lastest entrys in weblog. And no patch can I see from me.
v4l-dvb.git
3 days ago
Mauro Carvalho...
V4L/DVB: Fix bad whitespacing master
commit | commitdiff | tree
4 days ago
Max Thrun
V4L/DVB: gspca - ov534: Update copyright info
commit | commitdiff | tree
4 days ago
Mosalam Ebrahimi
V4L/DVB: gspca - ov534: Add Powerline Frequency control
commit | commitdiff | tree
4 days ago
Antonio Ospite
V4L/DVB: gspca - ov534: Cosmetics: fix indentation...
commit | commitdiff | tree
please check it!
Cheers,
Stefan
--
Stefan Ringel <stefan.ringel@arcor.de>
^ permalink raw reply [flat|nested] 12+ messages in thread* tm6000
2010-03-14 20:19 ` Stefan Ringel
@ 2010-03-27 14:55 ` Stefan Ringel
0 siblings, 0 replies; 12+ messages in thread
From: Stefan Ringel @ 2010-03-27 14:55 UTC (permalink / raw)
To: linux-media; +Cc: Mauro Carvalho Chehab
Hi Mauro,
First, I have a question, in the function "int tm6000_cards_setup(struct
tm6000_core *dev)" have you reset gpio 1 and 4, but why? In my lastest
patch I have add a few sticks and it's works with and without this
part.What for sticks use this part? For a week I have become a email
with usbsnoop log from a tm5600 based stick and I have analysed it.
Resume is that I think it use two reset gpio's.
1. GPIO1 = 0
2. GPIO4 = 0
3. wait a few ms
4. GPIO1 = 1
5. GPIO4 = 1
/*
* Default initialization. Most of the devices seem to use GPIO1
* and GPIO4.on the same way, so, this handles the common sequence
* used by most devices.
* If a device uses a different sequence or different GPIO pins for
* reset, just add the code at the board-specific part
*/
for (i = 0; i < 2; i++) {
rc = tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
dev->gpio.tuner_reset, 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->gpio.tuner_reset, 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(KERN_DEBUG "board=%d\n", rc);
}
}
For a week I have become a email with usbsnoop log from a tm5600 based
stick and I have analysed it. Resume is that I think it use two reset
gpio's.
1. GPIO1 = 0
2. GPIO4 = 0
3. wait a few ms
4. GPIO1 = 1
5. GPIO4 = 1
So I think, if it a part from function tm6000_cards_setup is, then is
that part wrong and must remove to tuner_callback function.
Second, I will rewrite the gpio's into a struct.
for example:
in tm6000.h
struct tm6000_gpio {
int tuner_reset;
int tuner_on;
int demod_reset;
int demod_on;
int power_led;
int dvb_led;
int ir;
};
in tm6000_card.c
[TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE] = {
.name = "Terratec Cinergy Hybrid XE / Cinergy Hybrid-Stick",
.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 = {
.tuner_reset = TM6010_GPIO_2,
.tuner_on = TM6010_GPIO_3,
.demod_reset = TM6010_GPIO_1,
.demod_on = TM6010_GPIO_4,
.power_led = TM6010_GPIO_7,
.dvb_led = TM6010_GPIO_5,
.ir = TM6010_GPIO_0,
},
},
The rest I send in the patch email. So can the gpio's define in the
board struct and using per label in the functions.
Stefan Ringel
--
Stefan Ringel <stefan.ringel@arcor.de>
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH] Add new TV cards of Beholder
@ 2009-11-10 4:37 Dmitri Belimov
2009-11-23 21:28 ` Mauro Carvalho Chehab
0 siblings, 1 reply; 12+ messages in thread
From: Dmitri Belimov @ 2009-11-10 4:37 UTC (permalink / raw)
To: linux-media, video4linux-list
[-- Attachment #1: Type: text/plain, Size: 1888 bytes --]
Hi All
Add new TV cards of Beholder for autodetect.
diff -r 3919b17dc88e linux/drivers/staging/tm6000/tm6000-cards.c
--- a/linux/drivers/staging/tm6000/tm6000-cards.c Wed Oct 14 12:52:55 2009 -0300
+++ b/linux/drivers/staging/tm6000/tm6000-cards.c Tue Nov 10 08:05:15 2009 +0900
@@ -33,6 +33,7 @@
#include "tm6000.h"
#include "tm6000-regs.h"
#include "tuner-xc2028.h"
+#include "tuner-xc5000.h"
#define TM6000_BOARD_UNKNOWN 0
#define TM5600_BOARD_GENERIC 1
@@ -193,6 +194,36 @@
},
.gpio_addr_tun_reset = TM6000_GPIO_2,
},
+ [TM6010_BOARD_BEHOLD_WANDER] = {
+ .name = "Beholder Wander DVB-T/TV/FM USB2.0",
+ .tuner_type = TUNER_XC5000,
+ .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 = TM6000_GPIO_2,
+ },
+ [TM6010_BOARD_BEHOLD_VOYAGER] = {
+ .name = "Beholder Voyager TV/FM USB2.0",
+ .tuner_type = TUNER_XC5000,
+ .tuner_addr = 0xc2 >> 1,
+ .type = TM6010,
+ .caps = {
+ .has_tuner = 1,
+ .has_dvb = 0,
+ .has_zl10353 = 0,
+ .has_eeprom = 1,
+ .has_remote = 1,
+ },
+ .gpio_addr_tun_reset = TM6000_GPIO_2,
+ },
+
};
/* table of devices that work with this driver */
@@ -203,6 +234,8 @@
{ USB_DEVICE(0x14aa, 0x0620), .driver_info = TM6000_BOARD_FREECOM_AND_SIMILAR },
{ USB_DEVICE(0x06e1, 0xb339), .driver_info = TM6000_BOARD_ADSTECH_MINI_DUAL_TV },
{ 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 },
{ },
};
Signed-off-by: Beholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com>
With my best regards, Dmitry.
[-- Attachment #2: behold_usb.patch --]
[-- Type: text/x-patch, Size: 1803 bytes --]
diff -r 3919b17dc88e linux/drivers/staging/tm6000/tm6000-cards.c
--- a/linux/drivers/staging/tm6000/tm6000-cards.c Wed Oct 14 12:52:55 2009 -0300
+++ b/linux/drivers/staging/tm6000/tm6000-cards.c Tue Nov 10 08:05:15 2009 +0900
@@ -33,6 +33,7 @@
#include "tm6000.h"
#include "tm6000-regs.h"
#include "tuner-xc2028.h"
+#include "tuner-xc5000.h"
#define TM6000_BOARD_UNKNOWN 0
#define TM5600_BOARD_GENERIC 1
@@ -193,6 +194,36 @@
},
.gpio_addr_tun_reset = TM6000_GPIO_2,
},
+ [TM6010_BOARD_BEHOLD_WANDER] = {
+ .name = "Beholder Wander DVB-T/TV/FM USB2.0",
+ .tuner_type = TUNER_XC5000,
+ .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 = TM6000_GPIO_2,
+ },
+ [TM6010_BOARD_BEHOLD_VOYAGER] = {
+ .name = "Beholder Voyager TV/FM USB2.0",
+ .tuner_type = TUNER_XC5000,
+ .tuner_addr = 0xc2 >> 1,
+ .type = TM6010,
+ .caps = {
+ .has_tuner = 1,
+ .has_dvb = 0,
+ .has_zl10353 = 0,
+ .has_eeprom = 1,
+ .has_remote = 1,
+ },
+ .gpio_addr_tun_reset = TM6000_GPIO_2,
+ },
+
};
/* table of devices that work with this driver */
@@ -203,6 +234,8 @@
{ USB_DEVICE(0x14aa, 0x0620), .driver_info = TM6000_BOARD_FREECOM_AND_SIMILAR },
{ USB_DEVICE(0x06e1, 0xb339), .driver_info = TM6000_BOARD_ADSTECH_MINI_DUAL_TV },
{ 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 },
{ },
};
Signed-off-by: Beholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com>
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH] Add new TV cards of Beholder
2009-11-10 4:37 [PATCH] Add new TV cards of Beholder Dmitri Belimov
@ 2009-11-23 21:28 ` Mauro Carvalho Chehab
2010-01-12 8:24 ` tm6000 Dmitri Belimov
0 siblings, 1 reply; 12+ messages in thread
From: Mauro Carvalho Chehab @ 2009-11-23 21:28 UTC (permalink / raw)
To: Dmitri Belimov; +Cc: linux-media, video4linux-list
Hi Dmitri,
I added this patch, but the driver is essentially broken. It would
be wonderful if you have some time to fix it.
Cheers,
Mauro.
Dmitri Belimov wrote:
> Hi All
>
> Add new TV cards of Beholder for autodetect.
>
> diff -r 3919b17dc88e linux/drivers/staging/tm6000/tm6000-cards.c
> --- a/linux/drivers/staging/tm6000/tm6000-cards.c Wed Oct 14 12:52:55 2009 -0300
> +++ b/linux/drivers/staging/tm6000/tm6000-cards.c Tue Nov 10 08:05:15 2009 +0900
> @@ -33,6 +33,7 @@
> #include "tm6000.h"
> #include "tm6000-regs.h"
> #include "tuner-xc2028.h"
> +#include "tuner-xc5000.h"
>
> #define TM6000_BOARD_UNKNOWN 0
> #define TM5600_BOARD_GENERIC 1
> @@ -193,6 +194,36 @@
> },
> .gpio_addr_tun_reset = TM6000_GPIO_2,
> },
> + [TM6010_BOARD_BEHOLD_WANDER] = {
> + .name = "Beholder Wander DVB-T/TV/FM USB2.0",
> + .tuner_type = TUNER_XC5000,
> + .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 = TM6000_GPIO_2,
> + },
> + [TM6010_BOARD_BEHOLD_VOYAGER] = {
> + .name = "Beholder Voyager TV/FM USB2.0",
> + .tuner_type = TUNER_XC5000,
> + .tuner_addr = 0xc2 >> 1,
> + .type = TM6010,
> + .caps = {
> + .has_tuner = 1,
> + .has_dvb = 0,
> + .has_zl10353 = 0,
> + .has_eeprom = 1,
> + .has_remote = 1,
> + },
> + .gpio_addr_tun_reset = TM6000_GPIO_2,
> + },
> +
> };
>
> /* table of devices that work with this driver */
> @@ -203,6 +234,8 @@
> { USB_DEVICE(0x14aa, 0x0620), .driver_info = TM6000_BOARD_FREECOM_AND_SIMILAR },
> { USB_DEVICE(0x06e1, 0xb339), .driver_info = TM6000_BOARD_ADSTECH_MINI_DUAL_TV },
> { 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 },
> { },
> };
>
> Signed-off-by: Beholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com>
>
> With my best regards, Dmitry.
>
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2010-05-18 7:35 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-05 4:50 tm6000 Dmitri Belimov
2010-05-05 5:44 ` tm6000 Bee Hock Goh
2010-05-05 7:27 ` tm6000 Dmitri Belimov
2010-05-05 7:47 ` tm6000 Bee Hock Goh
2010-05-05 13:58 ` tm6000 Mauro Carvalho Chehab
-- strict thread matches above, loose matches on Subject: below --
2010-05-18 7:35 tm6000 Dmitri Belimov
2010-04-23 0:48 [PATCH] tm6000 fix i2c Dmitri Belimov
2010-04-23 15:15 ` Stefan Ringel
2010-04-26 0:25 ` Dmitri Belimov
2010-04-26 12:58 ` Bee Hock Goh
2010-04-27 5:15 ` Dmitri Belimov
2010-04-27 6:07 ` Bee Hock Goh
2010-04-28 5:49 ` tm6000 Dmitri Belimov
2010-04-28 7:32 ` tm6000 Bee Hock Goh
2010-04-28 12:14 ` tm6000 Mauro Carvalho Chehab
2010-03-10 17:57 [PATCH] tm6000: add new hybrid-stick stefan.ringel
2010-03-14 7:11 ` Stefan Ringel
2010-03-14 18:26 ` Mauro Carvalho Chehab
2010-03-14 20:19 ` Stefan Ringel
2010-03-27 14:55 ` tm6000 Stefan Ringel
2009-11-10 4:37 [PATCH] Add new TV cards of Beholder Dmitri Belimov
2009-11-23 21:28 ` Mauro Carvalho Chehab
2010-01-12 8:24 ` tm6000 Dmitri Belimov
2010-01-12 11:50 ` tm6000 Mauro Carvalho Chehab
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox