Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
40046d1a
Commit
40046d1a
authored
May 31, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://linux-watchdog.bkbits.net/linux-2.6-watchdog
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
4bd146ff
841b4bc2
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
54 additions
and
12 deletions
+54
-12
drivers/char/watchdog/w83627hf_wdt.c
drivers/char/watchdog/w83627hf_wdt.c
+54
-12
No files found.
drivers/char/watchdog/w83627hf_wdt.c
View file @
40046d1a
...
@@ -72,7 +72,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CON
...
@@ -72,7 +72,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CON
#define WDT_EFDR (WDT_EFIR+1)
/* Extended Function Data Register */
#define WDT_EFDR (WDT_EFIR+1)
/* Extended Function Data Register */
static
void
static
void
w
dt_ctrl
(
int
timeout
)
w
83627hf_select_wd_register
(
void
)
{
{
outb_p
(
0x87
,
WDT_EFER
);
/* Enter extended function mode */
outb_p
(
0x87
,
WDT_EFER
);
/* Enter extended function mode */
outb_p
(
0x87
,
WDT_EFER
);
/* Again according to manual */
outb_p
(
0x87
,
WDT_EFER
);
/* Again according to manual */
...
@@ -81,23 +81,64 @@ wdt_ctrl(int timeout)
...
@@ -81,23 +81,64 @@ wdt_ctrl(int timeout)
outb_p
(
0x08
,
WDT_EFDR
);
/* select logical device 8 (GPIO2) */
outb_p
(
0x08
,
WDT_EFDR
);
/* select logical device 8 (GPIO2) */
outb_p
(
0x30
,
WDT_EFER
);
/* select CR30 */
outb_p
(
0x30
,
WDT_EFER
);
/* select CR30 */
outb_p
(
0x01
,
WDT_EFDR
);
/* set bit 0 to activate GPIO2 */
outb_p
(
0x01
,
WDT_EFDR
);
/* set bit 0 to activate GPIO2 */
}
static
void
w83627hf_unselect_wd_register
(
void
)
{
outb_p
(
0xAA
,
WDT_EFER
);
/* Leave extended function mode */
}
/* tyan motherboards seem to set F5 to 0x4C ?
* So explicitly init to appropriate value. */
static
void
w83627hf_init
(
void
)
{
unsigned
char
t
;
w83627hf_select_wd_register
();
outb_p
(
0xF5
,
WDT_EFER
);
/* Select CRF5 */
t
=
inb_p
(
WDT_EFDR
);
/* read CRF5 */
t
&=~
0x0C
;
/* set second mode & disable keyboard turning off watchdog */
outb_p
(
t
,
WDT_EFDR
);
/* Write back to CRF5 */
w83627hf_unselect_wd_register
();
}
static
void
wdt_ctrl
(
int
timeout
)
{
w83627hf_select_wd_register
();
outb_p
(
0xF6
,
WDT_EFER
);
/* Select CRF6 */
outb_p
(
0xF6
,
WDT_EFER
);
/* Select CRF6 */
outb_p
(
timeout
,
WDT_EFDR
);
/* Write Timeout counter to CRF6 */
outb_p
(
timeout
,
WDT_EFDR
);
/* Write Timeout counter to CRF6 */
outb_p
(
0xAA
,
WDT_EFER
);
/* Leave extended function mode */
w83627hf_unselect_wd_register
();
}
}
static
void
static
int
wdt_ping
(
void
)
wdt_ping
(
void
)
{
{
wdt_ctrl
(
timeout
);
wdt_ctrl
(
timeout
);
return
0
;
}
}
static
void
static
int
wdt_disable
(
void
)
wdt_disable
(
void
)
{
{
wdt_ctrl
(
0
);
wdt_ctrl
(
0
);
return
0
;
}
static
int
wdt_set_heartbeat
(
int
t
)
{
if
((
t
<
1
)
||
(
t
>
63
))
return
-
EINVAL
;
timeout
=
t
;
return
0
;
}
}
static
ssize_t
static
ssize_t
...
@@ -134,7 +175,7 @@ wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
...
@@ -134,7 +175,7 @@ wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
static
struct
watchdog_info
ident
=
{
static
struct
watchdog_info
ident
=
{
.
options
=
WDIOF_KEEPALIVEPING
|
WDIOF_SETTIMEOUT
|
WDIOF_MAGICCLOSE
,
.
options
=
WDIOF_KEEPALIVEPING
|
WDIOF_SETTIMEOUT
|
WDIOF_MAGICCLOSE
,
.
firmware_version
=
1
,
.
firmware_version
=
1
,
.
identity
=
"
Advantech
WDT"
,
.
identity
=
"
W83627HF
WDT"
,
};
};
switch
(
cmd
)
{
switch
(
cmd
)
{
...
@@ -154,9 +195,8 @@ wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
...
@@ -154,9 +195,8 @@ wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
case
WDIOC_SETTIMEOUT
:
case
WDIOC_SETTIMEOUT
:
if
(
get_user
(
new_timeout
,
(
int
*
)
arg
))
if
(
get_user
(
new_timeout
,
(
int
*
)
arg
))
return
-
EFAULT
;
return
-
EFAULT
;
if
(
(
new_timeout
<
1
)
||
(
new_timeout
>
63
))
if
(
wdt_set_heartbeat
(
new_timeout
))
return
-
EINVAL
;
return
-
EINVAL
;
timeout
=
new_timeout
;
wdt_ping
();
wdt_ping
();
/* Fall */
/* Fall */
...
@@ -211,8 +251,8 @@ wdt_close(struct inode *inode, struct file *file)
...
@@ -211,8 +251,8 @@ wdt_close(struct inode *inode, struct file *file)
printk
(
KERN_CRIT
PFX
"Unexpected close, not stopping watchdog!
\n
"
);
printk
(
KERN_CRIT
PFX
"Unexpected close, not stopping watchdog!
\n
"
);
wdt_ping
();
wdt_ping
();
}
}
clear_bit
(
0
,
&
wdt_is_open
);
expect_close
=
0
;
expect_close
=
0
;
clear_bit
(
0
,
&
wdt_is_open
);
return
0
;
return
0
;
}
}
...
@@ -266,10 +306,10 @@ wdt_init(void)
...
@@ -266,10 +306,10 @@ wdt_init(void)
printk
(
KERN_INFO
"WDT driver for the Winbond(TM) W83627HF Super I/O chip initialising.
\n
"
);
printk
(
KERN_INFO
"WDT driver for the Winbond(TM) W83627HF Super I/O chip initialising.
\n
"
);
if
(
timeout
<
1
||
timeout
>
63
)
{
if
(
wdt_set_heartbeat
(
timeout
)
)
{
timeout
=
WATCHDOG_TIMEOUT
;
wdt_set_heartbeat
(
WATCHDOG_TIMEOUT
)
;
printk
(
KERN_INFO
PFX
"timeout value must be 1<=
x
<=63, using %d
\n
"
,
printk
(
KERN_INFO
PFX
"timeout value must be 1<=
timeout
<=63, using %d
\n
"
,
timeout
);
WATCHDOG_TIMEOUT
);
}
}
if
(
!
request_region
(
wdt_io
,
1
,
WATCHDOG_NAME
))
{
if
(
!
request_region
(
wdt_io
,
1
,
WATCHDOG_NAME
))
{
...
@@ -279,6 +319,8 @@ wdt_init(void)
...
@@ -279,6 +319,8 @@ wdt_init(void)
goto
out
;
goto
out
;
}
}
w83627hf_init
();
ret
=
register_reboot_notifier
(
&
wdt_notifier
);
ret
=
register_reboot_notifier
(
&
wdt_notifier
);
if
(
ret
!=
0
)
{
if
(
ret
!=
0
)
{
printk
(
KERN_ERR
PFX
"cannot register reboot notifier (err=%d)
\n
"
,
printk
(
KERN_ERR
PFX
"cannot register reboot notifier (err=%d)
\n
"
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment