Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
a75de772
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
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看板
未验证
提交
a75de772
编写于
1月 12, 2018
作者:
M
Mark Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branches 'regmap/topic/soundwire' and 'regmap/topic/zero' into regmap-next
上级
757b6528
7c22ce6e
9bf485c9
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
138 addition
and
2 deletion
+138
-2
drivers/base/regmap/Kconfig
drivers/base/regmap/Kconfig
+4
-0
drivers/base/regmap/Makefile
drivers/base/regmap/Makefile
+1
-0
drivers/base/regmap/regmap-sdw.c
drivers/base/regmap/regmap-sdw.c
+88
-0
drivers/base/regmap/regmap.c
drivers/base/regmap/regmap.c
+3
-1
include/linux/regmap.h
include/linux/regmap.h
+42
-1
未找到文件。
drivers/base/regmap/Kconfig
浏览文件 @
a75de772
...
...
@@ -37,3 +37,7 @@ config REGMAP_MMIO
config REGMAP_IRQ
bool
config REGMAP_SOUNDWIRE
tristate
depends on SOUNDWIRE_BUS
drivers/base/regmap/Makefile
浏览文件 @
a75de772
...
...
@@ -13,3 +13,4 @@ obj-$(CONFIG_REGMAP_SPMI) += regmap-spmi.o
obj-$(CONFIG_REGMAP_MMIO)
+=
regmap-mmio.o
obj-$(CONFIG_REGMAP_IRQ)
+=
regmap-irq.o
obj-$(CONFIG_REGMAP_W1)
+=
regmap-w1.o
obj-$(CONFIG_REGMAP_SOUNDWIRE)
+=
regmap-sdw.o
drivers/base/regmap/regmap-sdw.c
0 → 100644
浏览文件 @
a75de772
// SPDX-License-Identifier: GPL-2.0
// Copyright(c) 2015-17 Intel Corporation.
#include <linux/device.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/soundwire/sdw.h>
#include "internal.h"
static
int
regmap_sdw_write
(
void
*
context
,
unsigned
int
reg
,
unsigned
int
val
)
{
struct
device
*
dev
=
context
;
struct
sdw_slave
*
slave
=
dev_to_sdw_dev
(
dev
);
return
sdw_write
(
slave
,
reg
,
val
);
}
static
int
regmap_sdw_read
(
void
*
context
,
unsigned
int
reg
,
unsigned
int
*
val
)
{
struct
device
*
dev
=
context
;
struct
sdw_slave
*
slave
=
dev_to_sdw_dev
(
dev
);
int
read
;
read
=
sdw_read
(
slave
,
reg
);
if
(
read
<
0
)
return
read
;
*
val
=
read
;
return
0
;
}
static
struct
regmap_bus
regmap_sdw
=
{
.
reg_read
=
regmap_sdw_read
,
.
reg_write
=
regmap_sdw_write
,
.
reg_format_endian_default
=
REGMAP_ENDIAN_LITTLE
,
.
val_format_endian_default
=
REGMAP_ENDIAN_LITTLE
,
};
static
int
regmap_sdw_config_check
(
const
struct
regmap_config
*
config
)
{
/* All register are 8-bits wide as per MIPI Soundwire 1.0 Spec */
if
(
config
->
val_bits
!=
8
)
return
-
ENOTSUPP
;
/* Registers are 32 bits wide */
if
(
config
->
reg_bits
!=
32
)
return
-
ENOTSUPP
;
if
(
config
->
pad_bits
!=
0
)
return
-
ENOTSUPP
;
return
0
;
}
struct
regmap
*
__regmap_init_sdw
(
struct
sdw_slave
*
sdw
,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
const
char
*
lock_name
)
{
int
ret
;
ret
=
regmap_sdw_config_check
(
config
);
if
(
ret
)
return
ERR_PTR
(
ret
);
return
__regmap_init
(
&
sdw
->
dev
,
&
regmap_sdw
,
&
sdw
->
dev
,
config
,
lock_key
,
lock_name
);
}
EXPORT_SYMBOL_GPL
(
__regmap_init_sdw
);
struct
regmap
*
__devm_regmap_init_sdw
(
struct
sdw_slave
*
sdw
,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
const
char
*
lock_name
)
{
int
ret
;
ret
=
regmap_sdw_config_check
(
config
);
if
(
ret
)
return
ERR_PTR
(
ret
);
return
__devm_regmap_init
(
&
sdw
->
dev
,
&
regmap_sdw
,
&
sdw
->
dev
,
config
,
lock_key
,
lock_name
);
}
EXPORT_SYMBOL_GPL
(
__devm_regmap_init_sdw
);
MODULE_DESCRIPTION
(
"Regmap SoundWire Module"
);
MODULE_LICENSE
(
"GPL v2"
);
drivers/base/regmap/regmap.c
浏览文件 @
a75de772
...
...
@@ -777,7 +777,9 @@ struct regmap *__regmap_init(struct device *dev,
INIT_LIST_HEAD
(
&
map
->
async_free
);
init_waitqueue_head
(
&
map
->
async_waitq
);
if
(
config
->
read_flag_mask
||
config
->
write_flag_mask
)
{
if
(
config
->
read_flag_mask
||
config
->
write_flag_mask
||
config
->
zero_flag_mask
)
{
map
->
read_flag_mask
=
config
->
read_flag_mask
;
map
->
write_flag_mask
=
config
->
write_flag_mask
;
}
else
if
(
bus
)
{
...
...
include/linux/regmap.h
浏览文件 @
a75de772
...
...
@@ -30,6 +30,7 @@ struct regmap;
struct
regmap_range_cfg
;
struct
regmap_field
;
struct
snd_ac97
;
struct
sdw_slave
;
/* An enum of all the supported cache types */
enum
regcache_type
{
...
...
@@ -299,7 +300,10 @@ typedef void (*regmap_unlock)(void *);
* a read.
* @write_flag_mask: Mask to be set in the top bytes of the register when doing
* a write. If both read_flag_mask and write_flag_mask are
* empty the regmap_bus default masks are used.
* empty and zero_flag_mask is not set the regmap_bus default
* masks are used.
* @zero_flag_mask: If set, read_flag_mask and write_flag_mask are used even
* if they are both empty.
* @use_single_rw: If set, converts the bulk read and write operations into
* a series of single read and write operations. This is useful
* for device that does not support bulk read and write.
...
...
@@ -361,6 +365,7 @@ struct regmap_config {
unsigned
long
read_flag_mask
;
unsigned
long
write_flag_mask
;
bool
zero_flag_mask
;
bool
use_single_rw
;
bool
can_multi_write
;
...
...
@@ -531,6 +536,10 @@ struct regmap *__regmap_init_ac97(struct snd_ac97 *ac97,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
const
char
*
lock_name
);
struct
regmap
*
__regmap_init_sdw
(
struct
sdw_slave
*
sdw
,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
const
char
*
lock_name
);
struct
regmap
*
__devm_regmap_init
(
struct
device
*
dev
,
const
struct
regmap_bus
*
bus
,
...
...
@@ -568,6 +577,10 @@ struct regmap *__devm_regmap_init_ac97(struct snd_ac97 *ac97,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
const
char
*
lock_name
);
struct
regmap
*
__devm_regmap_init_sdw
(
struct
sdw_slave
*
sdw
,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
const
char
*
lock_name
);
/*
* Wrapper for regmap_init macros to include a unique lockdep key and name
...
...
@@ -716,6 +729,20 @@ int regmap_attach_dev(struct device *dev, struct regmap *map,
ac97, config)
bool
regmap_ac97_default_volatile
(
struct
device
*
dev
,
unsigned
int
reg
);
/**
* regmap_init_sdw() - Initialise register map
*
* @sdw: Device that will be interacted with
* @config: Configuration for register map
*
* The return value will be an ERR_PTR() on error or a valid pointer to
* a struct regmap.
*/
#define regmap_init_sdw(sdw, config) \
__regmap_lockdep_wrapper(__regmap_init_sdw, #config, \
sdw, config)
/**
* devm_regmap_init() - Initialise managed register map
*
...
...
@@ -846,6 +873,20 @@ bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg);
__regmap_lockdep_wrapper(__devm_regmap_init_ac97, #config, \
ac97, config)
/**
* devm_regmap_init_sdw() - Initialise managed register map
*
* @sdw: Device that will be interacted with
* @config: Configuration for register map
*
* The return value will be an ERR_PTR() on error or a valid pointer
* to a struct regmap. The regmap will be automatically freed by the
* device management code.
*/
#define devm_regmap_init_sdw(sdw, config) \
__regmap_lockdep_wrapper(__devm_regmap_init_sdw, #config, \
sdw, config)
void
regmap_exit
(
struct
regmap
*
map
);
int
regmap_reinit_cache
(
struct
regmap
*
map
,
const
struct
regmap_config
*
config
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录