On Sábado, 23 de Julio de 2011 12:37:53 Antti Palosaari escribió:
> On 07/23/2011 01:21 PM, Jose Alberto Reguero wrote:
> > On Sábado, 23 de Julio de 2011 11:42:58 Antti Palosaari escribió:
> >> On 07/23/2011 11:26 AM, Jose Alberto Reguero wrote:
> >>> The problem is in i2c read in tda827x_probe_version. Without the fix
> >>> sometimes, when changing the code the tuner is detected as tda827xo
> >>> instead of tda827xa. That is because the variable where i2c read should
> >>> store the value is initialized, and sometimes it works.
> >>
> >> struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = I2C_M_RD,
> >>
> >> .buf =&data, .len = 1 };
> >>
> >> rc = tuner_transfer(fe,&msg, 1);
> >>
> >> :-( Could you read what I write. It is a little bit annoying to find out
> >>
> >> everything for you. You just answer every time something like it does
> >> not work and I should always find out what's problem.
> >>
> >> As I pointed out read will never work since I2C adapter supports only
> >> read done in WRITE+READ combination. Driver uses read which is single
> >> READ without write.
> >>
> >> You should implement new read. You can look example from af9015 or other
> >> drivers using tda827x
> >>
> >> This have been never worked thus I Cc Guy Martin who have added DVB-C
> >> support for that device.
> >>
> >>
> >> regards
> >> Antti
> >
> > I don't understand you. I think that you don' see the fix, but the old
> > code. Old code:
> >
> > read = i+1< num&& (msg[i+1].flags& I2C_M_RD);
> >
> > Fix:
> >
> > read1 = i+1< num&& (msg[i+1].flags& I2C_M_RD); for the tda10023 and
> > tda10048 read2 = msg[i].flags& I2C_M_RD; for the tda827x
> >
> > Jose Alberto
>
> First of all I must apologize of blaming you about that I2C adapter,
> sorry, I should going to shame now. It was me who doesn't read your
> changes as should :/
>
> Your changes are logically OK and implements correctly single reading as
> needed. Some comments still;
> * consider renaming read1 and read2 for example write_read and read
> * obuf[1] contains WRITE len. your code sets that now as READ len.
> Probably it should be 0 always in single write since no bytes written.
> * remove useless checks from end of the "if (foo) if (foo)";
> if (read1 || read2) {
> if (read1) {
> [...]
> } else if (read2)
>
> If you store some variables at the beginning, olen, ilen, obuf, ibuf,
> you can increase i++ for write+read and rest of the code in function can
> be same (no more if read or write + read). But maybe it is safe to keep
> closer original than change such much.
>
>
> regards
> Antti
There are a second i2c read, but less important.It is in:
tda827xa_set_params
............
buf[0] = 0xa0;
buf[1] = 0x40;
msg.len = 2;
rc = tuner_transfer(fe, &msg, 1);
if (rc < 0)
goto err;
msleep(11);
msg.flags = I2C_M_RD;
rc = tuner_transfer(fe, &msg, 1);
if (rc < 0)
goto err;
msg.flags = 0;
buf[1] >>= 4;
............
I supposed that buf[0] is the register to read and they read the value in
buf[1]. The code now seem to work ok but perhaps is wrong.
Jose Alberto
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html