> On Sep 12, 2021, at 8:17 AM, Jason Thorpe <thor...@me.com> wrote: > > Doing this with symbols is a mess.
Here’s a way to basically get most of what you want without referencing symbols: struct device_call_generic { const char *name; void *args; }; int device_call_generic(device_t, const struct device_call_generic *); struct i2c_enumerate_devices_args { ... }; union i2c_enumerate_devices_binding { struct device_call_generic generic; struct { const char *name; struct i2c_enumerate_devices_args *args; } binding; }; #define I2C_ENUMERATE_DEVICES(_args_) \ &((const union i2c_enumerate_devices_binding){ \ .binding.name = "i2c-enumerate-devices", \ .binding.args = (_args_), \ }) #define device_call(dev, call) \ device_call_generic((dev), (call)->generic) struct i2c_attach_args ia = { .ia_tag = ic, }; struct i2c_enumerate_devices_args enumargs = { .ia = &ia, .callback = iic_enumerate_devices_callback, }; rv = device_call(dev, I2C_ENUMERATE_DEVICES(&enumargs)); -- thorpej