forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f70575805708cabdedea7498aaa3f710fde4d920
kernel/drivers/staging/greybus/arche-apb-ctrl.c
....@@ -8,9 +8,8 @@
88
99 #include <linux/clk.h>
1010 #include <linux/delay.h>
11
-#include <linux/gpio.h>
11
+#include <linux/gpio/consumer.h>
1212 #include <linux/interrupt.h>
13
-#include <linux/of_gpio.h>
1413 #include <linux/of_irq.h>
1514 #include <linux/module.h>
1615 #include <linux/pinctrl/consumer.h>
....@@ -20,17 +19,16 @@
2019 #include <linux/spinlock.h>
2120 #include "arche_platform.h"
2221
23
-
2422 static void apb_bootret_deassert(struct device *dev);
2523
2624 struct arche_apb_ctrl_drvdata {
2725 /* Control GPIO signals to and from AP <=> AP Bridges */
28
- int resetn_gpio;
29
- int boot_ret_gpio;
30
- int pwroff_gpio;
31
- int wake_in_gpio;
32
- int wake_out_gpio;
33
- int pwrdn_gpio;
26
+ struct gpio_desc *resetn;
27
+ struct gpio_desc *boot_ret;
28
+ struct gpio_desc *pwroff;
29
+ struct gpio_desc *wake_in;
30
+ struct gpio_desc *wake_out;
31
+ struct gpio_desc *pwrdn;
3432
3533 enum arche_platform_state state;
3634 bool init_disabled;
....@@ -38,28 +36,28 @@
3836 struct regulator *vcore;
3937 struct regulator *vio;
4038
41
- int clk_en_gpio;
39
+ struct gpio_desc *clk_en;
4240 struct clk *clk;
4341
4442 struct pinctrl *pinctrl;
4543 struct pinctrl_state *pin_default;
4644
4745 /* V2: SPI Bus control */
48
- int spi_en_gpio;
46
+ struct gpio_desc *spi_en;
4947 bool spi_en_polarity_high;
5048 };
5149
5250 /*
5351 * Note that these low level api's are active high
5452 */
55
-static inline void deassert_reset(unsigned int gpio)
53
+static inline void deassert_reset(struct gpio_desc *gpio)
5654 {
57
- gpio_set_value(gpio, 1);
55
+ gpiod_set_raw_value(gpio, 1);
5856 }
5957
60
-static inline void assert_reset(unsigned int gpio)
58
+static inline void assert_reset(struct gpio_desc *gpio)
6159 {
62
- gpio_set_value(gpio, 0);
60
+ gpiod_set_raw_value(gpio, 0);
6361 }
6462
6563 /*
....@@ -76,11 +74,10 @@
7674 return 0;
7775
7876 /* Hold APB in reset state */
79
- assert_reset(apb->resetn_gpio);
77
+ assert_reset(apb->resetn);
8078
81
- if (apb->state == ARCHE_PLATFORM_STATE_FW_FLASHING &&
82
- gpio_is_valid(apb->spi_en_gpio))
83
- devm_gpio_free(dev, apb->spi_en_gpio);
79
+ if (apb->state == ARCHE_PLATFORM_STATE_FW_FLASHING && apb->spi_en)
80
+ devm_gpiod_put(dev, apb->spi_en);
8481
8582 /* Enable power to APB */
8683 if (!IS_ERR(apb->vcore)) {
....@@ -102,13 +99,13 @@
10299 apb_bootret_deassert(dev);
103100
104101 /* On DB3 clock was not mandatory */
105
- if (gpio_is_valid(apb->clk_en_gpio))
106
- gpio_set_value(apb->clk_en_gpio, 1);
102
+ if (apb->clk_en)
103
+ gpiod_set_value(apb->clk_en, 1);
107104
108105 usleep_range(100, 200);
109106
110107 /* deassert reset to APB : Active-low signal */
111
- deassert_reset(apb->resetn_gpio);
108
+ deassert_reset(apb->resetn);
112109
113110 apb->state = ARCHE_PLATFORM_STATE_ACTIVE;
114111
....@@ -137,25 +134,25 @@
137134 return ret;
138135 }
139136
140
- if (gpio_is_valid(apb->spi_en_gpio)) {
137
+ if (apb->spi_en) {
141138 unsigned long flags;
142139
143140 if (apb->spi_en_polarity_high)
144
- flags = GPIOF_OUT_INIT_HIGH;
141
+ flags = GPIOD_OUT_HIGH;
145142 else
146
- flags = GPIOF_OUT_INIT_LOW;
143
+ flags = GPIOD_OUT_LOW;
147144
148
- ret = devm_gpio_request_one(dev, apb->spi_en_gpio,
149
- flags, "apb_spi_en");
150
- if (ret) {
151
- dev_err(dev, "Failed requesting SPI bus en gpio %d\n",
152
- apb->spi_en_gpio);
145
+ apb->spi_en = devm_gpiod_get(dev, "spi-en", flags);
146
+ if (IS_ERR(apb->spi_en)) {
147
+ ret = PTR_ERR(apb->spi_en);
148
+ dev_err(dev, "Failed requesting SPI bus en GPIO: %d\n",
149
+ ret);
153150 return ret;
154151 }
155152 }
156153
157154 /* for flashing device should be in reset state */
158
- assert_reset(apb->resetn_gpio);
155
+ assert_reset(apb->resetn);
159156 apb->state = ARCHE_PLATFORM_STATE_FW_FLASHING;
160157
161158 return 0;
....@@ -177,9 +174,8 @@
177174 apb->state == ARCHE_PLATFORM_STATE_OFF)
178175 return 0;
179176
180
- if (apb->state == ARCHE_PLATFORM_STATE_FW_FLASHING &&
181
- gpio_is_valid(apb->spi_en_gpio))
182
- devm_gpio_free(dev, apb->spi_en_gpio);
177
+ if (apb->state == ARCHE_PLATFORM_STATE_FW_FLASHING && apb->spi_en)
178
+ devm_gpiod_put(dev, apb->spi_en);
183179
184180 /*
185181 * As per WDM spec, do nothing
....@@ -202,13 +198,12 @@
202198 if (apb->init_disabled || apb->state == ARCHE_PLATFORM_STATE_OFF)
203199 return;
204200
205
- if (apb->state == ARCHE_PLATFORM_STATE_FW_FLASHING &&
206
- gpio_is_valid(apb->spi_en_gpio))
207
- devm_gpio_free(dev, apb->spi_en_gpio);
201
+ if (apb->state == ARCHE_PLATFORM_STATE_FW_FLASHING && apb->spi_en)
202
+ devm_gpiod_put(dev, apb->spi_en);
208203
209204 /* disable the clock */
210
- if (gpio_is_valid(apb->clk_en_gpio))
211
- gpio_set_value(apb->clk_en_gpio, 0);
205
+ if (apb->clk_en)
206
+ gpiod_set_value(apb->clk_en, 0);
212207
213208 if (!IS_ERR(apb->vcore) && regulator_is_enabled(apb->vcore) > 0)
214209 regulator_disable(apb->vcore);
....@@ -217,7 +212,7 @@
217212 regulator_disable(apb->vio);
218213
219214 /* As part of exit, put APB back in reset state */
220
- assert_reset(apb->resetn_gpio);
215
+ assert_reset(apb->resetn);
221216 apb->state = ARCHE_PLATFORM_STATE_OFF;
222217
223218 /* TODO: May have to send an event to SVC about this exit */
....@@ -227,7 +222,7 @@
227222 {
228223 struct arche_apb_ctrl_drvdata *apb = dev_get_drvdata(dev);
229224
230
- gpio_set_value(apb->boot_ret_gpio, 0);
225
+ gpiod_set_value(apb->boot_ret, 0);
231226 }
232227
233228 int apb_ctrl_coldboot(struct device *dev)
....@@ -323,66 +318,44 @@
323318 struct arche_apb_ctrl_drvdata *apb)
324319 {
325320 struct device *dev = &pdev->dev;
326
- struct device_node *np = dev->of_node;
327321 int ret;
328322
329
- apb->resetn_gpio = of_get_named_gpio(np, "reset-gpios", 0);
330
- if (apb->resetn_gpio < 0) {
331
- dev_err(dev, "failed to get reset gpio\n");
332
- return apb->resetn_gpio;
333
- }
334
- ret = devm_gpio_request_one(dev, apb->resetn_gpio,
335
- GPIOF_OUT_INIT_LOW, "apb-reset");
336
- if (ret) {
337
- dev_err(dev, "Failed requesting reset gpio %d\n",
338
- apb->resetn_gpio);
323
+ apb->resetn = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
324
+ if (IS_ERR(apb->resetn)) {
325
+ ret = PTR_ERR(apb->resetn);
326
+ dev_err(dev, "Failed requesting reset GPIO: %d\n", ret);
339327 return ret;
340328 }
341329
342
- apb->boot_ret_gpio = of_get_named_gpio(np, "boot-ret-gpios", 0);
343
- if (apb->boot_ret_gpio < 0) {
344
- dev_err(dev, "failed to get boot retention gpio\n");
345
- return apb->boot_ret_gpio;
346
- }
347
- ret = devm_gpio_request_one(dev, apb->boot_ret_gpio,
348
- GPIOF_OUT_INIT_LOW, "boot retention");
349
- if (ret) {
350
- dev_err(dev, "Failed requesting bootret gpio %d\n",
351
- apb->boot_ret_gpio);
330
+ apb->boot_ret = devm_gpiod_get(dev, "boot-ret", GPIOD_OUT_LOW);
331
+ if (IS_ERR(apb->boot_ret)) {
332
+ ret = PTR_ERR(apb->boot_ret);
333
+ dev_err(dev, "Failed requesting bootret GPIO: %d\n", ret);
352334 return ret;
353335 }
354336
355337 /* It's not mandatory to support power management interface */
356
- apb->pwroff_gpio = of_get_named_gpio(np, "pwr-off-gpios", 0);
357
- if (apb->pwroff_gpio < 0) {
358
- dev_err(dev, "failed to get power off gpio\n");
359
- return apb->pwroff_gpio;
360
- }
361
- ret = devm_gpio_request_one(dev, apb->pwroff_gpio,
362
- GPIOF_IN, "pwroff_n");
363
- if (ret) {
364
- dev_err(dev, "Failed requesting pwroff_n gpio %d\n",
365
- apb->pwroff_gpio);
338
+ apb->pwroff = devm_gpiod_get_optional(dev, "pwr-off", GPIOD_IN);
339
+ if (IS_ERR(apb->pwroff)) {
340
+ ret = PTR_ERR(apb->pwroff);
341
+ dev_err(dev, "Failed requesting pwroff_n GPIO: %d\n", ret);
366342 return ret;
367343 }
368344
369345 /* Do not make clock mandatory as of now (for DB3) */
370
- apb->clk_en_gpio = of_get_named_gpio(np, "clock-en-gpio", 0);
371
- if (apb->clk_en_gpio < 0) {
372
- dev_warn(dev, "failed to get clock en gpio\n");
373
- } else if (gpio_is_valid(apb->clk_en_gpio)) {
374
- ret = devm_gpio_request_one(dev, apb->clk_en_gpio,
375
- GPIOF_OUT_INIT_LOW, "apb_clk_en");
376
- if (ret) {
377
- dev_warn(dev, "Failed requesting APB clock en gpio %d\n",
378
- apb->clk_en_gpio);
379
- return ret;
380
- }
346
+ apb->clk_en = devm_gpiod_get_optional(dev, "clock-en", GPIOD_OUT_LOW);
347
+ if (IS_ERR(apb->clk_en)) {
348
+ ret = PTR_ERR(apb->clk_en);
349
+ dev_err(dev, "Failed requesting APB clock en GPIO: %d\n", ret);
350
+ return ret;
381351 }
382352
383
- apb->pwrdn_gpio = of_get_named_gpio(np, "pwr-down-gpios", 0);
384
- if (apb->pwrdn_gpio < 0)
385
- dev_warn(dev, "failed to get power down gpio\n");
353
+ apb->pwrdn = devm_gpiod_get(dev, "pwr-down", GPIOD_OUT_LOW);
354
+ if (IS_ERR(apb->pwrdn)) {
355
+ ret = PTR_ERR(apb->pwrdn);
356
+ dev_warn(dev, "Failed requesting power down GPIO: %d\n", ret);
357
+ return ret;
358
+ }
386359
387360 /* Regulators are optional, as we may have fixed supply coming in */
388361 apb->vcore = devm_regulator_get(dev, "vcore");
....@@ -405,12 +378,8 @@
405378 }
406379
407380 /* Only applicable for platform >= V2 */
408
- apb->spi_en_gpio = of_get_named_gpio(np, "spi-en-gpio", 0);
409
- if (apb->spi_en_gpio >= 0) {
410
- if (of_property_read_bool(pdev->dev.of_node,
411
- "spi-en-active-high"))
412
- apb->spi_en_polarity_high = true;
413
- }
381
+ if (of_property_read_bool(pdev->dev.of_node, "gb,spi-en-active-high"))
382
+ apb->spi_en_polarity_high = true;
414383
415384 return 0;
416385 }