* [patch] add i2c_clients_command()
@ 2003-04-02 17:06 Gerd Knorr
2003-04-02 18:08 ` Christoph Hellwig
0 siblings, 1 reply; 3+ messages in thread
From: Gerd Knorr @ 2003-04-02 17:06 UTC (permalink / raw)
To: Kernel List, Greg KH, Frank Davis
Hi,
This patch adds a function which loops over all i2c clients attached
to some i2c adapter and calls the ->command function of the driver.
Currently the bttv and saa7134 drivers have simliar functions, but
(currently) without sane locking and module handling. Newer versions
will switch to this function. Updates for the two drivers which are
actually using this new function are available from
http://bytesex.org/patches/wip/
Gerd
diff -u linux-2.5.66/drivers/i2c/i2c-core.c linux/drivers/i2c/i2c-core.c
--- linux-2.5.66/drivers/i2c/i2c-core.c 2003-04-02 11:42:18.357220889 +0200
+++ linux/drivers/i2c/i2c-core.c 2003-04-02 16:17:47.127702160 +0200
@@ -494,6 +494,27 @@
return 0;
}
+void i2c_clients_command(struct i2c_adapter *adap, unsigned int cmd, void *arg)
+{
+ int i;
+
+ down(&adap->list);
+ for (i = 0; i < I2C_CLIENT_MAX; i++) {
+ if (NULL == adap->clients[i])
+ continue;
+ if (!try_module_get(adap->clients[i]->driver->owner))
+ continue;
+ if (NULL == adap->clients[i]->driver->command)
+ continue;
+
+ up(&adap->list);
+ adap->clients[i]->driver->command(adap->clients[i],cmd,arg);
+ module_put(adap->clients[i]->driver->owner);
+ down(&adap->list);
+ }
+ up(&adap->list);
+}
+
#ifdef CONFIG_PROC_FS
/* This function generates the output for /proc/bus/i2c-? */
static ssize_t i2cproc_bus_read(struct file *file, char *buf,
@@ -1417,6 +1438,7 @@
EXPORT_SYMBOL(i2c_use_client);
EXPORT_SYMBOL(i2c_release_client);
EXPORT_SYMBOL(i2c_check_addr);
+EXPORT_SYMBOL(i2c_clients_command);
EXPORT_SYMBOL(i2c_master_send);
EXPORT_SYMBOL(i2c_master_recv);
diff -u linux-2.5.66/include/linux/i2c.h linux/include/linux/i2c.h
--- linux-2.5.66/include/linux/i2c.h 2003-04-02 11:49:36.479533709 +0200
+++ linux/include/linux/i2c.h 2003-04-02 11:49:36.727492916 +0200
@@ -329,6 +329,11 @@
extern int i2c_use_client(struct i2c_client *);
extern int i2c_release_client(struct i2c_client *);
+/* call the i2c_client->command() of all attached clients with
+ * the given arguments */
+extern void i2c_clients_command(struct i2c_adapter *adap,
+ unsigned int cmd, void *arg);
+
/* returns -EBUSY if address has been taken, 0 if not. Note that the only
other place at which this is called is within i2c_attach_client; so
you can cheat by simply not registering. Not recommended, of course! */
--
Michael Moore for president!
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [patch] add i2c_clients_command()
2003-04-02 17:06 [patch] add i2c_clients_command() Gerd Knorr
@ 2003-04-02 18:08 ` Christoph Hellwig
2003-04-03 8:49 ` Gerd Knorr
0 siblings, 1 reply; 3+ messages in thread
From: Christoph Hellwig @ 2003-04-02 18:08 UTC (permalink / raw)
To: Gerd Knorr; +Cc: Kernel List, Greg KH, Frank Davis
On Wed, Apr 02, 2003 at 07:06:52PM +0200, Gerd Knorr wrote:
> Hi,
>
> This patch adds a function which loops over all i2c clients attached
> to some i2c adapter and calls the ->command function of the driver.
>
> Currently the bttv and saa7134 drivers have simliar functions, but
> (currently) without sane locking and module handling. Newer versions
> will switch to this function. Updates for the two drivers which are
> actually using this new function are available from
> http://bytesex.org/patches/wip/
>
> Gerd
>
> diff -u linux-2.5.66/drivers/i2c/i2c-core.c linux/drivers/i2c/i2c-core.c
> --- linux-2.5.66/drivers/i2c/i2c-core.c 2003-04-02 11:42:18.357220889 +0200
> +++ linux/drivers/i2c/i2c-core.c 2003-04-02 16:17:47.127702160 +0200
> @@ -494,6 +494,27 @@
> return 0;
> }
>
> +void i2c_clients_command(struct i2c_adapter *adap, unsigned int cmd, void *arg)
> +{
> + int i;
> +
> + down(&adap->list);
> + for (i = 0; i < I2C_CLIENT_MAX; i++) {
> + if (NULL == adap->clients[i])
> + continue;
> + if (!try_module_get(adap->clients[i]->driver->owner))
> + continue;
> + if (NULL == adap->clients[i]->driver->command)
> + continue;
> +
> + up(&adap->list);
> + adap->clients[i]->driver->command(adap->clients[i],cmd,arg);
> + module_put(adap->clients[i]->driver->owner);
> + down(&adap->list);
> + }
> + up(&adap->list);
This is a horrible algorithm! Please introduce a per-adapter client
lists.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [patch] add i2c_clients_command()
2003-04-02 18:08 ` Christoph Hellwig
@ 2003-04-03 8:49 ` Gerd Knorr
0 siblings, 0 replies; 3+ messages in thread
From: Gerd Knorr @ 2003-04-03 8:49 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Kernel List, Greg KH, Frank Davis
Christoph Hellwig <hch@infradead.org> writes:
> > +void i2c_clients_command(struct i2c_adapter *adap, unsigned int cmd, void *arg)
> > +{
> > + int i;
> > +
> > + down(&adap->list);
> > + for (i = 0; i < I2C_CLIENT_MAX; i++) {
> > + if (NULL == adap->clients[i])
> > + continue;
> This is a horrible algorithm! Please introduce a per-adapter client
> lists.
Well, I can't easily fix that single function. The whole i2c core
manages the clients that way, i.e. the whole i2c subsystem would need
a rewrite ...
Gerd
--
Michael Moore for president!
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2003-04-03 9:38 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-04-02 17:06 [patch] add i2c_clients_command() Gerd Knorr
2003-04-02 18:08 ` Christoph Hellwig
2003-04-03 8:49 ` Gerd Knorr
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox