On Fri Jul 18, 2025 at 10:10 AM MDT, Doug Anderson wrote: >> +#define mipi_dsi_dual(_func, _dsi1, _dsi2, _ctx, ...) \ >> + _mipi_dsi_dual(_func, _dsi1, _dsi2, _ctx, ##__VA_ARGS__) >> + >> +#define _mipi_dsi_dual(_func, _dsi1, _dsi2, _ctx, ...) \ >> + do { \ >> + (_ctx)->dsi = (_dsi1); \ >> + _func((_ctx), ##__VA_ARGS__); \ > > nit: shouldn't func be in parenthesis for safety? It's unlikely to > really matter, but just in case it's somehow a calculated value that > would make it safe from an order-of-operations point of view.
My assumption is that wrapping _func in parenthesis would cause a compilation error in the case of _func being a macro (more on that later...). I'll test that later today. >> + (_ctx)->dsi = (_dsi2); \ >> + _func((_ctx), ##__VA_ARGS__); \ >> + } while (0) > > Can you explain why you need the extra level of indirection here (in > other words, why do you need to define _mipi_dsi_dual() and then use > it in mipi_dsi_dual())? I don't see it buying anything, but maybe it's > performing some magic trick I'm not aware of? I mentioned this in v3 after the changelog and prompty forgot to include that information in v4: The extra indirection between mipi_dsi_dual() and _mipi_dsi_dual() is to allow for the expansion of _func in the case that _func is also a macro (as is the case with mipi_dsi_generic_write_seq_multi, i believe). Compilation fails after removing the indirection. There may very well be a better solution to this problem. I'd appreciate your thoughts. > Reading this with a fresh set of eyes, I also realize that this macro > is probably vulnerable to issues where arguments have side effects > since we have to repeat them. I don't think there's a way around this > and I think the macro is still worthwhile, but something to go into > with open eyes. Possibly worth noting in the macro description? We > could probably at least eliminate the need to reference "_ctx" more > than once by assigning it to a local variable. I think referencing > "_func" and "__VA_ARGS__" more than once is unavoidable... I'm using _func, _ctx, and __VA_ARGS__ more than once in this macro and I don't expect the indirection to fix the potential issue of unintended side effects. I believe we can use GNU extensions to eliminate side effects to _ctx, but especially since _func can be a macro, I don't think there's much to be done about it. Not sure about __VA_ARGS__. I fear my inexperience is made sorely manifest here. Happy Friday, Brigham