|
26 | 26 | #include <linux/platform_device.h>
|
27 | 27 | #include <linux/regulator/driver.h>
|
28 | 28 | #include <linux/regulator/max8952.h>
|
29 |
| -#include <linux/gpio.h> |
30 | 29 | #include <linux/gpio/consumer.h>
|
31 | 30 | #include <linux/io.h>
|
32 | 31 | #include <linux/of.h>
|
33 |
| -#include <linux/of_gpio.h> |
34 | 32 | #include <linux/regulator/of_regulator.h>
|
35 | 33 | #include <linux/slab.h>
|
36 | 34 |
|
|
50 | 48 | struct max8952_data {
|
51 | 49 | struct i2c_client *client;
|
52 | 50 | struct max8952_platform_data *pdata;
|
53 |
| - |
| 51 | + struct gpio_desc *vid0_gpiod; |
| 52 | + struct gpio_desc *vid1_gpiod; |
54 | 53 | bool vid0;
|
55 | 54 | bool vid1;
|
56 | 55 | };
|
@@ -100,16 +99,15 @@ static int max8952_set_voltage_sel(struct regulator_dev *rdev,
|
100 | 99 | {
|
101 | 100 | struct max8952_data *max8952 = rdev_get_drvdata(rdev);
|
102 | 101 |
|
103 |
| - if (!gpio_is_valid(max8952->pdata->gpio_vid0) || |
104 |
| - !gpio_is_valid(max8952->pdata->gpio_vid1)) { |
| 102 | + if (!max8952->vid0_gpiod || !max8952->vid1_gpiod) { |
105 | 103 | /* DVS not supported */
|
106 | 104 | return -EPERM;
|
107 | 105 | }
|
108 | 106 |
|
109 | 107 | max8952->vid0 = selector & 0x1;
|
110 | 108 | max8952->vid1 = (selector >> 1) & 0x1;
|
111 |
| - gpio_set_value(max8952->pdata->gpio_vid0, max8952->vid0); |
112 |
| - gpio_set_value(max8952->pdata->gpio_vid1, max8952->vid1); |
| 109 | + gpiod_set_value(max8952->vid0_gpiod, max8952->vid0); |
| 110 | + gpiod_set_value(max8952->vid1_gpiod, max8952->vid1); |
113 | 111 |
|
114 | 112 | return 0;
|
115 | 113 | }
|
@@ -147,9 +145,6 @@ static struct max8952_platform_data *max8952_parse_dt(struct device *dev)
|
147 | 145 | if (!pd)
|
148 | 146 | return NULL;
|
149 | 147 |
|
150 |
| - pd->gpio_vid0 = of_get_named_gpio(np, "max8952,vid-gpios", 0); |
151 |
| - pd->gpio_vid1 = of_get_named_gpio(np, "max8952,vid-gpios", 1); |
152 |
| - |
153 | 148 | if (of_property_read_u32(np, "max8952,default-mode", &pd->default_mode))
|
154 | 149 | dev_warn(dev, "Default mode not specified, assuming 0\n");
|
155 | 150 |
|
@@ -200,7 +195,7 @@ static int max8952_pmic_probe(struct i2c_client *client,
|
200 | 195 | struct gpio_desc *gpiod;
|
201 | 196 | enum gpiod_flags gflags;
|
202 | 197 |
|
203 |
| - int ret = 0, err = 0; |
| 198 | + int ret = 0; |
204 | 199 |
|
205 | 200 | if (client->dev.of_node)
|
206 | 201 | pdata = max8952_parse_dt(&client->dev);
|
@@ -253,32 +248,31 @@ static int max8952_pmic_probe(struct i2c_client *client,
|
253 | 248 | max8952->vid0 = pdata->default_mode & 0x1;
|
254 | 249 | max8952->vid1 = (pdata->default_mode >> 1) & 0x1;
|
255 | 250 |
|
256 |
| - if (gpio_is_valid(pdata->gpio_vid0) && |
257 |
| - gpio_is_valid(pdata->gpio_vid1)) { |
258 |
| - unsigned long gpio_flags; |
259 |
| - |
260 |
| - gpio_flags = max8952->vid0 ? |
261 |
| - GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; |
262 |
| - if (devm_gpio_request_one(&client->dev, pdata->gpio_vid0, |
263 |
| - gpio_flags, "MAX8952 VID0")) |
264 |
| - err = 1; |
265 |
| - |
266 |
| - gpio_flags = max8952->vid1 ? |
267 |
| - GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; |
268 |
| - if (devm_gpio_request_one(&client->dev, pdata->gpio_vid1, |
269 |
| - gpio_flags, "MAX8952 VID1")) |
270 |
| - err = 2; |
271 |
| - } else |
272 |
| - err = 3; |
273 |
| - |
274 |
| - if (err) { |
| 251 | + /* Fetch vid0 and vid1 GPIOs if available */ |
| 252 | + gflags = max8952->vid0 ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW; |
| 253 | + max8952->vid0_gpiod = devm_gpiod_get_index_optional(&client->dev, |
| 254 | + "max8952,vid", |
| 255 | + 0, gflags); |
| 256 | + if (IS_ERR(max8952->vid0_gpiod)) |
| 257 | + return PTR_ERR(max8952->vid0_gpiod); |
| 258 | + gflags = max8952->vid1 ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW; |
| 259 | + max8952->vid1_gpiod = devm_gpiod_get_index_optional(&client->dev, |
| 260 | + "max8952,vid", |
| 261 | + 1, gflags); |
| 262 | + if (IS_ERR(max8952->vid1_gpiod)) |
| 263 | + return PTR_ERR(max8952->vid1_gpiod); |
| 264 | + |
| 265 | + /* If either VID GPIO is missing just disable this */ |
| 266 | + if (!max8952->vid0_gpiod || !max8952->vid1_gpiod) { |
275 | 267 | dev_warn(&client->dev, "VID0/1 gpio invalid: "
|
276 |
| - "DVS not available.\n"); |
| 268 | + "DVS not available.\n"); |
277 | 269 | max8952->vid0 = 0;
|
278 | 270 | max8952->vid1 = 0;
|
279 |
| - /* Mark invalid */ |
280 |
| - pdata->gpio_vid0 = -1; |
281 |
| - pdata->gpio_vid1 = -1; |
| 271 | + /* Make sure if we have any descriptors they get set to low */ |
| 272 | + if (max8952->vid0_gpiod) |
| 273 | + gpiod_set_value(max8952->vid0_gpiod, 0); |
| 274 | + if (max8952->vid1_gpiod) |
| 275 | + gpiod_set_value(max8952->vid1_gpiod, 0); |
282 | 276 |
|
283 | 277 | /* Disable Pulldown of EN only */
|
284 | 278 | max8952_write_reg(max8952, MAX8952_REG_CONTROL, 0x60);
|
|
0 commit comments