Module Name: src Committed By: riastradh Date: Sun Dec 19 00:59:25 UTC 2021
Modified Files: src/sys/external/bsd/drm2/include/linux: i2c.h src/sys/external/bsd/drm2/linux: linux_i2c.c Log Message: Support i2c bus lock operations. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/sys/external/bsd/drm2/include/linux/i2c.h cvs rdiff -u -r1.3 -r1.4 src/sys/external/bsd/drm2/linux/linux_i2c.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/drm2/include/linux/i2c.h diff -u src/sys/external/bsd/drm2/include/linux/i2c.h:1.8 src/sys/external/bsd/drm2/include/linux/i2c.h:1.9 --- src/sys/external/bsd/drm2/include/linux/i2c.h:1.8 Thu Mar 5 17:29:18 2015 +++ src/sys/external/bsd/drm2/include/linux/i2c.h Sun Dec 19 00:59:25 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i2c.h,v 1.8 2015/03/05 17:29:18 riastradh Exp $ */ +/* $NetBSD: i2c.h,v 1.9 2021/12/19 00:59:25 riastradh Exp $ */ /*- * Copyright (c) 2015 The NetBSD Foundation, Inc. @@ -87,6 +87,7 @@ struct i2c_adapter { char name[I2C_NAME_SIZE]; const struct i2c_algorithm *algo; void *algo_data; + const struct i2c_lock_operations *lock_ops; int retries; struct module *owner; unsigned int class; /* I2C_CLASS_* */ @@ -107,6 +108,15 @@ struct i2c_algorithm { }; /* + * struct i2c_lock_operations: i2c bus lock operations. + */ +struct i2c_lock_operations { + void (*lock_bus)(struct i2c_adapter *, unsigned); + int (*trylock_bus)(struct i2c_adapter *, unsigned); + void (*unlock_bus)(struct i2c_adapter *, unsigned); +}; + +/* * struct i2c_board_info: Parameters to find an i2c bus and a slave on * it. type is the name of an i2c driver; addr is the slave address; * platform_data is an extra parameter to pass to the i2c driver. Index: src/sys/external/bsd/drm2/linux/linux_i2c.c diff -u src/sys/external/bsd/drm2/linux/linux_i2c.c:1.3 src/sys/external/bsd/drm2/linux/linux_i2c.c:1.4 --- src/sys/external/bsd/drm2/linux/linux_i2c.c:1.3 Thu Mar 5 17:29:18 2015 +++ src/sys/external/bsd/drm2/linux/linux_i2c.c Sun Dec 19 00:59:25 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_i2c.c,v 1.3 2015/03/05 17:29:18 riastradh Exp $ */ +/* $NetBSD: linux_i2c.c,v 1.4 2021/12/19 00:59:25 riastradh Exp $ */ /*- * Copyright (c) 2015 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_i2c.c,v 1.3 2015/03/05 17:29:18 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_i2c.c,v 1.4 2021/12/19 00:59:25 riastradh Exp $"); #include <sys/types.h> #include <sys/errno.h> @@ -127,8 +127,15 @@ i2c_master_recv(const struct i2c_client int i2c_transfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int n) { + int ret; + + if (adapter->lock_ops) + (*adapter->lock_ops->lock_bus)(adapter, 0); + ret = (*adapter->algo->master_xfer)(adapter, msgs, n); + if (adapter->lock_ops) + (*adapter->lock_ops->unlock_bus)(adapter, 0); - return (*adapter->algo->master_xfer)(adapter, msgs, n); + return ret; } static int