[PATCH 2/4] drm/dp/i2c: send bare addresses to properly reset i2c connections (v3)
Alex Deucher
alexdeucher at gmail.com
Mon Apr 7 06:44:06 PDT 2014
On Mon, Apr 7, 2014 at 3:49 AM, Thierry Reding <thierry.reding at gmail.com> wrote:
> On Fri, Apr 04, 2014 at 03:58:37PM -0400, Alex Deucher wrote:
>> We need bare address packets at the start and end of
>> each i2c over aux transaction to properly reset the connection
>> between transactions. This mirrors what the existing dp i2c
>> over aux algo currently does.
>>
>> This fixes EDID fetches on certain monitors especially with
>> dp bridges.
>>
>> v2: update as per Ville's comments
>> - Set buffer to NULL for zero sized packets
>> - abort the entre transaction if one of the messages fails
>> v3: drop leftover debugging code
>>
>> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
>> Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
>> Cc: Jani Nikula <jani.nikula at intel.com>
>> Cc: Thierry Reding <treding at nvidia.com>
>> Reviewed-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
>> ---
>> drivers/gpu/drm/drm_dp_helper.c | 52 +++++++++++++++++++++++------------------
>> 1 file changed, 29 insertions(+), 23 deletions(-)
>
> Can we please document that zero-sized messages specify address-only
> transactions? Perhaps it would also be useful to mention that these can
> only happen for I2C-over-AUX messages.
Can do. I don't know of any uses for bare address packets with
regular aux off hand, but there may be cases I'm not familiar with.
Does anyone know of any use for a bare address packet with regular
aux?
>
>> diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
>> index 74724aa..dfe4cf4 100644
>> --- a/drivers/gpu/drm/drm_dp_helper.c
>> +++ b/drivers/gpu/drm/drm_dp_helper.c
>> @@ -664,12 +664,23 @@ static int drm_dp_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs,
>> int num)
>> {
>> struct drm_dp_aux *aux = adapter->algo_data;
>> - unsigned int i, j;
>> + unsigned int m, b;
>
> I don't see why these would need to be changed. i and j are perfectly
> fine loop variable names.
It was easier for me to follow the code since the variables matched
the objects they were iterating, but I can change them back if you'd
prefer.
>
>> - for (i = 0; i < num; i++) {
>> - struct drm_dp_aux_msg msg;
>> - int err;
>> + memset(&msg, 0, sizeof(msg));
>>
>> + for (m = 0; m < num; m++) {
>> + msg.address = msgs[m].addr;
>> + msg.request = (msgs[m].flags & I2C_M_RD) ?
>> + DP_AUX_I2C_READ :
>> + DP_AUX_I2C_WRITE;
>> + msg.request |= DP_AUX_I2C_MOT;
>> + msg.buffer = NULL;
>> + msg.size = 0;
>> + err = drm_dp_i2c_do_msg(aux, &msg);
>> + if (err < 0)
>> + break;
>
> This seems somewhat brittle to me. Even though I notice that patch 3/4
> updates a comment that documents these assumptions, I don't see a reason
> for these assumptions in the first place.
We already assume that in drm_dp_i2c_do_msg() for the retry loop.
>
> I'd prefer if we simply provided the complete message rather than rely
> on drivers not to touch anything but the reply field.
Are you suggesting we re-write drm_dp_i2c_do_msg() or move the retry
logic into drm_dp_i2c_xfer()? Do you mind if we do that in a follow
up patch so we can keep it separate from the addition of the bare
address packets?
Alex
More information about the dri-devel
mailing list