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
87d31345
Commit
87d31345
authored
Feb 19, 2010
by
Benjamin Herrenschmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge commit 'gcl/next' into next
parents
e98efaf3
d24720a4
Changes
16
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
2522 additions
and
44 deletions
+2522
-44
Documentation/powerpc/dts-bindings/fsl/mpc5121-psc.txt
Documentation/powerpc/dts-bindings/fsl/mpc5121-psc.txt
+70
-0
Documentation/powerpc/dts-bindings/fsl/spi.txt
Documentation/powerpc/dts-bindings/fsl/spi.txt
+7
-0
arch/powerpc/boot/dts/mpc5121ads.dts
arch/powerpc/boot/dts/mpc5121ads.dts
+33
-22
arch/powerpc/configs/mpc512x_defconfig
arch/powerpc/configs/mpc512x_defconfig
+1694
-0
arch/powerpc/include/asm/mpc5121.h
arch/powerpc/include/asm/mpc5121.h
+24
-0
arch/powerpc/include/asm/mpc52xx_psc.h
arch/powerpc/include/asm/mpc52xx_psc.h
+4
-0
arch/powerpc/platforms/512x/clock.c
arch/powerpc/platforms/512x/clock.c
+1
-5
arch/powerpc/platforms/512x/mpc5121_ads.c
arch/powerpc/platforms/512x/mpc5121_ads.c
+2
-1
arch/powerpc/platforms/512x/mpc5121_generic.c
arch/powerpc/platforms/512x/mpc5121_generic.c
+2
-1
arch/powerpc/platforms/512x/mpc512x.h
arch/powerpc/platforms/512x/mpc512x.h
+3
-0
arch/powerpc/platforms/512x/mpc512x_shared.c
arch/powerpc/platforms/512x/mpc512x_shared.c
+43
-0
drivers/rtc/Kconfig
drivers/rtc/Kconfig
+10
-0
drivers/rtc/Makefile
drivers/rtc/Makefile
+1
-0
drivers/rtc/rtc-mpc5121.c
drivers/rtc/rtc-mpc5121.c
+387
-0
drivers/serial/mpc52xx_uart.c
drivers/serial/mpc52xx_uart.c
+236
-15
drivers/video/fsl-diu-fb.c
drivers/video/fsl-diu-fb.c
+5
-0
No files found.
Documentation/powerpc/dts-bindings/fsl/mpc5121-psc.txt
0 → 100644
View file @
87d31345
MPC5121 PSC Device Tree Bindings
PSC in UART mode
----------------
For PSC in UART mode the needed PSC serial devices
are specified by fsl,mpc5121-psc-uart nodes in the
fsl,mpc5121-immr SoC node. Additionally the PSC FIFO
Controller node fsl,mpc5121-psc-fifo is requered there:
fsl,mpc5121-psc-uart nodes
--------------------------
Required properties :
- compatible : Should contain "fsl,mpc5121-psc-uart" and "fsl,mpc5121-psc"
- cell-index : Index of the PSC in hardware
- reg : Offset and length of the register set for the PSC device
- interrupts : <a b> where a is the interrupt number of the
PSC FIFO Controller and b is a field that represents an
encoding of the sense and level information for the interrupt.
- interrupt-parent : the phandle for the interrupt controller that
services interrupts for this device.
Recommended properties :
- fsl,rx-fifo-size : the size of the RX fifo slice (a multiple of 4)
- fsl,tx-fifo-size : the size of the TX fifo slice (a multiple of 4)
fsl,mpc5121-psc-fifo node
-------------------------
Required properties :
- compatible : Should be "fsl,mpc5121-psc-fifo"
- reg : Offset and length of the register set for the PSC
FIFO Controller
- interrupts : <a b> where a is the interrupt number of the
PSC FIFO Controller and b is a field that represents an
encoding of the sense and level information for the interrupt.
- interrupt-parent : the phandle for the interrupt controller that
services interrupts for this device.
Example for a board using PSC0 and PSC1 devices in serial mode:
serial@11000 {
compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
cell-index = <0>;
reg = <0x11000 0x100>;
interrupts = <40 0x8>;
interrupt-parent = < &ipic >;
fsl,rx-fifo-size = <16>;
fsl,tx-fifo-size = <16>;
};
serial@11100 {
compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
cell-index = <1>;
reg = <0x11100 0x100>;
interrupts = <40 0x8>;
interrupt-parent = < &ipic >;
fsl,rx-fifo-size = <16>;
fsl,tx-fifo-size = <16>;
};
pscfifo@11f00 {
compatible = "fsl,mpc5121-psc-fifo";
reg = <0x11f00 0x100>;
interrupts = <40 0x8>;
interrupt-parent = < &ipic >;
};
Documentation/powerpc/dts-bindings/fsl/spi.txt
View file @
87d31345
...
...
@@ -13,6 +13,11 @@ Required properties:
- interrupt-parent : the phandle for the interrupt controller that
services interrupts for this device.
Optional properties:
- gpios : specifies the gpio pins to be used for chipselects.
The gpios will be referred to as reg = <index> in the SPI child nodes.
If unspecified, a single SPI device without a chip select can be used.
Example:
spi@4c0 {
cell-index = <0>;
...
...
@@ -21,4 +26,6 @@ Example:
interrupts = <82 0>;
interrupt-parent = <700>;
mode = "cpu";
gpios = <&gpio 18 1 // device reg=<0>
&gpio 19 1>; // device reg=<1>
};
arch/powerpc/boot/dts/mpc5121ads.dts
View file @
87d31345
...
...
@@ -62,17 +62,12 @@ nfc@40000000 {
interrupt
-
parent
=
<
&
ipic
>;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
1
>;
bank
-
width
=
<
1
>;
//
ADS
has
two
Hynix
512
MB
Nand
flash
chips
in
a
single
//
stacked
package
.
//
stacked
package
.
chips
=
<
2
>;
nand0
@
0
{
label
=
"nand0"
;
reg
=
<
0x00000000
0x02000000
>;
//
first
32
MB
of
chip
0
};
nand1
@
20000000
{
label
=
"nand1"
;
reg
=
<
0x20000000
0x02000000
>;
//
first
32
MB
of
chip
1
nand
@
0
{
label
=
"nand"
;
reg
=
<
0x00000000
0x40000000
>;
//
512
MB
+
512
MB
};
};
...
...
@@ -166,6 +161,11 @@ rtc@a00 { // Real time clock
interrupt-parent = < &ipic >;
};
reset@e00 { // Reset module
compatible = "fsl,mpc5121-reset";
reg = <0xe00 0x100>;
};
clock@f00 { // Clock control
compatible = "fsl,mpc5121-clock";
reg = <0xf00 0x100>;
...
...
@@ -185,17 +185,15 @@ gpio@1100 {
interrupt-parent = < &ipic >;
};
ms
can@1300 {
can@1300 {
compatible = "fsl,mpc5121-mscan";
cell-index = <0>;
interrupts = <12 0x8>;
interrupt-parent = < &ipic >;
reg = <0x1300 0x80>;
};
ms
can@1380 {
can@1380 {
compatible = "fsl,mpc5121-mscan";
cell-index = <1>;
interrupts = <13 0x8>;
interrupt-parent = < &ipic >;
reg = <0x1380 0x80>;
...
...
@@ -205,17 +203,31 @@ i2c@1700 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "fsl,mpc5121-i2c", "fsl-i2c";
cell-index = <0>;
reg = <0x1700 0x20>;
interrupts = <9 0x8>;
interrupt-parent = < &ipic >;
fsl,preserve-clocking;
hwmon@4a {
compatible = "adi,ad7414";
reg = <0x4a>;
};
eeprom@50 {
compatible = "at,24c32";
reg = <0x50>;
};
rtc@68 {
compatible = "stm,m41t62";
reg = <0x68>;
};
};
i2c@1720 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "fsl,mpc5121-i2c", "fsl-i2c";
cell-index = <1>;
reg = <0x1720 0x20>;
interrupts = <10 0x8>;
interrupt-parent = < &ipic >;
...
...
@@ -225,7 +237,6 @@ i2c@1740 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "fsl,mpc5121-i2c", "fsl-i2c";
cell-index = <2>;
reg = <0x1740 0x20>;
interrupts = <11 0x8>;
interrupt-parent = < &ipic >;
...
...
@@ -244,7 +255,7 @@ axe@2000 {
};
display@2100 {
compatible = "fsl,mpc5121-diu"
, "fsl-diu"
;
compatible = "fsl,mpc5121-diu";
reg = <0x2100 0x100>;
interrupts = <64 0x8>;
interrupt-parent = < &ipic >;
...
...
@@ -277,7 +288,7 @@ ethernet@2800 {
// USB1 using external ULPI PHY
//usb@3000 {
// compatible = "fsl,mpc5121-usb2-dr"
, "fsl-usb2-dr"
;
// compatible = "fsl,mpc5121-usb2-dr";
// reg = <0x3000 0x1000>;
// #address-cells = <1>;
// #size-cells = <0>;
...
...
@@ -285,12 +296,11 @@ ethernet@2800 {
// interrupts = <43 0x8>;
// dr_mode = "otg";
// phy_type = "ulpi";
// port1;
//};
// USB0 using internal UTMI PHY
usb@4000 {
compatible = "fsl,mpc5121-usb2-dr"
, "fsl-usb2-dr"
;
compatible = "fsl,mpc5121-usb2-dr";
reg = <0x4000 0x1000>;
#address-cells = <1>;
#size-cells = <0>;
...
...
@@ -298,7 +308,8 @@ usb@4000 {
interrupts = <44 0x8>;
dr_mode = "otg";
phy_type = "utmi_wide";
port0;
fsl,invert-drvvbus;
fsl,invert-pwr-fault;
};
// IO control
...
...
@@ -365,7 +376,7 @@ pscfifo@11f00 {
};
dma@14000 {
compatible = "fsl,mpc5121-dma
2
";
compatible = "fsl,mpc5121-dma";
reg = <0x14000 0x1800>;
interrupts = <65 0x8>;
interrupt-parent = < &ipic >;
...
...
arch/powerpc/configs/mpc512x_defconfig
0 → 100644
View file @
87d31345
This diff is collapsed.
Click to expand it.
arch/powerpc/include/asm/mpc5121.h
0 → 100644
View file @
87d31345
/*
* MPC5121 Prototypes and definitions
*
* This file is licensed under the terms of the GNU General Public
* License version 2.
*/
#ifndef __ASM_POWERPC_MPC5121_H__
#define __ASM_POWERPC_MPC5121_H__
/* MPC512x Reset module registers */
struct
mpc512x_reset_module
{
u32
rcwlr
;
/* Reset Configuration Word Low Register */
u32
rcwhr
;
/* Reset Configuration Word High Register */
u32
reserved1
;
u32
reserved2
;
u32
rsr
;
/* Reset Status Register */
u32
rmr
;
/* Reset Mode Register */
u32
rpr
;
/* Reset Protection Register */
u32
rcr
;
/* Reset Control Register */
u32
rcer
;
/* Reset Control Enable Register */
};
#endif
/* __ASM_POWERPC_MPC5121_H__ */
arch/powerpc/include/asm/mpc52xx_psc.h
View file @
87d31345
...
...
@@ -25,7 +25,11 @@
#include <asm/types.h>
/* Max number of PSCs */
#ifdef CONFIG_PPC_MPC512x
#define MPC52xx_PSC_MAXNUM 12
#else
#define MPC52xx_PSC_MAXNUM 6
#endif
/* Programmable Serial Controller (PSC) status register bits */
#define MPC52xx_PSC_SR_UNEX_RX 0x0001
...
...
arch/powerpc/platforms/512x/clock.c
View file @
87d31345
...
...
@@ -698,8 +698,7 @@ static struct clk_interface mpc5121_clk_functions = {
.
clk_get_parent
=
NULL
,
};
static
int
mpc5121_clk_init
(
void
)
int
__init
mpc5121_clk_init
(
void
)
{
struct
device_node
*
np
;
...
...
@@ -724,6 +723,3 @@ mpc5121_clk_init(void)
clk_functions
=
mpc5121_clk_functions
;
return
0
;
}
arch_initcall
(
mpc5121_clk_init
);
arch/powerpc/platforms/512x/mpc5121_ads.c
View file @
87d31345
...
...
@@ -64,8 +64,9 @@ define_machine(mpc5121_ads) {
.
name
=
"MPC5121 ADS"
,
.
probe
=
mpc5121_ads_probe
,
.
setup_arch
=
mpc5121_ads_setup_arch
,
.
init
=
mpc512x_
declare_of_platform_devices
,
.
init
=
mpc512x_
init
,
.
init_IRQ
=
mpc5121_ads_init_IRQ
,
.
get_irq
=
ipic_get_irq
,
.
calibrate_decr
=
generic_calibrate_decr
,
.
restart
=
mpc512x_restart
,
};
arch/powerpc/platforms/512x/mpc5121_generic.c
View file @
87d31345
...
...
@@ -51,8 +51,9 @@ static int __init mpc5121_generic_probe(void)
define_machine
(
mpc5121_generic
)
{
.
name
=
"MPC5121 generic"
,
.
probe
=
mpc5121_generic_probe
,
.
init
=
mpc512x_
declare_of_platform_devices
,
.
init
=
mpc512x_
init
,
.
init_IRQ
=
mpc512x_init_IRQ
,
.
get_irq
=
ipic_get_irq
,
.
calibrate_decr
=
generic_calibrate_decr
,
.
restart
=
mpc512x_restart
,
};
arch/powerpc/platforms/512x/mpc512x.h
View file @
87d31345
...
...
@@ -12,5 +12,8 @@
#ifndef __MPC512X_H__
#define __MPC512X_H__
extern
void
__init
mpc512x_init_IRQ
(
void
);
extern
void
__init
mpc512x_init
(
void
);
extern
int
__init
mpc5121_clk_init
(
void
);
void
__init
mpc512x_declare_of_platform_devices
(
void
);
extern
void
mpc512x_restart
(
char
*
cmd
);
#endif
/* __MPC512X_H__ */
arch/powerpc/platforms/512x/mpc512x_shared.c
View file @
87d31345
...
...
@@ -21,9 +21,38 @@
#include <asm/ipic.h>
#include <asm/prom.h>
#include <asm/time.h>
#include <asm/mpc5121.h>
#include "mpc512x.h"
static
struct
mpc512x_reset_module
__iomem
*
reset_module_base
;
static
void
__init
mpc512x_restart_init
(
void
)
{
struct
device_node
*
np
;
np
=
of_find_compatible_node
(
NULL
,
NULL
,
"fsl,mpc5121-reset"
);
if
(
!
np
)
return
;
reset_module_base
=
of_iomap
(
np
,
0
);
of_node_put
(
np
);
}
void
mpc512x_restart
(
char
*
cmd
)
{
if
(
reset_module_base
)
{
/* Enable software reset "RSTE" */
out_be32
(
&
reset_module_base
->
rpr
,
0x52535445
);
/* Set software hard reset */
out_be32
(
&
reset_module_base
->
rcr
,
0x2
);
}
else
{
pr_err
(
"Restart module not mapped.
\n
"
);
}
for
(;;)
;
}
void
__init
mpc512x_init_IRQ
(
void
)
{
struct
device_node
*
np
;
...
...
@@ -53,8 +82,22 @@ static struct of_device_id __initdata of_bus_ids[] = {
void
__init
mpc512x_declare_of_platform_devices
(
void
)
{
struct
device_node
*
np
;
if
(
of_platform_bus_probe
(
NULL
,
of_bus_ids
,
NULL
))
printk
(
KERN_ERR
__FILE__
": "
"Error while probing of_platform bus
\n
"
);
np
=
of_find_compatible_node
(
NULL
,
NULL
,
"fsl,mpc5121-nfc"
);
if
(
np
)
{
of_platform_device_create
(
np
,
NULL
,
NULL
);
of_node_put
(
np
);
}
}
void
__init
mpc512x_init
(
void
)
{
mpc512x_declare_of_platform_devices
();
mpc5121_clk_init
();
mpc512x_restart_init
();
}
drivers/rtc/Kconfig
View file @
87d31345
...
...
@@ -868,4 +868,14 @@ config RTC_DRV_MC13783
help
This enables support for the Freescale MC13783 PMIC RTC
config RTC_DRV_MPC5121
tristate "Freescale MPC5121 built-in RTC"
depends on PPC_MPC512x && RTC_CLASS
help
If you say yes here you will get support for the
built-in RTC MPC5121.
This driver can also be built as a module. If so, the module
will be called rtc-mpc5121.
endif # RTC_CLASS
drivers/rtc/Makefile
View file @
87d31345
...
...
@@ -55,6 +55,7 @@ obj-$(CONFIG_RTC_DRV_MAX6900) += rtc-max6900.o
obj-$(CONFIG_RTC_DRV_MAX6902)
+=
rtc-max6902.o
obj-$(CONFIG_RTC_DRV_MC13783)
+=
rtc-mc13783.o
obj-$(CONFIG_RTC_DRV_MSM6242)
+=
rtc-msm6242.o
obj-$(CONFIG_RTC_DRV_MPC5121)
+=
rtc-mpc5121.o
obj-$(CONFIG_RTC_DRV_MV)
+=
rtc-mv.o
obj-$(CONFIG_RTC_DRV_NUC900)
+=
rtc-nuc900.o
obj-$(CONFIG_RTC_DRV_OMAP)
+=
rtc-omap.o
...
...
drivers/rtc/rtc-mpc5121.c
0 → 100644
View file @
87d31345
/*
* Real-time clock driver for MPC5121
*
* Copyright 2007, Domen Puncer <domen.puncer@telargo.com>
* Copyright 2008, Freescale Semiconductor, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/rtc.h>
#include <linux/of_device.h>
#include <linux/of_platform.h>
#include <linux/io.h>
struct
mpc5121_rtc_regs
{
u8
set_time
;
/* RTC + 0x00 */
u8
hour_set
;
/* RTC + 0x01 */
u8
minute_set
;
/* RTC + 0x02 */
u8
second_set
;
/* RTC + 0x03 */
u8
set_date
;
/* RTC + 0x04 */
u8
month_set
;
/* RTC + 0x05 */
u8
weekday_set
;
/* RTC + 0x06 */
u8
date_set
;
/* RTC + 0x07 */
u8
write_sw
;
/* RTC + 0x08 */
u8
sw_set
;
/* RTC + 0x09 */
u16
year_set
;
/* RTC + 0x0a */
u8
alm_enable
;
/* RTC + 0x0c */
u8
alm_hour_set
;
/* RTC + 0x0d */
u8
alm_min_set
;
/* RTC + 0x0e */
u8
int_enable
;
/* RTC + 0x0f */
u8
reserved1
;
u8
hour
;
/* RTC + 0x11 */
u8
minute
;
/* RTC + 0x12 */
u8
second
;
/* RTC + 0x13 */
u8
month
;
/* RTC + 0x14 */
u8
wday_mday
;
/* RTC + 0x15 */
u16
year
;
/* RTC + 0x16 */
u8
int_alm
;
/* RTC + 0x18 */
u8
int_sw
;
/* RTC + 0x19 */
u8
alm_status
;
/* RTC + 0x1a */
u8
sw_minute
;
/* RTC + 0x1b */
u8
bus_error_1
;
/* RTC + 0x1c */
u8
int_day
;
/* RTC + 0x1d */
u8
int_min
;
/* RTC + 0x1e */
u8
int_sec
;
/* RTC + 0x1f */
/*
* target_time:
* intended to be used for hibernation but hibernation
* does not work on silicon rev 1.5 so use it for non-volatile
* storage of offset between the actual_time register and linux
* time
*/
u32
target_time
;
/* RTC + 0x20 */
/*
* actual_time:
* readonly time since VBAT_RTC was last connected
*/
u32
actual_time
;
/* RTC + 0x24 */
u32
keep_alive
;
/* RTC + 0x28 */
};
struct
mpc5121_rtc_data
{
unsigned
irq
;
unsigned
irq_periodic
;
struct
mpc5121_rtc_regs
__iomem
*
regs
;
struct
rtc_device
*
rtc
;
struct
rtc_wkalrm
wkalarm
;
};
/*
* Update second/minute/hour registers.
*
* This is just so alarm will work.
*/
static
void
mpc5121_rtc_update_smh
(
struct
mpc5121_rtc_regs
__iomem
*
regs
,
struct
rtc_time
*
tm
)
{
out_8
(
&
regs
->
second_set
,
tm
->
tm_sec
);
out_8
(
&
regs
->
minute_set
,
tm
->
tm_min
);
out_8
(
&
regs
->
hour_set
,
tm
->
tm_hour
);
/* set time sequence */
out_8
(
&
regs
->
set_time
,
0x1
);
out_8
(
&
regs
->
set_time
,
0x3
);
out_8
(
&
regs
->
set_time
,
0x1
);
out_8
(
&
regs
->
set_time
,
0x0
);
}
static
int
mpc5121_rtc_read_time
(
struct
device
*
dev
,
struct
rtc_time
*
tm
)
{
struct
mpc5121_rtc_data
*
rtc
=
dev_get_drvdata
(
dev
);
struct
mpc5121_rtc_regs
__iomem
*
regs
=
rtc
->
regs
;
unsigned
long
now
;
/*
* linux time is actual_time plus the offset saved in target_time
*/
now
=
in_be32
(
&
regs
->
actual_time
)
+
in_be32
(
&
regs
->
target_time
);
rtc_time_to_tm
(
now
,
tm
);
/*
* update second minute hour registers
* so alarms will work
*/
mpc5121_rtc_update_smh
(
regs
,
tm
);
return
rtc_valid_tm
(
tm
);
}
static
int
mpc5121_rtc_set_time
(
struct
device
*
dev
,
struct
rtc_time
*
tm
)
{
struct
mpc5121_rtc_data
*
rtc
=
dev_get_drvdata
(
dev
);
struct
mpc5121_rtc_regs
__iomem
*
regs
=
rtc
->
regs
;
int
ret
;
unsigned
long
now
;
/*
* The actual_time register is read only so we write the offset
* between it and linux time to the target_time register.
*/
ret
=
rtc_tm_to_time
(
tm
,
&
now
);
if
(
ret
==
0
)
out_be32
(
&
regs
->
target_time
,
now
-
in_be32
(
&
regs
->
actual_time
));
/*
* update second minute hour registers
* so alarms will work
*/
mpc5121_rtc_update_smh
(
regs
,
tm
);
return
0
;
}
static
int
mpc5121_rtc_read_alarm
(
struct
device
*
dev
,
struct
rtc_wkalrm
*
alarm
)
{
struct
mpc5121_rtc_data
*
rtc
=
dev_get_drvdata
(
dev
);
struct
mpc5121_rtc_regs
__iomem
*
regs
=
rtc
->
regs
;
*
alarm
=
rtc
->
wkalarm
;
alarm
->
pending
=
in_8
(
&
regs
->
alm_status
);
return
0
;
}
static
int
mpc5121_rtc_set_alarm
(
struct
device
*
dev
,
struct
rtc_wkalrm
*
alarm
)
{
struct
mpc5121_rtc_data
*
rtc
=
dev_get_drvdata
(
dev
);
struct
mpc5121_rtc_regs
__iomem
*
regs
=
rtc
->
regs
;
/*
* the alarm has no seconds so deal with it
*/
if
(
alarm
->
time
.
tm_sec
)
{
alarm
->
time
.
tm_sec
=
0
;
alarm
->
time
.
tm_min
++
;
if
(
alarm
->
time
.
tm_min
>=
60
)
{
alarm
->
time
.
tm_min
=
0
;
alarm
->
time
.
tm_hour
++
;
if
(
alarm
->
time
.
tm_hour
>=
24
)
alarm
->
time
.
tm_hour
=
0
;
}
}
alarm
->
time
.
tm_mday
=
-
1
;
alarm
->
time
.
tm_mon
=
-
1
;
alarm
->
time
.
tm_year
=
-
1
;
out_8
(
&
regs
->
alm_min_set
,
alarm
->
time
.
tm_min
);
out_8
(
&
regs
->
alm_hour_set
,
alarm
->
time
.
tm_hour
);
out_8
(
&
regs
->
alm_enable
,
alarm
->
enabled
);
rtc
->
wkalarm
=
*
alarm
;
return
0
;
}
static
irqreturn_t
mpc5121_rtc_handler
(
int
irq
,
void
*
dev
)
{
struct
mpc5121_rtc_data
*
rtc
=
dev_get_drvdata
((
struct
device
*
)
dev
);
struct
mpc5121_rtc_regs
__iomem
*
regs
=
rtc
->
regs
;
if
(
in_8
(
&
regs
->
int_alm
))
{
/* acknowledge and clear status */
out_8
(
&
regs
->
int_alm
,
1
);
out_8
(
&
regs
->
alm_status
,
1
);
rtc_update_irq
(
rtc
->
rtc
,
1
,
RTC_IRQF
|
RTC_AF
);
return
IRQ_HANDLED
;
}
return
IRQ_NONE
;
}
static
irqreturn_t
mpc5121_rtc_handler_upd
(
int
irq
,
void
*
dev
)
{
struct
mpc5121_rtc_data
*
rtc
=
dev_get_drvdata
((
struct
device
*
)
dev
);
struct
mpc5121_rtc_regs
__iomem
*
regs
=
rtc
->
regs
;
if
(
in_8
(
&
regs
->
int_sec
)
&&
(
in_8
(
&
regs
->
int_enable
)
&
0x1
))
{
/* acknowledge */
out_8
(
&
regs
->
int_sec
,
1
);
rtc_update_irq
(
rtc
->
rtc
,
1
,
RTC_IRQF
|
RTC_UF
);
return
IRQ_HANDLED
;
}
return
IRQ_NONE
;
}
static
int
mpc5121_rtc_alarm_irq_enable
(
struct
device
*
dev
,
unsigned
int
enabled
)
{
struct
mpc5121_rtc_data
*
rtc
=
dev_get_drvdata
(
dev
);
struct
mpc5121_rtc_regs
__iomem
*
regs
=
rtc
->
regs
;
int
val
;
if
(
enabled
)
val
=
1
;
else
val
=
0
;
out_8
(
&
regs
->
alm_enable
,
val
);
rtc
->
wkalarm
.
enabled
=
val
;
return
0
;
}
static
int
mpc5121_rtc_update_irq_enable
(
struct
device
*
dev
,
unsigned
int
enabled
)
{
struct
mpc5121_rtc_data
*
rtc
=
dev_get_drvdata
(
dev
);
struct
mpc5121_rtc_regs
__iomem
*
regs
=
rtc
->
regs
;
int
val
;
val
=
in_8
(
&
regs
->
int_enable
);
if
(
enabled
)
val
=
(
val
&
~
0x8
)
|
0x1
;
else
val
&=
~
0x1
;
out_8
(
&
regs
->
int_enable
,
val
);
return
0
;
}
static
const
struct
rtc_class_ops
mpc5121_rtc_ops
=
{
.
read_time
=
mpc5121_rtc_read_time
,
.
set_time
=
mpc5121_rtc_set_time
,
.
read_alarm
=
mpc5121_rtc_read_alarm
,
.
set_alarm
=
mpc5121_rtc_set_alarm
,
.
alarm_irq_enable
=
mpc5121_rtc_alarm_irq_enable
,
.
update_irq_enable
=
mpc5121_rtc_update_irq_enable
,
};
static
int
__devinit
mpc5121_rtc_probe
(
struct
of_device
*
op
,
const
struct
of_device_id
*
match
)
{
struct
mpc5121_rtc_data
*
rtc
;
int
err
=
0
;
u32
ka
;
rtc
=
kzalloc
(
sizeof
(
*
rtc
),
GFP_KERNEL
);
if
(
!
rtc
)
return
-
ENOMEM
;
rtc
->
regs
=
of_iomap
(
op
->
node
,
0
);
if
(
!
rtc
->
regs
)
{
dev_err
(
&
op
->
dev
,
"%s: couldn't map io space
\n
"
,
__func__
);
err
=
-
ENOSYS
;
goto
out_free
;
}
device_init_wakeup
(
&
op
->
dev
,
1
);
dev_set_drvdata
(
&
op
->
dev
,
rtc
);
rtc
->
irq
=
irq_of_parse_and_map
(
op
->
node
,
1
);
err
=
request_irq
(
rtc
->
irq
,
mpc5121_rtc_handler
,
IRQF_DISABLED
,
"mpc5121-rtc"
,
&
op
->
dev
);
if
(
err
)
{
dev_err
(
&
op
->
dev
,
"%s: could not request irq: %i
\n
"
,
__func__
,
rtc
->
irq
);
goto
out_dispose
;
}
rtc
->
irq_periodic
=
irq_of_parse_and_map
(
op
->
node
,
0
);
err
=
request_irq
(
rtc
->
irq_periodic
,
mpc5121_rtc_handler_upd
,
IRQF_DISABLED
,
"mpc5121-rtc_upd"
,
&
op
->
dev
);
if
(
err
)
{
dev_err
(
&
op
->
dev
,
"%s: could not request irq: %i
\n
"
,
__func__
,
rtc
->
irq_periodic
);
goto
out_dispose2
;
}
ka
=
in_be32
(
&
rtc
->
regs
->
keep_alive
);
if
(
ka
&
0x02
)
{
dev_warn
(
&
op
->
dev
,
"mpc5121-rtc: Battery or oscillator failure!
\n
"
);
out_be32
(
&
rtc
->
regs
->
keep_alive
,
ka
);
}
rtc
->
rtc
=
rtc_device_register
(
"mpc5121-rtc"
,
&
op
->
dev
,
&
mpc5121_rtc_ops
,
THIS_MODULE
);
if
(
IS_ERR
(
rtc
->
rtc
))
{
err
=
PTR_ERR
(
rtc
->
rtc
);
goto
out_free_irq
;
}
return
0
;
out_free_irq:
free_irq
(
rtc
->
irq_periodic
,
&
op
->
dev
);
out_dispose2:
irq_dispose_mapping
(
rtc
->
irq_periodic
);
free_irq
(
rtc
->
irq
,
&
op
->
dev
);
out_dispose:
irq_dispose_mapping
(
rtc
->
irq
);
iounmap
(
rtc
->
regs
);
out_free:
kfree
(
rtc
);
return
err
;
}
static
int
__devexit
mpc5121_rtc_remove
(
struct
of_device
*
op
)
{
struct
mpc5121_rtc_data
*
rtc
=
dev_get_drvdata
(
&
op
->
dev
);
struct
mpc5121_rtc_regs
__iomem
*
regs
=
rtc
->
regs
;
/* disable interrupt, so there are no nasty surprises */
out_8
(
&
regs
->
alm_enable
,
0
);
out_8
(
&
regs
->
int_enable
,
in_8
(
&
regs
->
int_enable
)
&
~
0x1
);
rtc_device_unregister
(
rtc
->
rtc
);
iounmap
(
rtc
->
regs
);
free_irq
(
rtc
->
irq
,
&
op
->
dev
);
free_irq
(
rtc
->
irq_periodic
,
&
op
->
dev
);
irq_dispose_mapping
(
rtc
->
irq
);
irq_dispose_mapping
(
rtc
->
irq_periodic
);
dev_set_drvdata
(
&
op
->
dev
,
NULL
);
kfree
(
rtc
);
return
0
;
}
static
struct
of_device_id
mpc5121_rtc_match
[]
__devinitdata
=
{
{
.
compatible
=
"fsl,mpc5121-rtc"
,
},
{},
};
static
struct
of_platform_driver
mpc5121_rtc_driver
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"mpc5121-rtc"
,
.
match_table
=
mpc5121_rtc_match
,
.
probe
=
mpc5121_rtc_probe
,
.
remove
=
__devexit_p
(
mpc5121_rtc_remove
),
};
static
int
__init
mpc5121_rtc_init
(
void
)
{
return
of_register_platform_driver
(
&
mpc5121_rtc_driver
);
}
module_init
(
mpc5121_rtc_init
);
static
void
__exit
mpc5121_rtc_exit
(
void
)
{
of_unregister_platform_driver
(
&
mpc5121_rtc_driver
);
}
module_exit
(
mpc5121_rtc_exit
);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
"John Rigby <jcrigby@gmail.com>"
);
drivers/serial/mpc52xx_uart.c
View file @
87d31345
This diff is collapsed.
Click to expand it.
drivers/video/fsl-diu-fb.c
View file @
87d31345
...
...
@@ -1633,6 +1633,11 @@ static int __init fsl_diu_setup(char *options)
#endif
static
struct
of_device_id
fsl_diu_match
[]
=
{
#ifdef CONFIG_PPC_MPC512x
{
.
compatible
=
"fsl,mpc5121-diu"
,
},
#endif
{
.
compatible
=
"fsl,diu"
,
},
...
...
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