Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
a89be93c
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
a89be93c
编写于
9月 22, 2012
作者:
M
Mark Brown
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ASoC: wm2000: Add regulator support
Signed-off-by:
N
Mark Brown
<
broonie@opensource.wolfsonmicro.com
>
上级
8fed54ae
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
47 addition
and
6 deletion
+47
-6
sound/soc/codecs/wm2000.c
sound/soc/codecs/wm2000.c
+47
-6
未找到文件。
sound/soc/codecs/wm2000.c
浏览文件 @
a89be93c
...
...
@@ -31,6 +31,7 @@
#include <linux/i2c.h>
#include <linux/regmap.h>
#include <linux/debugfs.h>
#include <linux/regulator/consumer.h>
#include <linux/slab.h>
#include <sound/core.h>
#include <sound/pcm.h>
...
...
@@ -43,6 +44,14 @@
#include "wm2000.h"
#define WM2000_NUM_SUPPLIES 3
static
const
char
*
wm2000_supplies
[
WM2000_NUM_SUPPLIES
]
=
{
"SPKVDD"
,
"DBVDD"
,
"DCVDD"
,
};
enum
wm2000_anc_mode
{
ANC_ACTIVE
=
0
,
ANC_BYPASS
=
1
,
...
...
@@ -54,6 +63,8 @@ struct wm2000_priv {
struct
i2c_client
*
i2c
;
struct
regmap
*
regmap
;
struct
regulator_bulk_data
supplies
[
WM2000_NUM_SUPPLIES
];
enum
wm2000_anc_mode
anc_mode
;
unsigned
int
anc_active
:
1
;
...
...
@@ -126,6 +137,12 @@ static int wm2000_power_up(struct i2c_client *i2c, int analogue)
dev_dbg
(
&
i2c
->
dev
,
"Beginning power up
\n
"
);
ret
=
regulator_bulk_enable
(
WM2000_NUM_SUPPLIES
,
wm2000
->
supplies
);
if
(
ret
!=
0
)
{
dev_err
(
&
i2c
->
dev
,
"Failed to enable supplies: %d
\n
"
,
ret
);
return
ret
;
}
if
(
!
wm2000
->
mclk_div
)
{
dev_dbg
(
&
i2c
->
dev
,
"Disabling MCLK divider
\n
"
);
wm2000_write
(
i2c
,
WM2000_REG_SYS_CTL2
,
...
...
@@ -143,12 +160,14 @@ static int wm2000_power_up(struct i2c_client *i2c, int analogue)
if
(
!
wm2000_poll_bit
(
i2c
,
WM2000_REG_ANC_STAT
,
WM2000_ANC_ENG_IDLE
))
{
dev_err
(
&
i2c
->
dev
,
"ANC engine failed to reset
\n
"
);
regulator_bulk_disable
(
WM2000_NUM_SUPPLIES
,
wm2000
->
supplies
);
return
-
ETIMEDOUT
;
}
if
(
!
wm2000_poll_bit
(
i2c
,
WM2000_REG_SYS_STATUS
,
WM2000_STATUS_BOOT_COMPLETE
))
{
dev_err
(
&
i2c
->
dev
,
"ANC engine failed to initialise
\n
"
);
regulator_bulk_disable
(
WM2000_NUM_SUPPLIES
,
wm2000
->
supplies
);
return
-
ETIMEDOUT
;
}
...
...
@@ -163,11 +182,13 @@ static int wm2000_power_up(struct i2c_client *i2c, int analogue)
wm2000
->
anc_download_size
);
if
(
ret
<
0
)
{
dev_err
(
&
i2c
->
dev
,
"i2c_transfer() failed: %d
\n
"
,
ret
);
regulator_bulk_disable
(
WM2000_NUM_SUPPLIES
,
wm2000
->
supplies
);
return
ret
;
}
if
(
ret
!=
wm2000
->
anc_download_size
)
{
dev_err
(
&
i2c
->
dev
,
"i2c_transfer() failed, %d != %d
\n
"
,
ret
,
wm2000
->
anc_download_size
);
regulator_bulk_disable
(
WM2000_NUM_SUPPLIES
,
wm2000
->
supplies
);
return
-
EIO
;
}
...
...
@@ -201,6 +222,7 @@ static int wm2000_power_up(struct i2c_client *i2c, int analogue)
if
(
!
wm2000_poll_bit
(
i2c
,
WM2000_REG_SYS_STATUS
,
WM2000_STATUS_MOUSE_ACTIVE
))
{
dev_err
(
&
i2c
->
dev
,
"Timed out waiting for device
\n
"
);
regulator_bulk_disable
(
WM2000_NUM_SUPPLIES
,
wm2000
->
supplies
);
return
-
ETIMEDOUT
;
}
...
...
@@ -238,6 +260,8 @@ static int wm2000_power_down(struct i2c_client *i2c, int analogue)
return
-
ETIMEDOUT
;
}
regulator_bulk_disable
(
WM2000_NUM_SUPPLIES
,
wm2000
->
supplies
);
dev_dbg
(
&
i2c
->
dev
,
"powered off
\n
"
);
wm2000
->
anc_mode
=
ANC_OFF
;
...
...
@@ -747,7 +771,7 @@ static int __devinit wm2000_i2c_probe(struct i2c_client *i2c,
struct
wm2000_platform_data
*
pdata
;
const
char
*
filename
;
const
struct
firmware
*
fw
=
NULL
;
int
ret
;
int
ret
,
i
;
int
reg
;
u16
id
;
...
...
@@ -768,6 +792,22 @@ static int __devinit wm2000_i2c_probe(struct i2c_client *i2c,
goto
out
;
}
for
(
i
=
0
;
i
<
WM2000_NUM_SUPPLIES
;
i
++
)
wm2000
->
supplies
[
i
].
supply
=
wm2000_supplies
[
i
];
ret
=
devm_regulator_bulk_get
(
&
i2c
->
dev
,
WM2000_NUM_SUPPLIES
,
wm2000
->
supplies
);
if
(
ret
!=
0
)
{
dev_err
(
&
i2c
->
dev
,
"Failed to get supplies: %d
\n
"
,
ret
);
return
ret
;
}
ret
=
regulator_bulk_enable
(
WM2000_NUM_SUPPLIES
,
wm2000
->
supplies
);
if
(
ret
!=
0
)
{
dev_err
(
&
i2c
->
dev
,
"Failed to enable supplies: %d
\n
"
,
ret
);
return
ret
;
}
/* Verify that this is a WM2000 */
reg
=
wm2000_read
(
i2c
,
WM2000_REG_ID1
);
id
=
reg
<<
8
;
...
...
@@ -777,7 +817,7 @@ static int __devinit wm2000_i2c_probe(struct i2c_client *i2c,
if
(
id
!=
0x2000
)
{
dev_err
(
&
i2c
->
dev
,
"Device is not a WM2000 - ID %x
\n
"
,
id
);
ret
=
-
ENODEV
;
goto
out
;
goto
err_supplies
;
}
reg
=
wm2000_read
(
i2c
,
WM2000_REG_REVISON
);
...
...
@@ -796,7 +836,7 @@ static int __devinit wm2000_i2c_probe(struct i2c_client *i2c,
ret
=
request_firmware
(
&
fw
,
filename
,
&
i2c
->
dev
);
if
(
ret
!=
0
)
{
dev_err
(
&
i2c
->
dev
,
"Failed to acquire ANC data: %d
\n
"
,
ret
);
goto
out
;
goto
err_supplies
;
}
/* Pre-cook the concatenation of the register address onto the image */
...
...
@@ -807,7 +847,7 @@ static int __devinit wm2000_i2c_probe(struct i2c_client *i2c,
if
(
wm2000
->
anc_download
==
NULL
)
{
dev_err
(
&
i2c
->
dev
,
"Out of memory
\n
"
);
ret
=
-
ENOMEM
;
goto
out
;
goto
err_supplies
;
}
wm2000
->
anc_download
[
0
]
=
0x80
;
...
...
@@ -822,8 +862,9 @@ static int __devinit wm2000_i2c_probe(struct i2c_client *i2c,
wm2000_reset
(
wm2000
);
ret
=
snd_soc_register_codec
(
&
i2c
->
dev
,
&
soc_codec_dev_wm2000
,
NULL
,
0
);
if
(
!
ret
)
goto
out
;
err_supplies:
regulator_bulk_disable
(
WM2000_NUM_SUPPLIES
,
wm2000
->
supplies
);
out:
release_firmware
(
fw
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录