Hi Peter, first high-level review: > +int i2c_mux_reserve_adapters(struct i2c_mux_core *muxc, int adapters) I'd suggest to rename 'adapters' into 'num_adapters' throughout this patch. I think it makes the code a lot easier to understand. > +{ > + struct i2c_adapter **adapter; > + > + if (adapters <= muxc->max_adapters) > + return 0; > + > + adapter = devm_kmalloc_array(muxc->dev, > + adapters, sizeof(*adapter), > + GFP_KERNEL); > + if (!adapter) > + return -ENOMEM; > + > + if (muxc->adapter) { > + memcpy(adapter, muxc->adapter, > + muxc->max_adapters * sizeof(*adapter)); > + devm_kfree(muxc->dev, muxc->adapter); > + } > + > + muxc->adapter = adapter; > + muxc->max_adapters = adapters; > + return 0; > +} > +EXPORT_SYMBOL_GPL(i2c_mux_reserve_adapters); Despite that I wonder why not using some of the realloc functions, I wonder even more if we couldn't supply num_adapters to i2c_mux_alloc() and reserve the memory statically. i2c busses are not dynamic/hot-pluggable so that should be good enough? > - WARN(sysfs_create_link(&priv->adap.dev.kobj, &mux_dev->kobj, "mux_device"), > - "can't create symlink to mux device\n"); > + WARN(sysfs_create_link(&priv->adap.dev.kobj, &muxc->dev->kobj, > + "mux_device"), Ignoring the 80 char limit here makes the code more readable. > + "can't create symlink to mux device\n"); > > snprintf(symlink_name, sizeof(symlink_name), "channel-%u", chan_id); > - WARN(sysfs_create_link(&mux_dev->kobj, &priv->adap.dev.kobj, symlink_name), > - "can't create symlink for channel %u\n", chan_id); > + WARN(sysfs_create_link(&muxc->dev->kobj, &priv->adap.dev.kobj, > + symlink_name), ditto. > + "can't create symlink for channel %u\n", chan_id); > dev_info(&parent->dev, "Added multiplexed i2c bus %d\n", > i2c_adapter_id(&priv->adap)); > > - return &priv->adap; > + muxc->adapter[muxc->adapters++] = &priv->adap; > + return 0; > +} > +EXPORT_SYMBOL_GPL(i2c_mux_add_adapter); > + > +struct i2c_mux_core *i2c_mux_one_adapter(struct i2c_adapter *parent, > + struct device *dev, int sizeof_priv, > + u32 flags, u32 force_nr, > + u32 chan_id, unsigned int class, > + int (*select)(struct i2c_mux_core *, > + u32), ditto > + int (*deselect)(struct i2c_mux_core *, > + u32)) ditto > +{ > + struct i2c_mux_core *muxc; > + int ret; > + > + muxc = i2c_mux_alloc(parent, dev, sizeof_priv, flags, select, deselect); > + if (!muxc) > + return ERR_PTR(-ENOMEM); > + > + ret = i2c_mux_add_adapter(muxc, force_nr, chan_id, class); > + if (ret) { > + devm_kfree(dev, muxc); > + return ERR_PTR(ret); > + } > + > + return muxc; > +} > +EXPORT_SYMBOL_GPL(i2c_mux_one_adapter); Are you sure the above function pays off? Its argument list is very complex and it doesn't save a lot of code. Having seperate calls is probably more understandable in drivers? Then again, I assume it makes the conversion of existing drivers easier. So much for now. Thanks! Wolfram
Attachment:
signature.asc
Description: PGP signature