From: Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>
To: Lars Michael <lh_post-/E1597aS9LQAvxtiuMwx3w@public.gmane.org>
Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: How to use one I2C device from two modules?
Date: Fri, 13 May 2011 10:46:50 +0200 [thread overview]
Message-ID: <20110513104650.3d1b3ea6@endymion.delvare> (raw)
In-Reply-To: <135179.26946.qm-XzixtO+UlYSvuULXzWHTWIglqE1Y4D90QQ4Iyu8u01E@public.gmane.org>
Hi Lars,
On Fri, 13 May 2011 00:47:37 -0700 (PDT), Lars Michael wrote:
> --- On Sat, 7/5/11, Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org> wrote:
> > On Fri, 6 May 2011 04:30:33 -0700 (PDT), Lars Michael
> > wrote:
> > > But how do I access the same I2C device from several
> > modules? Ideally I want to specify the adapter and slave
> > address. If a client is found, I get the i2c_client
> > otherwise I have to create it by i2c_new_device (or probe
> > it). Is it possible?
> > >
> >
> > In general I would have pointed you to drivers/mfd and told
> > you to
> > write a mfd core driver for your chip. However in your case
> > I don't
> > think you have a multifunction device. You have a single
> > function
> > device (GPIO) with multiple users. So I suggest that you
> > simply write a
> > proper gpio driver for your chip, and get the device
> > registered as an
> > I2C GPIO device. Then, in your function drivers (power
> > supply control
> > and button control) get a reference to the gpio device in
> > question, and
> > use it.
>
> Thanks for the advice. I wrote a simple driver for my chip and
> instantiated it in the platform code. In order to access the
Please submit your driver for integration in the upstream kernel.
Others are certainly using the same device!
> device from the function modules, I exported an i2c_client get
> function, in order to get a reference to the client:
>
> struct i2c_client *pca950x_get_i2c_client(void)
> .....
> EXPORT_SYMBOL(pca950x_get_i2c_client);
>
> Not sure this is the perfect way to do it, but it works.
No, this doesn't seem right. A given system may have more than one
PCA950x chip. And symbol dependencies are a hell to handle as soon as
things get more complex. Such an export will never be accepted upstream.
I can think of 2 ways to handle your problem.
1* Use gpiochip_find(). It is currently only available to drivers if
gpiolib is built into the kernel, but I consider this a bug, patch
submitted [1] but no reply so far.
2a* Install a bus notifier on i2c bus type, and catch event
BUS_NOTIFY_BIND_DRIVER. This only works if you can install the notifier
before the pca950x driver binds to the GPIO chip.
2b* Use i2c_for_each_dev() to get a handle to your i2c client. This
only works if you are certain that the GPIO chip driver is loaded
before the drivers which need it.
Option 1* seems much cleaner to me, as it abstracts the bus type
completely. After all, sub-drivers should only care about the GPIO
functionality and not the technical implementation details.
If neither works for you for whatever reason, maybe we can add a helper
function to i2c-core to retrieve an i2c_client by bus number and
address. Maybe others would find it useful as well.
[1] http://marc.info/?l=linux-kernel&m=130293906304999&w=2
--
Jean Delvare
next prev parent reply other threads:[~2011-05-13 8:46 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-06 11:30 How to use one I2C device from two modules? Lars Michael
[not found] ` <842687.69100.qm-sMamaaD5nQOvuULXzWHTWIglqE1Y4D90QQ4Iyu8u01E@public.gmane.org>
2011-05-07 13:28 ` Jean Delvare
[not found] ` <20110507152832.25276ac6-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2011-05-13 7:47 ` Lars Michael
[not found] ` <135179.26946.qm-XzixtO+UlYSvuULXzWHTWIglqE1Y4D90QQ4Iyu8u01E@public.gmane.org>
2011-05-13 8:46 ` Jean Delvare [this message]
[not found] ` <20110513104650.3d1b3ea6-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2011-05-16 8:10 ` Lars Michael
[not found] ` <184526.31465.qm-hgS9n0fW3jyvuULXzWHTWIglqE1Y4D90QQ4Iyu8u01E@public.gmane.org>
2011-05-20 8:07 ` Jean Delvare
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=20110513104650.3d1b3ea6@endymion.delvare \
--to=khali-puyad+kwke1g9huczpvpmw@public.gmane.org \
--cc=lh_post-/E1597aS9LQAvxtiuMwx3w@public.gmane.org \
--cc=linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).