|
|
@ -71,7 +71,7 @@ static struct semaphore open_semaphore;
|
|
|
|
static unsigned expect_close;
|
|
|
|
static unsigned expect_close;
|
|
|
|
|
|
|
|
|
|
|
|
/* XXX currently fixed, allows max margin ~68.72 secs */
|
|
|
|
/* XXX currently fixed, allows max margin ~68.72 secs */
|
|
|
|
#define prescale_value 0xFFFF
|
|
|
|
#define prescale_value 0xffff
|
|
|
|
|
|
|
|
|
|
|
|
// Offset of the WDT registers
|
|
|
|
// Offset of the WDT registers
|
|
|
|
static unsigned long ar7_regs_wdt;
|
|
|
|
static unsigned long ar7_regs_wdt;
|
|
|
@ -96,7 +96,7 @@ static void ar7_wdt_kick(u32 value)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ar7_wdt->kick_lock = 0x5555;
|
|
|
|
ar7_wdt->kick_lock = 0x5555;
|
|
|
|
if ((ar7_wdt->kick_lock & 3) == 1) {
|
|
|
|
if ((ar7_wdt->kick_lock & 3) == 1) {
|
|
|
|
ar7_wdt->kick_lock = 0xAAAA;
|
|
|
|
ar7_wdt->kick_lock = 0xaaaa;
|
|
|
|
if ((ar7_wdt->kick_lock & 3) == 3) {
|
|
|
|
if ((ar7_wdt->kick_lock & 3) == 3) {
|
|
|
|
ar7_wdt->kick = value;
|
|
|
|
ar7_wdt->kick = value;
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -107,9 +107,9 @@ static void ar7_wdt_kick(u32 value)
|
|
|
|
|
|
|
|
|
|
|
|
static void ar7_wdt_prescale(u32 value)
|
|
|
|
static void ar7_wdt_prescale(u32 value)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ar7_wdt->prescale_lock = 0x5A5A;
|
|
|
|
ar7_wdt->prescale_lock = 0x5a5a;
|
|
|
|
if ((ar7_wdt->prescale_lock & 3) == 1) {
|
|
|
|
if ((ar7_wdt->prescale_lock & 3) == 1) {
|
|
|
|
ar7_wdt->prescale_lock = 0xA5A5;
|
|
|
|
ar7_wdt->prescale_lock = 0xa5a5;
|
|
|
|
if ((ar7_wdt->prescale_lock & 3) == 3) {
|
|
|
|
if ((ar7_wdt->prescale_lock & 3) == 3) {
|
|
|
|
ar7_wdt->prescale = value;
|
|
|
|
ar7_wdt->prescale = value;
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -122,7 +122,7 @@ static void ar7_wdt_change(u32 value)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ar7_wdt->change_lock = 0x6666;
|
|
|
|
ar7_wdt->change_lock = 0x6666;
|
|
|
|
if ((ar7_wdt->change_lock & 3) == 1) {
|
|
|
|
if ((ar7_wdt->change_lock & 3) == 1) {
|
|
|
|
ar7_wdt->change_lock = 0xBBBB;
|
|
|
|
ar7_wdt->change_lock = 0xbbbb;
|
|
|
|
if ((ar7_wdt->change_lock & 3) == 3) {
|
|
|
|
if ((ar7_wdt->change_lock & 3) == 3) {
|
|
|
|
ar7_wdt->change = value;
|
|
|
|
ar7_wdt->change = value;
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -135,9 +135,9 @@ static void ar7_wdt_disable(u32 value)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ar7_wdt->disable_lock = 0x7777;
|
|
|
|
ar7_wdt->disable_lock = 0x7777;
|
|
|
|
if ((ar7_wdt->disable_lock & 3) == 1) {
|
|
|
|
if ((ar7_wdt->disable_lock & 3) == 1) {
|
|
|
|
ar7_wdt->disable_lock = 0xCCCC;
|
|
|
|
ar7_wdt->disable_lock = 0xcccc;
|
|
|
|
if ((ar7_wdt->disable_lock & 3) == 2) {
|
|
|
|
if ((ar7_wdt->disable_lock & 3) == 2) {
|
|
|
|
ar7_wdt->disable_lock = 0xDDDD;
|
|
|
|
ar7_wdt->disable_lock = 0xdddd;
|
|
|
|
if ((ar7_wdt->disable_lock & 3) == 3) {
|
|
|
|
if ((ar7_wdt->disable_lock & 3) == 3) {
|
|
|
|
ar7_wdt->disable = value;
|
|
|
|
ar7_wdt->disable = value;
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -153,7 +153,7 @@ static void ar7_wdt_update_margin(int new_margin)
|
|
|
|
|
|
|
|
|
|
|
|
change = new_margin * (ar7_vbus_freq() / prescale_value);
|
|
|
|
change = new_margin * (ar7_vbus_freq() / prescale_value);
|
|
|
|
if (change < 1) change = 1;
|
|
|
|
if (change < 1) change = 1;
|
|
|
|
if (change > 0xFFFF) change = 0xFFFF;
|
|
|
|
if (change > 0xffff) change = 0xffff;
|
|
|
|
ar7_wdt_change(change);
|
|
|
|
ar7_wdt_change(change);
|
|
|
|
margin = change * prescale_value / ar7_vbus_freq();
|
|
|
|
margin = change * prescale_value / ar7_vbus_freq();
|
|
|
|
printk(KERN_INFO DRVNAME
|
|
|
|
printk(KERN_INFO DRVNAME
|
|
|
@ -248,8 +248,6 @@ static int ar7_wdt_ioctl(struct inode *inode, struct file *file,
|
|
|
|
int new_margin;
|
|
|
|
int new_margin;
|
|
|
|
|
|
|
|
|
|
|
|
switch (cmd) {
|
|
|
|
switch (cmd) {
|
|
|
|
default:
|
|
|
|
|
|
|
|
return -ENOTTY;
|
|
|
|
|
|
|
|
case WDIOC_GETSUPPORT:
|
|
|
|
case WDIOC_GETSUPPORT:
|
|
|
|
if(copy_to_user((struct watchdog_info *)arg, &ident,
|
|
|
|
if(copy_to_user((struct watchdog_info *)arg, &ident,
|
|
|
|
sizeof(ident)))
|
|
|
|
sizeof(ident)))
|
|
|
@ -276,6 +274,8 @@ static int ar7_wdt_ioctl(struct inode *inode, struct file *file,
|
|
|
|
if (put_user(margin, (int *)arg))
|
|
|
|
if (put_user(margin, (int *)arg))
|
|
|
|
return -EFAULT;
|
|
|
|
return -EFAULT;
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
return -ENOTTY;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|