> Hi Hans, > > > 2010-12-16 ¿ÀÈÄ 4:27, Hans Verkuil ¾´ ±Û: >> Thanks for the reminder, I missed this patch. >> >> Review comments are below. >> > > <snip> > >>> + >>> +/* MACRO */ >>> +#define e_check_w(fn, cat, byte, val, bitwidth) do { \ >>> + int ret; \ >>> + ret = (int)(fn); \ >>> + if ((ret) < 0) { \ >>> + dev_err(&client->dev, "fail i2c WRITE [%s] - " \ >>> + "category:0x%02x, " \ >>> + "bytes:0x%02x, " \ >>> + "value:0x%02x\n", \ >>> + (bitwidth), \ >>> + (cat), (byte), (u32)val); \ >>> + return ret; \ >>> + } \ >>> +} while (0) >>> + >>> +#define e_check_r(fn, cat, byte, val, bitwidth) do { \ >>> + int ret; \ >>> + ret = (int)(fn); \ >>> + if ((ret) < 0) { \ >>> + dev_err(&client->dev, "fail i2c READ [%s] - " \ >>> + "category:0x%02x, " \ >>> + "bytes:0x%02x, " \ >>> + "value:0x%02x\n", \ >>> + (bitwidth), \ >>> + (cat), (byte), (u32)(*val)); \ I would place this error in the m5mols_read_reg function itself rather than in the macro. >>> + return ret; \ >>> + } \ >>> +} while (0) >>> + >>> +#define REG_W_8(cat, byte, value) \ >>> + e_check_w(m5mols_write_reg(sd, M5MOLS_8BIT, cat, byte, value), \ >>> + cat, byte, value, "8bit") >>> +#define REG_R_8(cat, byte, value) \ >>> + e_check_r(m5mols_read_reg(sd, M5MOLS_8BIT, cat, byte, value), \ >>> + cat, byte, value, "8bit") >>> + >>> +#define e_check_mode(fn, mode) do { \ >>> + int ret; \ >>> + ret = (int)(fn); \ >>> + if (ret < 0) { \ >>> + dev_err(&client->dev, "Failed to %s mode\n", \ >>> + (mode)); \ >>> + return ret; \ >>> + } \ >>> +} while (0) >>> + >>> +#define mode_monitoring(sd) \ >>> + e_check_mode(m5mols_monitoring_mode(sd), "MONITORING") >>> +#define mode_parameter(sd) \ >>> + e_check_mode(m5mols_parameter_mode(sd), "PARAMETER") >> >> All these #defines above can be replaced by static inline functions. >> That the >> better option since static inline functions are type-safe. >> > You're definitely right. So, I know that #defines must be used carefully, > either. > But, in this driver code, the macros to use ultimately like this(e.g., > REG_W_8(), > REG_R_8(), mode_monitoring(), mode_parameter()), is never return any > value. > It return itself, if any error is sensed. I actually missed that during my first review. Thanks for pointing that out, but this is even more reason not to do it like this. > Namely, it's a bulk of codes, not a function. > > IMHO, The reasons I made of this macro are 3 things. > > 1. It may not looks good to add 3 or 4 lines code for checking error > return values. But what is worse is that you hide the return in the macro. So what looks like a simple function-like macro will in reality have the side-effect of returning. It's much better to explicitly handle the error in the calling function. > 2. It can prevent to miss error-checking code. Just use macro, then be > able to > handle error check, and show the kernel msg about i2c error return, or > anything > errors. You can add a __must_check attribute to the function that will force the compiler to generate a warning if the return code isn't checked. Much cleaner. > 3. If this macro changes to function type, it need one more error checking > codes > in the functions using this macros. So, then, the driver operation > flow is a > litte mess-up. Actually, I don't think the macros are needed at all. For reading and writing you can just call m5mols_write/read_reg directly and check the error. For the mode check you can make simple static inlines like: bool is_monitoring_mode() and bool is_parameter_mode() and use it like this: if (!is_monitoring_mode()) return ... The only place where you might want to do something fancy is if you have a lot of reads and/or writes in a function. Then you can do something like this: static inline void my_write(int reg, int val, int *err) { if (*err) return; *err = i2c_read(...); } int err = 0; my_write(0, 10, &err); my_write(1, 11, &err); my_write(2, 12, &err); if (err) return err; (just hacked together, so ignore the poor syntax :-) ). This allows you to do many reads and writes without having to check the error code each time. > Actually, to use static inline function for typesafing is right, I know. > But, can you think one more time, plz? > If I'm wrong after your thinking, I'll change this to inline functions. > > <snip> Regards, Hans -- Hans Verkuil - video4linux developer - sponsored by Cisco -- 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