From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Jean-Michel Hautbois <jean-michel.hautbois@vodalys.com>
Cc: linux-media@vger.kernel.org, linux-i2c@vger.kernel.org,
linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
wsa@the-dreams.de, lars@metafoo.de
Subject: Re: [PATCH 1/2] i2c: Add generic support passing secondary devices addresses
Date: Thu, 23 Oct 2014 02:37:41 +0300 [thread overview]
Message-ID: <1923603.aWjhqbNgon@avalon> (raw)
In-Reply-To: <1413991848-28495-1-git-send-email-jean-michel.hautbois@vodalys.com>
Hi Jean-Michel,
Thank you for the patch.
On Wednesday 22 October 2014 17:30:47 Jean-Michel Hautbois wrote:
> Some I2C devices have multiple addresses assigned, for example each address
> corresponding to a different internal register map page of the device.
> So far drivers which need support for this have handled this with a driver
> specific and non-generic implementation, e.g. passing the additional address
> via platform data.
>
> This patch provides a new helper function called i2c_new_secondary_device()
> which is intended to provide a generic way to get the secondary address
> as well as instantiate a struct i2c_client for the secondary address.
>
> The function expects a pointer to the primary i2c_client, a name
> for the secondary address and an optional default address. The name is used
> as a handle to specify which secondary address to get.
>
> The default address is used as a fallback in case no secondary address
> was explicitly specified. In case no secondary address and no default
> address were specified the function returns NULL.
>
> For now the function only supports look-up of the secondary address
> from devicetree, but it can be extended in the future
> to for example support board files and/or ACPI.
As this is core code I believe the DT bindings should be documented somewhere
in Documentation/devicetree/bindings/i2c/.
> Signed-off-by: Jean-Michel Hautbois <jean-michel.hautbois@vodalys.com>
> ---
> drivers/i2c/i2c-core.c | 40 ++++++++++++++++++++++++++++++++++++++++
> include/linux/i2c.h | 8 ++++++++
> 2 files changed, 48 insertions(+)
>
> diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
> index 2f90ac6..fd3b07c 100644
> --- a/drivers/i2c/i2c-core.c
> +++ b/drivers/i2c/i2c-core.c
> @@ -1166,6 +1166,46 @@ struct i2c_client *i2c_new_dummy(struct i2c_adapter
> *adapter, u16 address) }
> EXPORT_SYMBOL_GPL(i2c_new_dummy);
>
> +/**
> + * i2c_new_secondary_device - Helper to get the instantiated secondary
> address
It does more than that, it also creates the device.
> + * @client: Handle to the primary client
> + * @name: Handle to specify which secondary address to get
> + * @default_addr: Used as a fallback if no secondary address was specified
> + * Context: can sleep
> + *
> + * This returns an I2C client bound to the "dummy" driver based on DT
> parsing.
Could you elaborate on that ? I would explain that the address is retrieved
from the firmware based on the name, and that default_addr is used in case the
firmware doesn't provide any information.
> + *
> + * This returns the new i2c client, which should be saved for later use
> with
> + * i2c_unregister_device(); or NULL to indicate an error.
> + */
> +struct i2c_client *i2c_new_secondary_device(struct i2c_client *client,
> + const char *name,
> + u16 default_addr)
> +{
> + int i;
> + u32 addr;
> + struct device_node *np;
> +
> + np = client->dev.of_node;
> +
> + if (np) {
> + i = of_property_match_string(np, "reg-names", name);
> + if (i >= 0)
> + of_property_read_u32_index(np, "reg", i, &addr);
This call could fail in which case addr will be uninitialized.
> + else if (default_addr != 0)
> + addr = default_addr;
> + else
> + addr = NULL;
addr isn't a pointer. I'm surprised the compiler hasn't warned you.
> + } else {
> + addr = default_addr;
> + }
The whole logic can be simplified to
struct device_node *np = client->dev.of_node;
u32 addr = default_addr;
int i;
if (np) {
i = of_property_match_string(np, "reg-names", name);
if (i >= 0)
of_property_read_u32_index(np, "reg", i, &addr);
}
> +
> + dev_dbg(&client->adapter->dev, "Address for %s : 0x%x\n", name, addr);
> + return i2c_new_dummy(client->adapter, addr);
> +}
> +EXPORT_SYMBOL_GPL(i2c_new_secondary_device);
> +
> +
> /*
> -------------------------------------------------------------------------
> */
>
> /* I2C bus adapters -- one roots each I2C or SMBUS segment */
> diff --git a/include/linux/i2c.h b/include/linux/i2c.h
> index b556e0a..8629287 100644
> --- a/include/linux/i2c.h
> +++ b/include/linux/i2c.h
> @@ -322,6 +322,14 @@ extern int i2c_probe_func_quick_read(struct i2c_adapter
> *, unsigned short addr); extern struct i2c_client *
> i2c_new_dummy(struct i2c_adapter *adap, u16 address);
>
> +/* Helper function providing a generic way to get the secondary address
> + * as well as a client handle to this extra address.
> + */
The function is already documented in i2c-core.c, I would ditch this comment.
> +extern struct i2c_client *
> +i2c_new_secondary_device(struct i2c_client *client,
> + const char *name,
> + u16 default_addr);
> +
> extern void i2c_unregister_device(struct i2c_client *);
> #endif /* I2C */
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2014-10-22 23:37 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-22 15:30 [PATCH 1/2] i2c: Add generic support passing secondary devices addresses Jean-Michel Hautbois
2014-10-22 15:30 ` Jean-Michel Hautbois
2014-10-22 15:30 ` [PATCH 2/2] adv7604: Add support for i2c_new_secondary_device Jean-Michel Hautbois
2014-10-22 23:44 ` Laurent Pinchart
2014-10-23 6:02 ` Jean-Michel Hautbois
2014-10-23 6:02 ` Jean-Michel Hautbois
2014-10-22 23:37 ` Laurent Pinchart [this message]
2014-10-23 5:59 ` [PATCH 1/2] i2c: Add generic support passing secondary devices addresses Jean-Michel Hautbois
2014-10-23 5:59 ` Jean-Michel Hautbois
[not found] ` <CAL8zT=hM+ua3hdzVXAvQF9EcKbjou3HpHivfntJWYD1E+Ts8Xg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-10-26 23:25 ` Laurent Pinchart
2014-10-26 23:25 ` Laurent Pinchart
-- strict thread matches above, loose matches on Subject: below --
2014-10-22 20:05 John de la Garza
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1923603.aWjhqbNgon@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=devicetree@vger.kernel.org \
--cc=jean-michel.hautbois@vodalys.com \
--cc=lars@metafoo.de \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=wsa@the-dreams.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.