[PATCH 3/7] i2c: Add the ability to match device to compatible string without an of_node

Grant Likely grant.likely at linaro.org
Fri Jun 6 16:39:36 PDT 2014


On Fri, 6 Jun 2014 09:10:26 +0100, Lee Jones <lee.jones at linaro.org> wrote:
> On Thu, 05 Jun 2014, Grant Likely wrote:
> 
> > On Wed,  4 Jun 2014 13:09:52 +0100, Lee Jones <lee.jones at linaro.org> wrote:
> > > A great deal of I2C devices are currently matched via DT node name, and
> > > as such the compatible naming convention of '<vendor>,<device>' has gone
> > > somewhat awry - some nodes don't supply one, some supply an arbitrary
> > > string and others the correct device name with an arbitrary vendor prefix.
> > > 
> > > In an effort to correct this problem we have to supply a mechanism to
> > > match a device by compatible string AND by simple device name.  This
> > > function strips off the '<vendor>,' part of a supplied compatible string
> > > and attempts to match without it.
> > > 
> > > The plan is to remove this function once all of the compatible strings
> > > for each device have been brought into line.
> > > 
> > > Signed-off-by: Lee Jones <lee.jones at linaro.org>
> > > ---
> > >  drivers/i2c/i2c-core.c | 25 +++++++++++++++++++++++++
> > >  include/linux/i2c.h    | 10 ++++++++++
> > >  2 files changed, 35 insertions(+)
> > > 
> > > diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
> > > index d3802dc..7dcd5c3 100644
> > > --- a/drivers/i2c/i2c-core.c
> > > +++ b/drivers/i2c/i2c-core.c
> > > @@ -1090,6 +1090,31 @@ struct i2c_adapter *of_find_i2c_adapter_by_node(struct device_node *node)
> > >  	return i2c_verify_adapter(dev);
> > >  }
> > >  EXPORT_SYMBOL(of_find_i2c_adapter_by_node);
> > > +
> > > +const struct of_device_id
> > > +*i2c_of_match_device_strip_vendor(const struct of_device_id *matches,
> > > +				  struct device *dev)
> > > +{
> > > +	const struct i2c_client *client = i2c_verify_client(dev);
> > > +	const char *name;
> > > +
> > > +	if (!(client && matches))
> > > +		return NULL;
> > > +
> > > +	for (; matches->compatible[0]; matches++) {
> > > +		name = strchr(matches->compatible, ',');
> > > +		if (!name)
> > > +			name = matches->compatible;
> > > +		else
> > > +			name++;
> > > +
> > > +		if (!strncmp(client->name, name, strlen(client->name)))
> > > +			return matches;
> > > +	}
> > 
> > Is it actually necessary to strip off the vendor name? It would be fine
> > to make users include the vendor prefix when creating the device in
> > sysfs. In fact that would be preferrable for new drivers so that vendor
> > prefixes start getting used correctly.
> 
> I see a few issues with this strategy.  Firstly, there are already
> users registering their devices via sysfs, some are taking their
> device names from an EEPROM which would require reprogramming in order
> to prefix the vendor ID.  I'm keen not to break existing systems -
> which not stripping off the vendor name would inevitably do.
> Secondly, I'm not sure how Wolfram would feel about the client->name
> containing a DT compatible string. And finally, other than looking
> at the kernel source, there is no real way for a user to know if the
> device supports ACPI or OF, or neither and if an i2c_device_table is
> supplied or not.

I just went and looked at the code. I2C_NAME_SIZE is fixed to 20
characters. Compatible strings can be larger than that, so you're right.
Stuffing it into the name field isn't a good solution.

g.



More information about the linux-arm-kernel mailing list