diff options
-rw-r--r-- | drivers/net/ethernet/smsc/smc91x.c | 25 |
1 files changed, 8 insertions, 17 deletions
diff --git a/drivers/net/ethernet/smsc/smc91x.c b/drivers/net/ethernet/smsc/smc91x.c index 8678e39aba08..5a1a3e7c93e7 100644 --- a/drivers/net/ethernet/smsc/smc91x.c +++ b/drivers/net/ethernet/smsc/smc91x.c | |||
@@ -2204,27 +2204,18 @@ static int try_toggle_control_gpio(struct device *dev, | |||
2204 | int value, unsigned int nsdelay) | 2204 | int value, unsigned int nsdelay) |
2205 | { | 2205 | { |
2206 | struct gpio_desc *gpio = *desc; | 2206 | struct gpio_desc *gpio = *desc; |
2207 | enum gpiod_flags flags = value ? GPIOD_OUT_LOW : GPIOD_OUT_HIGH; | ||
2207 | int res; | 2208 | int res; |
2208 | 2209 | ||
2209 | gpio = devm_gpiod_get_index(dev, name, index); | 2210 | gpio = devm_gpiod_get_index_optional(dev, name, index, flags); |
2210 | if (IS_ERR(gpio)) { | 2211 | if (IS_ERR(gpio)) |
2211 | if (PTR_ERR(gpio) == -ENOENT) { | ||
2212 | *desc = NULL; | ||
2213 | return 0; | ||
2214 | } | ||
2215 | |||
2216 | return PTR_ERR(gpio); | 2212 | return PTR_ERR(gpio); |
2213 | |||
2214 | if (gpio) { | ||
2215 | if (nsdelay) | ||
2216 | usleep_range(nsdelay, 2 * nsdelay); | ||
2217 | gpiod_set_value_cansleep(gpio, value); | ||
2217 | } | 2218 | } |
2218 | res = gpiod_direction_output(gpio, !value); | ||
2219 | if (res) { | ||
2220 | dev_err(dev, "unable to toggle gpio %s: %i\n", name, res); | ||
2221 | devm_gpiod_put(dev, gpio); | ||
2222 | gpio = NULL; | ||
2223 | return res; | ||
2224 | } | ||
2225 | if (nsdelay) | ||
2226 | usleep_range(nsdelay, 2 * nsdelay); | ||
2227 | gpiod_set_value_cansleep(gpio, value); | ||
2228 | *desc = gpio; | 2219 | *desc = gpio; |
2229 | 2220 | ||
2230 | return 0; | 2221 | return 0; |