[RFC] i2c: Providing hooks for i2c multimaster bus arbitration.
Yuvaraj Kumar
yuvaraj.cd at gmail.com
Mon Feb 4 06:13:35 EST 2013
Below are the links on multi master bus arbitration where it has been
discussing.
http://comments.gmane.org/gmane.linux.kernel/1410276
http://www.kernelhub.org/?msg=179505&p=2
On Mon, Feb 4, 2013 at 2:33 PM, Yuvaraj Kumar C D <yuvaraj.cd at gmail.com> wrote:
> This RFC patch is w.r.t multimaster bus arbitration which is already
> being discussing in the mainline.
> This patch provides hooks for the i2c multimaster bus arbitration
> and to have the arbitration parameters.
>
> Signed-off-by: Yuvaraj Kumar C D <yuvaraj.cd at samsung.com>
> ---
> drivers/i2c/i2c-core.c | 13 ++++++++++++-
> include/linux/i2c.h | 12 ++++++++++++
> 2 files changed, 24 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
> index e388590..ed89fc8 100644
> --- a/drivers/i2c/i2c-core.c
> +++ b/drivers/i2c/i2c-core.c
> @@ -1408,18 +1408,29 @@ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
> (msgs[ret].flags & I2C_M_RECV_LEN) ? "+" : "");
> }
> #endif
> + if (adap->mm_arbit_algo) {
> + ret = adap->mm_arbit_algo->i2c_mm_bus_get(adap);
> + if (ret)
> + /* I2C bus under control of another master. */
> + return -EAGAIN;
> + }
>
> if (in_atomic() || irqs_disabled()) {
> ret = i2c_trylock_adapter(adap);
> - if (!ret)
> + if (!ret && adap->mm_arbit_algo) {
> + adap->mm_arbit_algo->i2c_mm_bus_release(adap);
> +
> /* I2C activity is ongoing. */
> return -EAGAIN;
> + }
> } else {
> i2c_lock_adapter(adap);
> }
>
> ret = __i2c_transfer(adap, msgs, num);
> i2c_unlock_adapter(adap);
> + if (adap->mm_arbit_algo)
> + adap->mm_arbit_algo->i2c_mm_bus_release(adap);
>
> return ret;
> } else {
> diff --git a/include/linux/i2c.h b/include/linux/i2c.h
> index d0c4db7..61fbfe3 100644
> --- a/include/linux/i2c.h
> +++ b/include/linux/i2c.h
> @@ -371,6 +371,17 @@ struct i2c_algorithm {
> };
>
> /*
> + *This struct provides hooks for i2c multi-master arbitration needs.
> + */
> +struct i2c_mm_arbitration {
> + void *arbitration_data;
> +
> + /* Should return 0 if mastership could be successfully established */
> + int (*i2c_mm_bus_get)(struct i2c_adapter *adap);
> + void (*i2c_mm_bus_release)(struct i2c_adapter *adap);
> +};
> +
> +/*
> * i2c_adapter is the structure used to identify a physical i2c bus along
> * with the access algorithms necessary to access it.
> */
> @@ -393,6 +404,7 @@ struct i2c_adapter {
>
> struct mutex userspace_clients_lock;
> struct list_head userspace_clients;
> + struct i2c_mm_arbitration *mm_arbit_algo;
> };
> #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev)
>
> --
> 1.7.9.5
>
More information about the linux-arm-kernel
mailing list