hc
2024-10-12 a5969cabbb4660eab42b6ef0412cbbd1200cf14d
kernel/drivers/i2c/muxes/i2c-arb-gpio-challenge.c
....@@ -1,26 +1,16 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * GPIO-based I2C Arbitration Using a Challenge & Response Mechanism
34 *
45 * Copyright (C) 2012 Google, Inc
5
- *
6
- * This software is licensed under the terms of the GNU General Public
7
- * License version 2, as published by the Free Software Foundation, and
8
- * may be copied, distributed, and modified under those terms.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
156 */
167
178 #include <linux/delay.h>
18
-#include <linux/gpio.h>
9
+#include <linux/gpio/consumer.h>
1910 #include <linux/kernel.h>
2011 #include <linux/i2c.h>
2112 #include <linux/i2c-mux.h>
2213 #include <linux/module.h>
23
-#include <linux/of_gpio.h>
2414 #include <linux/platform_device.h>
2515 #include <linux/slab.h>
2616
....@@ -28,22 +18,16 @@
2818 /**
2919 * struct i2c_arbitrator_data - Driver data for I2C arbitrator
3020 *
31
- * @our_gpio: GPIO we'll use to claim.
32
- * @our_gpio_release: 0 if active high; 1 if active low; AKA if the GPIO ==
33
- * this then consider it released.
34
- * @their_gpio: GPIO that the other side will use to claim.
35
- * @their_gpio_release: 0 if active high; 1 if active low; AKA if the GPIO ==
36
- * this then consider it released.
21
+ * @our_gpio: GPIO descriptor we'll use to claim.
22
+ * @their_gpio: GPIO descriptor that the other side will use to claim.
3723 * @slew_delay_us: microseconds to wait for a GPIO to go high.
3824 * @wait_retry_us: we'll attempt another claim after this many microseconds.
3925 * @wait_free_us: we'll give up after this many microseconds.
4026 */
4127
4228 struct i2c_arbitrator_data {
43
- int our_gpio;
44
- int our_gpio_release;
45
- int their_gpio;
46
- int their_gpio_release;
29
+ struct gpio_desc *our_gpio;
30
+ struct gpio_desc *their_gpio;
4731 unsigned int slew_delay_us;
4832 unsigned int wait_retry_us;
4933 unsigned int wait_free_us;
....@@ -64,15 +48,15 @@
6448 stop_time = jiffies + usecs_to_jiffies(arb->wait_free_us) + 1;
6549 do {
6650 /* Indicate that we want to claim the bus */
67
- gpio_set_value(arb->our_gpio, !arb->our_gpio_release);
51
+ gpiod_set_value(arb->our_gpio, 1);
6852 udelay(arb->slew_delay_us);
6953
7054 /* Wait for the other master to release it */
7155 stop_retry = jiffies + usecs_to_jiffies(arb->wait_retry_us) + 1;
7256 while (time_before(jiffies, stop_retry)) {
73
- int gpio_val = !!gpio_get_value(arb->their_gpio);
57
+ int gpio_val = gpiod_get_value(arb->their_gpio);
7458
75
- if (gpio_val == arb->their_gpio_release) {
59
+ if (!gpio_val) {
7660 /* We got it, so return */
7761 return 0;
7862 }
....@@ -81,13 +65,13 @@
8165 }
8266
8367 /* It didn't release, so give up, wait, and try again */
84
- gpio_set_value(arb->our_gpio, arb->our_gpio_release);
68
+ gpiod_set_value(arb->our_gpio, 0);
8569
8670 usleep_range(arb->wait_retry_us, arb->wait_retry_us * 2);
8771 } while (time_before(jiffies, stop_time));
8872
8973 /* Give up, release our claim */
90
- gpio_set_value(arb->our_gpio, arb->our_gpio_release);
74
+ gpiod_set_value(arb->our_gpio, 0);
9175 udelay(arb->slew_delay_us);
9276 dev_err(muxc->dev, "Could not claim bus, timeout\n");
9377 return -EBUSY;
....@@ -103,7 +87,7 @@
10387 const struct i2c_arbitrator_data *arb = i2c_mux_priv(muxc);
10488
10589 /* Release the bus and wait for the other master to notice */
106
- gpio_set_value(arb->our_gpio, arb->our_gpio_release);
90
+ gpiod_set_value(arb->our_gpio, 0);
10791 udelay(arb->slew_delay_us);
10892
10993 return 0;
....@@ -116,8 +100,7 @@
116100 struct device_node *parent_np;
117101 struct i2c_mux_core *muxc;
118102 struct i2c_arbitrator_data *arb;
119
- enum of_gpio_flags gpio_flags;
120
- unsigned long out_init;
103
+ struct gpio_desc *dummy;
121104 int ret;
122105
123106 /* We only support probing from device tree; no platform_data */
....@@ -138,45 +121,28 @@
138121
139122 platform_set_drvdata(pdev, muxc);
140123
141
- /* Request GPIOs */
142
- ret = of_get_named_gpio_flags(np, "our-claim-gpio", 0, &gpio_flags);
143
- if (!gpio_is_valid(ret)) {
144
- if (ret != -EPROBE_DEFER)
145
- dev_err(dev, "Error getting our-claim-gpio\n");
146
- return ret;
147
- }
148
- arb->our_gpio = ret;
149
- arb->our_gpio_release = !!(gpio_flags & OF_GPIO_ACTIVE_LOW);
150
- out_init = (gpio_flags & OF_GPIO_ACTIVE_LOW) ?
151
- GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW;
152
- ret = devm_gpio_request_one(dev, arb->our_gpio, out_init,
153
- "our-claim-gpio");
154
- if (ret) {
155
- if (ret != -EPROBE_DEFER)
156
- dev_err(dev, "Error requesting our-claim-gpio\n");
157
- return ret;
124
+ /* Request GPIOs, our GPIO as unclaimed to begin with */
125
+ arb->our_gpio = devm_gpiod_get(dev, "our-claim", GPIOD_OUT_LOW);
126
+ if (IS_ERR(arb->our_gpio)) {
127
+ dev_err(dev, "could not get \"our-claim\" GPIO (%ld)\n",
128
+ PTR_ERR(arb->our_gpio));
129
+ return PTR_ERR(arb->our_gpio);
158130 }
159131
160
- ret = of_get_named_gpio_flags(np, "their-claim-gpios", 0, &gpio_flags);
161
- if (!gpio_is_valid(ret)) {
162
- if (ret != -EPROBE_DEFER)
163
- dev_err(dev, "Error getting their-claim-gpio\n");
164
- return ret;
165
- }
166
- arb->their_gpio = ret;
167
- arb->their_gpio_release = !!(gpio_flags & OF_GPIO_ACTIVE_LOW);
168
- ret = devm_gpio_request_one(dev, arb->their_gpio, GPIOF_IN,
169
- "their-claim-gpio");
170
- if (ret) {
171
- if (ret != -EPROBE_DEFER)
172
- dev_err(dev, "Error requesting their-claim-gpio\n");
173
- return ret;
132
+ arb->their_gpio = devm_gpiod_get(dev, "their-claim", GPIOD_IN);
133
+ if (IS_ERR(arb->their_gpio)) {
134
+ dev_err(dev, "could not get \"their-claim\" GPIO (%ld)\n",
135
+ PTR_ERR(arb->their_gpio));
136
+ return PTR_ERR(arb->their_gpio);
174137 }
175138
176139 /* At the moment we only support a single two master (us + 1 other) */
177
- if (gpio_is_valid(of_get_named_gpio(np, "their-claim-gpios", 1))) {
140
+ dummy = devm_gpiod_get_index(dev, "their-claim", 1, GPIOD_IN);
141
+ if (!IS_ERR(dummy)) {
178142 dev_err(dev, "Only one other master is supported\n");
179143 return -EINVAL;
144
+ } else if (PTR_ERR(dummy) == -EPROBE_DEFER) {
145
+ return -EPROBE_DEFER;
180146 }
181147
182148 /* Arbitration parameters */