> 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

Reply via email to