Sun Dec 19 00:59:25 2021 UTC ()
Support i2c bus lock operations.


(riastradh)
diff -r1.8 -r1.9 src/sys/external/bsd/drm2/include/linux/i2c.h
diff -r1.3 -r1.4 src/sys/external/bsd/drm2/linux/linux_i2c.c

cvs diff -r1.8 -r1.9 src/sys/external/bsd/drm2/include/linux/i2c.h (expand / switch to unified diff)

--- src/sys/external/bsd/drm2/include/linux/i2c.h 2015/03/05 17:29:18 1.8
+++ src/sys/external/bsd/drm2/include/linux/i2c.h 2021/12/19 00:59:25 1.9
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: i2c.h,v 1.8 2015/03/05 17:29:18 riastradh Exp $ */ 1/* $NetBSD: i2c.h,v 1.9 2021/12/19 00:59:25 riastradh Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2015 The NetBSD Foundation, Inc. 4 * Copyright (c) 2015 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * This code is derived from software contributed to The NetBSD Foundation 7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Taylor R. Campbell. 8 * by Taylor R. Campbell.
9 * 9 *
10 * Redistribution and use in source and binary forms, with or without 10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions 11 * modification, are permitted provided that the following conditions
12 * are met: 12 * are met:
13 * 1. Redistributions of source code must retain the above copyright 13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer. 14 * notice, this list of conditions and the following disclaimer.
@@ -77,46 +77,56 @@ struct i2c_msg { @@ -77,46 +77,56 @@ struct i2c_msg {
77 i2c_addr_t addr; 77 i2c_addr_t addr;
78 uint16_t flags; /* I2C_M_* */ 78 uint16_t flags; /* I2C_M_* */
79 uint16_t len; 79 uint16_t len;
80 uint8_t *buf; 80 uint8_t *buf;
81}; 81};
82 82
83/* 83/*
84 * struct i2c_adapter: An i2c bus controller. 84 * struct i2c_adapter: An i2c bus controller.
85 */ 85 */
86struct i2c_adapter { 86struct i2c_adapter {
87 char name[I2C_NAME_SIZE]; 87 char name[I2C_NAME_SIZE];
88 const struct i2c_algorithm *algo; 88 const struct i2c_algorithm *algo;
89 void *algo_data; 89 void *algo_data;
 90 const struct i2c_lock_operations *lock_ops;
90 int retries; 91 int retries;
91 struct module *owner; 92 struct module *owner;
92 unsigned int class; /* I2C_CLASS_* */ 93 unsigned int class; /* I2C_CLASS_* */
93 struct { 94 struct {
94 device_t parent; 95 device_t parent;
95 } dev; 96 } dev;
96 void *i2ca_adapdata; 97 void *i2ca_adapdata;
97}; 98};
98 99
99/* 100/*
100 * struct i2c_algorithm: A procedure for transferring an i2c message on 101 * struct i2c_algorithm: A procedure for transferring an i2c message on
101 * an i2c bus, along with a set of flags describing its functionality. 102 * an i2c bus, along with a set of flags describing its functionality.
102 */ 103 */
103struct i2c_algorithm { 104struct i2c_algorithm {
104 int (*master_xfer)(struct i2c_adapter *, struct i2c_msg *, 105 int (*master_xfer)(struct i2c_adapter *, struct i2c_msg *,
105 int); 106 int);
106 uint32_t (*functionality)(struct i2c_adapter *); 107 uint32_t (*functionality)(struct i2c_adapter *);
107}; 108};
108 109
109/* 110/*
 111 * struct i2c_lock_operations: i2c bus lock operations.
 112 */
 113struct i2c_lock_operations {
 114 void (*lock_bus)(struct i2c_adapter *, unsigned);
 115 int (*trylock_bus)(struct i2c_adapter *, unsigned);
 116 void (*unlock_bus)(struct i2c_adapter *, unsigned);
 117};
 118
 119/*
110 * struct i2c_board_info: Parameters to find an i2c bus and a slave on 120 * struct i2c_board_info: Parameters to find an i2c bus and a slave on
111 * it. type is the name of an i2c driver; addr is the slave address; 121 * it. type is the name of an i2c driver; addr is the slave address;
112 * platform_data is an extra parameter to pass to the i2c driver. 122 * platform_data is an extra parameter to pass to the i2c driver.
113 */ 123 */
114struct i2c_board_info { 124struct i2c_board_info {
115 char type[I2C_NAME_SIZE]; 125 char type[I2C_NAME_SIZE];
116 uint16_t addr; 126 uint16_t addr;
117 uint16_t flags; 127 uint16_t flags;
118 void *platform_data; 128 void *platform_data;
119}; 129};
120 130
121#define I2C_BOARD_INFO(board_type, board_addr) \ 131#define I2C_BOARD_INFO(board_type, board_addr) \
122 .type = (board_type), \ 132 .type = (board_type), \

cvs diff -r1.3 -r1.4 src/sys/external/bsd/drm2/linux/linux_i2c.c (expand / switch to unified diff)

--- src/sys/external/bsd/drm2/linux/linux_i2c.c 2015/03/05 17:29:18 1.3
+++ src/sys/external/bsd/drm2/linux/linux_i2c.c 2021/12/19 00:59:25 1.4
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: linux_i2c.c,v 1.3 2015/03/05 17:29:18 riastradh Exp $ */ 1/* $NetBSD: linux_i2c.c,v 1.4 2021/12/19 00:59:25 riastradh Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2015 The NetBSD Foundation, Inc. 4 * Copyright (c) 2015 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * This code is derived from software contributed to The NetBSD Foundation 7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Taylor R. Campbell. 8 * by Taylor R. Campbell.
9 * 9 *
10 * Redistribution and use in source and binary forms, with or without 10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions 11 * modification, are permitted provided that the following conditions
12 * are met: 12 * are met:
13 * 1. Redistributions of source code must retain the above copyright 13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer. 14 * notice, this list of conditions and the following disclaimer.
@@ -20,27 +20,27 @@ @@ -20,27 +20,27 @@
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE. 29 * POSSIBILITY OF SUCH DAMAGE.
30 */ 30 */
31 31
32#include <sys/cdefs.h> 32#include <sys/cdefs.h>
33__KERNEL_RCSID(0, "$NetBSD: linux_i2c.c,v 1.3 2015/03/05 17:29:18 riastradh Exp $"); 33__KERNEL_RCSID(0, "$NetBSD: linux_i2c.c,v 1.4 2021/12/19 00:59:25 riastradh Exp $");
34 34
35#include <sys/types.h> 35#include <sys/types.h>
36#include <sys/errno.h> 36#include <sys/errno.h>
37#include <sys/kmem.h> 37#include <sys/kmem.h>
38#include <sys/queue.h> /* XXX include order botch: i2cvar.h needs */ 38#include <sys/queue.h> /* XXX include order botch: i2cvar.h needs */
39 39
40#include <dev/i2c/i2cvar.h> 40#include <dev/i2c/i2cvar.h>
41#include <dev/i2c/i2c_bitbang.h> /* XXX include order botch */ 41#include <dev/i2c/i2c_bitbang.h> /* XXX include order botch */
42 42
43#include <linux/i2c.h> 43#include <linux/i2c.h>
44#include <linux/i2c-algo-bit.h> 44#include <linux/i2c-algo-bit.h>
45 45
46static int netbsd_i2c_transfer(i2c_tag_t, struct i2c_msg *, int); 46static int netbsd_i2c_transfer(i2c_tag_t, struct i2c_msg *, int);
@@ -117,28 +117,35 @@ i2c_master_recv(const struct i2c_client  @@ -117,28 +117,35 @@ i2c_master_recv(const struct i2c_client
117 return ret; 117 return ret;
118 118
119 return count; 119 return count;
120} 120}
121  121
122/* 122/*
123 * Adapter operations: operations over an i2c bus via a particular 123 * Adapter operations: operations over an i2c bus via a particular
124 * controller. 124 * controller.
125 */ 125 */
126 126
127int 127int
128i2c_transfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int n) 128i2c_transfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int n)
129{ 129{
 130 int ret;
 131
 132 if (adapter->lock_ops)
 133 (*adapter->lock_ops->lock_bus)(adapter, 0);
 134 ret = (*adapter->algo->master_xfer)(adapter, msgs, n);
 135 if (adapter->lock_ops)
 136 (*adapter->lock_ops->unlock_bus)(adapter, 0);
130 137
131 return (*adapter->algo->master_xfer)(adapter, msgs, n); 138 return ret;
132} 139}
133 140
134static int 141static int
135netbsd_i2c_transfer(i2c_tag_t i2c, struct i2c_msg *msgs, int n) 142netbsd_i2c_transfer(i2c_tag_t i2c, struct i2c_msg *msgs, int n)
136{ 143{
137 int i; 144 int i;
138 int error; 145 int error;
139 146
140 for (i = 0; i < n; i++) { 147 for (i = 0; i < n; i++) {
141 const i2c_op_t op = linux_i2c_flags_op(msgs[i].flags, 148 const i2c_op_t op = linux_i2c_flags_op(msgs[i].flags,
142 ((i + 1) == n)); 149 ((i + 1) == n));
143 const int flags = linux_i2c_flags_flags(msgs[i].flags); 150 const int flags = linux_i2c_flags_flags(msgs[i].flags);
144 151