Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
addfd8a0
cloud-kernel
项目概览
openanolis
/
cloud-kernel
大约 2 年 前同步成功
通知
173
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
addfd8a0
编写于
3月 14, 2012
作者:
M
Mark Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'regmap/topic/bulk' into regmap-next
上级
eae4b51b
df00c79f
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
78 addition
and
5 deletion
+78
-5
drivers/base/regmap/regcache.c
drivers/base/regmap/regcache.c
+5
-0
drivers/base/regmap/regmap.c
drivers/base/regmap/regmap.c
+71
-5
include/linux/regmap.h
include/linux/regmap.h
+2
-0
未找到文件。
drivers/base/regmap/regcache.c
浏览文件 @
addfd8a0
...
...
@@ -35,12 +35,17 @@ static int regcache_hw_init(struct regmap *map)
return
-
EINVAL
;
if
(
!
map
->
reg_defaults_raw
)
{
u32
cache_bypass
=
map
->
cache_bypass
;
dev_warn
(
map
->
dev
,
"No cache defaults, reading back from HW
\n
"
);
/* Bypass the cache access till data read from HW*/
map
->
cache_bypass
=
1
;
tmp_buf
=
kmalloc
(
map
->
cache_size_raw
,
GFP_KERNEL
);
if
(
!
tmp_buf
)
return
-
EINVAL
;
ret
=
regmap_bulk_read
(
map
,
0
,
tmp_buf
,
map
->
num_reg_defaults_raw
);
map
->
cache_bypass
=
cache_bypass
;
if
(
ret
<
0
)
{
kfree
(
tmp_buf
);
return
ret
;
...
...
drivers/base/regmap/regmap.c
浏览文件 @
addfd8a0
...
...
@@ -411,6 +411,26 @@ static int _regmap_raw_write(struct regmap *map, unsigned int reg,
if
(
!
map
->
writeable_reg
(
map
->
dev
,
reg
+
i
))
return
-
EINVAL
;
if
(
!
map
->
cache_bypass
&&
map
->
format
.
parse_val
)
{
unsigned
int
ival
;
int
val_bytes
=
map
->
format
.
val_bytes
;
for
(
i
=
0
;
i
<
val_len
/
val_bytes
;
i
++
)
{
memcpy
(
map
->
work_buf
,
val
+
(
i
*
val_bytes
),
val_bytes
);
ival
=
map
->
format
.
parse_val
(
map
->
work_buf
);
ret
=
regcache_write
(
map
,
reg
+
i
,
ival
);
if
(
ret
)
{
dev_err
(
map
->
dev
,
"Error in caching of register: %u ret: %d
\n
"
,
reg
+
i
,
ret
);
return
ret
;
}
}
if
(
map
->
cache_only
)
{
map
->
cache_dirty
=
true
;
return
0
;
}
}
map
->
format
.
format_reg
(
map
->
work_buf
,
reg
);
u8
[
0
]
|=
map
->
write_flag_mask
;
...
...
@@ -461,7 +481,7 @@ int _regmap_write(struct regmap *map, unsigned int reg,
int
ret
;
BUG_ON
(
!
map
->
format
.
format_write
&&
!
map
->
format
.
format_val
);
if
(
!
map
->
cache_bypass
)
{
if
(
!
map
->
cache_bypass
&&
map
->
format
.
format_write
)
{
ret
=
regcache_write
(
map
,
reg
,
val
);
if
(
ret
!=
0
)
return
ret
;
...
...
@@ -538,12 +558,8 @@ EXPORT_SYMBOL_GPL(regmap_write);
int
regmap_raw_write
(
struct
regmap
*
map
,
unsigned
int
reg
,
const
void
*
val
,
size_t
val_len
)
{
size_t
val_count
=
val_len
/
map
->
format
.
val_bytes
;
int
ret
;
WARN_ON
(
!
regmap_volatile_range
(
map
,
reg
,
val_count
)
&&
map
->
cache_type
!=
REGCACHE_NONE
);
mutex_lock
(
&
map
->
lock
);
ret
=
_regmap_raw_write
(
map
,
reg
,
val
,
val_len
);
...
...
@@ -554,6 +570,56 @@ int regmap_raw_write(struct regmap *map, unsigned int reg,
}
EXPORT_SYMBOL_GPL
(
regmap_raw_write
);
/*
* regmap_bulk_write(): Write multiple registers to the device
*
* @map: Register map to write to
* @reg: First register to be write from
* @val: Block of data to be written, in native register size for device
* @val_count: Number of registers to write
*
* This function is intended to be used for writing a large block of
* data to be device either in single transfer or multiple transfer.
*
* A value of zero will be returned on success, a negative errno will
* be returned in error cases.
*/
int
regmap_bulk_write
(
struct
regmap
*
map
,
unsigned
int
reg
,
const
void
*
val
,
size_t
val_count
)
{
int
ret
=
0
,
i
;
size_t
val_bytes
=
map
->
format
.
val_bytes
;
void
*
wval
;
if
(
!
map
->
format
.
parse_val
)
return
-
EINVAL
;
mutex_lock
(
&
map
->
lock
);
/* No formatting is require if val_byte is 1 */
if
(
val_bytes
==
1
)
{
wval
=
(
void
*
)
val
;
}
else
{
wval
=
kmemdup
(
val
,
val_count
*
val_bytes
,
GFP_KERNEL
);
if
(
!
wval
)
{
ret
=
-
ENOMEM
;
dev_err
(
map
->
dev
,
"Error in memory allocation
\n
"
);
goto
out
;
}
for
(
i
=
0
;
i
<
val_count
*
val_bytes
;
i
+=
val_bytes
)
map
->
format
.
parse_val
(
wval
+
i
);
}
ret
=
_regmap_raw_write
(
map
,
reg
,
wval
,
val_bytes
*
val_count
);
if
(
val_bytes
!=
1
)
kfree
(
wval
);
out:
mutex_unlock
(
&
map
->
lock
);
return
ret
;
}
EXPORT_SYMBOL_GPL
(
regmap_bulk_write
);
static
int
_regmap_raw_read
(
struct
regmap
*
map
,
unsigned
int
reg
,
void
*
val
,
unsigned
int
val_len
)
{
...
...
include/linux/regmap.h
浏览文件 @
addfd8a0
...
...
@@ -146,6 +146,8 @@ int regmap_reinit_cache(struct regmap *map,
int
regmap_write
(
struct
regmap
*
map
,
unsigned
int
reg
,
unsigned
int
val
);
int
regmap_raw_write
(
struct
regmap
*
map
,
unsigned
int
reg
,
const
void
*
val
,
size_t
val_len
);
int
regmap_bulk_write
(
struct
regmap
*
map
,
unsigned
int
reg
,
const
void
*
val
,
size_t
val_count
);
int
regmap_read
(
struct
regmap
*
map
,
unsigned
int
reg
,
unsigned
int
*
val
);
int
regmap_raw_read
(
struct
regmap
*
map
,
unsigned
int
reg
,
void
*
val
,
size_t
val_len
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录