Commit 22ec9bb1 authored by Linus Walleij's avatar Linus Walleij Committed by Wim Van Sebroeck

watchdog: mena21_wdt: Convert to GPIO descriptors

This drops the old OF API use to look up global GPIO
numbers and replace it with the GPIO descriptor API.

Cc: Johannes Thumshirn <jthumshirn@suse.de>
Cc: Johannes Thumshirn <morbidrsa@gmail.com>
Cc: Johannes Thumshirn <jth@kernel.org>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Acked-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
Signed-off-by: default avatarWim Van Sebroeck <wim@linux-watchdog.org>
parent 8d4d4f32
...@@ -13,10 +13,10 @@ ...@@ -13,10 +13,10 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/watchdog.h> #include <linux/watchdog.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/gpio.h> #include <linux/gpio/consumer.h>
#include <linux/of_gpio.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/of.h>
#define NUM_GPIOS 6 #define NUM_GPIOS 6
...@@ -31,7 +31,7 @@ enum a21_wdt_gpios { ...@@ -31,7 +31,7 @@ enum a21_wdt_gpios {
struct a21_wdt_drv { struct a21_wdt_drv {
struct watchdog_device wdt; struct watchdog_device wdt;
unsigned gpios[NUM_GPIOS]; struct gpio_desc *gpios[NUM_GPIOS];
}; };
static bool nowayout = WATCHDOG_NOWAYOUT; static bool nowayout = WATCHDOG_NOWAYOUT;
...@@ -43,9 +43,9 @@ static unsigned int a21_wdt_get_bootstatus(struct a21_wdt_drv *drv) ...@@ -43,9 +43,9 @@ static unsigned int a21_wdt_get_bootstatus(struct a21_wdt_drv *drv)
{ {
int reset = 0; int reset = 0;
reset |= gpio_get_value(drv->gpios[GPIO_WD_RST0]) ? (1 << 0) : 0; reset |= gpiod_get_value(drv->gpios[GPIO_WD_RST0]) ? (1 << 0) : 0;
reset |= gpio_get_value(drv->gpios[GPIO_WD_RST1]) ? (1 << 1) : 0; reset |= gpiod_get_value(drv->gpios[GPIO_WD_RST1]) ? (1 << 1) : 0;
reset |= gpio_get_value(drv->gpios[GPIO_WD_RST2]) ? (1 << 2) : 0; reset |= gpiod_get_value(drv->gpios[GPIO_WD_RST2]) ? (1 << 2) : 0;
return reset; return reset;
} }
...@@ -54,7 +54,7 @@ static int a21_wdt_start(struct watchdog_device *wdt) ...@@ -54,7 +54,7 @@ static int a21_wdt_start(struct watchdog_device *wdt)
{ {
struct a21_wdt_drv *drv = watchdog_get_drvdata(wdt); struct a21_wdt_drv *drv = watchdog_get_drvdata(wdt);
gpio_set_value(drv->gpios[GPIO_WD_ENAB], 1); gpiod_set_value(drv->gpios[GPIO_WD_ENAB], 1);
return 0; return 0;
} }
...@@ -63,7 +63,7 @@ static int a21_wdt_stop(struct watchdog_device *wdt) ...@@ -63,7 +63,7 @@ static int a21_wdt_stop(struct watchdog_device *wdt)
{ {
struct a21_wdt_drv *drv = watchdog_get_drvdata(wdt); struct a21_wdt_drv *drv = watchdog_get_drvdata(wdt);
gpio_set_value(drv->gpios[GPIO_WD_ENAB], 0); gpiod_set_value(drv->gpios[GPIO_WD_ENAB], 0);
return 0; return 0;
} }
...@@ -72,9 +72,9 @@ static int a21_wdt_ping(struct watchdog_device *wdt) ...@@ -72,9 +72,9 @@ static int a21_wdt_ping(struct watchdog_device *wdt)
{ {
struct a21_wdt_drv *drv = watchdog_get_drvdata(wdt); struct a21_wdt_drv *drv = watchdog_get_drvdata(wdt);
gpio_set_value(drv->gpios[GPIO_WD_TRIG], 0); gpiod_set_value(drv->gpios[GPIO_WD_TRIG], 0);
ndelay(10); ndelay(10);
gpio_set_value(drv->gpios[GPIO_WD_TRIG], 1); gpiod_set_value(drv->gpios[GPIO_WD_TRIG], 1);
return 0; return 0;
} }
...@@ -96,9 +96,9 @@ static int a21_wdt_set_timeout(struct watchdog_device *wdt, ...@@ -96,9 +96,9 @@ static int a21_wdt_set_timeout(struct watchdog_device *wdt,
} }
if (timeout == 1) if (timeout == 1)
gpio_set_value(drv->gpios[GPIO_WD_FAST], 1); gpiod_set_value(drv->gpios[GPIO_WD_FAST], 1);
else else
gpio_set_value(drv->gpios[GPIO_WD_FAST], 0); gpiod_set_value(drv->gpios[GPIO_WD_FAST], 0);
wdt->timeout = timeout; wdt->timeout = timeout;
...@@ -127,7 +127,6 @@ static struct watchdog_device a21_wdt = { ...@@ -127,7 +127,6 @@ static struct watchdog_device a21_wdt = {
static int a21_wdt_probe(struct platform_device *pdev) static int a21_wdt_probe(struct platform_device *pdev)
{ {
struct device_node *node;
struct a21_wdt_drv *drv; struct a21_wdt_drv *drv;
unsigned int reset = 0; unsigned int reset = 0;
int num_gpios; int num_gpios;
...@@ -138,40 +137,40 @@ static int a21_wdt_probe(struct platform_device *pdev) ...@@ -138,40 +137,40 @@ static int a21_wdt_probe(struct platform_device *pdev)
if (!drv) if (!drv)
return -ENOMEM; return -ENOMEM;
/* Fill GPIO pin array */ num_gpios = gpiod_count(&pdev->dev, NULL);
node = pdev->dev.of_node;
num_gpios = of_gpio_count(node);
if (num_gpios != NUM_GPIOS) { if (num_gpios != NUM_GPIOS) {
dev_err(&pdev->dev, "gpios DT property wrong, got %d want %d", dev_err(&pdev->dev, "gpios DT property wrong, got %d want %d",
num_gpios, NUM_GPIOS); num_gpios, NUM_GPIOS);
return -ENODEV; return -ENODEV;
} }
for (i = 0; i < num_gpios; i++) {
int val;
val = of_get_gpio(node, i);
if (val < 0)
return val;
drv->gpios[i] = val;
}
/* Request the used GPIOs */ /* Request the used GPIOs */
for (i = 0; i < num_gpios; i++) { for (i = 0; i < num_gpios; i++) {
ret = devm_gpio_request(&pdev->dev, drv->gpios[i], enum gpiod_flags gflags;
"MEN A21 Watchdog");
if (ret)
return ret;
if (i < GPIO_WD_RST0) if (i < GPIO_WD_RST0)
ret = gpio_direction_output(drv->gpios[i], gflags = GPIOD_ASIS;
gpio_get_value(drv->gpios[i])); else
else /* GPIO_WD_RST[0..2] are inputs */ gflags = GPIOD_IN;
ret = gpio_direction_input(drv->gpios[i]); drv->gpios[i] = devm_gpiod_get_index(&pdev->dev, NULL, i,
if (ret) gflags);
if (IS_ERR(drv->gpios[i])) {
ret = PTR_ERR(drv->gpios[i]);
return ret; return ret;
}
gpiod_set_consumer_name(drv->gpios[i], "MEN A21 Watchdog");
/*
* Retrieve the initial value from the GPIOs that should be
* output, then set up the line as output with that value.
*/
if (i < GPIO_WD_RST0) {
int val;
val = gpiod_get_value(drv->gpios[i]);
gpiod_direction_output(drv->gpios[i], val);
}
} }
watchdog_init_timeout(&a21_wdt, 30, &pdev->dev); watchdog_init_timeout(&a21_wdt, 30, &pdev->dev);
...@@ -207,7 +206,7 @@ static void a21_wdt_shutdown(struct platform_device *pdev) ...@@ -207,7 +206,7 @@ static void a21_wdt_shutdown(struct platform_device *pdev)
{ {
struct a21_wdt_drv *drv = dev_get_drvdata(&pdev->dev); struct a21_wdt_drv *drv = dev_get_drvdata(&pdev->dev);
gpio_set_value(drv->gpios[GPIO_WD_ENAB], 0); gpiod_set_value(drv->gpios[GPIO_WD_ENAB], 0);
} }
static const struct of_device_id a21_wdt_ids[] = { static const struct of_device_id a21_wdt_ids[] = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment