Hi Peter, > >>>>>>> + if (msgs[i].flags & I2C_M_RD) { > >>>>>>> + /* gpu_i2c_read has implicit start and stop */ > >>>>>>> + status = gpu_i2c_read(i2cd, msgs[i].buf, > msgs[i].len); > >>>>>>> + if (status < 0) > >>>>>>> + return status; > >>>>>>> + } else { > >>>>>>> + /* start on first write message */ > >>>>>>> + if (i == 0) { > >>>>>> > >>>>>> This "if (i == 0)" test is completely bogus to me. I fail to see > >>>>>> why the meat of the block should not happen for both writes in a > >>>>>> double-write transfer. > >>>>>> > >>>>>> If the second message is a write, you do not issue any start nor > >>>>>> do you write out the address for the second message. You want to > >>>>>> generate the following for a transfer consisting of 2 write-messages: > >>>>>> > >>>>>> S Addr Wr [A] Data [A] ... S Addr Wr [A] Data [A] ... P > >>>>>> ============= > >>>>>> > >>>>>> (where "..." denotes further optional "Data [A]" instances) > >>>>>> > >>>>>> As is, the stuff underlined by equal signs are not generated, at > >>>>>> least as I read the code. > >>>>>> > >>>>>> This is what I meant in my comment around this area for the v9 patch. > >>>>> > >>>>> Oh, I just realized, this probably means that the ccg_write > >>>>> function in patch > >>>>> 2/2 asks for the wrong thing. If this code actually works, the > >>>>> client driver should probably ask for a single-message transfer > >>>>> consisting of the 2-byte rab concatenated with the data buffer. > >>>>> And that actually makes sense, there is no reason to split the two > >>>>> (dependent) parts of the write into separate messages. > >>>> That would require to create new buffer and copy data for each > >>>> write request from UCSI core driver for sending UCSI command. This > >>>> doesn't look proper way of doing it. > >>> > >>> Well, that's the way master_xfer works, so you will just have to > >>> live with it if you do not want a stop in the middle. > >> > >> Bzzt, s/stop/restart/ > > Obviously, a stop in middle will not work. For any read or write > > request, > > Yes, with "s/stop/restart/", I meant "replace stop with restart", and not "stop > followed by restart". That's pretty standard notation, but sorry if that was not > clear. > > > 2 byte rab write has to go first. We anyway have to separate rab part > > in read transactions so write should be okay to have separate rab > > write message. > > That is not at all certain. The two below transfers need not mean the same > thing at all. > > S Addr Wr [A] rab1 [A] rab2 [A] Data [A] ... P S Addr Wr [A] rab1 [A] rab2 [A] S > Addr Wr [A] Data [A] ... P > > In fact, I strongly suspect that for the latter case, the device will interpret the > first two Data bytes as rab and that you therefore have to make sure that the > first transfer (w/o restart) is what you generate in ccg_write. > > > All the client driver of this needs to create messages in pairs where > > first one will always be a rab write and second one either read or write. > > I can add a check for this condition in master_xfer if needed. > > > > Do you still see any issue with this? > > Yes, this is very much an issue. master_xfer has to start each message with a > start for the first message, and a restart for subsequent messages. And after > the final message there should be a stop. All starts/restarts should be > followed by the address and the read/write bit. Then data in the given > direction. The master_xfer function should never do any device specific > checks for device specific conditions. It simply should not care about which > client driver is currently using it, and instead just stick to implementing the > master_xfer api so that all client drivers know what to expect. No cludges. I didn't get how read will happen. Read will also require a 2 byte rab write and followed by read. Are you saying to have two messages for reads [rab + read] and combined (rab and write) single message for write? Then for read: rab is written first followed by reads and then actual explicit stop? for (i = 0; i < num; i++) if (Read) { read (without stop); } else { start; addr; write; } } stop; Thanks Ajay -- nvpublic -- > > Cheers, > Peter