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
Kirill Smelkov
linux
Commits
8c82da5e
Commit
8c82da5e
authored
Dec 09, 2009
by
Benjamin Herrenschmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge commit 'gcl/next' into next
parents
51badebd
6d535599
Changes
17
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
1609 additions
and
320 deletions
+1609
-320
Documentation/powerpc/dts-bindings/fsl/mpc5200.txt
Documentation/powerpc/dts-bindings/fsl/mpc5200.txt
+16
-1
arch/powerpc/include/asm/mpc52xx.h
arch/powerpc/include/asm/mpc52xx.h
+47
-0
arch/powerpc/kernel/io.c
arch/powerpc/kernel/io.c
+2
-2
arch/powerpc/platforms/52xx/Kconfig
arch/powerpc/platforms/52xx/Kconfig
+5
-0
arch/powerpc/platforms/52xx/Makefile
arch/powerpc/platforms/52xx/Makefile
+1
-0
arch/powerpc/platforms/52xx/mpc52xx_gpt.c
arch/powerpc/platforms/52xx/mpc52xx_gpt.c
+415
-13
arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c
arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c
+560
-0
drivers/mmc/host/of_mmc_spi.c
drivers/mmc/host/of_mmc_spi.c
+2
-0
drivers/spi/Kconfig
drivers/spi/Kconfig
+8
-0
drivers/spi/Makefile
drivers/spi/Makefile
+1
-0
drivers/spi/mpc52xx_psc_spi.c
drivers/spi/mpc52xx_psc_spi.c
+17
-8
drivers/spi/mpc52xx_spi.c
drivers/spi/mpc52xx_spi.c
+520
-0
drivers/spi/xilinx_spi.c
drivers/spi/xilinx_spi.c
+2
-1
drivers/watchdog/Kconfig
drivers/watchdog/Kconfig
+3
-1
drivers/watchdog/Makefile
drivers/watchdog/Makefile
+0
-1
drivers/watchdog/mpc5200_wdt.c
drivers/watchdog/mpc5200_wdt.c
+0
-293
include/linux/spi/mpc52xx_spi.h
include/linux/spi/mpc52xx_spi.h
+10
-0
No files found.
Documentation/powerpc/dts-bindings/fsl/mpc5200.txt
View file @
8c82da5e
...
...
@@ -103,7 +103,22 @@ fsl,mpc5200-gpt nodes
---------------------
On the mpc5200 and 5200b, GPT0 has a watchdog timer function. If the board
design supports the internal wdt, then the device node for GPT0 should
include the empty property 'fsl,has-wdt'.
include the empty property 'fsl,has-wdt'. Note that this does not activate
the watchdog. The timer will function as a GPT if the timer api is used, and
it will function as watchdog if the watchdog device is used. The watchdog
mode has priority over the gpt mode, i.e. if the watchdog is activated, any
gpt api call to this timer will fail with -EBUSY.
If you add the property
fsl,wdt-on-boot = <n>;
GPT0 will be marked as in-use watchdog, i.e. blocking every gpt access to it.
If n>0, the watchdog is started with a timeout of n seconds. If n=0, the
configuration of the watchdog is not touched. This is useful in two cases:
- just mark GPT0 as watchdog, blocking gpt accesses, and configure it later;
- do not touch a configuration assigned by the boot loader which supervises
the boot process itself.
The watchdog will respect the CONFIG_WATCHDOG_NOWAYOUT option.
An mpc5200-gpt can be used as a single line GPIO controller. To do so,
add the following properties to the gpt node:
...
...
arch/powerpc/include/asm/mpc52xx.h
View file @
8c82da5e
...
...
@@ -276,6 +276,53 @@ extern int mpc52xx_set_psc_clkdiv(int psc_id, int clkdiv);
extern
unsigned
int
mpc52xx_get_xtal_freq
(
struct
device_node
*
node
);
extern
void
mpc52xx_restart
(
char
*
cmd
);
/* mpc52xx_gpt.c */
struct
mpc52xx_gpt_priv
;
extern
struct
mpc52xx_gpt_priv
*
mpc52xx_gpt_from_irq
(
int
irq
);
extern
int
mpc52xx_gpt_start_timer
(
struct
mpc52xx_gpt_priv
*
gpt
,
u64
period
,
int
continuous
);
extern
u64
mpc52xx_gpt_timer_period
(
struct
mpc52xx_gpt_priv
*
gpt
);
extern
int
mpc52xx_gpt_stop_timer
(
struct
mpc52xx_gpt_priv
*
gpt
);
/* mpc52xx_lpbfifo.c */
#define MPC52XX_LPBFIFO_FLAG_READ (0)
#define MPC52XX_LPBFIFO_FLAG_WRITE (1<<0)
#define MPC52XX_LPBFIFO_FLAG_NO_INCREMENT (1<<1)
#define MPC52XX_LPBFIFO_FLAG_NO_DMA (1<<2)
#define MPC52XX_LPBFIFO_FLAG_POLL_DMA (1<<3)
struct
mpc52xx_lpbfifo_request
{
struct
list_head
list
;
/* localplus bus address */
unsigned
int
cs
;
size_t
offset
;
/* Memory address */
void
*
data
;
phys_addr_t
data_phys
;
/* Details of transfer */
size_t
size
;
size_t
pos
;
/* current position of transfer */
int
flags
;
/* What to do when finished */
void
(
*
callback
)(
struct
mpc52xx_lpbfifo_request
*
);
void
*
priv
;
/* Driver private data */
/* statistics */
int
irq_count
;
int
irq_ticks
;
u8
last_byte
;
int
buffer_not_done_cnt
;
};
extern
int
mpc52xx_lpbfifo_submit
(
struct
mpc52xx_lpbfifo_request
*
req
);
extern
void
mpc52xx_lpbfifo_abort
(
struct
mpc52xx_lpbfifo_request
*
req
);
extern
void
mpc52xx_lpbfifo_poll
(
void
);
/* mpc52xx_pic.c */
extern
void
mpc52xx_init_irq
(
void
);
extern
unsigned
int
mpc52xx_get_irq
(
void
);
...
...
arch/powerpc/kernel/io.c
View file @
8c82da5e
...
...
@@ -161,7 +161,7 @@ void _memcpy_fromio(void *dest, const volatile void __iomem *src,
dest
++
;
n
--
;
}
while
(
n
>
4
)
{
while
(
n
>
=
4
)
{
*
((
u32
*
)
dest
)
=
*
((
volatile
u32
*
)
vsrc
);
eieio
();
vsrc
+=
4
;
...
...
@@ -190,7 +190,7 @@ void _memcpy_toio(volatile void __iomem *dest, const void *src, unsigned long n)
vdest
++
;
n
--
;
}
while
(
n
>
4
)
{
while
(
n
>
=
4
)
{
*
((
volatile
u32
*
)
vdest
)
=
*
((
volatile
u32
*
)
src
);
src
+=
4
;
vdest
+=
4
;
...
...
arch/powerpc/platforms/52xx/Kconfig
View file @
8c82da5e
...
...
@@ -62,3 +62,8 @@ config PPC_MPC5200_GPIO
select GENERIC_GPIO
help
Enable gpiolib support for mpc5200 based boards
config PPC_MPC5200_LPBFIFO
tristate "MPC5200 LocalPlus bus FIFO driver"
depends on PPC_MPC52xx
select PPC_BESTCOMM_GEN_BD
arch/powerpc/platforms/52xx/Makefile
View file @
8c82da5e
...
...
@@ -15,3 +15,4 @@ ifeq ($(CONFIG_PPC_LITE5200),y)
endif
obj-$(CONFIG_PPC_MPC5200_GPIO)
+=
mpc52xx_gpio.o
obj-$(CONFIG_PPC_MPC5200_LPBFIFO)
+=
mpc52xx_lpbfifo.o
arch/powerpc/platforms/52xx/mpc52xx_gpt.c
View file @
8c82da5e
This diff is collapsed.
Click to expand it.
arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c
0 → 100644
View file @
8c82da5e
This diff is collapsed.
Click to expand it.
drivers/mmc/host/of_mmc_spi.c
View file @
8c82da5e
...
...
@@ -22,6 +22,8 @@
#include <linux/mmc/core.h>
#include <linux/mmc/host.h>
MODULE_LICENSE
(
"GPL"
);
enum
{
CD_GPIO
=
0
,
WP_GPIO
,
...
...
drivers/spi/Kconfig
View file @
8c82da5e
...
...
@@ -133,6 +133,14 @@ config SPI_LM70_LLP
which interfaces to an LM70 temperature sensor using
a parallel port.
config SPI_MPC52xx
tristate "Freescale MPC52xx SPI (non-PSC) controller support"
depends on PPC_MPC52xx && SPI
select SPI_MASTER_OF
help
This drivers supports the MPC52xx SPI controller in master SPI
mode.
config SPI_MPC52xx_PSC
tristate "Freescale MPC52xx PSC SPI controller"
depends on PPC_MPC52xx && EXPERIMENTAL
...
...
drivers/spi/Makefile
View file @
8c82da5e
...
...
@@ -25,6 +25,7 @@ obj-$(CONFIG_SPI_OMAP24XX) += omap2_mcspi.o
obj-$(CONFIG_SPI_ORION)
+=
orion_spi.o
obj-$(CONFIG_SPI_PL022)
+=
amba-pl022.o
obj-$(CONFIG_SPI_MPC52xx_PSC)
+=
mpc52xx_psc_spi.o
obj-$(CONFIG_SPI_MPC52xx)
+=
mpc52xx_spi.o
obj-$(CONFIG_SPI_MPC8xxx)
+=
spi_mpc8xxx.o
obj-$(CONFIG_SPI_PPC4xx)
+=
spi_ppc4xx.o
obj-$(CONFIG_SPI_S3C24XX_GPIO)
+=
spi_s3c24xx_gpio.o
...
...
drivers/spi/mpc52xx_psc_spi.c
View file @
8c82da5e
...
...
@@ -17,6 +17,7 @@
#include <linux/errno.h>
#include <linux/interrupt.h>
#include <linux/of_platform.h>
#include <linux/of_spi.h>
#include <linux/workqueue.h>
#include <linux/completion.h>
#include <linux/io.h>
...
...
@@ -313,11 +314,13 @@ static int mpc52xx_psc_spi_port_config(int psc_id, struct mpc52xx_psc_spi *mps)
struct
mpc52xx_psc
__iomem
*
psc
=
mps
->
psc
;
struct
mpc52xx_psc_fifo
__iomem
*
fifo
=
mps
->
fifo
;
u32
mclken_div
;
int
ret
=
0
;
int
ret
;
/* default sysclk is 512MHz */
mclken_div
=
(
mps
->
sysclk
?
mps
->
sysclk
:
512000000
)
/
MCLK
;
mpc52xx_set_psc_clkdiv
(
psc_id
,
mclken_div
);
ret
=
mpc52xx_set_psc_clkdiv
(
psc_id
,
mclken_div
);
if
(
ret
)
return
ret
;
/* Reset the PSC into a known state */
out_8
(
&
psc
->
command
,
MPC52xx_PSC_RST_RX
);
...
...
@@ -341,7 +344,7 @@ static int mpc52xx_psc_spi_port_config(int psc_id, struct mpc52xx_psc_spi *mps)
mps
->
bits_per_word
=
8
;
return
ret
;
return
0
;
}
static
irqreturn_t
mpc52xx_psc_spi_isr
(
int
irq
,
void
*
dev_id
)
...
...
@@ -410,8 +413,10 @@ static int __init mpc52xx_psc_spi_do_probe(struct device *dev, u32 regaddr,
goto
free_master
;
ret
=
mpc52xx_psc_spi_port_config
(
master
->
bus_num
,
mps
);
if
(
ret
<
0
)
if
(
ret
<
0
)
{
dev_err
(
dev
,
"can't configure PSC! Is it capable of SPI?
\n
"
);
goto
free_irq
;
}
spin_lock_init
(
&
mps
->
lock
);
init_completion
(
&
mps
->
done
);
...
...
@@ -464,10 +469,11 @@ static int __init mpc52xx_psc_spi_of_probe(struct of_device *op,
const
u32
*
regaddr_p
;
u64
regaddr64
,
size64
;
s16
id
=
-
1
;
int
rc
;
regaddr_p
=
of_get_address
(
op
->
node
,
0
,
&
size64
,
NULL
);
if
(
!
regaddr_p
)
{
printk
(
KERN_ERR
"Invalid PSC address
\n
"
);
dev_err
(
&
op
->
dev
,
"Invalid PSC address
\n
"
);
return
-
EINVAL
;
}
regaddr64
=
of_translate_address
(
op
->
node
,
regaddr_p
);
...
...
@@ -478,15 +484,18 @@ static int __init mpc52xx_psc_spi_of_probe(struct of_device *op,
psc_nump
=
of_get_property
(
op
->
node
,
"cell-index"
,
NULL
);
if
(
!
psc_nump
||
*
psc_nump
>
5
)
{
printk
(
KERN_ERR
"mpc52xx_psc_spi: Device node %s has invalid "
"cell-index property
\n
"
,
op
->
node
->
full_name
);
dev_err
(
&
op
->
dev
,
"Invalid cell-index property
\n
"
);
return
-
EINVAL
;
}
id
=
*
psc_nump
+
1
;
}
r
eturn
mpc52xx_psc_spi_do_probe
(
&
op
->
dev
,
(
u32
)
regaddr64
,
(
u32
)
size64
,
r
c
=
mpc52xx_psc_spi_do_probe
(
&
op
->
dev
,
(
u32
)
regaddr64
,
(
u32
)
size64
,
irq_of_parse_and_map
(
op
->
node
,
0
),
id
);
if
(
rc
==
0
)
of_register_spi_devices
(
dev_get_drvdata
(
&
op
->
dev
),
op
->
node
);
return
rc
;
}
static
int
__exit
mpc52xx_psc_spi_of_remove
(
struct
of_device
*
op
)
...
...
drivers/spi/mpc52xx_spi.c
0 → 100644
View file @
8c82da5e
This diff is collapsed.
Click to expand it.
drivers/spi/xilinx_spi.c
View file @
8c82da5e
...
...
@@ -148,7 +148,8 @@ static int xilinx_spi_setup_transfer(struct spi_device *spi,
{
u8
bits_per_word
;
bits_per_word
=
(
t
)
?
t
->
bits_per_word
:
spi
->
bits_per_word
;
bits_per_word
=
(
t
&&
t
->
bits_per_word
)
?
t
->
bits_per_word
:
spi
->
bits_per_word
;
if
(
bits_per_word
!=
8
)
{
dev_err
(
&
spi
->
dev
,
"%s, unsupported bits_per_word=%d
\n
"
,
__func__
,
bits_per_word
);
...
...
drivers/watchdog/Kconfig
View file @
8c82da5e
...
...
@@ -861,8 +861,10 @@ config GEF_WDT
Watchdog timer found in a number of GE Fanuc single board computers.
config MPC5200_WDT
tristate "MPC5200
Watchdog Timer"
bool "MPC52xx
Watchdog Timer"
depends on PPC_MPC52xx
help
Use General Purpose Timer (GPT) 0 on the MPC5200 as Watchdog.
config 8xxx_WDT
tristate "MPC8xxx Platform Watchdog Timer"
...
...
drivers/watchdog/Makefile
View file @
8c82da5e
...
...
@@ -118,7 +118,6 @@ obj-$(CONFIG_TXX9_WDT) += txx9wdt.o
# POWERPC Architecture
obj-$(CONFIG_GEF_WDT)
+=
gef_wdt.o
obj-$(CONFIG_MPC5200_WDT)
+=
mpc5200_wdt.o
obj-$(CONFIG_8xxx_WDT)
+=
mpc8xxx_wdt.o
obj-$(CONFIG_MV64X60_WDT)
+=
mv64x60_wdt.o
obj-$(CONFIG_PIKA_WDT)
+=
pika_wdt.o
...
...
drivers/watchdog/mpc5200_wdt.c
deleted
100644 → 0
View file @
51badebd
#include <linux/init.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/watchdog.h>
#include <linux/io.h>
#include <linux/spinlock.h>
#include <linux/of_platform.h>
#include <linux/uaccess.h>
#include <asm/mpc52xx.h>
#define GPT_MODE_WDT (1 << 15)
#define GPT_MODE_CE (1 << 12)
#define GPT_MODE_MS_TIMER (0x4)
struct
mpc5200_wdt
{
unsigned
count
;
/* timer ticks before watchdog kicks in */
long
ipb_freq
;
struct
miscdevice
miscdev
;
struct
resource
mem
;
struct
mpc52xx_gpt
__iomem
*
regs
;
spinlock_t
io_lock
;
};
/* is_active stores wether or not the /dev/watchdog device is opened */
static
unsigned
long
is_active
;
/* misc devices don't provide a way, to get back to 'dev' or 'miscdev' from
* file operations, which sucks. But there can be max 1 watchdog anyway, so...
*/
static
struct
mpc5200_wdt
*
wdt_global
;
/* helper to calculate timeout in timer counts */
static
void
mpc5200_wdt_set_timeout
(
struct
mpc5200_wdt
*
wdt
,
int
timeout
)
{
/* use biggest prescaler of 64k */
wdt
->
count
=
(
wdt
->
ipb_freq
+
0xffff
)
/
0x10000
*
timeout
;
if
(
wdt
->
count
>
0xffff
)
wdt
->
count
=
0xffff
;
}
/* return timeout in seconds (calculated from timer count) */
static
int
mpc5200_wdt_get_timeout
(
struct
mpc5200_wdt
*
wdt
)
{
return
wdt
->
count
*
0x10000
/
wdt
->
ipb_freq
;
}
/* watchdog operations */
static
int
mpc5200_wdt_start
(
struct
mpc5200_wdt
*
wdt
)
{
spin_lock
(
&
wdt
->
io_lock
);
/* disable */
out_be32
(
&
wdt
->
regs
->
mode
,
0
);
/* set timeout, with maximum prescaler */
out_be32
(
&
wdt
->
regs
->
count
,
0x0
|
wdt
->
count
);
/* enable watchdog */
out_be32
(
&
wdt
->
regs
->
mode
,
GPT_MODE_CE
|
GPT_MODE_WDT
|
GPT_MODE_MS_TIMER
);
spin_unlock
(
&
wdt
->
io_lock
);
return
0
;
}
static
int
mpc5200_wdt_ping
(
struct
mpc5200_wdt
*
wdt
)
{
spin_lock
(
&
wdt
->
io_lock
);
/* writing A5 to OCPW resets the watchdog */
out_be32
(
&
wdt
->
regs
->
mode
,
0xA5000000
|
(
0xffffff
&
in_be32
(
&
wdt
->
regs
->
mode
)));
spin_unlock
(
&
wdt
->
io_lock
);
return
0
;
}
static
int
mpc5200_wdt_stop
(
struct
mpc5200_wdt
*
wdt
)
{
spin_lock
(
&
wdt
->
io_lock
);
/* disable */
out_be32
(
&
wdt
->
regs
->
mode
,
0
);
spin_unlock
(
&
wdt
->
io_lock
);
return
0
;
}
/* file operations */
static
ssize_t
mpc5200_wdt_write
(
struct
file
*
file
,
const
char
__user
*
data
,
size_t
len
,
loff_t
*
ppos
)
{
struct
mpc5200_wdt
*
wdt
=
file
->
private_data
;
mpc5200_wdt_ping
(
wdt
);
return
0
;
}
static
struct
watchdog_info
mpc5200_wdt_info
=
{
.
options
=
WDIOF_SETTIMEOUT
|
WDIOF_KEEPALIVEPING
,
.
identity
=
"mpc5200 watchdog on GPT0"
,
};
static
long
mpc5200_wdt_ioctl
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
struct
mpc5200_wdt
*
wdt
=
file
->
private_data
;
int
__user
*
data
=
(
int
__user
*
)
arg
;
int
timeout
;
int
ret
=
0
;
switch
(
cmd
)
{
case
WDIOC_GETSUPPORT
:
ret
=
copy_to_user
(
data
,
&
mpc5200_wdt_info
,
sizeof
(
mpc5200_wdt_info
));
if
(
ret
)
ret
=
-
EFAULT
;
break
;
case
WDIOC_GETSTATUS
:
case
WDIOC_GETBOOTSTATUS
:
ret
=
put_user
(
0
,
data
);
break
;
case
WDIOC_KEEPALIVE
:
mpc5200_wdt_ping
(
wdt
);
break
;
case
WDIOC_SETTIMEOUT
:
ret
=
get_user
(
timeout
,
data
);
if
(
ret
)
break
;
mpc5200_wdt_set_timeout
(
wdt
,
timeout
);
mpc5200_wdt_start
(
wdt
);
/* fall through and return the timeout */
case
WDIOC_GETTIMEOUT
:
timeout
=
mpc5200_wdt_get_timeout
(
wdt
);
ret
=
put_user
(
timeout
,
data
);
break
;
default:
ret
=
-
ENOTTY
;
}
return
ret
;
}
static
int
mpc5200_wdt_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
/* /dev/watchdog can only be opened once */
if
(
test_and_set_bit
(
0
,
&
is_active
))
return
-
EBUSY
;
/* Set and activate the watchdog */
mpc5200_wdt_set_timeout
(
wdt_global
,
30
);
mpc5200_wdt_start
(
wdt_global
);
file
->
private_data
=
wdt_global
;
return
nonseekable_open
(
inode
,
file
);
}
static
int
mpc5200_wdt_release
(
struct
inode
*
inode
,
struct
file
*
file
)
{
#if WATCHDOG_NOWAYOUT == 0
struct
mpc5200_wdt
*
wdt
=
file
->
private_data
;
mpc5200_wdt_stop
(
wdt
);
wdt
->
count
=
0
;
/* == disabled */
#endif
clear_bit
(
0
,
&
is_active
);
return
0
;
}
static
const
struct
file_operations
mpc5200_wdt_fops
=
{
.
owner
=
THIS_MODULE
,
.
write
=
mpc5200_wdt_write
,
.
unlocked_ioctl
=
mpc5200_wdt_ioctl
,
.
open
=
mpc5200_wdt_open
,
.
release
=
mpc5200_wdt_release
,
};
/* module operations */
static
int
mpc5200_wdt_probe
(
struct
of_device
*
op
,
const
struct
of_device_id
*
match
)
{
struct
mpc5200_wdt
*
wdt
;
int
err
;
const
void
*
has_wdt
;
int
size
;
has_wdt
=
of_get_property
(
op
->
node
,
"has-wdt"
,
NULL
);
if
(
!
has_wdt
)
has_wdt
=
of_get_property
(
op
->
node
,
"fsl,has-wdt"
,
NULL
);
if
(
!
has_wdt
)
return
-
ENODEV
;
wdt
=
kzalloc
(
sizeof
(
*
wdt
),
GFP_KERNEL
);
if
(
!
wdt
)
return
-
ENOMEM
;
wdt
->
ipb_freq
=
mpc5xxx_get_bus_frequency
(
op
->
node
);
err
=
of_address_to_resource
(
op
->
node
,
0
,
&
wdt
->
mem
);
if
(
err
)
goto
out_free
;
size
=
wdt
->
mem
.
end
-
wdt
->
mem
.
start
+
1
;
if
(
!
request_mem_region
(
wdt
->
mem
.
start
,
size
,
"mpc5200_wdt"
))
{
err
=
-
ENODEV
;
goto
out_free
;
}
wdt
->
regs
=
ioremap
(
wdt
->
mem
.
start
,
size
);
if
(
!
wdt
->
regs
)
{
err
=
-
ENODEV
;
goto
out_release
;
}
dev_set_drvdata
(
&
op
->
dev
,
wdt
);
spin_lock_init
(
&
wdt
->
io_lock
);
wdt
->
miscdev
=
(
struct
miscdevice
)
{
.
minor
=
WATCHDOG_MINOR
,
.
name
=
"watchdog"
,
.
fops
=
&
mpc5200_wdt_fops
,
.
parent
=
&
op
->
dev
,
};
wdt_global
=
wdt
;
err
=
misc_register
(
&
wdt
->
miscdev
);
if
(
!
err
)
return
0
;
iounmap
(
wdt
->
regs
);
out_release:
release_mem_region
(
wdt
->
mem
.
start
,
size
);
out_free:
kfree
(
wdt
);
return
err
;
}
static
int
mpc5200_wdt_remove
(
struct
of_device
*
op
)
{
struct
mpc5200_wdt
*
wdt
=
dev_get_drvdata
(
&
op
->
dev
);
mpc5200_wdt_stop
(
wdt
);
misc_deregister
(
&
wdt
->
miscdev
);
iounmap
(
wdt
->
regs
);
release_mem_region
(
wdt
->
mem
.
start
,
wdt
->
mem
.
end
-
wdt
->
mem
.
start
+
1
);
kfree
(
wdt
);
return
0
;
}
static
int
mpc5200_wdt_suspend
(
struct
of_device
*
op
,
pm_message_t
state
)
{
struct
mpc5200_wdt
*
wdt
=
dev_get_drvdata
(
&
op
->
dev
);
mpc5200_wdt_stop
(
wdt
);
return
0
;
}
static
int
mpc5200_wdt_resume
(
struct
of_device
*
op
)
{
struct
mpc5200_wdt
*
wdt
=
dev_get_drvdata
(
&
op
->
dev
);
if
(
wdt
->
count
)
mpc5200_wdt_start
(
wdt
);
return
0
;
}
static
int
mpc5200_wdt_shutdown
(
struct
of_device
*
op
)
{
struct
mpc5200_wdt
*
wdt
=
dev_get_drvdata
(
&
op
->
dev
);
mpc5200_wdt_stop
(
wdt
);
return
0
;
}
static
struct
of_device_id
mpc5200_wdt_match
[]
=
{
{
.
compatible
=
"mpc5200-gpt"
,
},
{
.
compatible
=
"fsl,mpc5200-gpt"
,
},
{},
};
static
struct
of_platform_driver
mpc5200_wdt_driver
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"mpc5200-gpt-wdt"
,
.
match_table
=
mpc5200_wdt_match
,
.
probe
=
mpc5200_wdt_probe
,
.
remove
=
mpc5200_wdt_remove
,
.
suspend
=
mpc5200_wdt_suspend
,
.
resume
=
mpc5200_wdt_resume
,
.
shutdown
=
mpc5200_wdt_shutdown
,
};
static
int
__init
mpc5200_wdt_init
(
void
)
{
return
of_register_platform_driver
(
&
mpc5200_wdt_driver
);
}
static
void
__exit
mpc5200_wdt_exit
(
void
)
{
of_unregister_platform_driver
(
&
mpc5200_wdt_driver
);
}
module_init
(
mpc5200_wdt_init
);
module_exit
(
mpc5200_wdt_exit
);
MODULE_AUTHOR
(
"Domen Puncer <domen.puncer@telargo.com>"
);
MODULE_LICENSE
(
"Dual BSD/GPL"
);
MODULE_ALIAS_MISCDEV
(
WATCHDOG_MINOR
);
include/linux/spi/mpc52xx_spi.h
0 → 100644
View file @
8c82da5e
#ifndef INCLUDE_MPC5200_SPI_H
#define INCLUDE_MPC5200_SPI_H
extern
void
mpc52xx_spi_set_premessage_hook
(
struct
spi_master
*
master
,
void
(
*
hook
)(
struct
spi_message
*
m
,
void
*
context
),
void
*
hook_context
);
#endif
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