Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
5a3e3b22
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
5a3e3b22
编写于
10月 04, 2006
作者:
P
Paul Mackerras
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'upstream' of
git://git.kernel.org/pub/scm/linux/kernel/git/vitb/linux-2.6-PQ
上级
c730f5b6
91bd6109
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
1165 addition
and
9 deletion
+1165
-9
arch/powerpc/Kconfig
arch/powerpc/Kconfig
+1
-0
arch/powerpc/boot/dts/mpc8272ads.dts
arch/powerpc/boot/dts/mpc8272ads.dts
+223
-0
arch/powerpc/platforms/82xx/Kconfig
arch/powerpc/platforms/82xx/Kconfig
+21
-0
arch/powerpc/platforms/82xx/Makefile
arch/powerpc/platforms/82xx/Makefile
+5
-0
arch/powerpc/platforms/82xx/m82xx_pci.h
arch/powerpc/platforms/82xx/m82xx_pci.h
+19
-0
arch/powerpc/platforms/82xx/mpc82xx.c
arch/powerpc/platforms/82xx/mpc82xx.c
+111
-0
arch/powerpc/platforms/82xx/mpc82xx_ads.c
arch/powerpc/platforms/82xx/mpc82xx_ads.c
+661
-0
arch/powerpc/platforms/82xx/pq2ads.h
arch/powerpc/platforms/82xx/pq2ads.h
+67
-0
arch/powerpc/sysdev/cpm2_pic.c
arch/powerpc/sysdev/cpm2_pic.c
+1
-1
arch/powerpc/sysdev/cpm2_pic.h
arch/powerpc/sysdev/cpm2_pic.h
+1
-1
arch/powerpc/sysdev/fsl_soc.c
arch/powerpc/sysdev/fsl_soc.c
+55
-7
未找到文件。
arch/powerpc/Kconfig
浏览文件 @
5a3e3b22
...
...
@@ -594,6 +594,7 @@ endmenu
source arch/powerpc/platforms/embedded6xx/Kconfig
source arch/powerpc/platforms/4xx/Kconfig
source arch/powerpc/platforms/82xx/Kconfig
source arch/powerpc/platforms/83xx/Kconfig
source arch/powerpc/platforms/85xx/Kconfig
source arch/powerpc/platforms/86xx/Kconfig
...
...
arch/powerpc/boot/dts/mpc8272ads.dts
0 → 100644
浏览文件 @
5a3e3b22
/*
*
MPC8272
ADS
Device
Tree
Source
*
*
Copyright
2005
Freescale
Semiconductor
Inc
.
*
*
This
program
is
free
software
;
you
can
redistribute
it
and
/
or
modify
it
*
under
the
terms
of
the
GNU
General
Public
License
as
published
by
the
*
Free
Software
Foundation
;
either
version
2
of
the
License
,
or
(
at
your
*
option
)
any
later
version
.
*/
/
{
model
=
"MPC8272ADS"
;
compatible
=
"MPC8260ADS"
;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
1
>;
linux
,
phandle
=
<
100
>;
cpus
{
#
cpus
=
<
1
>;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
0
>;
linux
,
phandle
=
<
200
>;
PowerPC
,
8272
@
0
{
device_type
=
"cpu"
;
reg
=
<
0
>;
d
-
cache
-
line
-
size
=
<
20
>;
//
32
bytes
i
-
cache
-
line
-
size
=
<
20
>;
//
32
bytes
d
-
cache
-
size
=
<
4000
>;
//
L1
,
16
K
i
-
cache
-
size
=
<
4000
>;
//
L1
,
16
K
timebase
-
frequency
=
<
0
>;
bus
-
frequency
=
<
0
>;
clock
-
frequency
=
<
0
>;
32
-
bit
;
linux
,
phandle
=
<
201
>;
linux
,
boot
-
cpu
;
};
};
interrupt
-
controller
@
f8200000
{
linux
,
phandle
=
<
f8200000
>;
#
address
-
cells
=
<
0
>;
#
interrupt
-
cells
=
<
2
>;
interrupt
-
controller
;
reg
=
<
f8200000
f8200004
>;
built
-
in
;
device_type
=
"pci-pic"
;
};
memory
{
device_type
=
"memory"
;
linux
,
phandle
=
<
300
>;
reg
=
<
00000000
4000000
f4500000
00000020
>;
};
soc8272
@
f0000000
{
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
1
>;
#
interrupt
-
cells
=
<
2
>;
device_type
=
"soc"
;
ranges
=
<
0
0
2
00000000
f0000000
00053000
>;
reg
=
<
f0000000
0
>;
mdio
@
0
{
device_type
=
"mdio"
;
compatible
=
"fs_enet"
;
reg
=
<
0
0
>;
linux
,
phandle
=
<
24520
>;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
0
>;
ethernet
-
phy
@
0
{
linux
,
phandle
=
<
2452000
>;
interrupt
-
parent
=
<
10
c00
>;
interrupts
=
<
19
1
>;
reg
=
<
0
>;
bitbang
=
[
12
12
13
02
02
01
];
device_type
=
"ethernet-phy"
;
};
ethernet
-
phy
@
1
{
linux
,
phandle
=
<
2452001
>;
interrupt
-
parent
=
<
10
c00
>;
interrupts
=
<
19
1
>;
bitbang
=
[
12
12
13
02
02
01
];
reg
=
<
3
>;
device_type
=
"ethernet-phy"
;
};
};
ethernet
@
24000
{
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
0
>;
device_type
=
"network"
;
device
-
id
=
<
2
>;
compatible
=
"fs_enet"
;
model
=
"FCC"
;
reg
=
<
11300
20
8400
100
11380
30
>;
mac
-
address
=
[
00
11
2F
99
43
54
];
interrupts
=
<
20
2
>;
interrupt
-
parent
=
<
10
c00
>;
phy
-
handle
=
<
2452000
>;
rx
-
clock
=
<
13
>;
tx
-
clock
=
<
12
>;
};
ethernet
@
25000
{
device_type
=
"network"
;
device
-
id
=
<
3
>;
compatible
=
"fs_enet"
;
model
=
"FCC"
;
reg
=
<
11320
20
8500
100
113
b0
30
>;
mac
-
address
=
[
00
11
2F
99
44
54
];
interrupts
=
<
21
2
>;
interrupt
-
parent
=
<
10
c00
>;
phy
-
handle
=
<
2452001
>;
rx
-
clock
=
<
17
>;
tx
-
clock
=
<
18
>;
};
cpm
@
f0000000
{
linux
,
phandle
=
<
f0000000
>;
#
address
-
cells
=
<
1
>;
#
size
-
cells
=
<
1
>;
#
interrupt
-
cells
=
<
2
>;
device_type
=
"cpm"
;
model
=
"CPM2"
;
ranges
=
<
00000000
00000000
3f
fff
>;
reg
=
<
10
d80
3280
>;
command
-
proc
=
<
119
c0
>;
brg
-
frequency
=
<
17
D7840
>;
cpm_clk
=
<
BEBC200
>;
scc
@
11
a00
{
device_type
=
"serial"
;
compatible
=
"cpm_uart"
;
model
=
"SCC"
;
device
-
id
=
<
2
>;
reg
=
<
11
a00
20
8000
100
>;
current
-
speed
=
<
1
c200
>;
interrupts
=
<
28
2
>;
interrupt
-
parent
=
<
10
c00
>;
clock
-
setup
=
<
0
00f
fffff
>;
rx
-
clock
=
<
1
>;
tx
-
clock
=
<
1
>;
};
scc
@
11
a60
{
device_type
=
"serial"
;
compatible
=
"cpm_uart"
;
model
=
"SCC"
;
device
-
id
=
<
5
>;
reg
=
<
11
a60
20
8300
100
>;
current
-
speed
=
<
1
c200
>;
interrupts
=
<
2
b
2
>;
interrupt
-
parent
=
<
10
c00
>;
clock
-
setup
=
<
1
b
ffffff00
>;
rx
-
clock
=
<
4
>;
tx
-
clock
=
<
4
>;
};
};
interrupt
-
controller
@
10
c00
{
linux
,
phandle
=
<
10
c00
>;
#
address
-
cells
=
<
0
>;
#
interrupt
-
cells
=
<
2
>;
interrupt
-
controller
;
reg
=
<
10
c00
80
>;
built
-
in
;
device_type
=
"cpm-pic"
;
compatible
=
"CPM2"
;
};
pci
@
0500
{
linux
,
phandle
=
<
0500
>;
#
interrupt
-
cells
=
<
1
>;
#
size
-
cells
=
<
2
>;
#
address
-
cells
=
<
3
>;
compatible
=
"8272"
;
device_type
=
"pci"
;
reg
=
<
10430
4
dc
>;
clock
-
frequency
=
<
3f940
aa
>;
interrupt
-
map
-
mask
=
<
f800
0
0
7
>;
interrupt
-
map
=
<
/*
IDSEL
0x16
*/
b000
0
0
1
f8200000
40
0
b000
0
0
2
f8200000
41
0
b000
0
0
3
f8200000
42
0
b000
0
0
4
f8200000
43
0
/*
IDSEL
0x17
*/
b800
0
0
1
f8200000
43
0
b800
0
0
2
f8200000
40
0
b800
0
0
3
f8200000
41
0
b800
0
0
4
f8200000
42
0
/*
IDSEL
0x18
*/
c000
0
0
1
f8200000
42
0
c000
0
0
2
f8200000
43
0
c000
0
0
3
f8200000
40
0
c000
0
0
4
f8200000
41
0
>;
interrupt
-
parent
=
<
10
c00
>;
interrupts
=
<
14
3
>;
bus
-
range
=
<
0
0
>;
ranges
=
<
02000000
0
80000000
80000000
0
40000000
01000000
0
00000000
f6000000
0
02000000
>;
};
/*
May
need
to
remove
if
on
a
part
without
crypto
engine
*/
crypto
@
30000
{
device_type
=
"crypto"
;
model
=
"SEC2"
;
compatible
=
"talitos"
;
reg
=
<
30000
10000
>;
interrupts
=
<
b
0
>;
interrupt
-
parent
=
<
10
c00
>;
num
-
channels
=
<
4
>;
channel
-
fifo
-
len
=
<
18
>;
exec
-
units
-
mask
=
<
0000007
e
>;
/*
desc
mask
is
for
rev1
.
x
,
we
need
runtime
fixup
for
>=
2.
x
*/
descriptor
-
types
-
mask
=
<
01010
ebf
>;
};
};
};
arch/powerpc/platforms/82xx/Kconfig
0 → 100644
浏览文件 @
5a3e3b22
menu "Platform support"
depends on PPC_82xx
choice
prompt "Machine Type"
default MPC82xx_ADS
config MPC82xx_ADS
bool "Freescale MPC82xx ADS"
select DEFAULT_UIMAGE
select PQ2ADS
select 8272
select 8260
select CPM2
select FSL_SOC
help
This option enables support for the MPC8272 ADS board
endchoice
endmenu
arch/powerpc/platforms/82xx/Makefile
0 → 100644
浏览文件 @
5a3e3b22
#
# Makefile for the PowerPC 82xx linux kernel.
#
obj-$(CONFIG_PPC_82xx)
+=
mpc82xx.o
obj-$(CONFIG_MPC82xx_ADS)
+=
mpc82xx_ads.o
arch/powerpc/platforms/82xx/m82xx_pci.h
0 → 100644
浏览文件 @
5a3e3b22
#ifndef _PPC_KERNEL_M82XX_PCI_H
#define _PPC_KERNEL_M82XX_PCI_H
/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#include <asm/m8260_pci.h>
#define SIU_INT_IRQ1 ((uint)0x13 + CPM_IRQ_OFFSET)
#ifndef _IO_BASE
#define _IO_BASE isa_io_base
#endif
#endif
/* _PPC_KERNEL_M8260_PCI_H */
arch/powerpc/platforms/82xx/mpc82xx.c
0 → 100644
浏览文件 @
5a3e3b22
/*
* MPC82xx setup and early boot code plus other random bits.
*
* Author: Vitaly Bordug <vbordug@ru.mvista.com>
*
* Copyright (c) 2006 MontaVista Software, Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
#include <linux/config.h>
#include <linux/stddef.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/reboot.h>
#include <linux/pci.h>
#include <linux/interrupt.h>
#include <linux/kdev_t.h>
#include <linux/major.h>
#include <linux/console.h>
#include <linux/delay.h>
#include <linux/seq_file.h>
#include <linux/root_dev.h>
#include <linux/initrd.h>
#include <linux/module.h>
#include <linux/fsl_devices.h>
#include <linux/fs_uart_pd.h>
#include <asm/system.h>
#include <asm/pgtable.h>
#include <asm/page.h>
#include <asm/atomic.h>
#include <asm/time.h>
#include <asm/io.h>
#include <asm/machdep.h>
#include <asm/bootinfo.h>
#include <asm/pci-bridge.h>
#include <asm/mpc8260.h>
#include <asm/irq.h>
#include <mm/mmu_decl.h>
#include <asm/prom.h>
#include <asm/cpm2.h>
#include <asm/udbg.h>
#include <asm/i8259.h>
#include <linux/fs_enet_pd.h>
#include <sysdev/fsl_soc.h>
#include <sysdev/cpm2_pic.h>
#include "pq2ads_pd.h"
static
int
__init
get_freq
(
char
*
name
,
unsigned
long
*
val
)
{
struct
device_node
*
cpu
;
unsigned
int
*
fp
;
int
found
=
0
;
/* The cpu node should have timebase and clock frequency properties */
cpu
=
of_find_node_by_type
(
NULL
,
"cpu"
);
if
(
cpu
)
{
fp
=
(
unsigned
int
*
)
get_property
(
cpu
,
name
,
NULL
);
if
(
fp
)
{
found
=
1
;
*
val
=
*
fp
++
;
}
of_node_put
(
cpu
);
}
return
found
;
}
void
__init
m82xx_calibrate_decr
(
void
)
{
ppc_tb_freq
=
125000000
;
if
(
!
get_freq
(
"bus-frequency"
,
&
ppc_tb_freq
))
{
printk
(
KERN_ERR
"WARNING: Estimating decrementer frequency "
"(not found)
\n
"
);
}
ppc_tb_freq
/=
4
;
ppc_proc_freq
=
1000000000
;
if
(
!
get_freq
(
"clock-frequency"
,
&
ppc_proc_freq
))
printk
(
KERN_ERR
"WARNING: Estimating processor frequency"
"(not found)
\n
"
);
}
void
mpc82xx_ads_show_cpuinfo
(
struct
seq_file
*
m
)
{
uint
pvid
,
svid
,
phid1
;
uint
memsize
=
total_memory
;
pvid
=
mfspr
(
SPRN_PVR
);
svid
=
mfspr
(
SPRN_SVR
);
seq_printf
(
m
,
"Vendor
\t\t
: Freescale Semiconductor
\n
"
);
seq_printf
(
m
,
"Machine
\t\t
: %s
\n
"
,
CPUINFO_MACHINE
);
seq_printf
(
m
,
"PVR
\t\t
: 0x%x
\n
"
,
pvid
);
seq_printf
(
m
,
"SVR
\t\t
: 0x%x
\n
"
,
svid
);
/* Display cpu Pll setting */
phid1
=
mfspr
(
SPRN_HID1
);
seq_printf
(
m
,
"PLL setting
\t
: 0x%x
\n
"
,
((
phid1
>>
24
)
&
0x3f
));
/* Display the amount of memory */
seq_printf
(
m
,
"Memory
\t\t
: %d MB
\n
"
,
memsize
/
(
1024
*
1024
));
}
arch/powerpc/platforms/82xx/mpc82xx_ads.c
0 → 100644
浏览文件 @
5a3e3b22
/*
* MPC82xx_ads setup and early boot code plus other random bits.
*
* Author: Vitaly Bordug <vbordug@ru.mvista.com>
* m82xx_restart fix by Wade Farnsworth <wfarnsworth@mvista.com>
*
* Copyright (c) 2006 MontaVista Software, Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
#include <linux/config.h>
#include <linux/stddef.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/reboot.h>
#include <linux/pci.h>
#include <linux/interrupt.h>
#include <linux/kdev_t.h>
#include <linux/major.h>
#include <linux/console.h>
#include <linux/delay.h>
#include <linux/seq_file.h>
#include <linux/root_dev.h>
#include <linux/initrd.h>
#include <linux/module.h>
#include <linux/fsl_devices.h>
#include <linux/fs_uart_pd.h>
#include <asm/system.h>
#include <asm/pgtable.h>
#include <asm/page.h>
#include <asm/atomic.h>
#include <asm/time.h>
#include <asm/io.h>
#include <asm/machdep.h>
#include <asm/bootinfo.h>
#include <asm/pci-bridge.h>
#include <asm/mpc8260.h>
#include <asm/irq.h>
#include <mm/mmu_decl.h>
#include <asm/prom.h>
#include <asm/cpm2.h>
#include <asm/udbg.h>
#include <asm/i8259.h>
#include <linux/fs_enet_pd.h>
#include <sysdev/fsl_soc.h>
#include <../sysdev/cpm2_pic.h>
#include "pq2ads_pd.h"
#ifdef CONFIG_PCI
static
uint
pci_clk_frq
;
static
struct
{
unsigned
long
*
pci_int_stat_reg
;
unsigned
long
*
pci_int_mask_reg
;
}
pci_regs
;
static
unsigned
long
pci_int_base
;
static
struct
irq_host
*
pci_pic_host
;
static
struct
device_node
*
pci_pic_node
;
#endif
static
void
__init
mpc82xx_ads_pic_init
(
void
)
{
struct
device_node
*
np
=
of_find_compatible_node
(
NULL
,
"cpm-pic"
,
"CPM2"
);
struct
resource
r
;
cpm2_map_t
*
cpm_reg
;
if
(
np
==
NULL
)
{
printk
(
KERN_ERR
"PIC init: can not find cpm-pic node
\n
"
);
return
;
}
if
(
of_address_to_resource
(
np
,
0
,
&
r
))
{
printk
(
KERN_ERR
"PIC init: invalid resource
\n
"
);
of_node_put
(
np
);
return
;
}
cpm2_pic_init
(
np
);
of_node_put
(
np
);
/* Initialize the default interrupt mapping priorities,
* in case the boot rom changed something on us.
*/
cpm_reg
=
(
cpm2_map_t
*
)
ioremap
(
get_immrbase
(),
sizeof
(
cpm2_map_t
));
cpm_reg
->
im_intctl
.
ic_siprr
=
0x05309770
;
iounmap
(
cpm_reg
);
#ifdef CONFIG_PCI
/* Initialize stuff for the 82xx CPLD IC and install demux */
m82xx_pci_init_irq
();
#endif
}
static
void
init_fcc1_ioports
(
struct
fs_platform_info
*
fpi
)
{
struct
io_port
*
io
;
u32
tempval
;
cpm2_map_t
*
immap
=
ioremap
(
get_immrbase
(),
sizeof
(
cpm2_map_t
));
struct
device_node
*
np
;
struct
resource
r
;
u32
*
bcsr
;
np
=
of_find_node_by_type
(
NULL
,
"memory"
);
if
(
!
np
)
{
printk
(
KERN_INFO
"No memory node in device tree
\n
"
);
return
;
}
if
(
of_address_to_resource
(
np
,
1
,
&
r
))
{
printk
(
KERN_INFO
"No memory reg property [1] in devicetree
\n
"
);
return
;
}
of_node_put
(
np
);
bcsr
=
ioremap
(
r
.
start
+
4
,
sizeof
(
u32
));
io
=
&
immap
->
im_ioport
;
/* Enable the PHY */
clrbits32
(
bcsr
,
BCSR1_FETHIEN
);
setbits32
(
bcsr
,
BCSR1_FETH_RST
);
/* FCC1 pins are on port A/C. */
/* Configure port A and C pins for FCC1 Ethernet. */
tempval
=
in_be32
(
&
io
->
iop_pdira
);
tempval
&=
~
PA1_DIRA0
;
tempval
|=
PA1_DIRA1
;
out_be32
(
&
io
->
iop_pdira
,
tempval
);
tempval
=
in_be32
(
&
io
->
iop_psora
);
tempval
&=
~
PA1_PSORA0
;
tempval
|=
PA1_PSORA1
;
out_be32
(
&
io
->
iop_psora
,
tempval
);
setbits32
(
&
io
->
iop_ppara
,
PA1_DIRA0
|
PA1_DIRA1
);
/* Alter clocks */
tempval
=
PC_CLK
(
fpi
->
clk_tx
-
8
)
|
PC_CLK
(
fpi
->
clk_rx
-
8
);
clrbits32
(
&
io
->
iop_psorc
,
tempval
);
clrbits32
(
&
io
->
iop_pdirc
,
tempval
);
setbits32
(
&
io
->
iop_pparc
,
tempval
);
cpm2_clk_setup
(
CPM_CLK_FCC1
,
fpi
->
clk_rx
,
CPM_CLK_RX
);
cpm2_clk_setup
(
CPM_CLK_FCC1
,
fpi
->
clk_tx
,
CPM_CLK_TX
);
iounmap
(
bcsr
);
iounmap
(
immap
);
}
static
void
init_fcc2_ioports
(
struct
fs_platform_info
*
fpi
)
{
cpm2_map_t
*
immap
=
ioremap
(
get_immrbase
(),
sizeof
(
cpm2_map_t
));
struct
device_node
*
np
;
struct
resource
r
;
u32
*
bcsr
;
struct
io_port
*
io
;
u32
tempval
;
np
=
of_find_node_by_type
(
NULL
,
"memory"
);
if
(
!
np
)
{
printk
(
KERN_INFO
"No memory node in device tree
\n
"
);
return
;
}
if
(
of_address_to_resource
(
np
,
1
,
&
r
))
{
printk
(
KERN_INFO
"No memory reg property [1] in devicetree
\n
"
);
return
;
}
of_node_put
(
np
);
io
=
&
immap
->
im_ioport
;
bcsr
=
ioremap
(
r
.
start
+
12
,
sizeof
(
u32
));
/* Enable the PHY */
clrbits32
(
bcsr
,
BCSR3_FETHIEN2
);
setbits32
(
bcsr
,
BCSR3_FETH2_RST
);
/* FCC2 are port B/C. */
/* Configure port A and C pins for FCC2 Ethernet. */
tempval
=
in_be32
(
&
io
->
iop_pdirb
);
tempval
&=
~
PB2_DIRB0
;
tempval
|=
PB2_DIRB1
;
out_be32
(
&
io
->
iop_pdirb
,
tempval
);
tempval
=
in_be32
(
&
io
->
iop_psorb
);
tempval
&=
~
PB2_PSORB0
;
tempval
|=
PB2_PSORB1
;
out_be32
(
&
io
->
iop_psorb
,
tempval
);
setbits32
(
&
io
->
iop_pparb
,
PB2_DIRB0
|
PB2_DIRB1
);
tempval
=
PC_CLK
(
fpi
->
clk_tx
-
8
)
|
PC_CLK
(
fpi
->
clk_rx
-
8
);
/* Alter clocks */
clrbits32
(
&
io
->
iop_psorc
,
tempval
);
clrbits32
(
&
io
->
iop_pdirc
,
tempval
);
setbits32
(
&
io
->
iop_pparc
,
tempval
);
cpm2_clk_setup
(
CPM_CLK_FCC2
,
fpi
->
clk_rx
,
CPM_CLK_RX
);
cpm2_clk_setup
(
CPM_CLK_FCC2
,
fpi
->
clk_tx
,
CPM_CLK_TX
);
iounmap
(
bcsr
);
iounmap
(
immap
);
}
void
init_fcc_ioports
(
struct
fs_platform_info
*
fpi
)
{
int
fcc_no
=
fs_get_fcc_index
(
fpi
->
fs_no
);
switch
(
fcc_no
)
{
case
0
:
init_fcc1_ioports
(
fpi
);
break
;
case
1
:
init_fcc2_ioports
(
fpi
);
break
;
default:
printk
(
KERN_ERR
"init_fcc_ioports: invalid FCC number
\n
"
);
return
;
}
}
static
void
init_scc1_uart_ioports
(
struct
fs_uart_platform_info
*
data
)
{
cpm2_map_t
*
immap
=
ioremap
(
get_immrbase
(),
sizeof
(
cpm2_map_t
));
/* SCC1 is only on port D */
setbits32
(
&
immap
->
im_ioport
.
iop_ppard
,
0x00000003
);
clrbits32
(
&
immap
->
im_ioport
.
iop_psord
,
0x00000001
);
setbits32
(
&
immap
->
im_ioport
.
iop_psord
,
0x00000002
);
clrbits32
(
&
immap
->
im_ioport
.
iop_pdird
,
0x00000001
);
setbits32
(
&
immap
->
im_ioport
.
iop_pdird
,
0x00000002
);
clrbits32
(
&
immap
->
im_cpmux
.
cmx_scr
,
(
0x00000007
<<
(
4
-
data
->
clk_tx
)));
clrbits32
(
&
immap
->
im_cpmux
.
cmx_scr
,
(
0x00000038
<<
(
4
-
data
->
clk_rx
)));
setbits32
(
&
immap
->
im_cpmux
.
cmx_scr
,
((
data
->
clk_tx
-
1
)
<<
(
4
-
data
->
clk_tx
)));
setbits32
(
&
immap
->
im_cpmux
.
cmx_scr
,
((
data
->
clk_rx
-
1
)
<<
(
4
-
data
->
clk_rx
)));
iounmap
(
immap
);
}
static
void
init_scc4_uart_ioports
(
struct
fs_uart_platform_info
*
data
)
{
cpm2_map_t
*
immap
=
ioremap
(
get_immrbase
(),
sizeof
(
cpm2_map_t
));
setbits32
(
&
immap
->
im_ioport
.
iop_ppard
,
0x00000600
);
clrbits32
(
&
immap
->
im_ioport
.
iop_psord
,
0x00000600
);
clrbits32
(
&
immap
->
im_ioport
.
iop_pdird
,
0x00000200
);
setbits32
(
&
immap
->
im_ioport
.
iop_pdird
,
0x00000400
);
clrbits32
(
&
immap
->
im_cpmux
.
cmx_scr
,
(
0x00000007
<<
(
4
-
data
->
clk_tx
)));
clrbits32
(
&
immap
->
im_cpmux
.
cmx_scr
,
(
0x00000038
<<
(
4
-
data
->
clk_rx
)));
setbits32
(
&
immap
->
im_cpmux
.
cmx_scr
,
((
data
->
clk_tx
-
1
)
<<
(
4
-
data
->
clk_tx
)));
setbits32
(
&
immap
->
im_cpmux
.
cmx_scr
,
((
data
->
clk_rx
-
1
)
<<
(
4
-
data
->
clk_rx
)));
iounmap
(
immap
);
}
void
init_scc_ioports
(
struct
fs_uart_platform_info
*
data
)
{
int
scc_no
=
fs_get_scc_index
(
data
->
fs_no
);
switch
(
scc_no
)
{
case
0
:
init_scc1_uart_ioports
(
data
);
data
->
brg
=
data
->
clk_rx
;
break
;
case
3
:
init_scc4_uart_ioports
(
data
);
data
->
brg
=
data
->
clk_rx
;
break
;
default:
printk
(
KERN_ERR
"init_scc_ioports: invalid SCC number
\n
"
);
return
;
}
}
void
__init
m82xx_board_setup
(
void
)
{
cpm2_map_t
*
immap
=
ioremap
(
get_immrbase
(),
sizeof
(
cpm2_map_t
));
struct
device_node
*
np
;
struct
resource
r
;
u32
*
bcsr
;
np
=
of_find_node_by_type
(
NULL
,
"memory"
);
if
(
!
np
)
{
printk
(
KERN_INFO
"No memory node in device tree
\n
"
);
return
;
}
if
(
of_address_to_resource
(
np
,
1
,
&
r
))
{
printk
(
KERN_INFO
"No memory reg property [1] in devicetree
\n
"
);
return
;
}
of_node_put
(
np
);
bcsr
=
ioremap
(
r
.
start
+
4
,
sizeof
(
u32
));
/* Enable the 2nd UART port */
clrbits32
(
bcsr
,
BCSR1_RS232_EN2
);
#ifdef CONFIG_SERIAL_CPM_SCC1
clrbits32
((
u32
*
)
&
immap
->
im_scc
[
0
].
scc_sccm
,
UART_SCCM_TX
|
UART_SCCM_RX
);
clrbits32
((
u32
*
)
&
immap
->
im_scc
[
0
].
scc_gsmrl
,
SCC_GSMRL_ENR
|
SCC_GSMRL_ENT
);
#endif
#ifdef CONFIG_SERIAL_CPM_SCC2
clrbits32
((
u32
*
)
&
immap
->
im_scc
[
1
].
scc_sccm
,
UART_SCCM_TX
|
UART_SCCM_RX
);
clrbits32
((
u32
*
)
&
immap
->
im_scc
[
1
].
scc_gsmrl
,
SCC_GSMRL_ENR
|
SCC_GSMRL_ENT
);
#endif
#ifdef CONFIG_SERIAL_CPM_SCC3
clrbits32
((
u32
*
)
&
immap
->
im_scc
[
2
].
scc_sccm
,
UART_SCCM_TX
|
UART_SCCM_RX
);
clrbits32
((
u32
*
)
&
immap
->
im_scc
[
2
].
scc_gsmrl
,
SCC_GSMRL_ENR
|
SCC_GSMRL_ENT
);
#endif
#ifdef CONFIG_SERIAL_CPM_SCC4
clrbits32
((
u32
*
)
&
immap
->
im_scc
[
3
].
scc_sccm
,
UART_SCCM_TX
|
UART_SCCM_RX
);
clrbits32
((
u32
*
)
&
immap
->
im_scc
[
3
].
scc_gsmrl
,
SCC_GSMRL_ENR
|
SCC_GSMRL_ENT
);
#endif
iounmap
(
bcsr
);
iounmap
(
immap
);
}
#ifdef CONFIG_PCI
static
void
m82xx_pci_mask_irq
(
unsigned
int
irq
)
{
int
bit
=
irq
-
pci_int_base
;
*
pci_regs
.
pci_int_mask_reg
|=
(
1
<<
(
31
-
bit
));
return
;
}
static
void
m82xx_pci_unmask_irq
(
unsigned
int
irq
)
{
int
bit
=
irq
-
pci_int_base
;
*
pci_regs
.
pci_int_mask_reg
&=
~
(
1
<<
(
31
-
bit
));
return
;
}
static
void
m82xx_pci_mask_and_ack
(
unsigned
int
irq
)
{
int
bit
=
irq
-
pci_int_base
;
*
pci_regs
.
pci_int_mask_reg
|=
(
1
<<
(
31
-
bit
));
return
;
}
static
void
m82xx_pci_end_irq
(
unsigned
int
irq
)
{
int
bit
=
irq
-
pci_int_base
;
*
pci_regs
.
pci_int_mask_reg
&=
~
(
1
<<
(
31
-
bit
));
return
;
}
struct
hw_interrupt_type
m82xx_pci_ic
=
{
.
typename
=
"MPC82xx ADS PCI"
,
.
name
=
"MPC82xx ADS PCI"
,
.
enable
=
m82xx_pci_unmask_irq
,
.
disable
=
m82xx_pci_mask_irq
,
.
ack
=
m82xx_pci_mask_and_ack
,
.
end
=
m82xx_pci_end_irq
,
.
mask
=
m82xx_pci_mask_irq
,
.
mask_ack
=
m82xx_pci_mask_and_ack
,
.
unmask
=
m82xx_pci_unmask_irq
,
.
eoi
=
m82xx_pci_end_irq
,
};
static
void
m82xx_pci_irq_demux
(
unsigned
int
irq
,
struct
irq_desc
*
desc
,
struct
pt_regs
*
regs
)
{
unsigned
long
stat
,
mask
,
pend
;
int
bit
;
for
(;;)
{
stat
=
*
pci_regs
.
pci_int_stat_reg
;
mask
=
*
pci_regs
.
pci_int_mask_reg
;
pend
=
stat
&
~
mask
&
0xf0000000
;
if
(
!
pend
)
break
;
for
(
bit
=
0
;
pend
!=
0
;
++
bit
,
pend
<<=
1
)
{
if
(
pend
&
0x80000000
)
__do_IRQ
(
pci_int_base
+
bit
,
regs
);
}
}
}
static
int
pci_pic_host_match
(
struct
irq_host
*
h
,
struct
device_node
*
node
)
{
return
node
==
pci_pic_node
;
}
static
int
pci_pic_host_map
(
struct
irq_host
*
h
,
unsigned
int
virq
,
irq_hw_number_t
hw
)
{
get_irq_desc
(
virq
)
->
status
|=
IRQ_LEVEL
;
set_irq_chip
(
virq
,
&
m82xx_pci_ic
);
return
0
;
}
static
void
pci_host_unmap
(
struct
irq_host
*
h
,
unsigned
int
virq
)
{
/* remove chip and handler */
set_irq_chip
(
virq
,
NULL
);
}
static
struct
irq_host_ops
pci_pic_host_ops
=
{
.
match
=
pci_pic_host_match
,
.
map
=
pci_pic_host_map
,
.
unmap
=
pci_host_unmap
,
};
void
m82xx_pci_init_irq
(
void
)
{
int
irq
;
cpm2_map_t
*
immap
;
struct
device_node
*
np
;
struct
resource
r
;
const
u32
*
regs
;
unsigned
int
size
;
const
u32
*
irq_map
;
int
i
;
unsigned
int
irq_max
,
irq_min
;
if
((
np
=
of_find_node_by_type
(
NULL
,
"soc"
))
==
NULL
)
{
printk
(
KERN_INFO
"No SOC node in device tree
\n
"
);
return
;
}
memset
(
&
r
,
0
,
sizeof
(
r
));
if
(
of_address_to_resource
(
np
,
0
,
&
r
))
{
printk
(
KERN_INFO
"No SOC reg property in device tree
\n
"
);
return
;
}
immap
=
ioremap
(
r
.
start
,
sizeof
(
*
immap
));
of_node_put
(
np
);
/* install the demultiplexer for the PCI cascade interrupt */
np
=
of_find_node_by_type
(
NULL
,
"pci"
);
if
(
!
np
)
{
printk
(
KERN_INFO
"No pci node on device tree
\n
"
);
iounmap
(
immap
);
return
;
}
irq_map
=
get_property
(
np
,
"interrupt-map"
,
&
size
);
if
((
!
irq_map
)
||
(
size
<=
7
))
{
printk
(
KERN_INFO
"No interrupt-map property of pci node
\n
"
);
iounmap
(
immap
);
return
;
}
size
/=
sizeof
(
irq_map
[
0
]);
for
(
i
=
0
,
irq_max
=
0
,
irq_min
=
512
;
i
<
size
;
i
+=
7
,
irq_map
+=
7
)
{
if
(
irq_map
[
5
]
<
irq_min
)
irq_min
=
irq_map
[
5
];
if
(
irq_map
[
5
]
>
irq_max
)
irq_max
=
irq_map
[
5
];
}
pci_int_base
=
irq_min
;
irq
=
irq_of_parse_and_map
(
np
,
0
);
set_irq_chained_handler
(
irq
,
m82xx_pci_irq_demux
);
of_node_put
(
np
);
np
=
of_find_node_by_type
(
NULL
,
"pci-pic"
);
if
(
!
np
)
{
printk
(
KERN_INFO
"No pci pic node on device tree
\n
"
);
iounmap
(
immap
);
return
;
}
pci_pic_node
=
of_node_get
(
np
);
/* PCI interrupt controller registers: status and mask */
regs
=
get_property
(
np
,
"reg"
,
&
size
);
if
((
!
regs
)
||
(
size
<=
2
))
{
printk
(
KERN_INFO
"No reg property in pci pic node
\n
"
);
iounmap
(
immap
);
return
;
}
pci_regs
.
pci_int_stat_reg
=
ioremap
(
regs
[
0
],
sizeof
(
*
pci_regs
.
pci_int_stat_reg
));
pci_regs
.
pci_int_mask_reg
=
ioremap
(
regs
[
1
],
sizeof
(
*
pci_regs
.
pci_int_mask_reg
));
of_node_put
(
np
);
/* configure chip select for PCI interrupt controller */
immap
->
im_memctl
.
memc_br3
=
regs
[
0
]
|
0x00001801
;
immap
->
im_memctl
.
memc_or3
=
0xffff8010
;
/* make PCI IRQ level sensitive */
immap
->
im_intctl
.
ic_siexr
&=
~
(
1
<<
(
14
-
(
irq
-
SIU_INT_IRQ1
)));
/* mask all PCI interrupts */
*
pci_regs
.
pci_int_mask_reg
|=
0xfff00000
;
iounmap
(
immap
);
pci_pic_host
=
irq_alloc_host
(
IRQ_HOST_MAP_LINEAR
,
irq_max
-
irq_min
+
1
,
&
pci_pic_host_ops
,
irq_max
+
1
);
return
;
}
static
int
m82xx_pci_exclude_device
(
u_char
bus
,
u_char
devfn
)
{
if
(
bus
==
0
&&
PCI_SLOT
(
devfn
)
==
0
)
return
PCIBIOS_DEVICE_NOT_FOUND
;
else
return
PCIBIOS_SUCCESSFUL
;
}
static
void
__init
mpc82xx_pcibios_fixup
(
void
)
{
struct
pci_dev
*
dev
=
NULL
;
for_each_pci_dev
(
dev
)
{
pci_read_irq_line
(
dev
);
}
}
void
__init
add_bridge
(
struct
device_node
*
np
)
{
int
len
;
struct
pci_controller
*
hose
;
struct
resource
r
;
const
int
*
bus_range
;
const
void
*
ptr
;
memset
(
&
r
,
0
,
sizeof
(
r
));
if
(
of_address_to_resource
(
np
,
0
,
&
r
))
{
printk
(
KERN_INFO
"No PCI reg property in device tree
\n
"
);
return
;
}
if
(
!
(
ptr
=
get_property
(
np
,
"clock-frequency"
,
NULL
)))
{
printk
(
KERN_INFO
"No clock-frequency property in PCI node"
);
return
;
}
pci_clk_frq
=
*
(
uint
*
)
ptr
;
of_node_put
(
np
);
bus_range
=
get_property
(
np
,
"bus-range"
,
&
len
);
if
(
bus_range
==
NULL
||
len
<
2
*
sizeof
(
int
))
{
printk
(
KERN_WARNING
"Can't get bus-range for %s, assume"
" bus 0
\n
"
,
np
->
full_name
);
}
pci_assign_all_buses
=
1
;
hose
=
pcibios_alloc_controller
();
if
(
!
hose
)
return
;
hose
->
arch_data
=
np
;
hose
->
set_cfg_type
=
1
;
hose
->
first_busno
=
bus_range
?
bus_range
[
0
]
:
0
;
hose
->
last_busno
=
bus_range
?
bus_range
[
1
]
:
0xff
;
hose
->
bus_offset
=
0
;
hose
->
set_cfg_type
=
1
;
setup_indirect_pci
(
hose
,
r
.
start
+
offsetof
(
pci_cpm2_t
,
pci_cfg_addr
),
r
.
start
+
offsetof
(
pci_cpm2_t
,
pci_cfg_data
));
pci_process_bridge_OF_ranges
(
hose
,
np
,
1
);
}
#endif
/*
* Setup the architecture
*/
static
void
__init
mpc82xx_ads_setup_arch
(
void
)
{
#ifdef CONFIG_PCI
struct
device_node
*
np
;
#endif
if
(
ppc_md
.
progress
)
ppc_md
.
progress
(
"mpc82xx_ads_setup_arch()"
,
0
);
cpm2_reset
();
/* Map I/O region to a 256MB BAT */
m82xx_board_setup
();
#ifdef CONFIG_PCI
ppc_md
.
pci_exclude_device
=
m82xx_pci_exclude_device
;
for
(
np
=
NULL
;
(
np
=
of_find_node_by_type
(
np
,
"pci"
))
!=
NULL
;)
add_bridge
(
np
);
of_node_put
(
np
);
ppc_md
.
pci_map_irq
=
NULL
;
ppc_md
.
pcibios_fixup
=
mpc82xx_pcibios_fixup
;
ppc_md
.
pcibios_fixup_bus
=
NULL
;
#endif
#ifdef CONFIG_ROOT_NFS
ROOT_DEV
=
Root_NFS
;
#else
ROOT_DEV
=
Root_HDA1
;
#endif
if
(
ppc_md
.
progress
)
ppc_md
.
progress
(
"mpc82xx_ads_setup_arch(), finish"
,
0
);
}
/*
* Called very early, device-tree isn't unflattened
*/
static
int
__init
mpc82xx_ads_probe
(
void
)
{
/* We always match for now, eventually we should look at
* the flat dev tree to ensure this is the board we are
* supposed to run on
*/
return
1
;
}
#define RMR_CSRE 0x00000001
static
void
m82xx_restart
(
char
*
cmd
)
{
__volatile__
unsigned
char
dummy
;
local_irq_disable
();
((
cpm2_map_t
*
)
cpm2_immr
)
->
im_clkrst
.
car_rmr
|=
RMR_CSRE
;
/* Clear the ME,EE,IR & DR bits in MSR to cause checkstop */
mtmsr
(
mfmsr
()
&
~
(
MSR_ME
|
MSR_EE
|
MSR_IR
|
MSR_DR
));
dummy
=
((
cpm2_map_t
*
)
cpm2_immr
)
->
im_clkrst
.
res
[
0
];
printk
(
"Restart failed
\n
"
);
while
(
1
)
;
}
static
void
m82xx_halt
(
void
)
{
local_irq_disable
();
while
(
1
)
;
}
define_machine
(
mpc82xx_ads
)
{
.
name
=
"MPC82xx ADS"
,
.
probe
=
mpc82xx_ads_probe
,
.
setup_arch
=
mpc82xx_ads_setup_arch
,
.
init_IRQ
=
mpc82xx_ads_pic_init
,
.
show_cpuinfo
=
mpc82xx_ads_show_cpuinfo
,
.
get_irq
=
cpm2_get_irq
,
.
calibrate_decr
=
m82xx_calibrate_decr
,
.
restart
=
m82xx_restart
,.
halt
=
m82xx_halt
,
};
arch/powerpc/platforms/82xx/pq2ads.h
0 → 100644
浏览文件 @
5a3e3b22
/*
* PQ2/mpc8260 board-specific stuff
*
* A collection of structures, addresses, and values associated with
* the Freescale MPC8260ADS/MPC8266ADS-PCI boards.
* Copied from the RPX-Classic and SBS8260 stuff.
*
* Author: Vitaly Bordug <vbordug@ru.mvista.com>
*
* Originally written by Dan Malek for Motorola MPC8260 family
*
* Copyright (c) 2001 Dan Malek <dan@embeddedalley.com>
* Copyright (c) 2006 MontaVista Software, Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
#ifdef __KERNEL__
#ifndef __MACH_ADS8260_DEFS
#define __MACH_ADS8260_DEFS
#include <linux/config.h>
#include <asm/ppcboot.h>
/* For our show_cpuinfo hooks. */
#define CPUINFO_VENDOR "Freescale Semiconductor"
#define CPUINFO_MACHINE "PQ2 ADS PowerPC"
/* Backword-compatibility stuff for the drivers */
#define CPM_MAP_ADDR ((uint)0xf0000000)
#define CPM_IRQ_OFFSET 0
/* The ADS8260 has 16, 32-bit wide control/status registers, accessed
* only on word boundaries.
* Not all are used (yet), or are interesting to us (yet).
*/
/* Things of interest in the CSR.
*/
#define BCSR0_LED0 ((uint)0x02000000)
/* 0 == on */
#define BCSR0_LED1 ((uint)0x01000000)
/* 0 == on */
#define BCSR1_FETHIEN ((uint)0x08000000)
/* 0 == enable*/
#define BCSR1_FETH_RST ((uint)0x04000000)
/* 0 == reset */
#define BCSR1_RS232_EN1 ((uint)0x02000000)
/* 0 ==enable */
#define BCSR1_RS232_EN2 ((uint)0x01000000)
/* 0 ==enable */
#define BCSR3_FETHIEN2 ((uint)0x10000000)
/* 0 == enable*/
#define BCSR3_FETH2_RS ((uint)0x80000000)
/* 0 == reset */
/* cpm serial driver works with constants below */
#define SIU_INT_SMC1 ((uint)0x04+CPM_IRQ_OFFSET)
#define SIU_INT_SMC2i ((uint)0x05+CPM_IRQ_OFFSET)
#define SIU_INT_SCC1 ((uint)0x28+CPM_IRQ_OFFSET)
#define SIU_INT_SCC2 ((uint)0x29+CPM_IRQ_OFFSET)
#define SIU_INT_SCC3 ((uint)0x2a+CPM_IRQ_OFFSET)
#define SIU_INT_SCC4 ((uint)0x2b+CPM_IRQ_OFFSET)
void
m82xx_pci_init_irq
(
void
);
void
mpc82xx_ads_show_cpuinfo
(
struct
seq_file
*
);
void
m82xx_calibrate_decr
(
void
);
#endif
/* __MACH_ADS8260_DEFS */
#endif
/* __KERNEL__ */
arch/powerpc/sysdev/cpm2_pic.c
浏览文件 @
5a3e3b22
...
...
@@ -147,7 +147,7 @@ static struct irq_chip cpm2_pic = {
.
end
=
cpm2_end_irq
,
};
int
cpm2_get_irq
(
struct
pt_regs
*
regs
)
unsigned
int
cpm2_get_irq
(
struct
pt_regs
*
regs
)
{
int
irq
;
unsigned
long
bits
;
...
...
arch/powerpc/sysdev/cpm2_pic.h
浏览文件 @
5a3e3b22
...
...
@@ -3,7 +3,7 @@
extern
intctl_cpm2_t
*
cpm2_intctl
;
extern
int
cpm2_get_irq
(
struct
pt_regs
*
regs
);
extern
unsigned
int
cpm2_get_irq
(
struct
pt_regs
*
regs
);
extern
void
cpm2_pic_init
(
struct
device_node
*
);
...
...
arch/powerpc/sysdev/fsl_soc.c
浏览文件 @
5a3e3b22
...
...
@@ -37,6 +37,7 @@
#include <asm/cpm2.h>
extern
void
init_fcc_ioports
(
struct
fs_platform_info
*
);
extern
void
init_scc_ioports
(
struct
fs_uart_platform_info
*
);
static
phys_addr_t
immrbase
=
-
1
;
phys_addr_t
get_immrbase
(
void
)
...
...
@@ -566,7 +567,7 @@ static int __init fs_enet_of_init(void)
struct
resource
r
[
4
];
struct
device_node
*
phy
,
*
mdio
;
struct
fs_platform_info
fs_enet_data
;
const
unsigned
int
*
id
,
*
phy_addr
;
const
unsigned
int
*
id
,
*
phy_addr
,
phy_irq
;
const
void
*
mac_addr
;
const
phandle
*
ph
;
const
char
*
model
;
...
...
@@ -588,6 +589,7 @@ static int __init fs_enet_of_init(void)
if
(
ret
)
goto
err
;
r
[
2
].
name
=
fcc_regs_c
;
fs_enet_data
.
fcc_regs_c
=
r
[
2
].
start
;
r
[
3
].
start
=
r
[
3
].
end
=
irq_of_parse_and_map
(
np
,
0
);
r
[
3
].
flags
=
IORESOURCE_IRQ
;
...
...
@@ -620,6 +622,8 @@ static int __init fs_enet_of_init(void)
phy_addr
=
get_property
(
phy
,
"reg"
,
NULL
);
fs_enet_data
.
phy_addr
=
*
phy_addr
;
phy_irq
=
get_property
(
phy
,
"interrupts"
,
NULL
);
id
=
get_property
(
np
,
"device-id"
,
NULL
);
fs_enet_data
.
fs_no
=
*
id
;
strcpy
(
fs_enet_data
.
fs_type
,
model
);
...
...
@@ -637,6 +641,7 @@ static int __init fs_enet_of_init(void)
if
(
strstr
(
model
,
"FCC"
))
{
int
fcc_index
=
*
id
-
1
;
unsigned
char
*
mdio_bb_prop
;
fs_enet_data
.
dpram_offset
=
(
u32
)
cpm_dpram_addr
(
0
);
fs_enet_data
.
rx_ring
=
32
;
...
...
@@ -652,14 +657,57 @@ static int __init fs_enet_of_init(void)
(
u32
)
res
.
start
,
fs_enet_data
.
phy_addr
);
fs_enet_data
.
bus_id
=
(
char
*
)
&
bus_id
[(
*
id
)];
fs_enet_data
.
init_ioports
=
init_fcc_ioports
;
}
of_node_put
(
phy
);
of_node_put
(
mdio
);
mdio_bb_prop
=
get_property
(
phy
,
"bitbang"
,
NULL
);
if
(
mdio_bb_prop
)
{
struct
platform_device
*
fs_enet_mdio_bb_dev
;
struct
fs_mii_bb_platform_info
fs_enet_mdio_bb_data
;
fs_enet_mdio_bb_dev
=
platform_device_register_simple
(
"fsl-bb-mdio"
,
i
,
NULL
,
0
);
memset
(
&
fs_enet_mdio_bb_data
,
0
,
sizeof
(
struct
fs_mii_bb_platform_info
));
fs_enet_mdio_bb_data
.
mdio_dat
.
bit
=
mdio_bb_prop
[
0
];
fs_enet_mdio_bb_data
.
mdio_dir
.
bit
=
mdio_bb_prop
[
1
];
fs_enet_mdio_bb_data
.
mdc_dat
.
bit
=
mdio_bb_prop
[
2
];
fs_enet_mdio_bb_data
.
mdio_port
=
mdio_bb_prop
[
3
];
fs_enet_mdio_bb_data
.
mdc_port
=
mdio_bb_prop
[
4
];
fs_enet_mdio_bb_data
.
delay
=
mdio_bb_prop
[
5
];
fs_enet_mdio_bb_data
.
irq
[
0
]
=
phy_irq
[
0
];
fs_enet_mdio_bb_data
.
irq
[
1
]
=
-
1
;
fs_enet_mdio_bb_data
.
irq
[
2
]
=
-
1
;
fs_enet_mdio_bb_data
.
irq
[
3
]
=
phy_irq
[
0
];
fs_enet_mdio_bb_data
.
irq
[
31
]
=
-
1
;
fs_enet_mdio_bb_data
.
mdio_dat
.
offset
=
(
u32
)
&
cpm2_immr
->
im_ioport
.
iop_pdatc
;
fs_enet_mdio_bb_data
.
mdio_dir
.
offset
=
(
u32
)
&
cpm2_immr
->
im_ioport
.
iop_pdirc
;
fs_enet_mdio_bb_data
.
mdc_dat
.
offset
=
(
u32
)
&
cpm2_immr
->
im_ioport
.
iop_pdatc
;
ret
=
platform_device_add_data
(
fs_enet_mdio_bb_dev
,
&
fs_enet_mdio_bb_data
,
sizeof
(
struct
fs_mii_bb_platform_info
));
if
(
ret
)
goto
unreg
;
}
of_node_put
(
phy
);
of_node_put
(
mdio
);
ret
=
platform_device_add_data
(
fs_enet_dev
,
&
fs_enet_data
,
sizeof
(
struct
fs_platform_info
));
ret
=
platform_device_add_data
(
fs_enet_dev
,
&
fs_enet_data
,
sizeof
(
struct
fs_platform_info
));
if
(
ret
)
goto
unreg
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录