Re: [PATCH RFC] em28xx: PCTV 520e switch tda18271 to tda18271c2dd

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Oct 2, 2012 at 8:29 AM, Antti Palosaari <crope@xxxxxx> wrote:
> On 10/02/2012 02:05 PM, Mauro Carvalho Chehab wrote:
>>
>> Em Tue, 02 Oct 2012 12:55:55 +0300
>> Antti Palosaari <crope@xxxxxx> escreveu:
>>
>>> On 10/02/2012 06:17 AM, Michael Krufky wrote:
>>>>
>>>> On Mon, Oct 1, 2012 at 9:58 PM, Devin Heitmueller
>>>> <dheitmueller@xxxxxxxxxxxxxx> wrote:
>>>>>
>>>>> On Mon, Oct 1, 2012 at 8:52 PM, Antti Palosaari <crope@xxxxxx> wrote:
>>>>>>
>>>>>> New drxk firmware download does not work with tda18271. Actual
>>>>>> reason is more drxk driver than tda18271. Anyhow, tda18271c2dd
>>>>>> will work as it does not do as much I/O during attach than tda18271.
>>>>>>
>>>>>> Root of cause is tuner I/O during drx-k asynchronous firmware
>>>>>> download. request_firmware_nowait()... :-/
>>>>>
>>>>>
>>>>> This seems like it's just changing the timing of the initialization
>>>>> process, which isn't really any better than the "msleep(2000)".  It's
>>>>> just dumb luck that it happens to work on the developer's system.
>>>>>
>>>>> Don't get me wrong, I agree with Michael that this whole situation is
>>>>> ridiculous, but I don't see why swapping out the entire driver is a
>>>>> reasonable fix.
>>>>
>>>>
>>>> I just send out a patch entitled, "tda18271: prevent register access
>>>> during attach() if delay_cal is set"   Antti, could you set
>>>> tda18271_config.delay_cal = 1 with this patch applied and see if it
>>>> solves your problem?
>>>>
>>>> Again, although this may solve the problem for this particular device,
>>>> the *real* problem is this asynchronous firmware download in the demod
>>>> driver.
>>>>
>>>> Nonetheless, Antti has been asking for this feature, to not allow
>>>> register access during attach, I was against it and I have my reasons,
>>>> but I believe that this patch is a fair compromise.
>>>>
>>>> After somebody can test it, I think we should merge this -- any
>>>> comments?
>>>>
>>>> http://patchwork.linuxtv.org/patch/14799/
>>>
>>>
>>> I tested. It does not help. I also looked it more and it really bails
>>> out with error much earlier, in function where it reads chip ID. That
>>> makes me look the tda18271c2dd driver.
>>
>>
>> I saw Antti's logs: basically, tda18271_get_id() reads all registers at
>> the
>> chip during attach(), returning -EINVAL if tda18271_read_regs(fe) can't
>> read the value for R_ID register.
>>
>> Btw, why do you need to read 16 registers at once, instead of just reading
>> the needed register? read_extended and write operations are even more
>> evil:
>> they read/write the full set of 39 registers on each operation. That seems
>> to be overkill, especially on places like tda18271_get_id(), where
>> all the driver is doing is to check for the ID register.
>>
>> Worse than that, tda18271_get_id() doesn't even check if the read()
>> operation failed: it assumes that it will always work, letting the
>> switch(regs[R_ID]) to print a wrong message (device unknown) when
>> what actually failed where the 16 registers dump.
>>
>>> I found that for some reason
>>> these drivers uses different method for register read. tda18271 uses I2C
>>> transaction with 2 messages, write and read with REPEATED START
>>> condition. tda18271c2dd driver is just simple I2C read. So which one is
>>> correct?
>>
>>
>> That's due to the I2C locking schema: if you do two separate I2C
>> transfers, the I2C core will allow an event to happen between the
>> two operations. That typically causes troubles on read operations.
>> So, it is recommended to use just one i2c_transfer() call for read
>> operations that are mapped via a write and a read.
>
>
> I know rather well how I2C works. As many messages you put to single
> transfer those are aimed to do with REPEATED START condition without a STOP.
> And naturally, when you split to multiple transactions then there is STOP.
> STOP is send after the last I2C message in one transaction.
>
> But what I tried to say there was a different communication schema used
> between the drivers. Other must (quite likely) be wrong. There is no any
> mention about hacks. I don't see how that I2C locking you mention is
> related, as it is *one* I2C transfer in question for both cases.
>
> Here is difference what I mean:
> tda18271: START c0|Ack|00|Ack|START c1|data read|NAck|STOP
> tda18271cc: START c1|data read|NAck|STOP

As per section 9.1 of the NXP TDA18271 datasheet (page 8) (download
from http://www.nxp.com/documents/data_sheet/TDA18271HD.pdf)

9.1 I2C-bus format, Write/Read mode
Remark: The I2C-bus read in the TDA18271HD must read the entire
I2C-bus map, with
required subaddress 00h. The number of bytes read is 16, or 39 in
extended register
mode; see Table 7. Reading write-only bits can return values that are
different from the
programmed values

tda18271 is doing the right thing, tda18271cc is not.

-Mike Krufky
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux