Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
a15fdc34
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
未验证
提交
a15fdc34
编写于
11月 06, 2017
作者:
M
Mark Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branches 'regmap/topic/const' and 'regmap/topic/hwspinlock' into regmap-next
上级
e7f774c9
9c2e5cb3
c077fadf
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
110 addition
and
19 deletion
+110
-19
drivers/base/regmap/Kconfig
drivers/base/regmap/Kconfig
+4
-0
drivers/base/regmap/internal.h
drivers/base/regmap/internal.h
+2
-0
drivers/base/regmap/regmap-spi.c
drivers/base/regmap/regmap-spi.c
+1
-1
drivers/base/regmap/regmap-spmi.c
drivers/base/regmap/regmap-spmi.c
+2
-2
drivers/base/regmap/regmap.c
drivers/base/regmap/regmap.c
+95
-16
include/linux/regmap.h
include/linux/regmap.h
+6
-0
未找到文件。
drivers/base/regmap/Kconfig
浏览文件 @
a15fdc34
...
...
@@ -5,6 +5,7 @@
config REGMAP
default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ)
select IRQ_DOMAIN if REGMAP_IRQ
select REGMAP_HWSPINLOCK if HWSPINLOCK=y
bool
config REGCACHE_COMPRESSED
...
...
@@ -36,3 +37,6 @@ config REGMAP_MMIO
config REGMAP_IRQ
bool
config REGMAP_HWSPINLOCK
bool
drivers/base/regmap/internal.h
浏览文件 @
a15fdc34
...
...
@@ -157,6 +157,8 @@ struct regmap {
struct
rb_root
range_tree
;
void
*
selector_work_buf
;
/* Scratch buffer used for selector */
struct
hwspinlock
*
hwlock
;
};
struct
regcache_ops
{
...
...
drivers/base/regmap/regmap-spi.c
浏览文件 @
a15fdc34
...
...
@@ -102,7 +102,7 @@ static int regmap_spi_read(void *context,
return
spi_write_then_read
(
spi
,
reg
,
reg_size
,
val
,
val_size
);
}
static
struct
regmap_bus
regmap_spi
=
{
static
const
struct
regmap_bus
regmap_spi
=
{
.
write
=
regmap_spi_write
,
.
gather_write
=
regmap_spi_gather_write
,
.
async_write
=
regmap_spi_async_write
,
...
...
drivers/base/regmap/regmap-spmi.c
浏览文件 @
a15fdc34
...
...
@@ -83,7 +83,7 @@ static int regmap_spmi_base_write(void *context, const void *data,
count
-
1
);
}
static
struct
regmap_bus
regmap_spmi_base
=
{
static
const
struct
regmap_bus
regmap_spmi_base
=
{
.
read
=
regmap_spmi_base_read
,
.
write
=
regmap_spmi_base_write
,
.
gather_write
=
regmap_spmi_base_gather_write
,
...
...
@@ -203,7 +203,7 @@ static int regmap_spmi_ext_write(void *context, const void *data,
count
-
2
);
}
static
struct
regmap_bus
regmap_spmi_ext
=
{
static
const
struct
regmap_bus
regmap_spmi_ext
=
{
.
read
=
regmap_spmi_ext_read
,
.
write
=
regmap_spmi_ext_write
,
.
gather_write
=
regmap_spmi_ext_gather_write
,
...
...
drivers/base/regmap/regmap.c
浏览文件 @
a15fdc34
...
...
@@ -20,6 +20,7 @@
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/log2.h>
#include <linux/hwspinlock.h>
#define CREATE_TRACE_POINTS
#include "trace.h"
...
...
@@ -413,6 +414,51 @@ static unsigned int regmap_parse_64_native(const void *buf)
}
#endif
#ifdef REGMAP_HWSPINLOCK
static
void
regmap_lock_hwlock
(
void
*
__map
)
{
struct
regmap
*
map
=
__map
;
hwspin_lock_timeout
(
map
->
hwlock
,
UINT_MAX
);
}
static
void
regmap_lock_hwlock_irq
(
void
*
__map
)
{
struct
regmap
*
map
=
__map
;
hwspin_lock_timeout_irq
(
map
->
hwlock
,
UINT_MAX
);
}
static
void
regmap_lock_hwlock_irqsave
(
void
*
__map
)
{
struct
regmap
*
map
=
__map
;
hwspin_lock_timeout_irqsave
(
map
->
hwlock
,
UINT_MAX
,
&
map
->
spinlock_flags
);
}
static
void
regmap_unlock_hwlock
(
void
*
__map
)
{
struct
regmap
*
map
=
__map
;
hwspin_unlock
(
map
->
hwlock
);
}
static
void
regmap_unlock_hwlock_irq
(
void
*
__map
)
{
struct
regmap
*
map
=
__map
;
hwspin_unlock_irq
(
map
->
hwlock
);
}
static
void
regmap_unlock_hwlock_irqrestore
(
void
*
__map
)
{
struct
regmap
*
map
=
__map
;
hwspin_unlock_irqrestore
(
map
->
hwlock
,
&
map
->
spinlock_flags
);
}
#endif
static
void
regmap_lock_mutex
(
void
*
__map
)
{
struct
regmap
*
map
=
__map
;
...
...
@@ -627,6 +673,34 @@ struct regmap *__regmap_init(struct device *dev,
map
->
lock
=
config
->
lock
;
map
->
unlock
=
config
->
unlock
;
map
->
lock_arg
=
config
->
lock_arg
;
}
else
if
(
config
->
hwlock_id
)
{
#ifdef REGMAP_HWSPINLOCK
map
->
hwlock
=
hwspin_lock_request_specific
(
config
->
hwlock_id
);
if
(
!
map
->
hwlock
)
{
ret
=
-
ENXIO
;
goto
err_map
;
}
switch
(
config
->
hwlock_mode
)
{
case
HWLOCK_IRQSTATE
:
map
->
lock
=
regmap_lock_hwlock_irqsave
;
map
->
unlock
=
regmap_unlock_hwlock_irqrestore
;
break
;
case
HWLOCK_IRQ
:
map
->
lock
=
regmap_lock_hwlock_irq
;
map
->
unlock
=
regmap_unlock_hwlock_irq
;
break
;
default:
map
->
lock
=
regmap_lock_hwlock
;
map
->
unlock
=
regmap_unlock_hwlock
;
break
;
}
map
->
lock_arg
=
map
;
#else
ret
=
-
EINVAL
;
goto
err_map
;
#endif
}
else
{
if
((
bus
&&
bus
->
fast_io
)
||
config
->
fast_io
)
{
...
...
@@ -729,7 +803,7 @@ struct regmap *__regmap_init(struct device *dev,
map
->
format
.
format_write
=
regmap_format_2_6_write
;
break
;
default:
goto
err_
map
;
goto
err_
hwlock
;
}
break
;
...
...
@@ -739,7 +813,7 @@ struct regmap *__regmap_init(struct device *dev,
map
->
format
.
format_write
=
regmap_format_4_12_write
;
break
;
default:
goto
err_
map
;
goto
err_
hwlock
;
}
break
;
...
...
@@ -749,7 +823,7 @@ struct regmap *__regmap_init(struct device *dev,
map
->
format
.
format_write
=
regmap_format_7_9_write
;
break
;
default:
goto
err_
map
;
goto
err_
hwlock
;
}
break
;
...
...
@@ -759,7 +833,7 @@ struct regmap *__regmap_init(struct device *dev,
map
->
format
.
format_write
=
regmap_format_10_14_write
;
break
;
default:
goto
err_
map
;
goto
err_
hwlock
;
}
break
;
...
...
@@ -779,13 +853,13 @@ struct regmap *__regmap_init(struct device *dev,
map
->
format
.
format_reg
=
regmap_format_16_native
;
break
;
default:
goto
err_
map
;
goto
err_
hwlock
;
}
break
;
case
24
:
if
(
reg_endian
!=
REGMAP_ENDIAN_BIG
)
goto
err_
map
;
goto
err_
hwlock
;
map
->
format
.
format_reg
=
regmap_format_24
;
break
;
...
...
@@ -801,7 +875,7 @@ struct regmap *__regmap_init(struct device *dev,
map
->
format
.
format_reg
=
regmap_format_32_native
;
break
;
default:
goto
err_
map
;
goto
err_
hwlock
;
}
break
;
...
...
@@ -818,13 +892,13 @@ struct regmap *__regmap_init(struct device *dev,
map
->
format
.
format_reg
=
regmap_format_64_native
;
break
;
default:
goto
err_
map
;
goto
err_
hwlock
;
}
break
;
#endif
default:
goto
err_
map
;
goto
err_
hwlock
;
}
if
(
val_endian
==
REGMAP_ENDIAN_NATIVE
)
...
...
@@ -853,12 +927,12 @@ struct regmap *__regmap_init(struct device *dev,
map
->
format
.
parse_val
=
regmap_parse_16_native
;
break
;
default:
goto
err_
map
;
goto
err_
hwlock
;
}
break
;
case
24
:
if
(
val_endian
!=
REGMAP_ENDIAN_BIG
)
goto
err_
map
;
goto
err_
hwlock
;
map
->
format
.
format_val
=
regmap_format_24
;
map
->
format
.
parse_val
=
regmap_parse_24
;
break
;
...
...
@@ -879,7 +953,7 @@ struct regmap *__regmap_init(struct device *dev,
map
->
format
.
parse_val
=
regmap_parse_32_native
;
break
;
default:
goto
err_
map
;
goto
err_
hwlock
;
}
break
;
#ifdef CONFIG_64BIT
...
...
@@ -900,7 +974,7 @@ struct regmap *__regmap_init(struct device *dev,
map
->
format
.
parse_val
=
regmap_parse_64_native
;
break
;
default:
goto
err_
map
;
goto
err_
hwlock
;
}
break
;
#endif
...
...
@@ -909,18 +983,18 @@ struct regmap *__regmap_init(struct device *dev,
if
(
map
->
format
.
format_write
)
{
if
((
reg_endian
!=
REGMAP_ENDIAN_BIG
)
||
(
val_endian
!=
REGMAP_ENDIAN_BIG
))
goto
err_
map
;
goto
err_
hwlock
;
map
->
use_single_write
=
true
;
}
if
(
!
map
->
format
.
format_write
&&
!
(
map
->
format
.
format_reg
&&
map
->
format
.
format_val
))
goto
err_
map
;
goto
err_
hwlock
;
map
->
work_buf
=
kzalloc
(
map
->
format
.
buf_size
,
GFP_KERNEL
);
if
(
map
->
work_buf
==
NULL
)
{
ret
=
-
ENOMEM
;
goto
err_
map
;
goto
err_
hwlock
;
}
if
(
map
->
format
.
format_write
)
{
...
...
@@ -1041,6 +1115,9 @@ struct regmap *__regmap_init(struct device *dev,
err_range:
regmap_range_exit
(
map
);
kfree
(
map
->
work_buf
);
err_hwlock:
if
(
IS_ENABLED
(
REGMAP_HWSPINLOCK
)
&&
map
->
hwlock
)
hwspin_lock_free
(
map
->
hwlock
);
err_map:
kfree
(
map
);
err:
...
...
@@ -1228,6 +1305,8 @@ void regmap_exit(struct regmap *map)
kfree
(
async
->
work_buf
);
kfree
(
async
);
}
if
(
IS_ENABLED
(
REGMAP_HWSPINLOCK
)
&&
map
->
hwlock
)
hwspin_lock_free
(
map
->
hwlock
);
kfree
(
map
);
}
EXPORT_SYMBOL_GPL
(
regmap_exit
);
...
...
include/linux/regmap.h
浏览文件 @
a15fdc34
...
...
@@ -317,6 +317,9 @@ typedef void (*regmap_unlock)(void *);
*
* @ranges: Array of configuration entries for virtual address ranges.
* @num_ranges: Number of range configuration entries.
* @hwlock_id: Specify the hardware spinlock id.
* @hwlock_mode: The hardware spinlock mode, should be HWLOCK_IRQSTATE,
* HWLOCK_IRQ or 0.
*/
struct
regmap_config
{
const
char
*
name
;
...
...
@@ -361,6 +364,9 @@ struct regmap_config {
const
struct
regmap_range_cfg
*
ranges
;
unsigned
int
num_ranges
;
unsigned
int
hwlock_id
;
unsigned
int
hwlock_mode
;
};
/**
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录