|
|
|
@ -66,23 +66,18 @@ static struct { |
|
|
|
|
int default_ticks; |
|
|
|
|
unsigned long inuse; |
|
|
|
|
unsigned gpio; |
|
|
|
|
int gstate; |
|
|
|
|
unsigned int gstate; |
|
|
|
|
} mtx1_wdt_device; |
|
|
|
|
|
|
|
|
|
static void mtx1_wdt_trigger(unsigned long unused) |
|
|
|
|
{ |
|
|
|
|
u32 tmp; |
|
|
|
|
|
|
|
|
|
spin_lock(&mtx1_wdt_device.lock); |
|
|
|
|
if (mtx1_wdt_device.running) |
|
|
|
|
ticks--; |
|
|
|
|
|
|
|
|
|
/* toggle wdt gpio */ |
|
|
|
|
mtx1_wdt_device.gstate = ~mtx1_wdt_device.gstate; |
|
|
|
|
if (mtx1_wdt_device.gstate) |
|
|
|
|
gpio_direction_output(mtx1_wdt_device.gpio, 1); |
|
|
|
|
else |
|
|
|
|
gpio_direction_input(mtx1_wdt_device.gpio); |
|
|
|
|
mtx1_wdt_device.gstate = !mtx1_wdt_device.gstate; |
|
|
|
|
gpio_set_value(mtx1_wdt_device.gpio, mtx1_wdt_device.gstate); |
|
|
|
|
|
|
|
|
|
if (mtx1_wdt_device.queue && ticks) |
|
|
|
|
mod_timer(&mtx1_wdt_device.timer, jiffies + MTX1_WDT_INTERVAL); |
|
|
|
@ -105,7 +100,7 @@ static void mtx1_wdt_start(void) |
|
|
|
|
if (!mtx1_wdt_device.queue) { |
|
|
|
|
mtx1_wdt_device.queue = 1; |
|
|
|
|
mtx1_wdt_device.gstate = 1; |
|
|
|
|
gpio_direction_output(mtx1_wdt_device.gpio, 1); |
|
|
|
|
gpio_set_value(mtx1_wdt_device.gpio, 1); |
|
|
|
|
mod_timer(&mtx1_wdt_device.timer, jiffies + MTX1_WDT_INTERVAL); |
|
|
|
|
} |
|
|
|
|
mtx1_wdt_device.running++; |
|
|
|
@ -120,7 +115,7 @@ static int mtx1_wdt_stop(void) |
|
|
|
|
if (mtx1_wdt_device.queue) { |
|
|
|
|
mtx1_wdt_device.queue = 0; |
|
|
|
|
mtx1_wdt_device.gstate = 0; |
|
|
|
|
gpio_direction_output(mtx1_wdt_device.gpio, 0); |
|
|
|
|
gpio_set_value(mtx1_wdt_device.gpio, 0); |
|
|
|
|
} |
|
|
|
|
ticks = mtx1_wdt_device.default_ticks; |
|
|
|
|
spin_unlock_irqrestore(&mtx1_wdt_device.lock, flags); |
|
|
|
@ -214,6 +209,12 @@ static int __devinit mtx1_wdt_probe(struct platform_device *pdev) |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
mtx1_wdt_device.gpio = pdev->resource[0].start; |
|
|
|
|
ret = gpio_request_one(mtx1_wdt_device.gpio, |
|
|
|
|
GPIOF_OUT_INIT_HIGH, "mtx1-wdt"); |
|
|
|
|
if (ret < 0) { |
|
|
|
|
dev_err(&pdev->dev, "failed to request gpio"); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
spin_lock_init(&mtx1_wdt_device.lock); |
|
|
|
|
init_completion(&mtx1_wdt_device.stop); |
|
|
|
@ -239,11 +240,13 @@ static int __devexit mtx1_wdt_remove(struct platform_device *pdev) |
|
|
|
|
mtx1_wdt_device.queue = 0; |
|
|
|
|
wait_for_completion(&mtx1_wdt_device.stop); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
gpio_free(mtx1_wdt_device.gpio); |
|
|
|
|
misc_deregister(&mtx1_wdt_misc); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static struct platform_driver mtx1_wdt = { |
|
|
|
|
static struct platform_driver mtx1_wdt_driver = { |
|
|
|
|
.probe = mtx1_wdt_probe, |
|
|
|
|
.remove = __devexit_p(mtx1_wdt_remove), |
|
|
|
|
.driver.name = "mtx1-wdt", |
|
|
|
@ -252,12 +255,12 @@ static struct platform_driver mtx1_wdt = { |
|
|
|
|
|
|
|
|
|
static int __init mtx1_wdt_init(void) |
|
|
|
|
{ |
|
|
|
|
return platform_driver_register(&mtx1_wdt); |
|
|
|
|
return platform_driver_register(&mtx1_wdt_driver); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void __exit mtx1_wdt_exit(void) |
|
|
|
|
{ |
|
|
|
|
platform_driver_unregister(&mtx1_wdt); |
|
|
|
|
platform_driver_unregister(&mtx1_wdt_driver); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
module_init(mtx1_wdt_init); |
|
|
|
|