--- zzzz-none-000/linux-3.10.107/drivers/power/reset/gpio-poweroff.c 2017-06-27 09:49:32.000000000 +0000 +++ scorpion-7490-727/linux-3.10.107/drivers/power/reset/gpio-poweroff.c 2021-02-04 17:41:59.000000000 +0000 @@ -15,31 +15,29 @@ #include #include #include -#include +#include #include -#include #include /* * Hold configuration here, cannot be more than one instance of the driver * since pm_power_off itself is global. */ -static int gpio_num = -1; -static int gpio_active_low; +static struct gpio_desc *reset_gpio; static void gpio_poweroff_do_poweroff(void) { - BUG_ON(!gpio_is_valid(gpio_num)); + BUG_ON(!reset_gpio); /* drive it active, also inactive->active edge */ - gpio_direction_output(gpio_num, !gpio_active_low); + gpiod_direction_output(reset_gpio, 1); mdelay(100); /* drive inactive, also active->inactive edge */ - gpio_set_value(gpio_num, gpio_active_low); + gpiod_set_value(reset_gpio, 0); mdelay(100); /* drive it active, also inactive->active edge */ - gpio_set_value(gpio_num, !gpio_active_low); + gpiod_set_value(reset_gpio, 1); /* give it some time */ mdelay(3000); @@ -49,54 +47,33 @@ static int gpio_poweroff_probe(struct platform_device *pdev) { - enum of_gpio_flags flags; bool input = false; - int ret; + enum gpiod_flags flags; /* If a pm_power_off function has already been added, leave it alone */ if (pm_power_off != NULL) { - pr_err("%s: pm_power_off function already registered", + dev_err(&pdev->dev, + "%s: pm_power_off function already registered", __func__); return -EBUSY; } - gpio_num = of_get_gpio_flags(pdev->dev.of_node, 0, &flags); - if (!gpio_is_valid(gpio_num)) - return gpio_num; - - gpio_active_low = flags & OF_GPIO_ACTIVE_LOW; - input = of_property_read_bool(pdev->dev.of_node, "input"); - - ret = gpio_request(gpio_num, "poweroff-gpio"); - if (ret) { - pr_err("%s: Could not get GPIO %d", __func__, gpio_num); - return ret; - } - if (input) { - if (gpio_direction_input(gpio_num)) { - pr_err("Could not set direction of GPIO %d to input", - gpio_num); - goto err; - } - } else { - if (gpio_direction_output(gpio_num, gpio_active_low)) { - pr_err("Could not set direction of GPIO %d", gpio_num); - goto err; - } - } + if (input) + flags = GPIOD_IN; + else + flags = GPIOD_OUT_LOW; + + reset_gpio = devm_gpiod_get(&pdev->dev, NULL, flags); + if (IS_ERR(reset_gpio)) + return PTR_ERR(reset_gpio); pm_power_off = &gpio_poweroff_do_poweroff; return 0; - -err: - gpio_free(gpio_num); - return -ENODEV; } static int gpio_poweroff_remove(struct platform_device *pdev) { - gpio_free(gpio_num); if (pm_power_off == &gpio_poweroff_do_poweroff) pm_power_off = NULL; @@ -113,7 +90,6 @@ .remove = gpio_poweroff_remove, .driver = { .name = "poweroff-gpio", - .owner = THIS_MODULE, .of_match_table = of_gpio_poweroff_match, }, };