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

From: Grant Likely
Date: Sat Jun 07 2014 - 03:31:29 EST


On Fri, 6 Jun 2014 09:10:26 +0100, Lee Jones <lee.jones@xxxxxxxxxx> wrote:
> On Thu, 05 Jun 2014, Grant Likely wrote:
>
> > On Wed, 4 Jun 2014 13:09:52 +0100, Lee Jones <lee.jones@xxxxxxxxxx> 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@xxxxxxxxxx>
> > > ---
> > > 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.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/