diff options
author | Florian Fainelli <florian@openwrt.org> | 2011-06-15 13:15:41 -0400 |
---|---|---|
committer | Wim Van Sebroeck <wim@iguana.be> | 2011-06-28 03:42:30 -0400 |
commit | 2ea4e76e997019ae25ac3417aa46e31ddf7ecb17 (patch) | |
tree | 347392d5b9cfc8d5fd97c636050b01d1a338ff1a /drivers/watchdog | |
parent | 9b19d40aa3ebaf1078779da10555da2ab8512422 (diff) |
watchdog: mtx1-wdt: fix GPIO toggling
Commit e391be76 (MIPS: Alchemy: Clean up GPIO registers and accessors)
changed the way the GPIO was toggled. Prior to this patch, we would
always actively drive the GPIO output to either 0 or 1, this patch
drove the GPIO active to 0, and put the GPIO in tristate to drive it
to 1, unfortunately this does not work, revert back to active driving.
Using a signed variable (gstate) to hold the gpio state and using a bit-
wise operation on it also resulted in toggling value from 1 to -2 since
the variable is signed. This value was then passed on to gpio_direction_
output, which always perform a if (value) ... to set the value to the
gpio, so we were always writing a 1 to this GPIO instead of 1 -> 0 -> 1 ...
Signed-off-by: Florian Fainelli <florian@openwrt.org>
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
Cc: stable <stable@kernel.org>
Diffstat (limited to 'drivers/watchdog')
-rw-r--r-- | drivers/watchdog/mtx-1_wdt.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/drivers/watchdog/mtx-1_wdt.c b/drivers/watchdog/mtx-1_wdt.c index aa011da1d5fb..54aa90042484 100644 --- a/drivers/watchdog/mtx-1_wdt.c +++ b/drivers/watchdog/mtx-1_wdt.c | |||
@@ -66,7 +66,7 @@ static struct { | |||
66 | int default_ticks; | 66 | int default_ticks; |
67 | unsigned long inuse; | 67 | unsigned long inuse; |
68 | unsigned gpio; | 68 | unsigned gpio; |
69 | int gstate; | 69 | unsigned int gstate; |
70 | } mtx1_wdt_device; | 70 | } mtx1_wdt_device; |
71 | 71 | ||
72 | static void mtx1_wdt_trigger(unsigned long unused) | 72 | static void mtx1_wdt_trigger(unsigned long unused) |
@@ -78,11 +78,8 @@ static void mtx1_wdt_trigger(unsigned long unused) | |||
78 | ticks--; | 78 | ticks--; |
79 | 79 | ||
80 | /* toggle wdt gpio */ | 80 | /* toggle wdt gpio */ |
81 | mtx1_wdt_device.gstate = ~mtx1_wdt_device.gstate; | 81 | mtx1_wdt_device.gstate = !mtx1_wdt_device.gstate; |
82 | if (mtx1_wdt_device.gstate) | 82 | gpio_set_value(mtx1_wdt_device.gpio, mtx1_wdt_device.gstate); |
83 | gpio_direction_output(mtx1_wdt_device.gpio, 1); | ||
84 | else | ||
85 | gpio_direction_input(mtx1_wdt_device.gpio); | ||
86 | 83 | ||
87 | if (mtx1_wdt_device.queue && ticks) | 84 | if (mtx1_wdt_device.queue && ticks) |
88 | mod_timer(&mtx1_wdt_device.timer, jiffies + MTX1_WDT_INTERVAL); | 85 | mod_timer(&mtx1_wdt_device.timer, jiffies + MTX1_WDT_INTERVAL); |
@@ -105,7 +102,7 @@ static void mtx1_wdt_start(void) | |||
105 | if (!mtx1_wdt_device.queue) { | 102 | if (!mtx1_wdt_device.queue) { |
106 | mtx1_wdt_device.queue = 1; | 103 | mtx1_wdt_device.queue = 1; |
107 | mtx1_wdt_device.gstate = 1; | 104 | mtx1_wdt_device.gstate = 1; |
108 | gpio_direction_output(mtx1_wdt_device.gpio, 1); | 105 | gpio_set_value(mtx1_wdt_device.gpio, 1); |
109 | mod_timer(&mtx1_wdt_device.timer, jiffies + MTX1_WDT_INTERVAL); | 106 | mod_timer(&mtx1_wdt_device.timer, jiffies + MTX1_WDT_INTERVAL); |
110 | } | 107 | } |
111 | mtx1_wdt_device.running++; | 108 | mtx1_wdt_device.running++; |
@@ -120,7 +117,7 @@ static int mtx1_wdt_stop(void) | |||
120 | if (mtx1_wdt_device.queue) { | 117 | if (mtx1_wdt_device.queue) { |
121 | mtx1_wdt_device.queue = 0; | 118 | mtx1_wdt_device.queue = 0; |
122 | mtx1_wdt_device.gstate = 0; | 119 | mtx1_wdt_device.gstate = 0; |
123 | gpio_direction_output(mtx1_wdt_device.gpio, 0); | 120 | gpio_set_value(mtx1_wdt_device.gpio, 0); |
124 | } | 121 | } |
125 | ticks = mtx1_wdt_device.default_ticks; | 122 | ticks = mtx1_wdt_device.default_ticks; |
126 | spin_unlock_irqrestore(&mtx1_wdt_device.lock, flags); | 123 | spin_unlock_irqrestore(&mtx1_wdt_device.lock, flags); |