* 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.