Merge tag 'v5.2-rc4' into regulator-5.3
[sfrench/cifs-2.6.git] / drivers / regulator / max8952.c
index 2a123b87d9f27ef7342c1cea171cc05138ca5935..ccd5da63cdf266a4c1046e78f4e4e4b7728cefc8 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/regulator/driver.h>
 #include <linux/regulator/max8952.h>
-#include <linux/gpio.h>
 #include <linux/gpio/consumer.h>
 #include <linux/io.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
 #include <linux/regulator/of_regulator.h>
 #include <linux/slab.h>
 
@@ -37,7 +35,8 @@ enum {
 struct max8952_data {
        struct i2c_client       *client;
        struct max8952_platform_data *pdata;
-
+       struct gpio_desc *vid0_gpiod;
+       struct gpio_desc *vid1_gpiod;
        bool vid0;
        bool vid1;
 };
@@ -87,16 +86,15 @@ static int max8952_set_voltage_sel(struct regulator_dev *rdev,
 {
        struct max8952_data *max8952 = rdev_get_drvdata(rdev);
 
-       if (!gpio_is_valid(max8952->pdata->gpio_vid0) ||
-                       !gpio_is_valid(max8952->pdata->gpio_vid1)) {
+       if (!max8952->vid0_gpiod || !max8952->vid1_gpiod) {
                /* DVS not supported */
                return -EPERM;
        }
 
        max8952->vid0 = selector & 0x1;
        max8952->vid1 = (selector >> 1) & 0x1;
-       gpio_set_value(max8952->pdata->gpio_vid0, max8952->vid0);
-       gpio_set_value(max8952->pdata->gpio_vid1, max8952->vid1);
+       gpiod_set_value(max8952->vid0_gpiod, max8952->vid0);
+       gpiod_set_value(max8952->vid1_gpiod, max8952->vid1);
 
        return 0;
 }
@@ -134,9 +132,6 @@ static struct max8952_platform_data *max8952_parse_dt(struct device *dev)
        if (!pd)
                return NULL;
 
-       pd->gpio_vid0 = of_get_named_gpio(np, "max8952,vid-gpios", 0);
-       pd->gpio_vid1 = of_get_named_gpio(np, "max8952,vid-gpios", 1);
-
        if (of_property_read_u32(np, "max8952,default-mode", &pd->default_mode))
                dev_warn(dev, "Default mode not specified, assuming 0\n");
 
@@ -179,7 +174,7 @@ static struct max8952_platform_data *max8952_parse_dt(struct device *dev)
 static int max8952_pmic_probe(struct i2c_client *client,
                const struct i2c_device_id *i2c_id)
 {
-       struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
+       struct i2c_adapter *adapter = client->adapter;
        struct max8952_platform_data *pdata = dev_get_platdata(&client->dev);
        struct regulator_config config = { };
        struct max8952_data *max8952;
@@ -187,7 +182,7 @@ static int max8952_pmic_probe(struct i2c_client *client,
        struct gpio_desc *gpiod;
        enum gpiod_flags gflags;
 
-       int ret = 0, err = 0;
+       int ret = 0;
 
        if (client->dev.of_node)
                pdata = max8952_parse_dt(&client->dev);
@@ -240,32 +235,31 @@ static int max8952_pmic_probe(struct i2c_client *client,
        max8952->vid0 = pdata->default_mode & 0x1;
        max8952->vid1 = (pdata->default_mode >> 1) & 0x1;
 
-       if (gpio_is_valid(pdata->gpio_vid0) &&
-                       gpio_is_valid(pdata->gpio_vid1)) {
-               unsigned long gpio_flags;
-
-               gpio_flags = max8952->vid0 ?
-                            GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW;
-               if (devm_gpio_request_one(&client->dev, pdata->gpio_vid0,
-                                         gpio_flags, "MAX8952 VID0"))
-                       err = 1;
-
-               gpio_flags = max8952->vid1 ?
-                            GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW;
-               if (devm_gpio_request_one(&client->dev, pdata->gpio_vid1,
-                                         gpio_flags, "MAX8952 VID1"))
-                       err = 2;
-       } else
-               err = 3;
-
-       if (err) {
+       /* Fetch vid0 and vid1 GPIOs if available */
+       gflags = max8952->vid0 ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW;
+       max8952->vid0_gpiod = devm_gpiod_get_index_optional(&client->dev,
+                                                           "max8952,vid",
+                                                           0, gflags);
+       if (IS_ERR(max8952->vid0_gpiod))
+               return PTR_ERR(max8952->vid0_gpiod);
+       gflags = max8952->vid1 ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW;
+       max8952->vid1_gpiod = devm_gpiod_get_index_optional(&client->dev,
+                                                           "max8952,vid",
+                                                           1, gflags);
+       if (IS_ERR(max8952->vid1_gpiod))
+               return PTR_ERR(max8952->vid1_gpiod);
+
+       /* If either VID GPIO is missing just disable this */
+       if (!max8952->vid0_gpiod || !max8952->vid1_gpiod) {
                dev_warn(&client->dev, "VID0/1 gpio invalid: "
-                               "DVS not available.\n");
+                        "DVS not available.\n");
                max8952->vid0 = 0;
                max8952->vid1 = 0;
-               /* Mark invalid */
-               pdata->gpio_vid0 = -1;
-               pdata->gpio_vid1 = -1;
+               /* Make sure if we have any descriptors they get set to low */
+               if (max8952->vid0_gpiod)
+                       gpiod_set_value(max8952->vid0_gpiod, 0);
+               if (max8952->vid1_gpiod)
+                       gpiod_set_value(max8952->vid1_gpiod, 0);
 
                /* Disable Pulldown of EN only */
                max8952_write_reg(max8952, MAX8952_REG_CONTROL, 0x60);