Re: [PATCH 0/11] introduce macros for i2c_msg initialization

2012-10-22 Thread Julia Lawall
I have been looking at this again, with the macros

#define I2C_MSG_OP(_addr, _buf, _len, _flags) \
{ .addr = _addr, .buf = _buf, .len = _len, .flags = _flags }

#define I2C_MSG_WRITE(addr, buf, len) \
I2C_MSG_OP(addr, buf, len, 0)
#define I2C_MSG_READ(addr, buf, len) \
I2C_MSG_OP(addr, buf, len, I2C_M_RD)
#define I2C_MSG_WRITE_OP(addr, buf, len, op) \
I2C_MSG_OP(addr, buf, len, 0 | op)
#define I2C_MSG_READ_OP(addr, buf, len, op) \
I2C_MSG_OP(addr, buf, len, I2C_M_RD | op)

and the tuners files as a random first example.  This time I haven't made
any adjustments for arrays of size 1.

The following file is a bit unfortunate, because a single structure is
mostly used for writing, but sometimes used for reading, in the function
tda827xa_set_params.  That is, there are explicit assignments to
msg.flags.

drivers/media/tuners/tda827x.c

Currently, this is done in 8 files across the entire kernel.  Would it be
a problem to use a READ or WRITE macro to initialize such a structure,
give that the type is going to change?  Maybe the I2C_MSG_OP macro could
be used, with an explicit flag argument?

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


Re: [PATCH 0/11] introduce macros for i2c_msg initialization

2012-10-09 Thread Jean Delvare
Hi Julia,

On Sun,  7 Oct 2012 17:38:30 +0200, Julia Lawall wrote:
 This patch set introduces some macros for describing how an i2c_msg is
 being initialized.  There are three macros: I2C_MSG_READ, for a read
 message, I2C_MSG_WRITE, for a write message, and I2C_MSG_OP, for some other
 kind of message, which is expected to be very rarely used.

Some other kind of message is actually messages which need extra
flags. They are still read or write messages.

OK, I've read the whole series now and grepped the kernel tree so I
have a better overview. There are a lot more occurrences than what you
converted. I presume the conversions were just an example and you leave
the rest up to the relevant maintainers (e.g. me) if they are
interested?

Given the huge number of affected drivers (a quick grep suggests 230
drivers and more than 300 occurrences), we'd better think twice before
going on as it will be intrusive and hard to change afterward.

So my first question will be: what is your goal with this change? Are
you only trying to save a few lines of source code? Or do you expect to
actually fix/prevent bugs by introducing these macros? Or something
else?

I admit I am not completely convinced by the benefit at the moment. A
number of these drivers should be using i2c_smbus_*() functions instead
of i2c_transfer() for improved compatibility, or i2c_master_send/recv()
for single message transfers (383 occurrences!), so making
i2c_transfer() easier to use isn't at the top of my priority list. And
I see the extra work for the pre-processor, so we need a good reason
for doing that.

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


Re: [PATCH 0/11] introduce macros for i2c_msg initialization

2012-10-09 Thread Julia Lawall
On Tue, 9 Oct 2012, Jean Delvare wrote:

 Hi Julia,

 On Sun,  7 Oct 2012 17:38:30 +0200, Julia Lawall wrote:
  This patch set introduces some macros for describing how an i2c_msg is
  being initialized.  There are three macros: I2C_MSG_READ, for a read
  message, I2C_MSG_WRITE, for a write message, and I2C_MSG_OP, for some other
  kind of message, which is expected to be very rarely used.

 Some other kind of message is actually messages which need extra
 flags. They are still read or write messages.

I agree.  We could also have a read with extra options macro and a write
with extra options macro.  That would give four macros, which is not too
much more than three.

 OK, I've read the whole series now and grepped the kernel tree so I
 have a better overview. There are a lot more occurrences than what you
 converted. I presume the conversions were just an example and you leave
 the rest up to the relevant maintainers (e.g. me) if they are
 interested?

I would be happy to do the rest, or at least to do more.  I just didn't
want to do 600+ cases before knowing how others felt about the various
changes.  Actually, now that we seem to have decided to make fewer changes
at once, I could probably work more quickly.  So far, I have been
comparing the results after running cpp, as well as checking that the
sizeof transformation is correct, which is a bit slow.

 Given the huge number of affected drivers (a quick grep suggests 230
 drivers and more than 300 occurrences), we'd better think twice before
 going on as it will be intrusive and hard to change afterward.

 So my first question will be: what is your goal with this change? Are
 you only trying to save a few lines of source code? Or do you expect to
 actually fix/prevent bugs by introducing these macros? Or something
 else?

The main goal just seems to be to provide something that is more readable.

 I admit I am not completely convinced by the benefit at the moment. A
 number of these drivers should be using i2c_smbus_*() functions instead
 of i2c_transfer() for improved compatibility, or i2c_master_send/recv()
 for single message transfers (383 occurrences!), so making
 i2c_transfer() easier to use isn't at the top of my priority list. And
 I see the extra work for the pre-processor, so we need a good reason
 for doing that.

OK, if it doesn't seem like a good idea, it is no problem to drop the idea
completely.  It does seem a bit nicer to have writing indicated as WRITE
rather than as 0, but that might not be a big enough benefit to justify
making changes.

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