Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
65bda1a9
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
65bda1a9
编写于
2月 22, 2005
作者:
M
Maciej W. Rozycki
提交者:
Ralf Baechle
10月 29, 2005
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Switch SiByte drivers back to __raw_*() functions.
Signed-off-by:
N
Ralf Baechle
<
ralf@linux-mips.org
>
上级
4912ba72
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
221 addition
and
210 deletion
+221
-210
arch/mips/mm/pg-sb1.c
arch/mips/mm/pg-sb1.c
+14
-14
arch/mips/sibyte/sb1250/bcm1250_tbprof.c
arch/mips/sibyte/sb1250/bcm1250_tbprof.c
+68
-62
arch/mips/sibyte/sb1250/bus_watcher.c
arch/mips/sibyte/sb1250/bus_watcher.c
+1
-1
arch/mips/sibyte/sb1250/irq.c
arch/mips/sibyte/sb1250/irq.c
+46
-42
arch/mips/sibyte/sb1250/setup.c
arch/mips/sibyte/sb1250/setup.c
+2
-2
arch/mips/sibyte/sb1250/smp.c
arch/mips/sibyte/sb1250/smp.c
+9
-9
arch/mips/sibyte/sb1250/time.c
arch/mips/sibyte/sb1250/time.c
+13
-13
arch/mips/sibyte/swarm/rtc_m41t81.c
arch/mips/sibyte/swarm/rtc_m41t81.c
+24
-23
arch/mips/sibyte/swarm/rtc_xicor1241.c
arch/mips/sibyte/swarm/rtc_xicor1241.c
+21
-21
arch/mips/sibyte/swarm/time.c
arch/mips/sibyte/swarm/time.c
+22
-22
include/asm-mips/sibyte/sb1250.h
include/asm-mips/sibyte/sb1250.h
+1
-1
未找到文件。
arch/mips/mm/pg-sb1.c
浏览文件 @
65bda1a9
...
...
@@ -214,12 +214,12 @@ void sb1_dma_init(void)
int
cpu
=
smp_processor_id
();
u64
base_val
=
CPHYSADDR
(
&
page_descr
[
cpu
])
|
V_DM_DSCR_BASE_RINGSZ
(
1
);
bus
_writeq
(
base_val
,
(
void
*
)
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_BASE
)));
bus
_writeq
(
base_val
|
M_DM_DSCR_BASE_RESET
,
(
void
*
)
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_BASE
)));
bus
_writeq
(
base_val
|
M_DM_DSCR_BASE_ENABL
,
(
void
*
)
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_BASE
)));
__raw
_writeq
(
base_val
,
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_BASE
)));
__raw
_writeq
(
base_val
|
M_DM_DSCR_BASE_RESET
,
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_BASE
)));
__raw
_writeq
(
base_val
|
M_DM_DSCR_BASE_ENABL
,
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_BASE
)));
}
void
clear_page
(
void
*
page
)
...
...
@@ -232,16 +232,16 @@ void clear_page(void *page)
page_descr
[
cpu
].
dscr_a
=
CPHYSADDR
(
page
)
|
M_DM_DSCRA_ZERO_MEM
|
M_DM_DSCRA_L2C_DEST
|
M_DM_DSCRA_INTERRUPT
;
page_descr
[
cpu
].
dscr_b
=
V_DM_DSCRB_SRC_LENGTH
(
PAGE_SIZE
);
bus_writeq
(
1
,
(
void
*
)
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_COUNT
)));
__raw_writeq
(
1
,
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_COUNT
)));
/*
* Don't really want to do it this way, but there's no
* reliable way to delay completion detection.
*/
while
(
!
(
bus_readq
((
void
*
)(
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_BASE_DEBUG
))
&
M_DM_DSCR_BASE_INTERRUPT
)
)))
while
(
!
(
__raw_readq
(
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_BASE_DEBUG
)))
M_DM_DSCR_BASE_INTERRUPT
)))
;
bus_readq
((
void
*
)
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_BASE
)));
__raw_readq
(
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_BASE
)));
}
void
copy_page
(
void
*
to
,
void
*
from
)
...
...
@@ -257,16 +257,16 @@ void copy_page(void *to, void *from)
page_descr
[
cpu
].
dscr_a
=
CPHYSADDR
(
to_phys
)
|
M_DM_DSCRA_L2C_DEST
|
M_DM_DSCRA_INTERRUPT
;
page_descr
[
cpu
].
dscr_b
=
CPHYSADDR
(
from_phys
)
|
V_DM_DSCRB_SRC_LENGTH
(
PAGE_SIZE
);
bus_writeq
(
1
,
(
void
*
)
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_COUNT
)));
__raw_writeq
(
1
,
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_COUNT
)));
/*
* Don't really want to do it this way, but there's no
* reliable way to delay completion detection.
*/
while
(
!
(
bus_readq
((
void
*
)
(
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_BASE_DEBUG
))
&
M_DM_DSCR_BASE_INTERRUPT
)
)))
while
(
!
(
__raw_readq
(
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_BASE_DEBUG
))
&
M_DM_DSCR_BASE_INTERRUPT
)))
;
bus_readq
((
void
*
)
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_BASE
)));
__raw_readq
(
IOADDR
(
A_DM_REGISTER
(
cpu
,
R_DM_DSCR_BASE
)));
}
#else
/* !CONFIG_SIBYTE_DMA_PAGEOPS */
...
...
arch/mips/sibyte/sb1250/bcm1250_tbprof.c
浏览文件 @
65bda1a9
...
...
@@ -65,24 +65,25 @@ static void arm_tb(void)
u_int64_t
tb_options
=
M_SCD_TRACE_CFG_FREEZE_FULL
;
/* Generate an SCD_PERFCNT interrupt in TB_PERIOD Zclks to
trigger start of trace. XXX vary sampling period */
bus
_writeq
(
0
,
IOADDR
(
A_SCD_PERF_CNT_1
));
scdperfcnt
=
bus
_readq
(
IOADDR
(
A_SCD_PERF_CNT_CFG
));
__raw
_writeq
(
0
,
IOADDR
(
A_SCD_PERF_CNT_1
));
scdperfcnt
=
__raw
_readq
(
IOADDR
(
A_SCD_PERF_CNT_CFG
));
/* Unfortunately, in Pass 2 we must clear all counters to knock down
a previous interrupt request. This means that bus profiling
requires ALL of the SCD perf counters. */
bus_writeq
((
scdperfcnt
&
~
M_SPC_CFG_SRC1
)
|
// keep counters 0,2,3 as is
M_SPC_CFG_ENABLE
|
// enable counting
M_SPC_CFG_CLEAR
|
// clear all counters
V_SPC_CFG_SRC1
(
1
),
// counter 1 counts cycles
IOADDR
(
A_SCD_PERF_CNT_CFG
));
bus_writeq
(
next
,
IOADDR
(
A_SCD_PERF_CNT_1
));
__raw_writeq
((
scdperfcnt
&
~
M_SPC_CFG_SRC1
)
|
// keep counters 0,2,3 as is
M_SPC_CFG_ENABLE
|
// enable counting
M_SPC_CFG_CLEAR
|
// clear all counters
V_SPC_CFG_SRC1
(
1
),
// counter 1 counts cycles
IOADDR
(
A_SCD_PERF_CNT_CFG
));
__raw_writeq
(
next
,
IOADDR
(
A_SCD_PERF_CNT_1
));
/* Reset the trace buffer */
bus
_writeq
(
M_SCD_TRACE_CFG_RESET
,
IOADDR
(
A_SCD_TRACE_CFG
));
__raw
_writeq
(
M_SCD_TRACE_CFG_RESET
,
IOADDR
(
A_SCD_TRACE_CFG
));
#if 0 && defined(M_SCD_TRACE_CFG_FORCECNT)
/* XXXKW may want to expose control to the data-collector */
tb_options |= M_SCD_TRACE_CFG_FORCECNT;
#endif
bus
_writeq
(
tb_options
,
IOADDR
(
A_SCD_TRACE_CFG
));
__raw
_writeq
(
tb_options
,
IOADDR
(
A_SCD_TRACE_CFG
));
sbp
.
tb_armed
=
1
;
}
...
...
@@ -94,23 +95,30 @@ static irqreturn_t sbprof_tb_intr(int irq, void *dev_id, struct pt_regs *regs)
/* XXX should use XKPHYS to make writes bypass L2 */
u_int64_t
*
p
=
sbp
.
sbprof_tbbuf
[
sbp
.
next_tb_sample
++
];
/* Read out trace */
bus_writeq
(
M_SCD_TRACE_CFG_START_READ
,
IOADDR
(
A_SCD_TRACE_CFG
));
__raw_writeq
(
M_SCD_TRACE_CFG_START_READ
,
IOADDR
(
A_SCD_TRACE_CFG
));
__asm__
__volatile__
(
"sync"
:
:
:
"memory"
);
/* Loop runs backwards because bundles are read out in reverse order */
for
(
i
=
256
*
6
;
i
>
0
;
i
-=
6
)
{
// Subscripts decrease to put bundle in the order
// t0 lo, t0 hi, t1 lo, t1 hi, t2 lo, t2 hi
p
[
i
-
1
]
=
bus_readq
(
IOADDR
(
A_SCD_TRACE_READ
));
// read t2 hi
p
[
i
-
2
]
=
bus_readq
(
IOADDR
(
A_SCD_TRACE_READ
));
// read t2 lo
p
[
i
-
3
]
=
bus_readq
(
IOADDR
(
A_SCD_TRACE_READ
));
// read t1 hi
p
[
i
-
4
]
=
bus_readq
(
IOADDR
(
A_SCD_TRACE_READ
));
// read t1 lo
p
[
i
-
5
]
=
bus_readq
(
IOADDR
(
A_SCD_TRACE_READ
));
// read t0 hi
p
[
i
-
6
]
=
bus_readq
(
IOADDR
(
A_SCD_TRACE_READ
));
// read t0 lo
p
[
i
-
1
]
=
__raw_readq
(
IOADDR
(
A_SCD_TRACE_READ
));
// read t2 hi
p
[
i
-
2
]
=
__raw_readq
(
IOADDR
(
A_SCD_TRACE_READ
));
// read t2 lo
p
[
i
-
3
]
=
__raw_readq
(
IOADDR
(
A_SCD_TRACE_READ
));
// read t1 hi
p
[
i
-
4
]
=
__raw_readq
(
IOADDR
(
A_SCD_TRACE_READ
));
// read t1 lo
p
[
i
-
5
]
=
__raw_readq
(
IOADDR
(
A_SCD_TRACE_READ
));
// read t0 hi
p
[
i
-
6
]
=
__raw_readq
(
IOADDR
(
A_SCD_TRACE_READ
));
// read t0 lo
}
if
(
!
sbp
.
tb_enable
)
{
DBG
(
printk
(
DEVNAME
": tb_intr shutdown
\n
"
));
bus
_writeq
(
M_SCD_TRACE_CFG_RESET
,
IOADDR
(
A_SCD_TRACE_CFG
));
__raw
_writeq
(
M_SCD_TRACE_CFG_RESET
,
IOADDR
(
A_SCD_TRACE_CFG
));
sbp
.
tb_armed
=
0
;
wake_up
(
&
sbp
.
tb_sync
);
}
else
{
...
...
@@ -119,7 +127,7 @@ static irqreturn_t sbprof_tb_intr(int irq, void *dev_id, struct pt_regs *regs)
}
else
{
/* No more trace buffer samples */
DBG
(
printk
(
DEVNAME
": tb_intr full
\n
"
));
bus
_writeq
(
M_SCD_TRACE_CFG_RESET
,
IOADDR
(
A_SCD_TRACE_CFG
));
__raw
_writeq
(
M_SCD_TRACE_CFG_RESET
,
IOADDR
(
A_SCD_TRACE_CFG
));
sbp
.
tb_armed
=
0
;
if
(
!
sbp
.
tb_enable
)
{
wake_up
(
&
sbp
.
tb_sync
);
...
...
@@ -153,13 +161,11 @@ int sbprof_zbprof_start(struct file *filp)
return
-
EBUSY
;
}
/* Make sure there isn't a perf-cnt interrupt waiting */
scdperfcnt
=
bus
_readq
(
IOADDR
(
A_SCD_PERF_CNT_CFG
));
scdperfcnt
=
__raw
_readq
(
IOADDR
(
A_SCD_PERF_CNT_CFG
));
/* Disable and clear counters, override SRC_1 */
bus_writeq
((
scdperfcnt
&
~
(
M_SPC_CFG_SRC1
|
M_SPC_CFG_ENABLE
))
|
M_SPC_CFG_ENABLE
|
M_SPC_CFG_CLEAR
|
V_SPC_CFG_SRC1
(
1
),
IOADDR
(
A_SCD_PERF_CNT_CFG
));
__raw_writeq
((
scdperfcnt
&
~
(
M_SPC_CFG_SRC1
|
M_SPC_CFG_ENABLE
))
|
M_SPC_CFG_ENABLE
|
M_SPC_CFG_CLEAR
|
V_SPC_CFG_SRC1
(
1
),
IOADDR
(
A_SCD_PERF_CNT_CFG
));
/* We grab this interrupt to prevent others from trying to use
it, even though we don't want to service the interrupts
...
...
@@ -173,55 +179,55 @@ int sbprof_zbprof_start(struct file *filp)
/* I need the core to mask these, but the interrupt mapper to
pass them through. I am exploiting my knowledge that
cp0_status masks out IP[5]. krw */
bus
_writeq
(
K_INT_MAP_I3
,
IOADDR
(
A_IMR_REGISTER
(
0
,
R_IMR_INTERRUPT_MAP_BASE
)
+
(
K_INT_PERF_CNT
<<
3
)));
__raw
_writeq
(
K_INT_MAP_I3
,
IOADDR
(
A_IMR_REGISTER
(
0
,
R_IMR_INTERRUPT_MAP_BASE
)
+
(
K_INT_PERF_CNT
<<
3
)));
/* Initialize address traps */
bus
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_UP_0
));
bus
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_UP_1
));
bus
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_UP_2
));
bus
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_UP_3
));
__raw
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_UP_0
));
__raw
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_UP_1
));
__raw
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_UP_2
));
__raw
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_UP_3
));
bus
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_DOWN_0
));
bus
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_DOWN_1
));
bus
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_DOWN_2
));
bus
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_DOWN_3
));
__raw
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_DOWN_0
));
__raw
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_DOWN_1
));
__raw
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_DOWN_2
));
__raw
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_DOWN_3
));
bus
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_CFG_0
));
bus
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_CFG_1
));
bus
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_CFG_2
));
bus
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_CFG_3
));
__raw
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_CFG_0
));
__raw
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_CFG_1
));
__raw
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_CFG_2
));
__raw
_writeq
(
0
,
IOADDR
(
A_ADDR_TRAP_CFG_3
));
/* Initialize Trace Event 0-7 */
// when interrupt
bus
_writeq
(
M_SCD_TREVT_INTERRUPT
,
IOADDR
(
A_SCD_TRACE_EVENT_0
));
bus
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_EVENT_1
));
bus
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_EVENT_2
));
bus
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_EVENT_3
));
bus
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_EVENT_4
));
bus
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_EVENT_5
));
bus
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_EVENT_6
));
bus
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_EVENT_7
));
__raw
_writeq
(
M_SCD_TREVT_INTERRUPT
,
IOADDR
(
A_SCD_TRACE_EVENT_0
));
__raw
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_EVENT_1
));
__raw
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_EVENT_2
));
__raw
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_EVENT_3
));
__raw
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_EVENT_4
));
__raw
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_EVENT_5
));
__raw
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_EVENT_6
));
__raw
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_EVENT_7
));
/* Initialize Trace Sequence 0-7 */
// Start on event 0 (interrupt)
bus
_writeq
(
V_SCD_TRSEQ_FUNC_START
|
0x0fff
,
IOADDR
(
A_SCD_TRACE_SEQUENCE_0
));
__raw
_writeq
(
V_SCD_TRSEQ_FUNC_START
|
0x0fff
,
IOADDR
(
A_SCD_TRACE_SEQUENCE_0
));
// dsamp when d used | asamp when a used
bus
_writeq
(
M_SCD_TRSEQ_ASAMPLE
|
M_SCD_TRSEQ_DSAMPLE
|
K_SCD_TRSEQ_TRIGGER_ALL
,
IOADDR
(
A_SCD_TRACE_SEQUENCE_1
));
bus
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_SEQUENCE_2
));
bus
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_SEQUENCE_3
));
bus
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_SEQUENCE_4
));
bus
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_SEQUENCE_5
));
bus
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_SEQUENCE_6
));
bus
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_SEQUENCE_7
));
__raw
_writeq
(
M_SCD_TRSEQ_ASAMPLE
|
M_SCD_TRSEQ_DSAMPLE
|
K_SCD_TRSEQ_TRIGGER_ALL
,
IOADDR
(
A_SCD_TRACE_SEQUENCE_1
));
__raw
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_SEQUENCE_2
));
__raw
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_SEQUENCE_3
));
__raw
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_SEQUENCE_4
));
__raw
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_SEQUENCE_5
));
__raw
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_SEQUENCE_6
));
__raw
_writeq
(
0
,
IOADDR
(
A_SCD_TRACE_SEQUENCE_7
));
/* Now indicate the PERF_CNT interrupt as a trace-relevant interrupt */
bus_writeq
((
1ULL
<<
K_INT_PERF_CNT
)
,
IOADDR
(
A_IMR_REGISTER
(
0
,
R_IMR_INTERRUPT_TRACE
)));
__raw_writeq
(
1ULL
<<
K_INT_PERF_CNT
,
IOADDR
(
A_IMR_REGISTER
(
0
,
R_IMR_INTERRUPT_TRACE
)));
arm_tb
();
...
...
arch/mips/sibyte/sb1250/bus_watcher.c
浏览文件 @
65bda1a9
...
...
@@ -189,7 +189,7 @@ static irqreturn_t sibyte_bw_int(int irq, void *data, struct pt_regs *regs)
for
(
i
=
0
;
i
<
256
*
6
;
i
++
)
printk
(
"%016llx
\n
"
,
(
unsigned
long
long
)
bus
_readq
(
IOADDR
(
A_SCD_TRACE_READ
)));
(
long
long
)
__raw
_readq
(
IOADDR
(
A_SCD_TRACE_READ
)));
csr_out32
(
M_SCD_TRACE_CFG_RESET
,
IOADDR
(
A_SCD_TRACE_CFG
));
csr_out32
(
M_SCD_TRACE_CFG_START
,
IOADDR
(
A_SCD_TRACE_CFG
));
...
...
arch/mips/sibyte/sb1250/irq.c
浏览文件 @
65bda1a9
...
...
@@ -96,11 +96,11 @@ void sb1250_mask_irq(int cpu, int irq)
u64
cur_ints
;
spin_lock_irqsave
(
&
sb1250_imr_lock
,
flags
);
cur_ints
=
__
bus
_readq
(
IOADDR
(
A_IMR_MAPPER
(
cpu
)
+
R_IMR_INTERRUPT_MASK
));
cur_ints
=
__
__raw
_readq
(
IOADDR
(
A_IMR_MAPPER
(
cpu
)
+
R_IMR_INTERRUPT_MASK
));
cur_ints
|=
(((
u64
)
1
)
<<
irq
);
__
bus
_writeq
(
cur_ints
,
IOADDR
(
A_IMR_MAPPER
(
cpu
)
+
R_IMR_INTERRUPT_MASK
));
__
__raw
_writeq
(
cur_ints
,
IOADDR
(
A_IMR_MAPPER
(
cpu
)
+
R_IMR_INTERRUPT_MASK
));
spin_unlock_irqrestore
(
&
sb1250_imr_lock
,
flags
);
}
...
...
@@ -110,11 +110,11 @@ void sb1250_unmask_irq(int cpu, int irq)
u64
cur_ints
;
spin_lock_irqsave
(
&
sb1250_imr_lock
,
flags
);
cur_ints
=
__
bus
_readq
(
IOADDR
(
A_IMR_MAPPER
(
cpu
)
+
R_IMR_INTERRUPT_MASK
));
cur_ints
=
__
__raw
_readq
(
IOADDR
(
A_IMR_MAPPER
(
cpu
)
+
R_IMR_INTERRUPT_MASK
));
cur_ints
&=
~
(((
u64
)
1
)
<<
irq
);
__
bus
_writeq
(
cur_ints
,
IOADDR
(
A_IMR_MAPPER
(
cpu
)
+
R_IMR_INTERRUPT_MASK
));
__
__raw
_writeq
(
cur_ints
,
IOADDR
(
A_IMR_MAPPER
(
cpu
)
+
R_IMR_INTERRUPT_MASK
));
spin_unlock_irqrestore
(
&
sb1250_imr_lock
,
flags
);
}
...
...
@@ -149,23 +149,23 @@ static void sb1250_set_affinity(unsigned int irq, unsigned long mask)
/* Swizzle each CPU's IMR (but leave the IP selection alone) */
old_cpu
=
sb1250_irq_owner
[
irq
];
cur_ints
=
__
bus
_readq
(
IOADDR
(
A_IMR_MAPPER
(
old_cpu
)
+
R_IMR_INTERRUPT_MASK
));
cur_ints
=
__
__raw
_readq
(
IOADDR
(
A_IMR_MAPPER
(
old_cpu
)
+
R_IMR_INTERRUPT_MASK
));
int_on
=
!
(
cur_ints
&
(((
u64
)
1
)
<<
irq
));
if
(
int_on
)
{
/* If it was on, mask it */
cur_ints
|=
(((
u64
)
1
)
<<
irq
);
__
bus
_writeq
(
cur_ints
,
IOADDR
(
A_IMR_MAPPER
(
old_cpu
)
+
R_IMR_INTERRUPT_MASK
));
__
__raw
_writeq
(
cur_ints
,
IOADDR
(
A_IMR_MAPPER
(
old_cpu
)
+
R_IMR_INTERRUPT_MASK
));
}
sb1250_irq_owner
[
irq
]
=
cpu
;
if
(
int_on
)
{
/* unmask for the new CPU */
cur_ints
=
__
bus
_readq
(
IOADDR
(
A_IMR_MAPPER
(
cpu
)
+
R_IMR_INTERRUPT_MASK
));
cur_ints
=
__
__raw
_readq
(
IOADDR
(
A_IMR_MAPPER
(
cpu
)
+
R_IMR_INTERRUPT_MASK
));
cur_ints
&=
~
(((
u64
)
1
)
<<
irq
);
__
bus
_writeq
(
cur_ints
,
IOADDR
(
A_IMR_MAPPER
(
cpu
)
+
R_IMR_INTERRUPT_MASK
));
__
__raw
_writeq
(
cur_ints
,
IOADDR
(
A_IMR_MAPPER
(
cpu
)
+
R_IMR_INTERRUPT_MASK
));
}
spin_unlock
(
&
sb1250_imr_lock
);
spin_unlock_irqrestore
(
&
desc
->
lock
,
flags
);
...
...
@@ -208,8 +208,8 @@ static void ack_sb1250_irq(unsigned int irq)
* deliver the interrupts to all CPUs (which makes affinity
* changing easier for us)
*/
pending
=
bus
_readq
(
IOADDR
(
A_IMR_REGISTER
(
sb1250_irq_owner
[
irq
],
R_IMR_LDT_INTERRUPT
)));
pending
=
__raw
_readq
(
IOADDR
(
A_IMR_REGISTER
(
sb1250_irq_owner
[
irq
],
R_IMR_LDT_INTERRUPT
)));
pending
&=
((
u64
)
1
<<
(
irq
));
if
(
pending
)
{
int
i
;
...
...
@@ -224,8 +224,8 @@ static void ack_sb1250_irq(unsigned int irq)
* Clear for all CPUs so an affinity switch
* doesn't find an old status
*/
bus
_writeq
(
pending
,
IOADDR
(
A_IMR_REGISTER
(
cpu
,
__raw
_writeq
(
pending
,
IOADDR
(
A_IMR_REGISTER
(
cpu
,
R_IMR_LDT_INTERRUPT_CLR
)));
}
...
...
@@ -340,12 +340,14 @@ void __init arch_init_irq(void)
/* Default everything to IP2 */
for
(
i
=
0
;
i
<
SB1250_NR_IRQS
;
i
++
)
{
/* was I0 */
bus_writeq
(
IMR_IP2_VAL
,
IOADDR
(
A_IMR_REGISTER
(
0
,
R_IMR_INTERRUPT_MAP_BASE
)
+
(
i
<<
3
)));
bus_writeq
(
IMR_IP2_VAL
,
IOADDR
(
A_IMR_REGISTER
(
1
,
R_IMR_INTERRUPT_MAP_BASE
)
+
(
i
<<
3
)));
__raw_writeq
(
IMR_IP2_VAL
,
IOADDR
(
A_IMR_REGISTER
(
0
,
R_IMR_INTERRUPT_MAP_BASE
)
+
(
i
<<
3
)));
__raw_writeq
(
IMR_IP2_VAL
,
IOADDR
(
A_IMR_REGISTER
(
1
,
R_IMR_INTERRUPT_MAP_BASE
)
+
(
i
<<
3
)));
}
init_sb1250_irqs
();
...
...
@@ -355,23 +357,23 @@ void __init arch_init_irq(void)
* inter-cpu messages
*/
/* Was I1 */
bus
_writeq
(
IMR_IP3_VAL
,
IOADDR
(
A_IMR_REGISTER
(
0
,
R_IMR_INTERRUPT_MAP_BASE
)
+
(
K_INT_MBOX_0
<<
3
)));
bus
_writeq
(
IMR_IP3_VAL
,
IOADDR
(
A_IMR_REGISTER
(
1
,
R_IMR_INTERRUPT_MAP_BASE
)
+
(
K_INT_MBOX_0
<<
3
)));
__raw
_writeq
(
IMR_IP3_VAL
,
IOADDR
(
A_IMR_REGISTER
(
0
,
R_IMR_INTERRUPT_MAP_BASE
)
+
(
K_INT_MBOX_0
<<
3
)));
__raw
_writeq
(
IMR_IP3_VAL
,
IOADDR
(
A_IMR_REGISTER
(
1
,
R_IMR_INTERRUPT_MAP_BASE
)
+
(
K_INT_MBOX_0
<<
3
)));
/* Clear the mailboxes. The firmware may leave them dirty */
bus
_writeq
(
0xffffffffffffffffULL
,
IOADDR
(
A_IMR_REGISTER
(
0
,
R_IMR_MAILBOX_CLR_CPU
)));
bus
_writeq
(
0xffffffffffffffffULL
,
IOADDR
(
A_IMR_REGISTER
(
1
,
R_IMR_MAILBOX_CLR_CPU
)));
__raw
_writeq
(
0xffffffffffffffffULL
,
IOADDR
(
A_IMR_REGISTER
(
0
,
R_IMR_MAILBOX_CLR_CPU
)));
__raw
_writeq
(
0xffffffffffffffffULL
,
IOADDR
(
A_IMR_REGISTER
(
1
,
R_IMR_MAILBOX_CLR_CPU
)));
/* Mask everything except the mailbox registers for both cpus */
tmp
=
~
((
u64
)
0
)
^
(((
u64
)
1
)
<<
K_INT_MBOX_0
);
bus
_writeq
(
tmp
,
IOADDR
(
A_IMR_REGISTER
(
0
,
R_IMR_INTERRUPT_MASK
)));
bus
_writeq
(
tmp
,
IOADDR
(
A_IMR_REGISTER
(
1
,
R_IMR_INTERRUPT_MASK
)));
__raw
_writeq
(
tmp
,
IOADDR
(
A_IMR_REGISTER
(
0
,
R_IMR_INTERRUPT_MASK
)));
__raw
_writeq
(
tmp
,
IOADDR
(
A_IMR_REGISTER
(
1
,
R_IMR_INTERRUPT_MASK
)));
sb1250_steal_irq
(
K_INT_MBOX_0
);
...
...
@@ -396,12 +398,14 @@ void __init arch_init_irq(void)
sb1250_duart_present
[
kgdb_port
]
=
0
;
#endif
/* Setup uart 1 settings, mapper */
bus_writeq
(
M_DUART_IMR_BRK
,
IOADDR
(
A_DUART_IMRREG
(
kgdb_port
)));
__raw_writeq
(
M_DUART_IMR_BRK
,
IOADDR
(
A_DUART_IMRREG
(
kgdb_port
)));
sb1250_steal_irq
(
kgdb_irq
);
bus_writeq
(
IMR_IP6_VAL
,
IOADDR
(
A_IMR_REGISTER
(
0
,
R_IMR_INTERRUPT_MAP_BASE
)
+
(
kgdb_irq
<<
3
)));
__raw_writeq
(
IMR_IP6_VAL
,
IOADDR
(
A_IMR_REGISTER
(
0
,
R_IMR_INTERRUPT_MAP_BASE
)
+
(
kgdb_irq
<<
3
)));
sb1250_unmask_irq
(
0
,
kgdb_irq
);
}
#endif
...
...
arch/mips/sibyte/sb1250/setup.c
浏览文件 @
65bda1a9
...
...
@@ -153,7 +153,7 @@ void sb1250_setup(void)
int
bad_config
=
0
;
sb1_pass
=
read_c0_prid
()
&
0xff
;
sys_rev
=
bus
_readq
(
IOADDR
(
A_SCD_SYSTEM_REVISION
));
sys_rev
=
__raw
_readq
(
IOADDR
(
A_SCD_SYSTEM_REVISION
));
soc_type
=
SYS_SOC_TYPE
(
sys_rev
);
soc_pass
=
G_SYS_REVISION
(
sys_rev
);
...
...
@@ -162,7 +162,7 @@ void sb1250_setup(void)
machine_restart
(
NULL
);
}
plldiv
=
G_SYS_PLL_DIV
(
bus
_readq
(
IOADDR
(
A_SCD_SYSTEM_CFG
)));
plldiv
=
G_SYS_PLL_DIV
(
__raw
_readq
(
IOADDR
(
A_SCD_SYSTEM_CFG
)));
zbbus_mhz
=
((
plldiv
>>
1
)
*
50
)
+
((
plldiv
&
1
)
*
25
);
prom_printf
(
"Broadcom SiByte %s %s @ %d MHz (SB1 rev %d)
\n
"
,
...
...
arch/mips/sibyte/sb1250/smp.c
浏览文件 @
65bda1a9
...
...
@@ -29,18 +29,18 @@
#include <asm/sibyte/sb1250_int.h>
static
void
*
mailbox_set_regs
[]
=
{
(
void
*
)
IOADDR
(
A_IMR_CPU0_BASE
+
R_IMR_MAILBOX_SET_CPU
),
(
void
*
)
IOADDR
(
A_IMR_CPU1_BASE
+
R_IMR_MAILBOX_SET_CPU
)
IOADDR
(
A_IMR_CPU0_BASE
+
R_IMR_MAILBOX_SET_CPU
),
IOADDR
(
A_IMR_CPU1_BASE
+
R_IMR_MAILBOX_SET_CPU
)
};
static
void
*
mailbox_clear_regs
[]
=
{
(
void
*
)
IOADDR
(
A_IMR_CPU0_BASE
+
R_IMR_MAILBOX_CLR_CPU
),
(
void
*
)
IOADDR
(
A_IMR_CPU1_BASE
+
R_IMR_MAILBOX_CLR_CPU
)
IOADDR
(
A_IMR_CPU0_BASE
+
R_IMR_MAILBOX_CLR_CPU
),
IOADDR
(
A_IMR_CPU1_BASE
+
R_IMR_MAILBOX_CLR_CPU
)
};
static
void
*
mailbox_regs
[]
=
{
(
void
*
)
IOADDR
(
A_IMR_CPU0_BASE
+
R_IMR_MAILBOX_CPU
),
(
void
*
)
IOADDR
(
A_IMR_CPU1_BASE
+
R_IMR_MAILBOX_CPU
)
IOADDR
(
A_IMR_CPU0_BASE
+
R_IMR_MAILBOX_CPU
),
IOADDR
(
A_IMR_CPU1_BASE
+
R_IMR_MAILBOX_CPU
)
};
/*
...
...
@@ -73,7 +73,7 @@ void sb1250_smp_finish(void)
*/
void
core_send_ipi
(
int
cpu
,
unsigned
int
action
)
{
bus
_writeq
((((
u64
)
action
)
<<
48
),
mailbox_set_regs
[
cpu
]);
__raw
_writeq
((((
u64
)
action
)
<<
48
),
mailbox_set_regs
[
cpu
]);
}
void
sb1250_mailbox_interrupt
(
struct
pt_regs
*
regs
)
...
...
@@ -83,10 +83,10 @@ void sb1250_mailbox_interrupt(struct pt_regs *regs)
kstat_this_cpu
.
irqs
[
K_INT_MBOX_0
]
++
;
/* Load the mailbox register to figure out what we're supposed to do */
action
=
(
__
bus
_readq
(
mailbox_regs
[
cpu
])
>>
48
)
&
0xffff
;
action
=
(
__
__raw
_readq
(
mailbox_regs
[
cpu
])
>>
48
)
&
0xffff
;
/* Clear the mailbox to clear the interrupt */
__
bus
_writeq
(((
u64
)
action
)
<<
48
,
mailbox_clear_regs
[
cpu
]);
__
__raw
_writeq
(((
u64
)
action
)
<<
48
,
mailbox_clear_regs
[
cpu
]);
/*
* Nothing to do for SMP_RESCHEDULE_YOURSELF; returning from the
...
...
arch/mips/sibyte/sb1250/time.c
浏览文件 @
65bda1a9
...
...
@@ -67,24 +67,24 @@ void sb1250_time_init(void)
sb1250_mask_irq
(
cpu
,
irq
);
/* Map the timer interrupt to ip[4] of this cpu */
bus
_writeq
(
IMR_IP4_VAL
,
IOADDR
(
A_IMR_REGISTER
(
cpu
,
R_IMR_INTERRUPT_MAP_BASE
)
+
(
irq
<<
3
)));
__raw
_writeq
(
IMR_IP4_VAL
,
IOADDR
(
A_IMR_REGISTER
(
cpu
,
R_IMR_INTERRUPT_MAP_BASE
)
+
(
irq
<<
3
)));
/* the general purpose timer ticks at 1 Mhz independent if the rest of the system */
/* Disable the timer and set up the count */
bus
_writeq
(
0
,
IOADDR
(
A_SCD_TIMER_REGISTER
(
cpu
,
R_SCD_TIMER_CFG
)));
__raw
_writeq
(
0
,
IOADDR
(
A_SCD_TIMER_REGISTER
(
cpu
,
R_SCD_TIMER_CFG
)));
#ifdef CONFIG_SIMULATION
bus
_writeq
(
50000
/
HZ
,
IOADDR
(
A_SCD_TIMER_REGISTER
(
cpu
,
R_SCD_TIMER_INIT
)));
__raw
_writeq
(
50000
/
HZ
,
IOADDR
(
A_SCD_TIMER_REGISTER
(
cpu
,
R_SCD_TIMER_INIT
)));
#else
bus_writeq
(
1000000
/
HZ
,
IOADDR
(
A_SCD_TIMER_REGISTER
(
cpu
,
R_SCD_TIMER_INIT
)));
__raw_writeq
(
1000000
/
HZ
,
IOADDR
(
A_SCD_TIMER_REGISTER
(
cpu
,
R_SCD_TIMER_INIT
)));
#endif
/* Set the timer running */
bus
_writeq
(
M_SCD_TIMER_ENABLE
|
M_SCD_TIMER_MODE_CONTINUOUS
,
IOADDR
(
A_SCD_TIMER_REGISTER
(
cpu
,
R_SCD_TIMER_CFG
)));
__raw
_writeq
(
M_SCD_TIMER_ENABLE
|
M_SCD_TIMER_MODE_CONTINUOUS
,
IOADDR
(
A_SCD_TIMER_REGISTER
(
cpu
,
R_SCD_TIMER_CFG
)));
sb1250_unmask_irq
(
cpu
,
irq
);
sb1250_steal_irq
(
irq
);
...
...
@@ -105,8 +105,8 @@ void sb1250_timer_interrupt(struct pt_regs *regs)
int
irq
=
K_INT_TIMER_0
+
cpu
;
/* Reset the timer */
__
bus
_writeq
(
M_SCD_TIMER_ENABLE
|
M_SCD_TIMER_MODE_CONTINUOUS
,
IOADDR
(
A_SCD_TIMER_REGISTER
(
cpu
,
R_SCD_TIMER_CFG
)));
__
__raw
_writeq
(
M_SCD_TIMER_ENABLE
|
M_SCD_TIMER_MODE_CONTINUOUS
,
IOADDR
(
A_SCD_TIMER_REGISTER
(
cpu
,
R_SCD_TIMER_CFG
)));
/*
* CPU 0 handles the global timer interrupt job
...
...
@@ -130,7 +130,7 @@ void sb1250_timer_interrupt(struct pt_regs *regs)
unsigned
long
sb1250_gettimeoffset
(
void
)
{
unsigned
long
count
=
bus
_readq
(
IOADDR
(
A_SCD_TIMER_REGISTER
(
0
,
R_SCD_TIMER_CNT
)));
__raw
_readq
(
IOADDR
(
A_SCD_TIMER_REGISTER
(
0
,
R_SCD_TIMER_CNT
)));
return
1000000
/
HZ
-
count
;
}
arch/mips/sibyte/swarm/rtc_m41t81.c
浏览文件 @
65bda1a9
...
...
@@ -82,59 +82,60 @@
#define M41T81REG_SQW 0x13
/* square wave register */
#define M41T81_CCR_ADDRESS 0x68
#define SMB_CSR(reg) ((u8 *) (IOADDR(A_SMB_REGISTER(1, reg))))
#define SMB_CSR(reg) IOADDR(A_SMB_REGISTER(1, reg))
static
int
m41t81_read
(
uint8_t
addr
)
{
while
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
while
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
;
bus
_writeq
(
addr
&
0xff
,
SMB_CSR
(
R_SMB_CMD
));
bus_writeq
((
V_SMB_ADDR
(
M41T81_CCR_ADDRESS
)
|
V_SMB_TT_WR1BYTE
)
,
SMB_CSR
(
R_SMB_START
));
__raw
_writeq
(
addr
&
0xff
,
SMB_CSR
(
R_SMB_CMD
));
__raw_writeq
(
V_SMB_ADDR
(
M41T81_CCR_ADDRESS
)
|
V_SMB_TT_WR1BYTE
,
SMB_CSR
(
R_SMB_START
));
while
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
while
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
;
bus_writeq
((
V_SMB_ADDR
(
M41T81_CCR_ADDRESS
)
|
V_SMB_TT_RD1BYTE
)
,
SMB_CSR
(
R_SMB_START
));
__raw_writeq
(
V_SMB_ADDR
(
M41T81_CCR_ADDRESS
)
|
V_SMB_TT_RD1BYTE
,
SMB_CSR
(
R_SMB_START
));
while
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
while
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
;
if
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_ERROR
)
{
if
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_ERROR
)
{
/* Clear error bit by writing a 1 */
bus
_writeq
(
M_SMB_ERROR
,
SMB_CSR
(
R_SMB_STATUS
));
__raw
_writeq
(
M_SMB_ERROR
,
SMB_CSR
(
R_SMB_STATUS
));
return
-
1
;
}
return
(
bus
_readq
(
SMB_CSR
(
R_SMB_DATA
))
&
0xff
);
return
(
__raw
_readq
(
SMB_CSR
(
R_SMB_DATA
))
&
0xff
);
}
static
int
m41t81_write
(
uint8_t
addr
,
int
b
)
{
while
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
while
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
;
bus_writeq
((
addr
&
0xFF
)
,
SMB_CSR
(
R_SMB_CMD
));
bus_writeq
((
b
&
0xff
)
,
SMB_CSR
(
R_SMB_DATA
));
bus
_writeq
(
V_SMB_ADDR
(
M41T81_CCR_ADDRESS
)
|
V_SMB_TT_WR2BYTE
,
SMB_CSR
(
R_SMB_START
));
__raw_writeq
(
addr
&
0xff
,
SMB_CSR
(
R_SMB_CMD
));
__raw_writeq
(
b
&
0xff
,
SMB_CSR
(
R_SMB_DATA
));
__raw
_writeq
(
V_SMB_ADDR
(
M41T81_CCR_ADDRESS
)
|
V_SMB_TT_WR2BYTE
,
SMB_CSR
(
R_SMB_START
));
while
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
while
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
;
if
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_ERROR
)
{
if
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_ERROR
)
{
/* Clear error bit by writing a 1 */
bus
_writeq
(
M_SMB_ERROR
,
SMB_CSR
(
R_SMB_STATUS
));
__raw
_writeq
(
M_SMB_ERROR
,
SMB_CSR
(
R_SMB_STATUS
));
return
-
1
;
}
/* read the same byte again to make sure it is written */
bus
_writeq
(
V_SMB_ADDR
(
M41T81_CCR_ADDRESS
)
|
V_SMB_TT_RD1BYTE
,
SMB_CSR
(
R_SMB_START
));
__raw
_writeq
(
V_SMB_ADDR
(
M41T81_CCR_ADDRESS
)
|
V_SMB_TT_RD1BYTE
,
SMB_CSR
(
R_SMB_START
));
while
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
while
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
;
return
0
;
...
...
arch/mips/sibyte/swarm/rtc_xicor1241.c
浏览文件 @
65bda1a9
...
...
@@ -57,52 +57,52 @@
#define X1241_CCR_ADDRESS 0x6F
#define SMB_CSR(reg)
((u8 *) (IOADDR(A_SMB_REGISTER(1, reg))
))
#define SMB_CSR(reg)
IOADDR(A_SMB_REGISTER(1, reg
))
static
int
xicor_read
(
uint8_t
addr
)
{
while
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
while
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
;
bus
_writeq
((
addr
>>
8
)
&
0x7
,
SMB_CSR
(
R_SMB_CMD
));
bus_writeq
((
addr
&
0xff
)
,
SMB_CSR
(
R_SMB_DATA
));
bus_writeq
((
V_SMB_ADDR
(
X1241_CCR_ADDRESS
)
|
V_SMB_TT_WR2BYTE
)
,
SMB_CSR
(
R_SMB_START
));
__raw
_writeq
((
addr
>>
8
)
&
0x7
,
SMB_CSR
(
R_SMB_CMD
));
__raw_writeq
(
addr
&
0xff
,
SMB_CSR
(
R_SMB_DATA
));
__raw_writeq
(
V_SMB_ADDR
(
X1241_CCR_ADDRESS
)
|
V_SMB_TT_WR2BYTE
,
SMB_CSR
(
R_SMB_START
));
while
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
while
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
;
bus_writeq
((
V_SMB_ADDR
(
X1241_CCR_ADDRESS
)
|
V_SMB_TT_RD1BYTE
)
,
SMB_CSR
(
R_SMB_START
));
__raw_writeq
(
V_SMB_ADDR
(
X1241_CCR_ADDRESS
)
|
V_SMB_TT_RD1BYTE
,
SMB_CSR
(
R_SMB_START
));
while
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
while
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
;
if
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_ERROR
)
{
if
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_ERROR
)
{
/* Clear error bit by writing a 1 */
bus
_writeq
(
M_SMB_ERROR
,
SMB_CSR
(
R_SMB_STATUS
));
__raw
_writeq
(
M_SMB_ERROR
,
SMB_CSR
(
R_SMB_STATUS
));
return
-
1
;
}
return
(
bus
_readq
(
SMB_CSR
(
R_SMB_DATA
))
&
0xff
);
return
(
__raw
_readq
(
SMB_CSR
(
R_SMB_DATA
))
&
0xff
);
}
static
int
xicor_write
(
uint8_t
addr
,
int
b
)
{
while
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
while
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
;
bus
_writeq
(
addr
,
SMB_CSR
(
R_SMB_CMD
));
bus
_writeq
((
addr
&
0xff
)
|
((
b
&
0xff
)
<<
8
),
SMB_CSR
(
R_SMB_DATA
));
bus
_writeq
(
V_SMB_ADDR
(
X1241_CCR_ADDRESS
)
|
V_SMB_TT_WR3BYTE
,
SMB_CSR
(
R_SMB_START
));
__raw
_writeq
(
addr
,
SMB_CSR
(
R_SMB_CMD
));
__raw
_writeq
((
addr
&
0xff
)
|
((
b
&
0xff
)
<<
8
),
SMB_CSR
(
R_SMB_DATA
));
__raw
_writeq
(
V_SMB_ADDR
(
X1241_CCR_ADDRESS
)
|
V_SMB_TT_WR3BYTE
,
SMB_CSR
(
R_SMB_START
));
while
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
while
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
;
if
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_ERROR
)
{
if
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_ERROR
)
{
/* Clear error bit by writing a 1 */
bus
_writeq
(
M_SMB_ERROR
,
SMB_CSR
(
R_SMB_STATUS
));
__raw
_writeq
(
M_SMB_ERROR
,
SMB_CSR
(
R_SMB_STATUS
));
return
-
1
;
}
else
{
return
0
;
...
...
arch/mips/sibyte/swarm/time.c
浏览文件 @
65bda1a9
...
...
@@ -79,48 +79,48 @@ static unsigned int usec_bias = 0;
static
int
xicor_read
(
uint8_t
addr
)
{
while
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
while
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
;
bus
_writeq
((
addr
>>
8
)
&
0x7
,
SMB_CSR
(
R_SMB_CMD
));
bus_writeq
((
addr
&
0xff
)
,
SMB_CSR
(
R_SMB_DATA
));
bus_writeq
((
V_SMB_ADDR
(
X1241_CCR_ADDRESS
)
|
V_SMB_TT_WR2BYTE
)
,
SMB_CSR
(
R_SMB_START
));
__raw
_writeq
((
addr
>>
8
)
&
0x7
,
SMB_CSR
(
R_SMB_CMD
));
__raw_writeq
(
addr
&
0xff
,
SMB_CSR
(
R_SMB_DATA
));
__raw_writeq
(
V_SMB_ADDR
(
X1241_CCR_ADDRESS
)
|
V_SMB_TT_WR2BYTE
,
SMB_CSR
(
R_SMB_START
));
while
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
while
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
;
bus_writeq
((
V_SMB_ADDR
(
X1241_CCR_ADDRESS
)
|
V_SMB_TT_RD1BYTE
)
,
SMB_CSR
(
R_SMB_START
));
__raw_writeq
(
V_SMB_ADDR
(
X1241_CCR_ADDRESS
)
|
V_SMB_TT_RD1BYTE
,
SMB_CSR
(
R_SMB_START
));
while
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
while
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
;
if
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_ERROR
)
{
if
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_ERROR
)
{
/* Clear error bit by writing a 1 */
bus
_writeq
(
M_SMB_ERROR
,
SMB_CSR
(
R_SMB_STATUS
));
__raw
_writeq
(
M_SMB_ERROR
,
SMB_CSR
(
R_SMB_STATUS
));
return
-
1
;
}
return
(
bus
_readq
(
SMB_CSR
(
R_SMB_DATA
))
&
0xff
);
return
(
__raw
_readq
(
SMB_CSR
(
R_SMB_DATA
))
&
0xff
);
}
static
int
xicor_write
(
uint8_t
addr
,
int
b
)
{
while
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
while
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
;
bus
_writeq
(
addr
,
SMB_CSR
(
R_SMB_CMD
));
bus
_writeq
((
addr
&
0xff
)
|
((
b
&
0xff
)
<<
8
),
SMB_CSR
(
R_SMB_DATA
));
bus
_writeq
(
V_SMB_ADDR
(
X1241_CCR_ADDRESS
)
|
V_SMB_TT_WR3BYTE
,
SMB_CSR
(
R_SMB_START
));
__raw
_writeq
(
addr
,
SMB_CSR
(
R_SMB_CMD
));
__raw
_writeq
((
addr
&
0xff
)
|
((
b
&
0xff
)
<<
8
),
SMB_CSR
(
R_SMB_DATA
));
__raw
_writeq
(
V_SMB_ADDR
(
X1241_CCR_ADDRESS
)
|
V_SMB_TT_WR3BYTE
,
SMB_CSR
(
R_SMB_START
));
while
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
while
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_BUSY
)
;
if
(
bus
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_ERROR
)
{
if
(
__raw
_readq
(
SMB_CSR
(
R_SMB_STATUS
))
&
M_SMB_ERROR
)
{
/* Clear error bit by writing a 1 */
bus
_writeq
(
M_SMB_ERROR
,
SMB_CSR
(
R_SMB_STATUS
));
__raw
_writeq
(
M_SMB_ERROR
,
SMB_CSR
(
R_SMB_STATUS
));
return
-
1
;
}
else
{
return
0
;
...
...
@@ -228,8 +228,8 @@ void __init swarm_time_init(void)
/* Establish communication with the Xicor 1241 RTC */
/* XXXKW how do I share the SMBus with the I2C subsystem? */
bus
_writeq
(
K_SMB_FREQ_400KHZ
,
SMB_CSR
(
R_SMB_FREQ
));
bus
_writeq
(
0
,
SMB_CSR
(
R_SMB_CONTROL
));
__raw
_writeq
(
K_SMB_FREQ_400KHZ
,
SMB_CSR
(
R_SMB_FREQ
));
__raw
_writeq
(
0
,
SMB_CSR
(
R_SMB_CONTROL
));
if
((
status
=
xicor_read
(
X1241REG_SR_RTCF
))
<
0
)
{
printk
(
"x1241: couldn't detect on SWARM SMBus 1
\n
"
);
...
...
include/asm-mips/sibyte/sb1250.h
浏览文件 @
65bda1a9
...
...
@@ -58,6 +58,6 @@ extern void prom_printf(char *fmt, ...);
#endif
#define IOADDR(a) (
IO_BASE + (a
))
#define IOADDR(a) (
(void *)(IO_BASE + (a)
))
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录