* 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[parent not found: <842687.69100.qm-sMamaaD5nQOvuULXzWHTWIglqE1Y4D90QQ4Iyu8u01E@public.gmane.org>]
* 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
[parent not found: <20110507152832.25276ac6-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>]
* 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
[parent not found: <135179.26946.qm-XzixtO+UlYSvuULXzWHTWIglqE1Y4D90QQ4Iyu8u01E@public.gmane.org>]
* 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
[parent not found: <20110513104650.3d1b3ea6-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>]
* 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
[parent not found: <184526.31465.qm-hgS9n0fW3jyvuULXzWHTWIglqE1Y4D90QQ4Iyu8u01E@public.gmane.org>]
* 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).