Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
c98cac89
K
Kernel
项目概览
openeuler
/
Kernel
接近 2 年 前同步成功
通知
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看板
提交
c98cac89
编写于
4月 28, 2013
作者:
M
Mark Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'regulator/topic/ab8500' into v3.9-rc8
上级
9e63d230
5d9de8b1
变更
9
展开全部
隐藏空白更改
内联
并排
Showing
9 changed file
with
3917 addition
and
294 deletion
+3917
-294
arch/arm/mach-ux500/board-mop500-regulators.c
arch/arm/mach-ux500/board-mop500-regulators.c
+714
-60
arch/arm/mach-ux500/board-mop500-regulators.h
arch/arm/mach-ux500/board-mop500-regulators.h
+4
-3
arch/arm/mach-ux500/board-mop500.c
arch/arm/mach-ux500/board-mop500.c
+1
-4
drivers/regulator/Makefile
drivers/regulator/Makefile
+1
-1
drivers/regulator/ab8500-ext.c
drivers/regulator/ab8500-ext.c
+407
-0
drivers/regulator/ab8500.c
drivers/regulator/ab8500.c
+2579
-207
drivers/regulator/dbx500-prcmu.h
drivers/regulator/dbx500-prcmu.h
+0
-2
include/linux/mfd/abx500/ab8500.h
include/linux/mfd/abx500/ab8500.h
+2
-9
include/linux/regulator/ab8500.h
include/linux/regulator/ab8500.h
+209
-8
未找到文件。
arch/arm/mach-ux500/board-mop500-regulators.c
浏览文件 @
c98cac89
此差异已折叠。
点击以展开。
arch/arm/mach-ux500/board-mop500-regulators.h
浏览文件 @
c98cac89
...
...
@@ -14,10 +14,11 @@
#include <linux/regulator/machine.h>
#include <linux/regulator/ab8500.h>
extern
struct
ab8500_regulator_reg_init
ab8500_regulator_reg_init
[
AB8500_NUM_REGULATOR_REGISTERS
];
extern
struct
regulator_init_data
ab8500_regulators
[
AB8500_NUM_REGULATORS
];
extern
struct
ab8500_regulator_platform_data
ab8500_regulator_plat_data
;
extern
struct
ab8500_regulator_platform_data
ab8505_regulator_plat_data
;
extern
struct
regulator_init_data
tps61052_regulator
;
extern
struct
regulator_init_data
gpio_en_3v3_regulator
;
void
mop500_regulator_init
(
void
);
#endif
arch/arm/mach-ux500/board-mop500.c
浏览文件 @
c98cac89
...
...
@@ -199,10 +199,7 @@ static struct platform_device snowball_sbnet_dev = {
struct
ab8500_platform_data
ab8500_platdata
=
{
.
irq_base
=
MOP500_AB8500_IRQ_BASE
,
.
regulator_reg_init
=
ab8500_regulator_reg_init
,
.
num_regulator_reg_init
=
ARRAY_SIZE
(
ab8500_regulator_reg_init
),
.
regulator
=
ab8500_regulators
,
.
num_regulator
=
ARRAY_SIZE
(
ab8500_regulators
),
.
regulator
=
&
ab8500_regulator_plat_data
,
.
gpio
=
&
ab8500_gpio_pdata
,
.
codec
=
&
ab8500_codec_pdata
,
};
...
...
drivers/regulator/Makefile
浏览文件 @
c98cac89
...
...
@@ -12,7 +12,7 @@ obj-$(CONFIG_REGULATOR_USERSPACE_CONSUMER) += userspace-consumer.o
obj-$(CONFIG_REGULATOR_88PM8607)
+=
88pm8607.o
obj-$(CONFIG_REGULATOR_AAT2870)
+=
aat2870-regulator.o
obj-$(CONFIG_REGULATOR_AB3100)
+=
ab3100.o
obj-$(CONFIG_REGULATOR_AB8500)
+=
ab8500.o
obj-$(CONFIG_REGULATOR_AB8500)
+=
ab8500.o
ab8500-ext.o
obj-$(CONFIG_REGULATOR_AD5398)
+=
ad5398.o
obj-$(CONFIG_REGULATOR_ANATOP)
+=
anatop-regulator.o
obj-$(CONFIG_REGULATOR_ARIZONA)
+=
arizona-micsupp.o arizona-ldo1.o
...
...
drivers/regulator/ab8500-ext.c
0 → 100644
浏览文件 @
c98cac89
/*
* Copyright (C) ST-Ericsson SA 2010
*
* License Terms: GNU General Public License v2
*
* Authors: Bengt Jonsson <bengt.g.jonsson@stericsson.com>
*
* This file is based on drivers/regulator/ab8500.c
*
* AB8500 external regulators
*
* ab8500-ext supports the following regulators:
* - VextSupply3
*/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/err.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/machine.h>
#include <linux/mfd/abx500.h>
#include <linux/mfd/abx500/ab8500.h>
#include <linux/regulator/ab8500.h>
/**
* struct ab8500_ext_regulator_info - ab8500 regulator information
* @dev: device pointer
* @desc: regulator description
* @rdev: regulator device
* @cfg: regulator configuration (extension of regulator FW configuration)
* @update_bank: bank to control on/off
* @update_reg: register to control on/off
* @update_mask: mask to enable/disable and set mode of regulator
* @update_val: bits holding the regulator current mode
* @update_val_hp: bits to set EN pin active (LPn pin deactive)
* normally this means high power mode
* @update_val_lp: bits to set EN pin active and LPn pin active
* normally this means low power mode
* @update_val_hw: bits to set regulator pins in HW control
* SysClkReq pins and logic will choose mode
*/
struct
ab8500_ext_regulator_info
{
struct
device
*
dev
;
struct
regulator_desc
desc
;
struct
regulator_dev
*
rdev
;
struct
ab8500_ext_regulator_cfg
*
cfg
;
u8
update_bank
;
u8
update_reg
;
u8
update_mask
;
u8
update_val
;
u8
update_val_hp
;
u8
update_val_lp
;
u8
update_val_hw
;
};
static
int
ab8500_ext_regulator_enable
(
struct
regulator_dev
*
rdev
)
{
int
ret
;
struct
ab8500_ext_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
u8
regval
;
if
(
info
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator info null pointer
\n
"
);
return
-
EINVAL
;
}
/*
* To satisfy both HW high power request and SW request, the regulator
* must be on in high power.
*/
if
(
info
->
cfg
&&
info
->
cfg
->
hwreq
)
regval
=
info
->
update_val_hp
;
else
regval
=
info
->
update_val
;
ret
=
abx500_mask_and_set_register_interruptible
(
info
->
dev
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
regval
);
if
(
ret
<
0
)
{
dev_err
(
rdev_get_dev
(
info
->
rdev
),
"couldn't set enable bits for regulator
\n
"
);
return
ret
;
}
dev_dbg
(
rdev_get_dev
(
rdev
),
"%s-enable (bank, reg, mask, value): 0x%02x, 0x%02x, 0x%02x, 0x%02x
\n
"
,
info
->
desc
.
name
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
regval
);
return
0
;
}
static
int
ab8500_ext_regulator_disable
(
struct
regulator_dev
*
rdev
)
{
int
ret
;
struct
ab8500_ext_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
u8
regval
;
if
(
info
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator info null pointer
\n
"
);
return
-
EINVAL
;
}
/*
* Set the regulator in HW request mode if configured
*/
if
(
info
->
cfg
&&
info
->
cfg
->
hwreq
)
regval
=
info
->
update_val_hw
;
else
regval
=
0
;
ret
=
abx500_mask_and_set_register_interruptible
(
info
->
dev
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
regval
);
if
(
ret
<
0
)
{
dev_err
(
rdev_get_dev
(
info
->
rdev
),
"couldn't set disable bits for regulator
\n
"
);
return
ret
;
}
dev_dbg
(
rdev_get_dev
(
rdev
),
"%s-disable (bank, reg, mask, value):"
" 0x%02x, 0x%02x, 0x%02x, 0x%02x
\n
"
,
info
->
desc
.
name
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
regval
);
return
0
;
}
static
int
ab8500_ext_regulator_is_enabled
(
struct
regulator_dev
*
rdev
)
{
int
ret
;
struct
ab8500_ext_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
u8
regval
;
if
(
info
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator info null pointer
\n
"
);
return
-
EINVAL
;
}
ret
=
abx500_get_register_interruptible
(
info
->
dev
,
info
->
update_bank
,
info
->
update_reg
,
&
regval
);
if
(
ret
<
0
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"couldn't read 0x%x register
\n
"
,
info
->
update_reg
);
return
ret
;
}
dev_dbg
(
rdev_get_dev
(
rdev
),
"%s-is_enabled (bank, reg, mask, value):"
" 0x%02x, 0x%02x, 0x%02x, 0x%02x
\n
"
,
info
->
desc
.
name
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
regval
);
if
(((
regval
&
info
->
update_mask
)
==
info
->
update_val_lp
)
||
((
regval
&
info
->
update_mask
)
==
info
->
update_val_hp
))
return
1
;
else
return
0
;
}
static
int
ab8500_ext_regulator_set_mode
(
struct
regulator_dev
*
rdev
,
unsigned
int
mode
)
{
int
ret
=
0
;
struct
ab8500_ext_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
u8
regval
;
if
(
info
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator info null pointer
\n
"
);
return
-
EINVAL
;
}
switch
(
mode
)
{
case
REGULATOR_MODE_NORMAL
:
regval
=
info
->
update_val_hp
;
break
;
case
REGULATOR_MODE_IDLE
:
regval
=
info
->
update_val_lp
;
break
;
default:
return
-
EINVAL
;
}
/* If regulator is enabled and info->cfg->hwreq is set, the regulator
must be on in high power, so we don't need to write the register with
the same value.
*/
if
(
ab8500_ext_regulator_is_enabled
(
rdev
)
&&
!
(
info
->
cfg
&&
info
->
cfg
->
hwreq
))
{
ret
=
abx500_mask_and_set_register_interruptible
(
info
->
dev
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
regval
);
if
(
ret
<
0
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"Could not set regulator mode.
\n
"
);
return
ret
;
}
dev_dbg
(
rdev_get_dev
(
rdev
),
"%s-set_mode (bank, reg, mask, value): "
"0x%x, 0x%x, 0x%x, 0x%x
\n
"
,
info
->
desc
.
name
,
info
->
update_bank
,
info
->
update_reg
,
info
->
update_mask
,
regval
);
}
info
->
update_val
=
regval
;
return
0
;
}
static
unsigned
int
ab8500_ext_regulator_get_mode
(
struct
regulator_dev
*
rdev
)
{
struct
ab8500_ext_regulator_info
*
info
=
rdev_get_drvdata
(
rdev
);
int
ret
;
if
(
info
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator info null pointer
\n
"
);
return
-
EINVAL
;
}
if
(
info
->
update_val
==
info
->
update_val_hp
)
ret
=
REGULATOR_MODE_NORMAL
;
else
if
(
info
->
update_val
==
info
->
update_val_lp
)
ret
=
REGULATOR_MODE_IDLE
;
else
ret
=
-
EINVAL
;
return
ret
;
}
static
int
ab8500_ext_list_voltage
(
struct
regulator_dev
*
rdev
,
unsigned
selector
)
{
struct
regulation_constraints
*
regu_constraints
=
rdev
->
constraints
;
if
(
regu_constraints
==
NULL
)
{
dev_err
(
rdev_get_dev
(
rdev
),
"regulator constraints null pointer
\n
"
);
return
-
EINVAL
;
}
/* return the uV for the fixed regulators */
if
(
regu_constraints
->
min_uV
&&
regu_constraints
->
max_uV
)
{
if
(
regu_constraints
->
min_uV
==
regu_constraints
->
max_uV
)
return
regu_constraints
->
min_uV
;
}
return
-
EINVAL
;
}
static
struct
regulator_ops
ab8500_ext_regulator_ops
=
{
.
enable
=
ab8500_ext_regulator_enable
,
.
disable
=
ab8500_ext_regulator_disable
,
.
is_enabled
=
ab8500_ext_regulator_is_enabled
,
.
set_mode
=
ab8500_ext_regulator_set_mode
,
.
get_mode
=
ab8500_ext_regulator_get_mode
,
.
list_voltage
=
ab8500_ext_list_voltage
,
};
static
struct
ab8500_ext_regulator_info
ab8500_ext_regulator_info
[
AB8500_NUM_EXT_REGULATORS
]
=
{
[
AB8500_EXT_SUPPLY1
]
=
{
.
desc
=
{
.
name
=
"VEXTSUPPLY1"
,
.
ops
=
&
ab8500_ext_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_EXT_SUPPLY1
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
},
.
update_bank
=
0x04
,
.
update_reg
=
0x08
,
.
update_mask
=
0x03
,
.
update_val
=
0x01
,
.
update_val_hp
=
0x01
,
.
update_val_lp
=
0x03
,
.
update_val_hw
=
0x02
,
},
[
AB8500_EXT_SUPPLY2
]
=
{
.
desc
=
{
.
name
=
"VEXTSUPPLY2"
,
.
ops
=
&
ab8500_ext_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_EXT_SUPPLY2
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
},
.
update_bank
=
0x04
,
.
update_reg
=
0x08
,
.
update_mask
=
0x0c
,
.
update_val
=
0x04
,
.
update_val_hp
=
0x04
,
.
update_val_lp
=
0x0c
,
.
update_val_hw
=
0x08
,
},
[
AB8500_EXT_SUPPLY3
]
=
{
.
desc
=
{
.
name
=
"VEXTSUPPLY3"
,
.
ops
=
&
ab8500_ext_regulator_ops
,
.
type
=
REGULATOR_VOLTAGE
,
.
id
=
AB8500_EXT_SUPPLY3
,
.
owner
=
THIS_MODULE
,
.
n_voltages
=
1
,
},
.
update_bank
=
0x04
,
.
update_reg
=
0x08
,
.
update_mask
=
0x30
,
.
update_val
=
0x10
,
.
update_val_hp
=
0x10
,
.
update_val_lp
=
0x30
,
.
update_val_hw
=
0x20
,
},
};
int
ab8500_ext_regulator_init
(
struct
platform_device
*
pdev
)
{
struct
ab8500
*
ab8500
=
dev_get_drvdata
(
pdev
->
dev
.
parent
);
struct
ab8500_platform_data
*
ppdata
;
struct
ab8500_regulator_platform_data
*
pdata
;
struct
regulator_config
config
=
{
};
int
i
,
err
;
if
(
!
ab8500
)
{
dev_err
(
&
pdev
->
dev
,
"null mfd parent
\n
"
);
return
-
EINVAL
;
}
ppdata
=
dev_get_platdata
(
ab8500
->
dev
);
if
(
!
ppdata
)
{
dev_err
(
&
pdev
->
dev
,
"null parent pdata
\n
"
);
return
-
EINVAL
;
}
pdata
=
ppdata
->
regulator
;
if
(
!
pdata
)
{
dev_err
(
&
pdev
->
dev
,
"null pdata
\n
"
);
return
-
EINVAL
;
}
/* make sure the platform data has the correct size */
if
(
pdata
->
num_ext_regulator
!=
ARRAY_SIZE
(
ab8500_ext_regulator_info
))
{
dev_err
(
&
pdev
->
dev
,
"Configuration error: size mismatch.
\n
"
);
return
-
EINVAL
;
}
/* check for AB8500 2.x */
if
(
is_ab8500_2p0_or_earlier
(
ab8500
))
{
struct
ab8500_ext_regulator_info
*
info
;
/* VextSupply3LPn is inverted on AB8500 2.x */
info
=
&
ab8500_ext_regulator_info
[
AB8500_EXT_SUPPLY3
];
info
->
update_val
=
0x30
;
info
->
update_val_hp
=
0x30
;
info
->
update_val_lp
=
0x10
;
}
/* register all regulators */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
ab8500_ext_regulator_info
);
i
++
)
{
struct
ab8500_ext_regulator_info
*
info
=
NULL
;
/* assign per-regulator data */
info
=
&
ab8500_ext_regulator_info
[
i
];
info
->
dev
=
&
pdev
->
dev
;
info
->
cfg
=
(
struct
ab8500_ext_regulator_cfg
*
)
pdata
->
ext_regulator
[
i
].
driver_data
;
config
.
dev
=
&
pdev
->
dev
;
config
.
init_data
=
&
pdata
->
ext_regulator
[
i
];
config
.
driver_data
=
info
;
/* register regulator with framework */
info
->
rdev
=
regulator_register
(
&
info
->
desc
,
&
config
);
if
(
IS_ERR
(
info
->
rdev
))
{
err
=
PTR_ERR
(
info
->
rdev
);
dev_err
(
&
pdev
->
dev
,
"failed to register regulator %s
\n
"
,
info
->
desc
.
name
);
/* when we fail, un-register all earlier regulators */
while
(
--
i
>=
0
)
{
info
=
&
ab8500_ext_regulator_info
[
i
];
regulator_unregister
(
info
->
rdev
);
}
return
err
;
}
dev_dbg
(
rdev_get_dev
(
info
->
rdev
),
"%s-probed
\n
"
,
info
->
desc
.
name
);
}
return
0
;
}
void
ab8500_ext_regulator_exit
(
struct
platform_device
*
pdev
)
{
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
ab8500_ext_regulator_info
);
i
++
)
{
struct
ab8500_ext_regulator_info
*
info
=
NULL
;
info
=
&
ab8500_ext_regulator_info
[
i
];
dev_vdbg
(
rdev_get_dev
(
info
->
rdev
),
"%s-remove
\n
"
,
info
->
desc
.
name
);
regulator_unregister
(
info
->
rdev
);
}
}
MODULE_LICENSE
(
"GPL v2"
);
MODULE_AUTHOR
(
"Bengt Jonsson <bengt.g.jonsson@stericsson.com>"
);
MODULE_DESCRIPTION
(
"AB8500 external regulator driver"
);
MODULE_ALIAS
(
"platform:ab8500-ext-regulator"
);
drivers/regulator/ab8500.c
浏览文件 @
c98cac89
此差异已折叠。
点击以展开。
drivers/regulator/dbx500-prcmu.h
浏览文件 @
c98cac89
...
...
@@ -21,7 +21,6 @@
* @is_enabled: status of the regulator
* @epod_id: id for EPOD (power domain)
* @is_ramret: RAM retention switch for EPOD (power domain)
* @operating_point: operating point (only for vape, to be removed)
*
*/
struct
dbx500_regulator_info
{
...
...
@@ -32,7 +31,6 @@ struct dbx500_regulator_info {
u16
epod_id
;
bool
is_ramret
;
bool
exclude_from_power_state
;
unsigned
int
operating_point
;
};
void
power_state_active_enable
(
void
);
...
...
include/linux/mfd/abx500/ab8500.h
浏览文件 @
c98cac89
...
...
@@ -364,8 +364,7 @@ struct ab8500 {
const
int
*
irq_reg_offset
;
};
struct
regulator_reg_init
;
struct
regulator_init_data
;
struct
ab8500_regulator_platform_data
;
struct
ab8500_gpio_platform_data
;
struct
ab8500_codec_platform_data
;
struct
ab8500_sysctrl_platform_data
;
...
...
@@ -375,19 +374,13 @@ struct ab8500_sysctrl_platform_data;
* @irq_base: start of AB8500 IRQs, AB8500_NR_IRQS will be used
* @pm_power_off: Should machine pm power off hook be registered or not
* @init: board-specific initialization after detection of ab8500
* @num_regulator_reg_init: number of regulator init registers
* @regulator_reg_init: regulator init registers
* @num_regulator: number of regulators
* @regulator: machine-specific constraints for regulators
*/
struct
ab8500_platform_data
{
int
irq_base
;
bool
pm_power_off
;
void
(
*
init
)
(
struct
ab8500
*
);
int
num_regulator_reg_init
;
struct
ab8500_regulator_reg_init
*
regulator_reg_init
;
int
num_regulator
;
struct
regulator_init_data
*
regulator
;
struct
ab8500_regulator_platform_data
*
regulator
;
struct
abx500_gpio_platform_data
*
gpio
;
struct
ab8500_codec_platform_data
*
codec
;
struct
ab8500_sysctrl_platform_data
*
sysctrl
;
...
...
include/linux/regulator/ab8500.h
浏览文件 @
c98cac89
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录