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
2bd1b5e2
Commit
2bd1b5e2
authored
Jan 02, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://bk.arm.linux.org.uk/linux-2.6-rmk
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
5f4e3bbd
b99c2a51
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
253 additions
and
18 deletions
+253
-18
arch/arm/mach-integrator/integrator_ap.c
arch/arm/mach-integrator/integrator_ap.c
+0
-2
arch/arm/mach-integrator/time.c
arch/arm/mach-integrator/time.c
+180
-15
include/asm-arm/arch-ixp4xx/entry-macro.S
include/asm-arm/arch-ixp4xx/entry-macro.S
+13
-0
include/asm-arm/arch-ixp4xx/hardware.h
include/asm-arm/arch-ixp4xx/hardware.h
+7
-0
include/asm-arm/arch-ixp4xx/irqs.h
include/asm-arm/arch-ixp4xx/irqs.h
+21
-1
include/asm-arm/arch-ixp4xx/ixp4xx-regs.h
include/asm-arm/arch-ixp4xx/ixp4xx-regs.h
+32
-0
No files found.
arch/arm/mach-integrator/integrator_ap.c
View file @
2bd1b5e2
...
...
@@ -68,7 +68,6 @@
* f1200000 12000000 EBI registers
* f1300000 13000000 Counter/Timer
* f1400000 14000000 Interrupt controller
* f1500000 15000000 RTC
* f1600000 16000000 UART 0
* f1700000 17000000 UART 1
* f1a00000 1a000000 Debug LEDs
...
...
@@ -81,7 +80,6 @@ static struct map_desc ap_io_desc[] __initdata = {
{
IO_ADDRESS
(
INTEGRATOR_EBI_BASE
),
INTEGRATOR_EBI_BASE
,
SZ_4K
,
MT_DEVICE
},
{
IO_ADDRESS
(
INTEGRATOR_CT_BASE
),
INTEGRATOR_CT_BASE
,
SZ_4K
,
MT_DEVICE
},
{
IO_ADDRESS
(
INTEGRATOR_IC_BASE
),
INTEGRATOR_IC_BASE
,
SZ_4K
,
MT_DEVICE
},
{
IO_ADDRESS
(
INTEGRATOR_RTC_BASE
),
INTEGRATOR_RTC_BASE
,
SZ_4K
,
MT_DEVICE
},
{
IO_ADDRESS
(
INTEGRATOR_UART0_BASE
),
INTEGRATOR_UART0_BASE
,
SZ_4K
,
MT_DEVICE
},
{
IO_ADDRESS
(
INTEGRATOR_UART1_BASE
),
INTEGRATOR_UART1_BASE
,
SZ_4K
,
MT_DEVICE
},
{
IO_ADDRESS
(
INTEGRATOR_DBG_BASE
),
INTEGRATOR_DBG_BASE
,
SZ_4K
,
MT_DEVICE
},
...
...
arch/arm/mach-integrator/time.c
View file @
2bd1b5e2
/*
* linux/arch/arm/mach-integrator/time.c
*
* Copyright (C) 2000-2001 Deep Blue Solutions
* Copyright (C) 2000-2001 Deep Blue Solutions
Ltd.
*
* 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/module.h>
#include <linux/kernel.h>
#include <linux/time.h>
#include <linux/mc146818rtc.h>
#include <linux/interrupt.h>
#include <linux/init.h>
#include <linux/device.h>
#include <asm/hardware/amba.h>
#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/rtc.h>
#define RTC_DR (IO_ADDRESS(INTEGRATOR_RTC_BASE) + 0)
#define RTC_MR (IO_ADDRESS(INTEGRATOR_RTC_BASE) + 4)
#define RTC_STAT (IO_ADDRESS(INTEGRATOR_RTC_BASE) + 8)
#define RTC_EOI (IO_ADDRESS(INTEGRATOR_RTC_BASE) + 8)
#define RTC_LR (IO_ADDRESS(INTEGRATOR_RTC_BASE) + 12)
#define RTC_CR (IO_ADDRESS(INTEGRATOR_RTC_BASE) + 16)
#define RTC_CR_MIE 0x00000001
#define RTC_DR (0)
#define RTC_MR (4)
#define RTC_STAT (8)
#define RTC_EOI (8)
#define RTC_LR (12)
#define RTC_CR (16)
#define RTC_CR_MIE (1 << 0)
extern
int
(
*
set_rtc
)(
void
);
static
void
*
rtc_base
;
static
int
integrator_set_rtc
(
void
)
{
__raw_writel
(
xtime
.
tv_sec
,
RTC_LR
);
__raw_writel
(
xtime
.
tv_sec
,
rtc_base
+
RTC_LR
);
return
1
;
}
static
int
integrator_rtc_init
(
void
)
static
void
rtc_read_alarm
(
struct
rtc_wkalrm
*
alrm
)
{
rtc_time_to_tm
(
readl
(
rtc_base
+
RTC_MR
),
&
alrm
->
time
);
}
static
int
rtc_set_alarm
(
struct
rtc_wkalrm
*
alrm
)
{
unsigned
long
time
;
int
ret
;
ret
=
rtc_tm_to_time
(
&
alrm
->
time
,
&
time
);
if
(
ret
==
0
)
writel
(
time
,
rtc_base
+
RTC_MR
);
return
ret
;
}
static
void
rtc_read_time
(
struct
rtc_time
*
tm
)
{
__raw_writel
(
0
,
RTC_CR
);
__raw_writel
(
0
,
RTC_EOI
);
rtc_time_to_tm
(
readl
(
rtc_base
+
RTC_DR
),
tm
);
}
/*
* Set the RTC time. Unfortunately, we can't accurately set
* the point at which the counter updates.
*
* Also, since RTC_LR is transferred to RTC_CR on next rising
* edge of the 1Hz clock, we must write the time one second
* in advance.
*/
static
int
rtc_set_time
(
struct
rtc_time
*
tm
)
{
unsigned
long
time
;
int
ret
;
ret
=
rtc_tm_to_time
(
tm
,
&
time
);
if
(
ret
==
0
)
writel
(
time
+
1
,
rtc_base
+
RTC_LR
);
return
ret
;
}
static
struct
rtc_ops
rtc_ops
=
{
.
owner
=
THIS_MODULE
,
.
read_time
=
rtc_read_time
,
.
set_time
=
rtc_set_time
,
.
read_alarm
=
rtc_read_alarm
,
.
set_alarm
=
rtc_set_alarm
,
};
static
irqreturn_t
rtc_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
writel
(
0
,
rtc_base
+
RTC_EOI
);
return
IRQ_HANDLED
;
}
static
int
rtc_probe
(
struct
amba_device
*
dev
,
void
*
id
)
{
int
ret
;
if
(
rtc_base
)
return
-
EBUSY
;
ret
=
amba_request_regions
(
dev
,
NULL
);
if
(
ret
)
goto
out
;
rtc_base
=
ioremap
(
dev
->
res
.
start
,
SZ_4K
);
if
(
!
rtc_base
)
{
ret
=
-
ENOMEM
;
goto
res_out
;
}
__raw_writel
(
0
,
rtc_base
+
RTC_CR
);
__raw_writel
(
0
,
rtc_base
+
RTC_EOI
);
xtime
.
tv_sec
=
__raw_readl
(
rtc_base
+
RTC_DR
);
ret
=
request_irq
(
dev
->
irq
[
0
],
rtc_interrupt
,
SA_INTERRUPT
,
"rtc-pl030"
,
rtc_base
);
if
(
ret
)
goto
map_out
;
xtime
.
tv_sec
=
__raw_readl
(
RTC_DR
);
ret
=
register_rtc
(
&
rtc_ops
);
if
(
ret
)
goto
irq_out
;
set_rtc
=
integrator_set_rtc
;
return
0
;
irq_out:
free_irq
(
dev
->
irq
[
0
],
rtc_base
);
map_out:
iounmap
(
rtc_base
);
rtc_base
=
NULL
;
res_out:
amba_release_regions
(
dev
);
out:
return
ret
;
}
static
int
rtc_remove
(
struct
amba_device
*
dev
)
{
set_rtc
=
NULL
;
writel
(
0
,
rtc_base
+
RTC_CR
);
free_irq
(
dev
->
irq
[
0
],
rtc_base
);
unregister_rtc
(
&
rtc_ops
);
iounmap
(
rtc_base
);
rtc_base
=
NULL
;
amba_release_regions
(
dev
);
return
0
;
}
static
struct
timespec
rtc_delta
;
static
int
rtc_suspend
(
struct
amba_device
*
dev
,
u32
state
)
{
struct
timespec
rtc
;
rtc
.
tv_sec
=
readl
(
rtc_base
+
RTC_DR
);
rtc
.
tv_nsec
=
0
;
save_time_delta
(
&
rtc_delta
,
&
rtc
);
return
0
;
}
__initcall
(
integrator_rtc_init
);
static
int
rtc_resume
(
struct
amba_device
*
dev
)
{
struct
timespec
rtc
;
rtc
.
tv_sec
=
readl
(
rtc_base
+
RTC_DR
);
rtc
.
tv_nsec
=
0
;
restore_time_delta
(
&
rtc_delta
,
&
rtc
);
return
0
;
}
static
struct
amba_id
rtc_ids
[]
=
{
{
.
id
=
0x00041030
,
.
mask
=
0x000fffff
,
},
{
0
,
0
},
};
static
struct
amba_driver
rtc_driver
=
{
.
drv
=
{
.
name
=
"rtc-pl030"
,
},
.
probe
=
rtc_probe
,
.
remove
=
rtc_remove
,
.
suspend
=
rtc_suspend
,
.
resume
=
rtc_resume
,
.
id_table
=
rtc_ids
,
};
static
int
__init
integrator_rtc_init
(
void
)
{
return
amba_driver_register
(
&
rtc_driver
);
}
static
void
__exit
integrator_rtc_exit
(
void
)
{
amba_driver_unregister
(
&
rtc_driver
);
}
module_init
(
integrator_rtc_init
);
module_exit
(
integrator_rtc_exit
);
include/asm-arm/arch-ixp4xx/entry-macro.S
View file @
2bd1b5e2
...
...
@@ -21,6 +21,19 @@
subs
\
irqnr
,
\
base
,
\
irqnr
1001
:
/
*
*
IXP465
has
an
upper
IRQ
status
register
*/
#if defined(CONFIG_CPU_IXP46X)
bne
1002
f
ldr
\
irqstat
,
=(
IXP4XX_INTC_BASE_VIRT
+
IXP4XX_ICIP2_OFFSET
)
ldr
\
irqstat
,
[
\
irqstat
]
@
get
upper
interrupts
mov
\
irqnr
,
#
63
clz
\
irqstat
,
\
irqstat
cmp
\
irqstat
,
#
32
subne
\
irqnr
,
\
irqnr
,
\
irqstat
1002
:
#endif
.
endm
include/asm-arm/arch-ixp4xx/hardware.h
View file @
2bd1b5e2
...
...
@@ -27,6 +27,13 @@
#define pcibios_assign_all_busses() 1
#if defined(CONFIG_CPU_IXP465) && !defined(__ASSEMBLY__)
extern
unsigned
int
processor_id
;
#define cpu_is_ixp465() ((processor_id & 0xffffffc0) == 0x69054200)
#else
#define cpu_is_ixp465() (0)
#endif
/* Register locations and bits */
#include "ixp4xx-regs.h"
...
...
include/asm-arm/arch-ixp4xx/irqs.h
View file @
2bd1b5e2
...
...
@@ -15,7 +15,6 @@
#ifndef _ARCH_IXP4XX_IRQS_H_
#define _ARCH_IXP4XX_IRQS_H_
#define NR_IRQS 32
#define IRQ_IXP4XX_NPEA 0
#define IRQ_IXP4XX_NPEB 1
...
...
@@ -50,6 +49,27 @@
#define IRQ_IXP4XX_SW_INT1 30
#define IRQ_IXP4XX_SW_INT2 31
#ifndef CONFIG_CPU_IXP46X
#define NR_IRQS 32
#else
/*
* IXP465 adds new sources
*/
#define IRQ_IXP4XX_USB_HOST 32
#define IRQ_IXP4XX_I2C 33
#define IRQ_IXP4XX_SSP 34
#define IRQ_IXP4XX_TSYNC 35
#define IRQ_IXP4XX_EAU_DONE 36
#define IRQ_IXP4XX_SHA_DONE 37
#define IRQ_IXP4XX_SWCP_PE 58
#define IRQ_IXP4XX_QM_PE 60
#define IRQ_IXP4XX_MCU_ECC 61
#define IRQ_IXP4XX_EXP_PE 62
#define NR_IRQS 64
#endif
#define XSCALE_PMU_IRQ (IRQ_IXP4XX_XSCALE_PMU)
/*
...
...
include/asm-arm/arch-ixp4xx/ixp4xx-regs.h
View file @
2bd1b5e2
...
...
@@ -129,6 +129,17 @@
#define IXP4XX_ICIH_OFFSET 0x18
/* IRQ Highest Pri Int */
#define IXP4XX_ICFH_OFFSET 0x1C
/* FIQ Highest Pri Int */
/*
* IXP465-only
*/
#define IXP4XX_ICPR2_OFFSET 0x20
/* Interrupt Status 2 */
#define IXP4XX_ICMR2_OFFSET 0x24
/* Interrupt Enable 2 */
#define IXP4XX_ICLR2_OFFSET 0x28
/* Interrupt IRQ/FIQ Select 2 */
#define IXP4XX_ICIP2_OFFSET 0x2C
/* IRQ Status */
#define IXP4XX_ICFP2_OFFSET 0x30
/* FIQ Status */
#define IXP4XX_ICEEN_OFFSET 0x34
/* Error High Pri Enable */
/*
* Interrupt Controller Register Definitions.
*/
...
...
@@ -143,6 +154,12 @@
#define IXP4XX_ICHR IXP4XX_INTC_REG(IXP4XX_ICHR_OFFSET)
#define IXP4XX_ICIH IXP4XX_INTC_REG(IXP4XX_ICIH_OFFSET)
#define IXP4XX_ICFH IXP4XX_INTC_REG(IXP4XX_ICFH_OFFSET)
#define IXP4XX_ICPR2 IXP4XX_INTC_REG(IXP4XX_ICPR2_OFFSET)
#define IXP4XX_ICMR2 IXP4XX_INTC_REG(IXP4XX_ICMR2_OFFSET)
#define IXP4XX_ICLR2 IXP4XX_INTC_REG(IXP4XX_ICLR2_OFFSET)
#define IXP4XX_ICIP2 IXP4XX_INTC_REG(IXP4XX_ICIP2_OFFSET)
#define IXP4XX_ICFP2 IXP4XX_INTC_REG(IXP4XX_ICFP2_OFFSET)
#define IXP4XX_ICEEN IXP4XX_INTC_REG(IXP4XX_ICEEN_OFFSET)
/*
* Constants to make it easy to access GPIO registers
...
...
@@ -548,4 +565,19 @@
#define DCMD_LENGTH 0x01fff
/* length mask (max = 8K - 1) */
#ifndef __ASSEMBLY__
static
inline
int
cpu_is_ixp46x
(
void
)
{
#ifdef CONFIG_CPU_IXP46X
unsigned
int
processor_id
;
asm
(
"mrc p15, 0, %0, cr0, cr0, 0;"
:
"=r"
(
processor_id
)
:
);
if
((
processor_id
&
0xffffff00
)
==
0x69054200
)
return
1
;
#endif
return
0
;
}
#endif
#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