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
a8cd2e50
Commit
a8cd2e50
authored
Sep 13, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog
parents
0160f53e
c315b7e8
Changes
10
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
2252 additions
and
43 deletions
+2252
-43
drivers/char/watchdog/Kconfig
drivers/char/watchdog/Kconfig
+72
-21
drivers/char/watchdog/Makefile
drivers/char/watchdog/Makefile
+6
-1
drivers/char/watchdog/i6300esb.c
drivers/char/watchdog/i6300esb.c
+527
-0
drivers/char/watchdog/ibmasr.c
drivers/char/watchdog/ibmasr.c
+405
-0
drivers/char/watchdog/mv64x60_wdt.c
drivers/char/watchdog/mv64x60_wdt.c
+252
-0
drivers/char/watchdog/pcwd_pci.c
drivers/char/watchdog/pcwd_pci.c
+24
-20
drivers/char/watchdog/s3c2410_wdt.c
drivers/char/watchdog/s3c2410_wdt.c
+1
-1
drivers/char/watchdog/sbc8360.c
drivers/char/watchdog/sbc8360.c
+414
-0
drivers/char/watchdog/w83977f_wdt.c
drivers/char/watchdog/w83977f_wdt.c
+543
-0
include/asm-ppc/mv64x60.h
include/asm-ppc/mv64x60.h
+8
-0
No files found.
drivers/char/watchdog/Kconfig
View file @
a8cd2e50
...
...
@@ -84,6 +84,17 @@ config 977_WATCHDOG
Not sure? It's safe to say N.
config IXP2000_WATCHDOG
tristate "IXP2000 Watchdog"
depends on WATCHDOG && ARCH_IXP2000
help
Say Y here if to include support for the watchdog timer
in the Intel IXP2000(2400, 2800, 2850) network processors.
This driver can be built as a module by choosing M. The module
will be called ixp2000_wdt.
Say N if you are unsure.
config IXP4XX_WATCHDOG
tristate "IXP4xx Watchdog"
depends on WATCHDOG && ARCH_IXP4XX
...
...
@@ -100,17 +111,6 @@ config IXP4XX_WATCHDOG
Say N if you are unsure.
config IXP2000_WATCHDOG
tristate "IXP2000 Watchdog"
depends on WATCHDOG && ARCH_IXP2000
help
Say Y here if to include support for the watchdog timer
in the Intel IXP2000(2400, 2800, 2850) network processors.
This driver can be built as a module by choosing M. The module
will be called ixp2000_wdt.
Say N if you are unsure.
config S3C2410_WATCHDOG
tristate "S3C2410 Watchdog"
depends on WATCHDOG && ARCH_S3C2410
...
...
@@ -233,6 +233,16 @@ config IB700_WDT
Most people will say N.
config IBMASR
tristate "IBM Automatic Server Restart"
depends on WATCHDOG && X86
help
This is the driver for the IBM Automatic Server Restart watchdog
timer builtin into some eServer xSeries machines.
To compile this driver as a module, choose M here: the
module will be called ibmasr.
config WAFER_WDT
tristate "ICP Wafer 5823 Single Board Computer Watchdog"
depends on WATCHDOG && X86
...
...
@@ -243,6 +253,16 @@ config WAFER_WDT
To compile this driver as a module, choose M here: the
module will be called wafer5823wdt.
config I6300ESB_WDT
tristate "Intel 6300ESB Timer/Watchdog"
depends on WATCHDOG && X86 && PCI
---help---
Hardware driver for the watchdog timer built into the Intel
6300ESB controller hub.
To compile this driver as a module, choose M here: the
module will be called i6300esb.
config I8XX_TCO
tristate "Intel i8xx TCO Timer/Watchdog"
depends on WATCHDOG && (X86 || IA64) && PCI
...
...
@@ -298,6 +318,19 @@ config 60XX_WDT
You can compile this driver directly into the kernel, or use
it as a module. The module will be called sbc60xxwdt.
config SBC8360_WDT
tristate "SBC8360 Watchdog Timer"
depends on WATCHDOG && X86
---help---
This is the driver for the hardware watchdog on the SBC8360 Single
Board Computer produced by Axiomtek Co., Ltd. (www.axiomtek.com).
To compile this driver as a module, choose M here: the
module will be called sbc8360.ko.
Most people will say N.
config CPU5_WDT
tristate "SMA CPU5 Watchdog"
depends on WATCHDOG && X86
...
...
@@ -336,6 +369,19 @@ config W83877F_WDT
Most people will say N.
config W83977F_WDT
tristate "W83977F (PCM-5335) Watchdog Timer"
depends on WATCHDOG && X86
---help---
This is the driver for the hardware watchdog on the W83977F I/O chip
as used in AAEON's PCM-5335 SBC (and likely others). This
watchdog simply watches your kernel to make sure it doesn't freeze,
and if it does, it reboots your computer after a certain amount of
time.
To compile this driver as a module, choose M here: the
module will be called w83977f_wdt.
config MACHZ_WDT
tristate "ZF MachZ Watchdog"
depends on WATCHDOG && X86
...
...
@@ -355,6 +401,10 @@ config 8xx_WDT
tristate "MPC8xx Watchdog Timer"
depends on WATCHDOG && 8xx
config MV64X60_WDT
tristate "MV64X60 (Marvell Discovery) Watchdog Timer"
depends on WATCHDOG && MV64X60
config BOOKE_WDT
tristate "PowerPC Book-E Watchdog Timer"
depends on WATCHDOG && (BOOKE || 4xx)
...
...
@@ -362,6 +412,17 @@ config BOOKE_WDT
Please see Documentation/watchdog/watchdog-api.txt for
more information.
# PPC64 Architecture
config WATCHDOG_RTAS
tristate "RTAS watchdog"
depends on WATCHDOG && PPC_RTAS
help
This driver adds watchdog support for the RTAS watchdog.
To compile this driver as a module, choose M here. The module
will be called wdrtas.
# MIPS Architecture
config INDYDOG
...
...
@@ -430,16 +491,6 @@ config WATCHDOG_RIO
machines. The watchdog timeout period is normally one minute but
can be changed with a boot-time parameter.
# ppc64 RTAS watchdog
config WATCHDOG_RTAS
tristate "RTAS watchdog"
depends on WATCHDOG && PPC_RTAS
help
This driver adds watchdog support for the RTAS watchdog.
To compile this driver as a module, choose M here. The module
will be called wdrtas.
#
# ISA-based Watchdog Cards
#
...
...
drivers/char/watchdog/Makefile
View file @
a8cd2e50
...
...
@@ -39,22 +39,27 @@ obj-$(CONFIG_ALIM7101_WDT) += alim7101_wdt.o
obj-$(CONFIG_SC520_WDT)
+=
sc520_wdt.o
obj-$(CONFIG_EUROTECH_WDT)
+=
eurotechwdt.o
obj-$(CONFIG_IB700_WDT)
+=
ib700wdt.o
obj-$(CONFIG_IBMASR)
+=
ibmasr.o
obj-$(CONFIG_WAFER_WDT)
+=
wafer5823wdt.o
obj-$(CONFIG_I6300ESB_WDT)
+=
i6300esb.o
obj-$(CONFIG_I8XX_TCO)
+=
i8xx_tco.o
obj-$(CONFIG_SC1200_WDT)
+=
sc1200wdt.o
obj-$(CONFIG_SCx200_WDT)
+=
scx200_wdt.o
obj-$(CONFIG_60XX_WDT)
+=
sbc60xxwdt.o
obj-$(CONFIG_SBC8360_WDT)
+=
sbc8360.o
obj-$(CONFIG_CPU5_WDT)
+=
cpu5wdt.o
obj-$(CONFIG_W83627HF_WDT)
+=
w83627hf_wdt.o
obj-$(CONFIG_W83877F_WDT)
+=
w83877f_wdt.o
obj-$(CONFIG_W83977F_WDT)
+=
w83977f_wdt.o
obj-$(CONFIG_MACHZ_WDT)
+=
machzwd.o
# PowerPC Architecture
obj-$(CONFIG_8xx_WDT)
+=
mpc8xx_wdt.o
obj-$(CONFIG_MV64X60_WDT)
+=
mv64x60_wdt.o
obj-$(CONFIG_BOOKE_WDT)
+=
booke_wdt.o
# PPC64 Architecture
obj-$(CONFIG_WATCHDOG_RTAS)
+=
wdrtas.o
obj-$(CONFIG_BOOKE_WDT)
+=
booke_wdt.o
# MIPS Architecture
obj-$(CONFIG_INDYDOG)
+=
indydog.o
...
...
drivers/char/watchdog/i6300esb.c
0 → 100644
View file @
a8cd2e50
This diff is collapsed.
Click to expand it.
drivers/char/watchdog/ibmasr.c
0 → 100644
View file @
a8cd2e50
/*
* IBM Automatic Server Restart driver.
*
* Copyright (c) 2005 Andrey Panin <pazke@donpac.ru>
*
* Based on driver written by Pete Reynolds.
* Copyright (c) IBM Corporation, 1998-2004.
*
* This software may be used and distributed according to the terms
* of the GNU Public License, incorporated herein by reference.
*/
#include <linux/config.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/timer.h>
#include <linux/miscdevice.h>
#include <linux/watchdog.h>
#include <linux/dmi.h>
#include <asm/io.h>
#include <asm/uaccess.h>
enum
{
ASMTYPE_UNKNOWN
,
ASMTYPE_TOPAZ
,
ASMTYPE_JASPER
,
ASMTYPE_PEARL
,
ASMTYPE_JUNIPER
,
ASMTYPE_SPRUCE
,
};
#define PFX "ibmasr: "
#define TOPAZ_ASR_REG_OFFSET 4
#define TOPAZ_ASR_TOGGLE 0x40
#define TOPAZ_ASR_DISABLE 0x80
/* PEARL ASR S/W REGISTER SUPERIO PORT ADDRESSES */
#define PEARL_BASE 0xe04
#define PEARL_WRITE 0xe06
#define PEARL_READ 0xe07
#define PEARL_ASR_DISABLE_MASK 0x80
/* bit 7: disable = 1, enable = 0 */
#define PEARL_ASR_TOGGLE_MASK 0x40
/* bit 6: 0, then 1, then 0 */
/* JASPER OFFSET FROM SIO BASE ADDR TO ASR S/W REGISTERS. */
#define JASPER_ASR_REG_OFFSET 0x38
#define JASPER_ASR_DISABLE_MASK 0x01
/* bit 0: disable = 1, enable = 0 */
#define JASPER_ASR_TOGGLE_MASK 0x02
/* bit 1: 0, then 1, then 0 */
#define JUNIPER_BASE_ADDRESS 0x54b
/* Base address of Juniper ASR */
#define JUNIPER_ASR_DISABLE_MASK 0x01
/* bit 0: disable = 1 enable = 0 */
#define JUNIPER_ASR_TOGGLE_MASK 0x02
/* bit 1: 0, then 1, then 0 */
#define SPRUCE_BASE_ADDRESS 0x118e
/* Base address of Spruce ASR */
#define SPRUCE_ASR_DISABLE_MASK 0x01
/* bit 1: disable = 1 enable = 0 */
#define SPRUCE_ASR_TOGGLE_MASK 0x02
/* bit 0: 0, then 1, then 0 */
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
static
unsigned
long
asr_is_open
;
static
char
asr_expect_close
;
static
unsigned
int
asr_type
,
asr_base
,
asr_length
;
static
unsigned
int
asr_read_addr
,
asr_write_addr
;
static
unsigned
char
asr_toggle_mask
,
asr_disable_mask
;
static
void
asr_toggle
(
void
)
{
unsigned
char
reg
=
inb
(
asr_read_addr
);
outb
(
reg
&
~
asr_toggle_mask
,
asr_write_addr
);
reg
=
inb
(
asr_read_addr
);
outb
(
reg
|
asr_toggle_mask
,
asr_write_addr
);
reg
=
inb
(
asr_read_addr
);
outb
(
reg
&
~
asr_toggle_mask
,
asr_write_addr
);
reg
=
inb
(
asr_read_addr
);
}
static
void
asr_enable
(
void
)
{
unsigned
char
reg
;
if
(
asr_type
==
ASMTYPE_TOPAZ
)
{
/* asr_write_addr == asr_read_addr */
reg
=
inb
(
asr_read_addr
);
outb
(
reg
&
~
(
TOPAZ_ASR_TOGGLE
|
TOPAZ_ASR_DISABLE
),
asr_read_addr
);
}
else
{
/*
* First make sure the hardware timer is reset by toggling
* ASR hardware timer line.
*/
asr_toggle
();
reg
=
inb
(
asr_read_addr
);
outb
(
reg
&
~
asr_disable_mask
,
asr_write_addr
);
}
reg
=
inb
(
asr_read_addr
);
}
static
void
asr_disable
(
void
)
{
unsigned
char
reg
=
inb
(
asr_read_addr
);
if
(
asr_type
==
ASMTYPE_TOPAZ
)
/* asr_write_addr == asr_read_addr */
outb
(
reg
|
TOPAZ_ASR_TOGGLE
|
TOPAZ_ASR_DISABLE
,
asr_read_addr
);
else
{
outb
(
reg
|
asr_toggle_mask
,
asr_write_addr
);
reg
=
inb
(
asr_read_addr
);
outb
(
reg
|
asr_disable_mask
,
asr_write_addr
);
}
reg
=
inb
(
asr_read_addr
);
}
static
int
__init
asr_get_base_address
(
void
)
{
unsigned
char
low
,
high
;
const
char
*
type
=
""
;
asr_length
=
1
;
switch
(
asr_type
)
{
case
ASMTYPE_TOPAZ
:
/* SELECT SuperIO CHIP FOR QUERYING (WRITE 0x07 TO BOTH 0x2E and 0x2F) */
outb
(
0x07
,
0x2e
);
outb
(
0x07
,
0x2f
);
/* SELECT AND READ THE HIGH-NIBBLE OF THE GPIO BASE ADDRESS */
outb
(
0x60
,
0x2e
);
high
=
inb
(
0x2f
);
/* SELECT AND READ THE LOW-NIBBLE OF THE GPIO BASE ADDRESS */
outb
(
0x61
,
0x2e
);
low
=
inb
(
0x2f
);
asr_base
=
(
high
<<
16
)
|
low
;
asr_read_addr
=
asr_write_addr
=
asr_base
+
TOPAZ_ASR_REG_OFFSET
;
asr_length
=
5
;
break
;
case
ASMTYPE_JASPER
:
type
=
"Jaspers "
;
/* FIXME: need to use pci_config_lock here, but it's not exported */
/* spin_lock_irqsave(&pci_config_lock, flags);*/
/* Select the SuperIO chip in the PCI I/O port register */
outl
(
0x8000f858
,
0xcf8
);
/*
* Read the base address for the SuperIO chip.
* Only the lower 16 bits are valid, but the address is word
* aligned so the last bit must be masked off.
*/
asr_base
=
inl
(
0xcfc
)
&
0xfffe
;
/* spin_unlock_irqrestore(&pci_config_lock, flags);*/
asr_read_addr
=
asr_write_addr
=
asr_base
+
JASPER_ASR_REG_OFFSET
;
asr_toggle_mask
=
JASPER_ASR_TOGGLE_MASK
;
asr_disable_mask
=
JASPER_ASR_DISABLE_MASK
;
asr_length
=
JASPER_ASR_REG_OFFSET
+
1
;
break
;
case
ASMTYPE_PEARL
:
type
=
"Pearls "
;
asr_base
=
PEARL_BASE
;
asr_read_addr
=
PEARL_READ
;
asr_write_addr
=
PEARL_WRITE
;
asr_toggle_mask
=
PEARL_ASR_TOGGLE_MASK
;
asr_disable_mask
=
PEARL_ASR_DISABLE_MASK
;
asr_length
=
4
;
break
;
case
ASMTYPE_JUNIPER
:
type
=
"Junipers "
;
asr_base
=
JUNIPER_BASE_ADDRESS
;
asr_read_addr
=
asr_write_addr
=
asr_base
;
asr_toggle_mask
=
JUNIPER_ASR_TOGGLE_MASK
;
asr_disable_mask
=
JUNIPER_ASR_DISABLE_MASK
;
break
;
case
ASMTYPE_SPRUCE
:
type
=
"Spruce's "
;
asr_base
=
SPRUCE_BASE_ADDRESS
;
asr_read_addr
=
asr_write_addr
=
asr_base
;
asr_toggle_mask
=
SPRUCE_ASR_TOGGLE_MASK
;
asr_disable_mask
=
SPRUCE_ASR_DISABLE_MASK
;
break
;
}
if
(
!
request_region
(
asr_base
,
asr_length
,
"ibmasr"
))
{
printk
(
KERN_ERR
PFX
"address %#x already in use
\n
"
,
asr_base
);
return
-
EBUSY
;
}
printk
(
KERN_INFO
PFX
"found %sASR @ addr %#x
\n
"
,
type
,
asr_base
);
return
0
;
}
static
ssize_t
asr_write
(
struct
file
*
file
,
const
char
__user
*
buf
,
size_t
count
,
loff_t
*
ppos
)
{
if
(
count
)
{
if
(
!
nowayout
)
{
size_t
i
;
/* In case it was set long ago */
asr_expect_close
=
0
;
for
(
i
=
0
;
i
!=
count
;
i
++
)
{
char
c
;
if
(
get_user
(
c
,
buf
+
i
))
return
-
EFAULT
;
if
(
c
==
'V'
)
asr_expect_close
=
42
;
}
}
asr_toggle
();
}
return
count
;
}
static
int
asr_ioctl
(
struct
inode
*
inode
,
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
static
const
struct
watchdog_info
ident
=
{
.
options
=
WDIOF_KEEPALIVEPING
|
WDIOF_MAGICCLOSE
,
.
identity
=
"IBM ASR"
};
void
__user
*
argp
=
(
void
__user
*
)
arg
;
int
__user
*
p
=
argp
;
int
heartbeat
;
switch
(
cmd
)
{
case
WDIOC_GETSUPPORT
:
return
copy_to_user
(
argp
,
&
ident
,
sizeof
(
ident
))
?
-
EFAULT
:
0
;
case
WDIOC_GETSTATUS
:
case
WDIOC_GETBOOTSTATUS
:
return
put_user
(
0
,
p
);
case
WDIOC_KEEPALIVE
:
asr_toggle
();
return
0
;
/*
* The hardware has a fixed timeout value, so no WDIOC_SETTIMEOUT
* and WDIOC_GETTIMEOUT always returns 256.
*/
case
WDIOC_GETTIMEOUT
:
heartbeat
=
256
;
return
put_user
(
heartbeat
,
p
);
case
WDIOC_SETOPTIONS
:
{
int
new_options
,
retval
=
-
EINVAL
;
if
(
get_user
(
new_options
,
p
))
return
-
EFAULT
;
if
(
new_options
&
WDIOS_DISABLECARD
)
{
asr_disable
();
retval
=
0
;
}
if
(
new_options
&
WDIOS_ENABLECARD
)
{
asr_enable
();
asr_toggle
();
retval
=
0
;
}
return
retval
;
}
}
return
-
ENOIOCTLCMD
;
}
static
int
asr_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
if
(
test_and_set_bit
(
0
,
&
asr_is_open
))
return
-
EBUSY
;
asr_toggle
();
asr_enable
();
return
nonseekable_open
(
inode
,
file
);
}
static
int
asr_release
(
struct
inode
*
inode
,
struct
file
*
file
)
{
if
(
asr_expect_close
==
42
)
asr_disable
();
else
{
printk
(
KERN_CRIT
PFX
"unexpected close, not stopping watchdog!
\n
"
);
asr_toggle
();
}
clear_bit
(
0
,
&
asr_is_open
);
asr_expect_close
=
0
;
return
0
;
}
static
struct
file_operations
asr_fops
=
{
.
owner
=
THIS_MODULE
,
.
llseek
=
no_llseek
,
.
write
=
asr_write
,
.
ioctl
=
asr_ioctl
,
.
open
=
asr_open
,
.
release
=
asr_release
,
};
static
struct
miscdevice
asr_miscdev
=
{
.
minor
=
WATCHDOG_MINOR
,
.
name
=
"watchdog"
,
.
fops
=
&
asr_fops
,
};
struct
ibmasr_id
{
const
char
*
desc
;
int
type
;
};
static
struct
ibmasr_id
__initdata
ibmasr_id_table
[]
=
{
{
"IBM Automatic Server Restart - eserver xSeries 220"
,
ASMTYPE_TOPAZ
},
{
"IBM Automatic Server Restart - Machine Type 8673"
,
ASMTYPE_PEARL
},
{
"IBM Automatic Server Restart - Machine Type 8480"
,
ASMTYPE_JASPER
},
{
"IBM Automatic Server Restart - Machine Type 8482"
,
ASMTYPE_JUNIPER
},
{
"IBM Automatic Server Restart - Machine Type 8648"
,
ASMTYPE_SPRUCE
},
{
NULL
}
};
static
int
__init
ibmasr_init
(
void
)
{
struct
ibmasr_id
*
id
;
int
rc
;
for
(
id
=
ibmasr_id_table
;
id
->
desc
;
id
++
)
{
if
(
dmi_find_device
(
DMI_DEV_TYPE_OTHER
,
id
->
desc
,
NULL
))
{
asr_type
=
id
->
type
;
break
;
}
}
if
(
!
asr_type
)
return
-
ENODEV
;
rc
=
misc_register
(
&
asr_miscdev
);
if
(
rc
<
0
)
{
printk
(
KERN_ERR
PFX
"failed to register misc device
\n
"
);
return
rc
;
}
rc
=
asr_get_base_address
();
if
(
rc
)
{
misc_deregister
(
&
asr_miscdev
);
return
rc
;
}
return
0
;
}
static
void
__exit
ibmasr_exit
(
void
)
{
if
(
!
nowayout
)
asr_disable
();
misc_deregister
(
&
asr_miscdev
);
release_region
(
asr_base
,
asr_length
);
}
module_init
(
ibmasr_init
);
module_exit
(
ibmasr_exit
);
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)"
);
MODULE_DESCRIPTION
(
"IBM Automatic Server Restart driver"
);
MODULE_AUTHOR
(
"Andrey Panin"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_ALIAS_MISCDEV
(
WATCHDOG_MINOR
);
drivers/char/watchdog/mv64x60_wdt.c
0 → 100644
View file @
a8cd2e50
/*
* mv64x60_wdt.c - MV64X60 (Marvell Discovery) watchdog userspace interface
*
* Author: James Chapman <jchapman@katalix.com>
*
* Platform-specific setup code should configure the dog to generate
* interrupt or reset as required. This code only enables/disables
* and services the watchdog.
*
* Derived from mpc8xx_wdt.c, with the following copyright.
*
* 2002 (c) Florian Schirmer <jolt@tuxbox.org> This file is licensed under
* the terms of the GNU General Public License version 2. This program
* is licensed "as is" without any warranty of any kind, whether express
* or implied.
*/
#include <linux/config.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/miscdevice.h>
#include <linux/module.h>
#include <linux/watchdog.h>
#include <asm/mv64x60.h>
#include <asm/uaccess.h>
#include <asm/io.h>
/* MV64x60 WDC (config) register access definitions */
#define MV64x60_WDC_CTL1_MASK (3 << 24)
#define MV64x60_WDC_CTL1(val) ((val & 3) << 24)
#define MV64x60_WDC_CTL2_MASK (3 << 26)
#define MV64x60_WDC_CTL2(val) ((val & 3) << 26)
/* Flags bits */
#define MV64x60_WDOG_FLAG_OPENED 0
#define MV64x60_WDOG_FLAG_ENABLED 1
static
unsigned
long
wdt_flags
;
static
int
wdt_status
;
static
void
__iomem
*
mv64x60_regs
;
static
int
mv64x60_wdt_timeout
;
static
void
mv64x60_wdt_reg_write
(
u32
val
)
{
/* Allow write only to CTL1 / CTL2 fields, retaining values in
* other fields.
*/
u32
data
=
readl
(
mv64x60_regs
+
MV64x60_WDT_WDC
);
data
&=
~
(
MV64x60_WDC_CTL1_MASK
|
MV64x60_WDC_CTL2_MASK
);
data
|=
val
;
writel
(
data
,
mv64x60_regs
+
MV64x60_WDT_WDC
);
}
static
void
mv64x60_wdt_service
(
void
)
{
/* Write 01 followed by 10 to CTL2 */
mv64x60_wdt_reg_write
(
MV64x60_WDC_CTL2
(
0x01
));
mv64x60_wdt_reg_write
(
MV64x60_WDC_CTL2
(
0x02
));
}
static
void
mv64x60_wdt_handler_disable
(
void
)
{
if
(
test_and_clear_bit
(
MV64x60_WDOG_FLAG_ENABLED
,
&
wdt_flags
))
{
/* Write 01 followed by 10 to CTL1 */
mv64x60_wdt_reg_write
(
MV64x60_WDC_CTL1
(
0x01
));
mv64x60_wdt_reg_write
(
MV64x60_WDC_CTL1
(
0x02
));
printk
(
KERN_NOTICE
"mv64x60_wdt: watchdog deactivated
\n
"
);
}
}
static
void
mv64x60_wdt_handler_enable
(
void
)
{
if
(
!
test_and_set_bit
(
MV64x60_WDOG_FLAG_ENABLED
,
&
wdt_flags
))
{
/* Write 01 followed by 10 to CTL1 */
mv64x60_wdt_reg_write
(
MV64x60_WDC_CTL1
(
0x01
));
mv64x60_wdt_reg_write
(
MV64x60_WDC_CTL1
(
0x02
));
printk
(
KERN_NOTICE
"mv64x60_wdt: watchdog activated
\n
"
);
}
}
static
int
mv64x60_wdt_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
if
(
test_and_set_bit
(
MV64x60_WDOG_FLAG_OPENED
,
&
wdt_flags
))
return
-
EBUSY
;
mv64x60_wdt_service
();
mv64x60_wdt_handler_enable
();
return
0
;
}
static
int
mv64x60_wdt_release
(
struct
inode
*
inode
,
struct
file
*
file
)
{
mv64x60_wdt_service
();
#if !defined(CONFIG_WATCHDOG_NOWAYOUT)
mv64x60_wdt_handler_disable
();
#endif
clear_bit
(
MV64x60_WDOG_FLAG_OPENED
,
&
wdt_flags
);
return
0
;
}
static
ssize_t
mv64x60_wdt_write
(
struct
file
*
file
,
const
char
*
data
,
size_t
len
,
loff_t
*
ppos
)
{
if
(
*
ppos
!=
file
->
f_pos
)
return
-
ESPIPE
;
if
(
len
)
mv64x60_wdt_service
();
return
len
;
}
static
int
mv64x60_wdt_ioctl
(
struct
inode
*
inode
,
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
int
timeout
;
static
struct
watchdog_info
info
=
{
.
options
=
WDIOF_KEEPALIVEPING
,
.
firmware_version
=
0
,
.
identity
=
"MV64x60 watchdog"
,
};
switch
(
cmd
)
{
case
WDIOC_GETSUPPORT
:
if
(
copy_to_user
((
void
*
)
arg
,
&
info
,
sizeof
(
info
)))
return
-
EFAULT
;
break
;
case
WDIOC_GETSTATUS
:
case
WDIOC_GETBOOTSTATUS
:
if
(
put_user
(
wdt_status
,
(
int
*
)
arg
))
return
-
EFAULT
;
wdt_status
&=
~
WDIOF_KEEPALIVEPING
;
break
;
case
WDIOC_GETTEMP
:
return
-
EOPNOTSUPP
;
case
WDIOC_SETOPTIONS
:
return
-
EOPNOTSUPP
;
case
WDIOC_KEEPALIVE
:
mv64x60_wdt_service
();
wdt_status
|=
WDIOF_KEEPALIVEPING
;
break
;
case
WDIOC_SETTIMEOUT
:
return
-
EOPNOTSUPP
;
case
WDIOC_GETTIMEOUT
:
timeout
=
mv64x60_wdt_timeout
*
HZ
;
if
(
put_user
(
timeout
,
(
int
*
)
arg
))
return
-
EFAULT
;
break
;
default:
return
-
ENOIOCTLCMD
;
}
return
0
;
}
static
struct
file_operations
mv64x60_wdt_fops
=
{
.
owner
=
THIS_MODULE
,
.
llseek
=
no_llseek
,
.
write
=
mv64x60_wdt_write
,
.
ioctl
=
mv64x60_wdt_ioctl
,
.
open
=
mv64x60_wdt_open
,
.
release
=
mv64x60_wdt_release
,
};
static
struct
miscdevice
mv64x60_wdt_miscdev
=
{
.
minor
=
WATCHDOG_MINOR
,
.
name
=
"watchdog"
,
.
fops
=
&
mv64x60_wdt_fops
,
};
static
int
__devinit
mv64x60_wdt_probe
(
struct
device
*
dev
)
{
struct
platform_device
*
pd
=
to_platform_device
(
dev
);
struct
mv64x60_wdt_pdata
*
pdata
=
pd
->
dev
.
platform_data
;
int
bus_clk
=
133
;
mv64x60_wdt_timeout
=
10
;
if
(
pdata
)
{
mv64x60_wdt_timeout
=
pdata
->
timeout
;
bus_clk
=
pdata
->
bus_clk
;
}
mv64x60_regs
=
mv64x60_get_bridge_vbase
();
writel
((
mv64x60_wdt_timeout
*
(
bus_clk
*
1000000
))
>>
8
,
mv64x60_regs
+
MV64x60_WDT_WDC
);
return
misc_register
(
&
mv64x60_wdt_miscdev
);
}
static
int
__devexit
mv64x60_wdt_remove
(
struct
device
*
dev
)
{
misc_deregister
(
&
mv64x60_wdt_miscdev
);
mv64x60_wdt_service
();
mv64x60_wdt_handler_disable
();
return
0
;
}
static
struct
device_driver
mv64x60_wdt_driver
=
{
.
name
=
MV64x60_WDT_NAME
,
.
bus
=
&
platform_bus_type
,
.
probe
=
mv64x60_wdt_probe
,
.
remove
=
__devexit_p
(
mv64x60_wdt_remove
),
};
static
struct
platform_device
*
mv64x60_wdt_dev
;
static
int
__init
mv64x60_wdt_init
(
void
)
{
int
ret
;
printk
(
KERN_INFO
"MV64x60 watchdog driver
\n
"
);
mv64x60_wdt_dev
=
platform_device_register_simple
(
MV64x60_WDT_NAME
,
-
1
,
NULL
,
0
);
if
(
IS_ERR
(
mv64x60_wdt_dev
))
{
ret
=
PTR_ERR
(
mv64x60_wdt_dev
);
goto
out
;
}
ret
=
driver_register
(
&
mv64x60_wdt_driver
);
out:
return
ret
;
}
static
void
__exit
mv64x60_wdt_exit
(
void
)
{
driver_unregister
(
&
mv64x60_wdt_driver
);
platform_device_unregister
(
mv64x60_wdt_dev
);
}
module_init
(
mv64x60_wdt_init
);
module_exit
(
mv64x60_wdt_exit
);
MODULE_AUTHOR
(
"James Chapman <jchapman@katalix.com>"
);
MODULE_DESCRIPTION
(
"MV64x60 watchdog driver"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_ALIAS_MISCDEV
(
WATCHDOG_MINOR
);
drivers/char/watchdog/pcwd_pci.c
View file @
a8cd2e50
...
...
@@ -29,27 +29,29 @@
* Includes, defines, variables, module parameters, ...
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/miscdevice.h>
#include <linux/watchdog.h>
#include <linux/notifier.h>
#include <linux/reboot.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/pci.h>
#include <linux/ioport.h>
#include <linux/spinlock.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/config.h>
/* For CONFIG_WATCHDOG_NOWAYOUT/... */
#include <linux/module.h>
/* For module specific items */
#include <linux/moduleparam.h>
/* For new moduleparam's */
#include <linux/types.h>
/* For standard types (like size_t) */
#include <linux/errno.h>
/* For the -ENODEV/... values */
#include <linux/kernel.h>
/* For printk/panic/... */
#include <linux/delay.h>
/* For mdelay function */
#include <linux/miscdevice.h>
/* For MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR) */
#include <linux/watchdog.h>
/* For the watchdog specific items */
#include <linux/notifier.h>
/* For notifier support */
#include <linux/reboot.h>
/* For reboot_notifier stuff */
#include <linux/init.h>
/* For __init/__exit/... */
#include <linux/fs.h>
/* For file operations */
#include <linux/pci.h>
/* For pci functions */
#include <linux/ioport.h>
/* For io-port access */
#include <linux/spinlock.h>
/* For spin_lock/spin_unlock/... */
#include <asm/uaccess.h>
/* For copy_to_user/put_user/... */
#include <asm/io.h>
/* For inb/outb/... */
/* Module and version information */
#define WATCHDOG_VERSION "1.01"
#define WATCHDOG_DATE "
15 Mar
2005"
#define WATCHDOG_DATE "
02 Sep
2005"
#define WATCHDOG_DRIVER_NAME "PCI-PC Watchdog"
#define WATCHDOG_NAME "pcwd_pci"
#define PFX WATCHDOG_NAME ": "
...
...
@@ -335,12 +337,14 @@ static int pcipcwd_ioctl(struct inode *inode, struct file *file,
return
-
EFAULT
;
if
(
new_options
&
WDIOS_DISABLECARD
)
{
pcipcwd_stop
();
if
(
pcipcwd_stop
())
return
-
EIO
;
retval
=
0
;
}
if
(
new_options
&
WDIOS_ENABLECARD
)
{
pcipcwd_start
();
if
(
pcipcwd_start
())
return
-
EIO
;
retval
=
0
;
}
...
...
drivers/char/watchdog/s3c2410_wdt.c
View file @
a8cd2e50
...
...
@@ -464,7 +464,7 @@ static void s3c2410wdt_shutdown(struct device *dev)
static
unsigned
long
wtcon_save
;
static
unsigned
long
wtdat_save
;
static
int
s3c2410wdt_suspend
(
struct
device
*
dev
,
u32
state
,
u32
level
)
static
int
s3c2410wdt_suspend
(
struct
device
*
dev
,
pm_message_t
state
,
u32
level
)
{
if
(
level
==
SUSPEND_POWER_DOWN
)
{
/* Save watchdog state, and turn it off. */
...
...
drivers/char/watchdog/sbc8360.c
0 → 100644
View file @
a8cd2e50
This diff is collapsed.
Click to expand it.
drivers/char/watchdog/w83977f_wdt.c
0 → 100644
View file @
a8cd2e50
This diff is collapsed.
Click to expand it.
include/asm-ppc/mv64x60.h
View file @
a8cd2e50
...
...
@@ -119,6 +119,14 @@ extern spinlock_t mv64x60_lock;
#define MV64x60_64BIT_WIN_COUNT 24
/* Watchdog Platform Device, Driver Data */
#define MV64x60_WDT_NAME "wdt"
struct
mv64x60_wdt_pdata
{
int
timeout
;
/* watchdog expiry in seconds, default 10 */
int
bus_clk
;
/* bus clock in MHz, default 133 */
};
/*
* Define a structure that's used to pass in config information to the
* core routines.
...
...
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