Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
7bc8c4c3
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看板
提交
7bc8c4c3
编写于
6月 30, 2013
作者:
M
Mark Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'regmap/topic/field' into regmap-next
上级
ad4f496b
539fde59
变更
7
展开全部
隐藏空白更改
内联
并排
Showing
7 changed file
with
1689 addition
and
0 deletion
+1689
-0
Documentation/devicetree/bindings/pinctrl/pinctrl-st.txt
Documentation/devicetree/bindings/pinctrl/pinctrl-st.txt
+110
-0
drivers/base/regmap/internal.h
drivers/base/regmap/internal.h
+8
-0
drivers/base/regmap/regmap.c
drivers/base/regmap/regmap.c
+130
-0
drivers/pinctrl/Kconfig
drivers/pinctrl/Kconfig
+6
-0
drivers/pinctrl/Makefile
drivers/pinctrl/Makefile
+1
-0
drivers/pinctrl/pinctrl-st.c
drivers/pinctrl/pinctrl-st.c
+1403
-0
include/linux/regmap.h
include/linux/regmap.h
+31
-0
未找到文件。
Documentation/devicetree/bindings/pinctrl/pinctrl-st.txt
0 → 100644
浏览文件 @
7bc8c4c3
*ST pin controller.
Each multi-function pin is controlled, driven and routed through the
PIO multiplexing block. Each pin supports GPIO functionality (ALT0)
and multiple alternate functions(ALT1 - ALTx) that directly connect
the pin to different hardware blocks.
When a pin is in GPIO mode, Output Enable (OE), Open Drain(OD), and
Pull Up (PU) are driven by the related PIO block.
ST pinctrl driver controls PIO multiplexing block and also interacts with
gpio driver to configure a pin.
Required properties: (PIO multiplexing block)
- compatible : should be "st,<SOC>-<pio-block>-pinctrl"
like st,stih415-sbc-pinctrl, st,stih415-front-pinctrl and so on.
- gpio-controller : Indicates this device is a GPIO controller
- #gpio-cells : Should be one. The first cell is the pin number.
- st,retime-pin-mask : Should be mask to specify which pins can be retimed.
If the property is not present, it is assumed that all the pins in the
bank are capable of retiming. Retiming is mainly used to improve the
IO timing margins of external synchronous interfaces.
- st,bank-name : Should be a name string for this bank as
specified in datasheet.
- st,syscfg : Should be a phandle of the syscfg node.
Example:
pin-controller-sbc {
#address-cells = <1>;
#size-cells = <1>;
compatible = "st,stih415-sbc-pinctrl";
st,syscfg = <&syscfg_sbc>;
ranges = <0 0xfe610000 0x5000>;
PIO0: gpio@fe610000 {
gpio-controller;
#gpio-cells = <1>;
reg = <0 0x100>;
st,bank-name = "PIO0";
};
...
pin-functions nodes follow...
};
Contents of function subnode node:
----------------------
Required properties for pin configuration node:
- st,pins : Child node with list of pins with configuration.
Below is the format of how each pin conf should look like.
<bank offset mux mode rt_type rt_delay rt_clk>
Every PIO is represented with 4-7 parameters depending on retime configuration.
Each parameter is explained as below.
-bank : Should be bank phandle to which this PIO belongs.
-offset : Offset in the PIO bank.
-mux : Should be alternate function number associated this pin.
Use same numbers from datasheet.
-mode :pin configuration is selected from one of the below values.
IN
IN_PU
OUT
BIDIR
BIDIR_PU
-rt_type Retiming Configuration for the pin.
Possible retime configuration are:
------- -------------
value args
------- -------------
NICLK <delay> <clk>
ICLK_IO <delay> <clk>
BYPASS <delay>
DE_IO <delay> <clk>
SE_ICLK_IO <delay> <clk>
SE_NICLK_IO <delay> <clk>
- delay is retime delay in pico seconds as mentioned in data sheet.
- rt_clk :clk to be use for retime.
Possible values are:
CLK_A
CLK_B
CLK_C
CLK_D
Example of mmcclk pin which is a bi-direction pull pu with retime config
as non inverted clock retimed with CLK_B and delay of 0 pico seconds:
pin-controller {
...
mmc0 {
pinctrl_mmc: mmc {
st,pins {
mmcclk = <&PIO13 4 ALT4 BIDIR_PU NICLK 0 CLK_B>;
...
};
};
...
};
};
sdhci0:sdhci@fe810000{
...
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_mmc>;
};
drivers/base/regmap/internal.h
浏览文件 @
7bc8c4c3
...
...
@@ -176,6 +176,14 @@ struct regmap_range_node {
unsigned
int
window_len
;
};
struct
regmap_field
{
struct
regmap
*
regmap
;
unsigned
int
mask
;
/* lsb */
unsigned
int
shift
;
unsigned
int
reg
;
};
#ifdef CONFIG_DEBUG_FS
extern
void
regmap_debugfs_initcall
(
void
);
extern
void
regmap_debugfs_init
(
struct
regmap
*
map
,
const
char
*
name
);
...
...
drivers/base/regmap/regmap.c
浏览文件 @
7bc8c4c3
...
...
@@ -807,6 +807,95 @@ struct regmap *devm_regmap_init(struct device *dev,
}
EXPORT_SYMBOL_GPL
(
devm_regmap_init
);
static
void
regmap_field_init
(
struct
regmap_field
*
rm_field
,
struct
regmap
*
regmap
,
struct
reg_field
reg_field
)
{
int
field_bits
=
reg_field
.
msb
-
reg_field
.
lsb
+
1
;
rm_field
->
regmap
=
regmap
;
rm_field
->
reg
=
reg_field
.
reg
;
rm_field
->
shift
=
reg_field
.
lsb
;
rm_field
->
mask
=
((
BIT
(
field_bits
)
-
1
)
<<
reg_field
.
lsb
);
}
/**
* devm_regmap_field_alloc(): Allocate and initialise a register field
* in a register map.
*
* @dev: Device that will be interacted with
* @regmap: regmap bank in which this register field is located.
* @reg_field: Register field with in the bank.
*
* The return value will be an ERR_PTR() on error or a valid pointer
* to a struct regmap_field. The regmap_field will be automatically freed
* by the device management code.
*/
struct
regmap_field
*
devm_regmap_field_alloc
(
struct
device
*
dev
,
struct
regmap
*
regmap
,
struct
reg_field
reg_field
)
{
struct
regmap_field
*
rm_field
=
devm_kzalloc
(
dev
,
sizeof
(
*
rm_field
),
GFP_KERNEL
);
if
(
!
rm_field
)
return
ERR_PTR
(
-
ENOMEM
);
regmap_field_init
(
rm_field
,
regmap
,
reg_field
);
return
rm_field
;
}
EXPORT_SYMBOL_GPL
(
devm_regmap_field_alloc
);
/**
* devm_regmap_field_free(): Free register field allocated using
* devm_regmap_field_alloc. Usally drivers need not call this function,
* as the memory allocated via devm will be freed as per device-driver
* life-cyle.
*
* @dev: Device that will be interacted with
* @field: regmap field which should be freed.
*/
void
devm_regmap_field_free
(
struct
device
*
dev
,
struct
regmap_field
*
field
)
{
devm_kfree
(
dev
,
field
);
}
EXPORT_SYMBOL_GPL
(
devm_regmap_field_free
);
/**
* regmap_field_alloc(): Allocate and initialise a register field
* in a register map.
*
* @regmap: regmap bank in which this register field is located.
* @reg_field: Register field with in the bank.
*
* The return value will be an ERR_PTR() on error or a valid pointer
* to a struct regmap_field. The regmap_field should be freed by the
* user once its finished working with it using regmap_field_free().
*/
struct
regmap_field
*
regmap_field_alloc
(
struct
regmap
*
regmap
,
struct
reg_field
reg_field
)
{
struct
regmap_field
*
rm_field
=
kzalloc
(
sizeof
(
*
rm_field
),
GFP_KERNEL
);
if
(
!
rm_field
)
return
ERR_PTR
(
-
ENOMEM
);
regmap_field_init
(
rm_field
,
regmap
,
reg_field
);
return
rm_field
;
}
EXPORT_SYMBOL_GPL
(
regmap_field_alloc
);
/**
* regmap_field_free(): Free register field allocated using regmap_field_alloc
*
* @field: regmap field which should be freed.
*/
void
regmap_field_free
(
struct
regmap_field
*
field
)
{
kfree
(
field
);
}
EXPORT_SYMBOL_GPL
(
regmap_field_free
);
/**
* regmap_reinit_cache(): Reinitialise the current register cache
*
...
...
@@ -1255,6 +1344,22 @@ int regmap_raw_write(struct regmap *map, unsigned int reg,
}
EXPORT_SYMBOL_GPL
(
regmap_raw_write
);
/**
* regmap_field_write(): Write a value to a single register field
*
* @field: Register field to write to
* @val: Value to be written
*
* A value of zero will be returned on success, a negative errno will
* be returned in error cases.
*/
int
regmap_field_write
(
struct
regmap_field
*
field
,
unsigned
int
val
)
{
return
regmap_update_bits
(
field
->
regmap
,
field
->
reg
,
field
->
mask
,
val
<<
field
->
shift
);
}
EXPORT_SYMBOL_GPL
(
regmap_field_write
);
/*
* regmap_bulk_write(): Write multiple registers to the device
*
...
...
@@ -1537,6 +1642,31 @@ int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
}
EXPORT_SYMBOL_GPL
(
regmap_raw_read
);
/**
* regmap_field_read(): Read a value to a single register field
*
* @field: Register field to read from
* @val: Pointer to store read value
*
* A value of zero will be returned on success, a negative errno will
* be returned in error cases.
*/
int
regmap_field_read
(
struct
regmap_field
*
field
,
unsigned
int
*
val
)
{
int
ret
;
unsigned
int
reg_val
;
ret
=
regmap_read
(
field
->
regmap
,
field
->
reg
,
&
reg_val
);
if
(
ret
!=
0
)
return
ret
;
reg_val
&=
field
->
mask
;
reg_val
>>=
field
->
shift
;
*
val
=
reg_val
;
return
ret
;
}
EXPORT_SYMBOL_GPL
(
regmap_field_read
);
/**
* regmap_bulk_read(): Read multiple registers from the device
*
...
...
drivers/pinctrl/Kconfig
浏览文件 @
7bc8c4c3
...
...
@@ -169,6 +169,12 @@ config PINCTRL_SUNXI
select PINMUX
select GENERIC_PINCONF
config PINCTRL_ST
bool
depends on OF
select PINMUX
select PINCONF
config PINCTRL_TEGRA
bool
select PINMUX
...
...
drivers/pinctrl/Makefile
浏览文件 @
7bc8c4c3
...
...
@@ -45,6 +45,7 @@ obj-$(CONFIG_PINCTRL_EXYNOS5440) += pinctrl-exynos5440.o
obj-$(CONFIG_PINCTRL_S3C64XX)
+=
pinctrl-s3c64xx.o
obj-$(CONFIG_PINCTRL_XWAY)
+=
pinctrl-xway.o
obj-$(CONFIG_PINCTRL_LANTIQ)
+=
pinctrl-lantiq.o
obj-$(CONFIG_PINCTRL_ST)
+=
pinctrl-st.o
obj-$(CONFIG_PLAT_ORION)
+=
mvebu/
obj-$(CONFIG_ARCH_SHMOBILE)
+=
sh-pfc/
...
...
drivers/pinctrl/pinctrl-st.c
0 → 100644
浏览文件 @
7bc8c4c3
此差异已折叠。
点击以展开。
include/linux/regmap.h
浏览文件 @
7bc8c4c3
...
...
@@ -23,6 +23,7 @@ struct irq_domain;
struct
spi_device
;
struct
regmap
;
struct
regmap_range_cfg
;
struct
regmap_field
;
/* An enum of all the supported cache types */
enum
regcache_type
{
...
...
@@ -416,6 +417,36 @@ bool regmap_reg_in_ranges(unsigned int reg,
const
struct
regmap_range
*
ranges
,
unsigned
int
nranges
);
/**
* Description of an register field
*
* @reg: Offset of the register within the regmap bank
* @lsb: lsb of the register field.
* @reg: msb of the register field.
*/
struct
reg_field
{
unsigned
int
reg
;
unsigned
int
lsb
;
unsigned
int
msb
;
};
#define REG_FIELD(_reg, _lsb, _msb) { \
.reg = _reg, \
.lsb = _lsb, \
.msb = _msb, \
}
struct
regmap_field
*
regmap_field_alloc
(
struct
regmap
*
regmap
,
struct
reg_field
reg_field
);
void
regmap_field_free
(
struct
regmap_field
*
field
);
struct
regmap_field
*
devm_regmap_field_alloc
(
struct
device
*
dev
,
struct
regmap
*
regmap
,
struct
reg_field
reg_field
);
void
devm_regmap_field_free
(
struct
device
*
dev
,
struct
regmap_field
*
field
);
int
regmap_field_read
(
struct
regmap_field
*
field
,
unsigned
int
*
val
);
int
regmap_field_write
(
struct
regmap_field
*
field
,
unsigned
int
val
);
/**
* Description of an IRQ for the generic regmap irq_chip.
*
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录