Now GPIOD has support for both pdata systems and for non-standard DT
bindings the Arizona reset GPIO can be converted to use it.

Signed-off-by: Charles Keepax <ckee...@opensource.cirrus.com>
---
 drivers/mfd/arizona-core.c        | 50 ++++++++++++++++++++++++++-------------
 include/linux/mfd/arizona/pdata.h |  3 ++-
 2 files changed, 35 insertions(+), 18 deletions(-)

diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c
index 77875250abe5..50e35e90d42b 100644
--- a/drivers/mfd/arizona-core.c
+++ b/drivers/mfd/arizona-core.c
@@ -278,8 +278,7 @@ static int arizona_wait_for_boot(struct arizona *arizona)
 
 static inline void arizona_enable_reset(struct arizona *arizona)
 {
-       if (arizona->pdata.reset)
-               gpio_set_value_cansleep(arizona->pdata.reset, 0);
+       gpiod_set_value_cansleep(arizona->pdata.reset, 0);
 }
 
 static void arizona_disable_reset(struct arizona *arizona)
@@ -295,7 +294,7 @@ static void arizona_disable_reset(struct arizona *arizona)
                        break;
                }
 
-               gpio_set_value_cansleep(arizona->pdata.reset, 1);
+               gpiod_set_value_cansleep(arizona->pdata.reset, 1);
                usleep_range(1000, 5000);
        }
 }
@@ -799,14 +798,25 @@ static int arizona_of_get_core_pdata(struct arizona 
*arizona)
        struct arizona_pdata *pdata = &arizona->pdata;
        int ret, i;
 
-       pdata->reset = of_get_named_gpio(arizona->dev->of_node, "wlf,reset", 0);
-       if (pdata->reset == -EPROBE_DEFER) {
-               return pdata->reset;
-       } else if (pdata->reset < 0) {
-               dev_err(arizona->dev, "Reset GPIO missing/malformed: %d\n",
-                       pdata->reset);
+       pdata->reset = devm_gpiod_get_from_of_node(arizona->dev,
+                                                  arizona->dev->of_node,
+                                                  "wlf,reset", 0,
+                                                  GPIOD_OUT_LOW,
+                                                  "arizona /RESET");
+       if (IS_ERR(pdata->reset)) {
+               ret = PTR_ERR(pdata->reset);
+               switch (ret) {
+               case -ENOENT:
+                       break;
+               case -EPROBE_DEFER:
+                       return ret;
+               default:
+                       dev_err(arizona->dev, "Reset GPIO malformed: %d\n",
+                               ret);
+                       break;
+               }
 
-               pdata->reset = 0;
+               pdata->reset = NULL;
        }
 
        ret = of_property_read_u32_array(arizona->dev->of_node,
@@ -1050,14 +1060,20 @@ int arizona_dev_init(struct arizona *arizona)
                goto err_early;
        }
 
-       if (arizona->pdata.reset) {
+       if (!arizona->pdata.reset) {
                /* Start out with /RESET low to put the chip into reset */
-               ret = devm_gpio_request_one(arizona->dev, arizona->pdata.reset,
-                                           GPIOF_DIR_OUT | GPIOF_INIT_LOW,
-                                           "arizona /RESET");
-               if (ret != 0) {
-                       dev_err(dev, "Failed to request /RESET: %d\n", ret);
-                       goto err_dcvdd;
+               arizona->pdata.reset = devm_gpiod_get(arizona->dev, "wlf,reset",
+                                                     GPIOD_OUT_LOW);
+               if (IS_ERR(arizona->pdata.reset)) {
+                       ret = PTR_ERR(arizona->pdata.reset);
+                       if (ret == -EPROBE_DEFER)
+                               goto err_dcvdd;
+                       else
+                               dev_err(arizona->dev,
+                                       "Reset GPIO missing/malformed: %d\n",
+                                       ret);
+
+                       arizona->pdata.reset = NULL;
                }
        }
 
diff --git a/include/linux/mfd/arizona/pdata.h 
b/include/linux/mfd/arizona/pdata.h
index f72dc53848d7..0013075d4cda 100644
--- a/include/linux/mfd/arizona/pdata.h
+++ b/include/linux/mfd/arizona/pdata.h
@@ -56,6 +56,7 @@
 #define ARIZONA_MAX_PDM_SPK 2
 
 struct regulator_init_data;
+struct gpio_desc;
 
 struct arizona_micbias {
        int mV;                    /** Regulated voltage */
@@ -77,7 +78,7 @@ struct arizona_micd_range {
 };
 
 struct arizona_pdata {
-       int reset;      /** GPIO controlling /RESET, if any */
+       struct gpio_desc *reset;      /** GPIO controlling /RESET, if any */
 
        /** Regulator configuration for MICVDD */
        struct arizona_micsupp_pdata micvdd;
-- 
2.11.0

Reply via email to