* How to use one I2C device from two modules?
@ 2011-05-06 11:30 Lars Michael
[not found] ` <842687.69100.qm-sMamaaD5nQOvuULXzWHTWIglqE1Y4D90QQ4Iyu8u01E@public.gmane.org>
0 siblings, 1 reply; 6+ messages in thread
From: Lars Michael @ 2011-05-06 11:30 UTC (permalink / raw)
To: linux-i2c-u79uwXL29TY76Z2rM5mHXA
Hello,
On our custom board we have an I2C GPIO port expander. This is used for different things like power supply control and button control. Hence I wrote two modules; pscontrol and button.
In the modules I use i2c_new_device to create the device and to get the i2c_client struct that I later use in the smbus calls. This works fine, one module at the time. Together the last insmod fails, because the device at that address is already created.
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?
Since I know the I2C bus and slave addresses in advance, would it be better to predeclare them by i2c_register_board_info? And in that case, how do I get the i2c_client struct in the module?
Kernel version 2.6.29
Target is m68k (Coldfire)
Thanks and regards,
- Lars
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: How to use one I2C device from two modules?
[not found] ` <842687.69100.qm-sMamaaD5nQOvuULXzWHTWIglqE1Y4D90QQ4Iyu8u01E@public.gmane.org>
@ 2011-05-07 13:28 ` Jean Delvare
[not found] ` <20110507152832.25276ac6-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
0 siblings, 1 reply; 6+ messages in thread
From: Jean Delvare @ 2011-05-07 13:28 UTC (permalink / raw)
To: Lars Michael; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA
Hi Lars,
On Fri, 6 May 2011 04:30:33 -0700 (PDT), Lars Michael wrote:
> On our custom board we have an I2C GPIO port expander. This is used for different things like power supply control and button control. Hence I wrote two modules; pscontrol and button.
>
> In the modules I use i2c_new_device to create the device and to get the i2c_client struct that I later use in the smbus calls. This works fine, one module at the time. Together the last insmod fails, because the device at that address is already created.
>
> 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?
>
> Since I know the I2C bus and slave addresses in advance, would it be better to predeclare them by i2c_register_board_info? And in that case, how do I get the i2c_client struct in the module?
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.
FWIW, we already have support for many I2C-based GPIO chip families.
Take a look in drivers/gpio, files adp5588-gpio.c, max7300.c,
max732x.c, pca953x.c, pcf857x.c and sx150x.c. With some luck, your chip
is already supported, so all you have to do is instantiate it in your
platform code.
--
Jean Delvare
^ permalink raw reply [flat|nested] 6+ messages in thread
* How to use one I2C device from two modules?
[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>
0 siblings, 1 reply; 6+ messages in thread
From: Lars Michael @ 2011-05-13 7:47 UTC (permalink / raw)
To: Jean Delvare; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA
--- 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
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.
Thanks and regards,
- Lars
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: How to use one I2C device from two modules?
[not found] ` <135179.26946.qm-XzixtO+UlYSvuULXzWHTWIglqE1Y4D90QQ4Iyu8u01E@public.gmane.org>
@ 2011-05-13 8:46 ` Jean Delvare
[not found] ` <20110513104650.3d1b3ea6-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
0 siblings, 1 reply; 6+ messages in thread
From: Jean Delvare @ 2011-05-13 8:46 UTC (permalink / raw)
To: Lars Michael; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA
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
^ permalink raw reply [flat|nested] 6+ messages in thread
* How to use one I2C device from two modules?
[not found] ` <20110513104650.3d1b3ea6-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
@ 2011-05-16 8:10 ` Lars Michael
[not found] ` <184526.31465.qm-hgS9n0fW3jyvuULXzWHTWIglqE1Y4D90QQ4Iyu8u01E@public.gmane.org>
0 siblings, 1 reply; 6+ messages in thread
From: Lars Michael @ 2011-05-16 8:10 UTC (permalink / raw)
To: Jean Delvare; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA
--- On Fri, 13/5/11, Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org> wrote:
> 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!
Please note that my driver has no device specific functions. It
only allows the device to be registered so that my function
modules can use the smbus commands and the i2c client handle to
use the device. The GPIO device/lib is not supported. So, I don't
think it's worth submitting it at this point...
> > 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.
You are right, and this quick solution was not meant to be submitted.
> I can think of 2 ways to handle your problem.
>
> 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.
I was looking for such a function, it could be very handy. And btw
a get adapter by id already exists.
Thanks and regards,
- Lars
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: How to use one I2C device from two modules?
[not found] ` <184526.31465.qm-hgS9n0fW3jyvuULXzWHTWIglqE1Y4D90QQ4Iyu8u01E@public.gmane.org>
@ 2011-05-20 8:07 ` Jean Delvare
0 siblings, 0 replies; 6+ messages in thread
From: Jean Delvare @ 2011-05-20 8:07 UTC (permalink / raw)
To: Lars Michael; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA
Hi Lars,
On Mon, 16 May 2011 01:10:22 -0700 (PDT), Lars Michael wrote:
> --- On Fri, 13/5/11, Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org> wrote:
> > 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.
>
> You are right, and this quick solution was not meant to be submitted.
>
> > I can think of 2 ways to handle your problem.
> >
> > 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.
>
> I was looking for such a function, it could be very handy. And btw
> a get adapter by id already exists.
This function could certainly be added if someone ever really needs it.
But in your case, it seems better to write a proper gpio driver for your
device and then have your subdrivers cleanly request the GPIO pins they
need. And you don't need to access the i2c_client from the subdrivers
if you do this.
--
Jean Delvare
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2011-05-20 8:07 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
[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
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).