linux-i2c.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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

  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).