On Thu, Jun 18, 2015 at 12:57:38PM -0700, York Sun wrote: > Based on i2c-mux-gpio driver, similarly the register-based mux > switch from one bus to another by setting a single register. > The register can be on PCIe bus, local bus, or any memory-mapped > address. The endianness of such register can be specified in device > tree if used, or in platform data. > > Signed-off-by: York Sun <yorksun@xxxxxxxxxxxxx> Thanks for this driver! ... > +- no-read: The existence indicates reading the register is not allowed. Given that we have "read-only" properties already, I'd prefer this one to be "write-only". > +For each i2c child node, an I2C child bus will be created. They will > +be numbered based on their order in the device tree. This is a Linux specific detail (which can be overridden by aliases), so it should not be in this document, I'd say. > diff --git a/drivers/i2c/muxes/Kconfig b/drivers/i2c/muxes/Kconfig > index f6d313e..77c1257 100644 > --- a/drivers/i2c/muxes/Kconfig > +++ b/drivers/i2c/muxes/Kconfig > @@ -29,6 +29,17 @@ config I2C_MUX_GPIO > This driver can also be built as a module. If so, the module > will be called i2c-mux-gpio. > > +config I2C_MUX_REG > + tristate "Register-based I2C multiplexer" > + help > + If you say yes to this option, support will be included for a > + register based I2C multiplexer. This driver provides access to > + I2C busses connected through a MUX, which is controlled > + by a sinple register. Typo here. And keep the sorting, please. > obj-$(CONFIG_I2C_MUX_GPIO) += i2c-mux-gpio.o > +obj-$(CONFIG_I2C_MUX_REG) += i2c-mux-reg.o Keep the sorting, please. > obj-$(CONFIG_I2C_MUX_PCA9541) += i2c-mux-pca9541.o > obj-$(CONFIG_I2C_MUX_PCA954x) += i2c-mux-pca954x.o > obj-$(CONFIG_I2C_MUX_PINCTRL) += i2c-mux-pinctrl.o > + adapter = of_find_i2c_adapter_by_node(adapter_np); > + if (!adapter) { > + dev_err(&pdev->dev, "Cannot find parent bus\n"); I don't think we should print something when deferring. > + return -EPROBE_DEFER; > + } > + mux->parent = adapter; > + mux->data.parent = i2c_adapter_id(adapter); > + put_device(&adapter->dev); > + > + mux->data.n_values = of_get_child_count(np); > + if (of_find_property(np, "little-endian", NULL)) { You should check for a "big-endian" property as well, no? > + parent = i2c_get_adapter(mux->data.parent); > + if (!parent) { > + dev_err(&pdev->dev, "Parent adapter (%d) not found\n", > + mux->data.parent); > + return -EPROBE_DEFER; Ditto about printing when deferred probing. > +static int i2c_mux_reg_remove(struct platform_device *pdev) > +{ > + struct regmux *mux = platform_get_drvdata(pdev); > + int i; > + > + for (i = 0; i < mux->data.n_values; i++) > + i2c_del_mux_adapter(mux->adap[i]); > + > + i2c_put_adapter(mux->parent); > + > + dev_dbg(&pdev->dev, "Removed\n"); No need for that debug. The driver core has debug output for that. Thanks, Wolfram
Attachment:
signature.asc
Description: Digital signature