Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OS
U-Boot.Mirror
提交
98691a60
U
U-Boot.Mirror
项目概览
OS
/
U-Boot.Mirror
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
U-Boot.Mirror
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
98691a60
编写于
1月 09, 2018
作者:
T
Tom Rini
浏览文件
操作
浏览文件
下载
差异文件
Merge
git://git.denx.de/u-boot-rockchip
上级
8c9e6f28
538f67c3
变更
12
隐藏空白更改
内联
并排
Showing
12 changed file
with
223 addition
and
0 deletion
+223
-0
arch/arm/include/asm/arch-rockchip/clock.h
arch/arm/include/asm/arch-rockchip/clock.h
+10
-0
drivers/clk/rockchip/clk_rk3036.c
drivers/clk/rockchip/clk_rk3036.c
+7
-0
drivers/clk/rockchip/clk_rk3188.c
drivers/clk/rockchip/clk_rk3188.c
+7
-0
drivers/clk/rockchip/clk_rk322x.c
drivers/clk/rockchip/clk_rk322x.c
+7
-0
drivers/clk/rockchip/clk_rk3288.c
drivers/clk/rockchip/clk_rk3288.c
+7
-0
drivers/clk/rockchip/clk_rk3328.c
drivers/clk/rockchip/clk_rk3328.c
+7
-0
drivers/clk/rockchip/clk_rk3368.c
drivers/clk/rockchip/clk_rk3368.c
+7
-0
drivers/clk/rockchip/clk_rk3399.c
drivers/clk/rockchip/clk_rk3399.c
+21
-0
drivers/clk/rockchip/clk_rv1108.c
drivers/clk/rockchip/clk_rv1108.c
+7
-0
drivers/reset/Kconfig
drivers/reset/Kconfig
+9
-0
drivers/reset/Makefile
drivers/reset/Makefile
+1
-0
drivers/reset/reset-rockchip.c
drivers/reset/reset-rockchip.c
+133
-0
未找到文件。
arch/arm/include/asm/arch-rockchip/clock.h
浏览文件 @
98691a60
...
@@ -85,4 +85,14 @@ void rk3288_clk_configure_cpu(struct rk3288_cru *cru, struct rk3288_grf *grf);
...
@@ -85,4 +85,14 @@ void rk3288_clk_configure_cpu(struct rk3288_cru *cru, struct rk3288_grf *grf);
int
rockchip_get_clk
(
struct
udevice
**
devp
);
int
rockchip_get_clk
(
struct
udevice
**
devp
);
/*
* rockchip_reset_bind() - Bind soft reset device as child of clock device
*
* @pdev: clock udevice
* @reg_offset: the first offset in cru for softreset registers
* @reg_number: the reg numbers of softreset registers
* @return 0 success, or error value
*/
int
rockchip_reset_bind
(
struct
udevice
*
pdev
,
u32
reg_offset
,
u32
reg_number
);
#endif
#endif
drivers/clk/rockchip/clk_rk3036.c
浏览文件 @
98691a60
...
@@ -347,6 +347,13 @@ static int rk3036_clk_bind(struct udevice *dev)
...
@@ -347,6 +347,13 @@ static int rk3036_clk_bind(struct udevice *dev)
sys_child
->
priv
=
priv
;
sys_child
->
priv
=
priv
;
}
}
#if CONFIG_IS_ENABLED(CONFIG_RESET_ROCKCHIP)
ret
=
offsetof
(
struct
rk3036_cru
,
cru_softrst_con
[
0
]);
ret
=
rockchip_reset_bind
(
dev
,
ret
,
9
);
if
(
ret
)
debug
(
"Warning: software reset driver bind faile
\n
"
);
#endif
return
0
;
return
0
;
}
}
...
...
drivers/clk/rockchip/clk_rk3188.c
浏览文件 @
98691a60
...
@@ -590,6 +590,13 @@ static int rk3188_clk_bind(struct udevice *dev)
...
@@ -590,6 +590,13 @@ static int rk3188_clk_bind(struct udevice *dev)
sys_child
->
priv
=
priv
;
sys_child
->
priv
=
priv
;
}
}
#if CONFIG_IS_ENABLED(CONFIG_RESET_ROCKCHIP)
ret
=
offsetof
(
struct
rk3188_cru
,
cru_softrst_con
[
0
]);
ret
=
rockchip_reset_bind
(
dev
,
ret
,
9
);
if
(
ret
)
debug
(
"Warning: software reset driver bind faile
\n
"
);
#endif
return
0
;
return
0
;
}
}
...
...
drivers/clk/rockchip/clk_rk322x.c
浏览文件 @
98691a60
...
@@ -402,6 +402,13 @@ static int rk322x_clk_bind(struct udevice *dev)
...
@@ -402,6 +402,13 @@ static int rk322x_clk_bind(struct udevice *dev)
sys_child
->
priv
=
priv
;
sys_child
->
priv
=
priv
;
}
}
#if CONFIG_IS_ENABLED(CONFIG_RESET_ROCKCHIP)
ret
=
offsetof
(
struct
rk322x_cru
,
cru_softrst_con
[
0
]);
ret
=
rockchip_reset_bind
(
dev
,
ret
,
9
);
if
(
ret
)
debug
(
"Warning: software reset driver bind faile
\n
"
);
#endif
return
0
;
return
0
;
}
}
...
...
drivers/clk/rockchip/clk_rk3288.c
浏览文件 @
98691a60
...
@@ -876,6 +876,13 @@ static int rk3288_clk_bind(struct udevice *dev)
...
@@ -876,6 +876,13 @@ static int rk3288_clk_bind(struct udevice *dev)
sys_child
->
priv
=
priv
;
sys_child
->
priv
=
priv
;
}
}
#if CONFIG_IS_ENABLED(CONFIG_RESET_ROCKCHIP)
ret
=
offsetof
(
struct
rk3288_cru
,
cru_softrst_con
[
0
]);
ret
=
rockchip_reset_bind
(
dev
,
ret
,
12
);
if
(
ret
)
debug
(
"Warning: software reset driver bind faile
\n
"
);
#endif
return
0
;
return
0
;
}
}
...
...
drivers/clk/rockchip/clk_rk3328.c
浏览文件 @
98691a60
...
@@ -614,6 +614,13 @@ static int rk3328_clk_bind(struct udevice *dev)
...
@@ -614,6 +614,13 @@ static int rk3328_clk_bind(struct udevice *dev)
sys_child
->
priv
=
priv
;
sys_child
->
priv
=
priv
;
}
}
#if CONFIG_IS_ENABLED(CONFIG_RESET_ROCKCHIP)
ret
=
offsetof
(
struct
rk3328_cru
,
softrst_con
[
0
]);
ret
=
rockchip_reset_bind
(
dev
,
ret
,
12
);
if
(
ret
)
debug
(
"Warning: software reset driver bind faile
\n
"
);
#endif
return
ret
;
return
ret
;
}
}
...
...
drivers/clk/rockchip/clk_rk3368.c
浏览文件 @
98691a60
...
@@ -543,6 +543,13 @@ static int rk3368_clk_bind(struct udevice *dev)
...
@@ -543,6 +543,13 @@ static int rk3368_clk_bind(struct udevice *dev)
sys_child
->
priv
=
priv
;
sys_child
->
priv
=
priv
;
}
}
#if CONFIG_IS_ENABLED(CONFIG_RESET_ROCKCHIP)
ret
=
offsetof
(
struct
rk3368_cru
,
softrst_con
[
0
]);
ret
=
rockchip_reset_bind
(
dev
,
ret
,
15
);
if
(
ret
)
debug
(
"Warning: software reset driver bind faile
\n
"
);
#endif
return
ret
;
return
ret
;
}
}
...
...
drivers/clk/rockchip/clk_rk3399.c
浏览文件 @
98691a60
...
@@ -1046,6 +1046,13 @@ static int rk3399_clk_bind(struct udevice *dev)
...
@@ -1046,6 +1046,13 @@ static int rk3399_clk_bind(struct udevice *dev)
sys_child
->
priv
=
priv
;
sys_child
->
priv
=
priv
;
}
}
#if CONFIG_IS_ENABLED(CONFIG_RESET_ROCKCHIP)
ret
=
offsetof
(
struct
rk3399_cru
,
softrst_con
[
0
]);
ret
=
rockchip_reset_bind
(
dev
,
ret
,
21
);
if
(
ret
)
debug
(
"Warning: software reset driver bind faile
\n
"
);
#endif
return
0
;
return
0
;
}
}
...
@@ -1221,6 +1228,19 @@ static int rk3399_pmuclk_ofdata_to_platdata(struct udevice *dev)
...
@@ -1221,6 +1228,19 @@ static int rk3399_pmuclk_ofdata_to_platdata(struct udevice *dev)
return
0
;
return
0
;
}
}
static
int
rk3399_pmuclk_bind
(
struct
udevice
*
dev
)
{
#if CONFIG_IS_ENABLED(CONFIG_RESET_ROCKCHIP)
int
ret
;
ret
=
offsetof
(
struct
rk3399_pmucru
,
pmucru_softrst_con
[
0
]);
ret
=
rockchip_reset_bind
(
dev
,
ret
,
2
);
if
(
ret
)
debug
(
"Warning: software reset driver bind faile
\n
"
);
#endif
return
0
;
}
static
const
struct
udevice_id
rk3399_pmuclk_ids
[]
=
{
static
const
struct
udevice_id
rk3399_pmuclk_ids
[]
=
{
{
.
compatible
=
"rockchip,rk3399-pmucru"
},
{
.
compatible
=
"rockchip,rk3399-pmucru"
},
{
}
{
}
...
@@ -1234,6 +1254,7 @@ U_BOOT_DRIVER(rockchip_rk3399_pmuclk) = {
...
@@ -1234,6 +1254,7 @@ U_BOOT_DRIVER(rockchip_rk3399_pmuclk) = {
.
ofdata_to_platdata
=
rk3399_pmuclk_ofdata_to_platdata
,
.
ofdata_to_platdata
=
rk3399_pmuclk_ofdata_to_platdata
,
.
ops
=
&
rk3399_pmuclk_ops
,
.
ops
=
&
rk3399_pmuclk_ops
,
.
probe
=
rk3399_pmuclk_probe
,
.
probe
=
rk3399_pmuclk_probe
,
.
bind
=
rk3399_pmuclk_bind
,
#if CONFIG_IS_ENABLED(OF_PLATDATA)
#if CONFIG_IS_ENABLED(OF_PLATDATA)
.
platdata_auto_alloc_size
=
sizeof
(
struct
rk3399_pmuclk_plat
),
.
platdata_auto_alloc_size
=
sizeof
(
struct
rk3399_pmuclk_plat
),
#endif
#endif
...
...
drivers/clk/rockchip/clk_rv1108.c
浏览文件 @
98691a60
...
@@ -240,6 +240,13 @@ static int rv1108_clk_bind(struct udevice *dev)
...
@@ -240,6 +240,13 @@ static int rv1108_clk_bind(struct udevice *dev)
sys_child
->
priv
=
priv
;
sys_child
->
priv
=
priv
;
}
}
#if CONFIG_IS_ENABLED(CONFIG_RESET_ROCKCHIP)
ret
=
offsetof
(
struct
rk3368_cru
,
softrst_con
[
0
]);
ret
=
rockchip_reset_bind
(
dev
,
ret
,
13
);
if
(
ret
)
debug
(
"Warning: software reset driver bind faile
\n
"
);
#endif
return
0
;
return
0
;
}
}
...
...
drivers/reset/Kconfig
浏览文件 @
98691a60
...
@@ -74,4 +74,13 @@ config AST2500_RESET
...
@@ -74,4 +74,13 @@ config AST2500_RESET
resets that are supported by watchdog. The main limitation though
resets that are supported by watchdog. The main limitation though
is that some reset signals, like I2C or MISC reset multiple devices.
is that some reset signals, like I2C or MISC reset multiple devices.
config RESET_ROCKCHIP
bool "Reset controller driver for Rockchip SoCs"
depends on DM_RESET && ARCH_ROCKCHIP && CLK
default y
help
Support for reset controller on rockchip SoC. The main limitation
though is that some reset signals, like I2C or MISC reset multiple
devices.
endmenu
endmenu
drivers/reset/Makefile
浏览文件 @
98691a60
...
@@ -12,3 +12,4 @@ obj-$(CONFIG_TEGRA186_RESET) += tegra186-reset.o
...
@@ -12,3 +12,4 @@ obj-$(CONFIG_TEGRA186_RESET) += tegra186-reset.o
obj-$(CONFIG_RESET_BCM6345)
+=
reset-bcm6345.o
obj-$(CONFIG_RESET_BCM6345)
+=
reset-bcm6345.o
obj-$(CONFIG_RESET_UNIPHIER)
+=
reset-uniphier.o
obj-$(CONFIG_RESET_UNIPHIER)
+=
reset-uniphier.o
obj-$(CONFIG_AST2500_RESET)
+=
ast2500-reset.o
obj-$(CONFIG_AST2500_RESET)
+=
ast2500-reset.o
obj-$(CONFIG_RESET_ROCKCHIP)
+=
reset-rockchip.o
drivers/reset/reset-rockchip.c
0 → 100644
浏览文件 @
98691a60
/*
* (C) Copyright 2017 Rockchip Electronics Co., Ltd
*
* SPDX-License-Identifier: GPL-2.0
*/
#include <common.h>
#include <dm.h>
#include <reset-uclass.h>
#include <linux/io.h>
#include <asm/arch/hardware.h>
#include <dm/lists.h>
/*
* Each reg has 16 bits reset signal for devices
* Note: Not including rk2818 and older SoCs
*/
#define ROCKCHIP_RESET_NUM_IN_REG 16
struct
rockchip_reset_priv
{
void
__iomem
*
base
;
/* Rockchip reset reg locate at cru controller */
u32
reset_reg_offset
;
/* Rockchip reset reg number */
u32
reset_reg_num
;
};
static
int
rockchip_reset_request
(
struct
reset_ctl
*
reset_ctl
)
{
struct
rockchip_reset_priv
*
priv
=
dev_get_priv
(
reset_ctl
->
dev
);
debug
(
"%s(reset_ctl=%p) (dev=%p, id=%lu) (reg_num=%d)
\n
"
,
__func__
,
reset_ctl
,
reset_ctl
->
dev
,
reset_ctl
->
id
,
priv
->
reset_reg_num
);
if
(
reset_ctl
->
id
/
ROCKCHIP_RESET_NUM_IN_REG
>=
priv
->
reset_reg_num
)
return
-
EINVAL
;
return
0
;
}
static
int
rockchip_reset_free
(
struct
reset_ctl
*
reset_ctl
)
{
debug
(
"%s(reset_ctl=%p) (dev=%p, id=%lu)
\n
"
,
__func__
,
reset_ctl
,
reset_ctl
->
dev
,
reset_ctl
->
id
);
return
0
;
}
static
int
rockchip_reset_assert
(
struct
reset_ctl
*
reset_ctl
)
{
struct
rockchip_reset_priv
*
priv
=
dev_get_priv
(
reset_ctl
->
dev
);
int
bank
=
reset_ctl
->
id
/
ROCKCHIP_RESET_NUM_IN_REG
;
int
offset
=
reset_ctl
->
id
%
ROCKCHIP_RESET_NUM_IN_REG
;
debug
(
"%s(reset_ctl=%p) (dev=%p, id=%lu) (reg_addr=%p)
\n
"
,
__func__
,
reset_ctl
,
reset_ctl
->
dev
,
reset_ctl
->
id
,
priv
->
base
+
(
bank
*
4
));
rk_setreg
(
priv
->
base
+
(
bank
*
4
),
BIT
(
offset
));
return
0
;
}
static
int
rockchip_reset_deassert
(
struct
reset_ctl
*
reset_ctl
)
{
struct
rockchip_reset_priv
*
priv
=
dev_get_priv
(
reset_ctl
->
dev
);
int
bank
=
reset_ctl
->
id
/
ROCKCHIP_RESET_NUM_IN_REG
;
int
offset
=
reset_ctl
->
id
%
ROCKCHIP_RESET_NUM_IN_REG
;
debug
(
"%s(reset_ctl=%p) (dev=%p, id=%lu) (reg_addr=%p)
\n
"
,
__func__
,
reset_ctl
,
reset_ctl
->
dev
,
reset_ctl
->
id
,
priv
->
base
+
(
bank
*
4
));
rk_clrreg
(
priv
->
base
+
(
bank
*
4
),
BIT
(
offset
));
return
0
;
}
struct
reset_ops
rockchip_reset_ops
=
{
.
request
=
rockchip_reset_request
,
.
free
=
rockchip_reset_free
,
.
rst_assert
=
rockchip_reset_assert
,
.
rst_deassert
=
rockchip_reset_deassert
,
};
static
int
rockchip_reset_probe
(
struct
udevice
*
dev
)
{
struct
rockchip_reset_priv
*
priv
=
dev_get_priv
(
dev
);
fdt_addr_t
addr
;
fdt_size_t
size
;
addr
=
dev_read_addr_size
(
dev
,
"reg"
,
&
size
);
if
(
addr
==
FDT_ADDR_T_NONE
)
return
-
EINVAL
;
if
((
priv
->
reset_reg_offset
==
0
)
&&
(
priv
->
reset_reg_num
==
0
))
return
-
EINVAL
;
addr
+=
priv
->
reset_reg_offset
;
priv
->
base
=
ioremap
(
addr
,
size
);
debug
(
"%s(base=%p) (reg_offset=%x, reg_num=%d)
\n
"
,
__func__
,
priv
->
base
,
priv
->
reset_reg_offset
,
priv
->
reset_reg_num
);
return
0
;
}
int
rockchip_reset_bind
(
struct
udevice
*
pdev
,
u32
reg_offset
,
u32
reg_number
)
{
struct
udevice
*
rst_dev
;
struct
rockchip_reset_priv
*
priv
;
int
ret
;
ret
=
device_bind_driver_to_node
(
pdev
,
"rockchip_reset"
,
"reset"
,
dev_ofnode
(
pdev
),
&
rst_dev
);
if
(
ret
)
{
debug
(
"Warning: No rockchip reset driver: ret=%d
\n
"
,
ret
);
return
ret
;
}
priv
=
malloc
(
sizeof
(
struct
rockchip_reset_priv
));
priv
->
reset_reg_offset
=
reg_offset
;
priv
->
reset_reg_num
=
reg_number
;
rst_dev
->
priv
=
priv
;
return
0
;
}
U_BOOT_DRIVER
(
rockchip_reset
)
=
{
.
name
=
"rockchip_reset"
,
.
id
=
UCLASS_RESET
,
.
probe
=
rockchip_reset_probe
,
.
ops
=
&
rockchip_reset_ops
,
.
priv_auto_alloc_size
=
sizeof
(
struct
rockchip_reset_priv
),
};
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录