Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
611ad378
cloud-kernel
项目概览
openanolis
/
cloud-kernel
接近 2 年 前同步成功
通知
170
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看板
提交
611ad378
编写于
9月 20, 2010
作者:
L
Liam Girdwood
浏览文件
操作
浏览文件
下载
差异文件
Merge remote branch 'broonie-asoc/for-2.6.37' into for-2.6.37
上级
2c4ee9b5
b9fde18c
变更
55
隐藏空白更改
内联
并排
Showing
55 changed file
with
2584 addition
and
207 deletion
+2584
-207
arch/sh/kernel/cpu/sh4a/setup-sh7722.c
arch/sh/kernel/cpu/sh4a/setup-sh7722.c
+1
-1
drivers/staging/xgifb/TODO
drivers/staging/xgifb/TODO
+1
-1
drivers/video/Kconfig
drivers/video/Kconfig
+1
-0
drivers/video/sh_mobile_hdmi.c
drivers/video/sh_mobile_hdmi.c
+25
-27
include/video/sh_mobile_hdmi.h
include/video/sh_mobile_hdmi.h
+5
-5
sound/soc/codecs/Kconfig
sound/soc/codecs/Kconfig
+4
-0
sound/soc/codecs/Makefile
sound/soc/codecs/Makefile
+2
-0
sound/soc/codecs/ad1980.c
sound/soc/codecs/ad1980.c
+1
-0
sound/soc/codecs/ak4642.c
sound/soc/codecs/ak4642.c
+11
-11
sound/soc/codecs/ak4671.c
sound/soc/codecs/ak4671.c
+0
-1
sound/soc/codecs/cs42l51.c
sound/soc/codecs/cs42l51.c
+1
-1
sound/soc/codecs/da7210.c
sound/soc/codecs/da7210.c
+9
-9
sound/soc/codecs/ssm2602.c
sound/soc/codecs/ssm2602.c
+0
-1
sound/soc/codecs/tlv320dac33.c
sound/soc/codecs/tlv320dac33.c
+0
-1
sound/soc/codecs/twl4030.c
sound/soc/codecs/twl4030.c
+0
-1
sound/soc/codecs/wm8510.c
sound/soc/codecs/wm8510.c
+0
-1
sound/soc/codecs/wm8580.c
sound/soc/codecs/wm8580.c
+1
-1
sound/soc/codecs/wm8711.c
sound/soc/codecs/wm8711.c
+1
-1
sound/soc/codecs/wm8728.c
sound/soc/codecs/wm8728.c
+1
-1
sound/soc/codecs/wm8731.c
sound/soc/codecs/wm8731.c
+1
-3
sound/soc/codecs/wm8741.c
sound/soc/codecs/wm8741.c
+1
-1
sound/soc/codecs/wm8750.c
sound/soc/codecs/wm8750.c
+1
-1
sound/soc/codecs/wm8753.c
sound/soc/codecs/wm8753.c
+1
-2
sound/soc/codecs/wm8776.c
sound/soc/codecs/wm8776.c
+1
-1
sound/soc/codecs/wm8900.c
sound/soc/codecs/wm8900.c
+1
-1
sound/soc/codecs/wm8940.c
sound/soc/codecs/wm8940.c
+1
-1
sound/soc/codecs/wm8961.c
sound/soc/codecs/wm8961.c
+1
-1
sound/soc/codecs/wm8962.c
sound/soc/codecs/wm8962.c
+1
-1
sound/soc/codecs/wm8985.c
sound/soc/codecs/wm8985.c
+1195
-0
sound/soc/codecs/wm8985.h
sound/soc/codecs/wm8985.h
+1045
-0
sound/soc/codecs/wm8988.c
sound/soc/codecs/wm8988.c
+1
-1
sound/soc/codecs/wm8990.c
sound/soc/codecs/wm8990.c
+0
-1
sound/soc/codecs/wm8993.c
sound/soc/codecs/wm8993.c
+1
-1
sound/soc/codecs/wm9081.c
sound/soc/codecs/wm9081.c
+1
-1
sound/soc/codecs/wm9705.c
sound/soc/codecs/wm9705.c
+1
-1
sound/soc/codecs/wm9712.c
sound/soc/codecs/wm9712.c
+1
-1
sound/soc/codecs/wm9713.c
sound/soc/codecs/wm9713.c
+1
-1
sound/soc/kirkwood/kirkwood-dma.c
sound/soc/kirkwood/kirkwood-dma.c
+2
-1
sound/soc/kirkwood/kirkwood-i2s.c
sound/soc/kirkwood/kirkwood-i2s.c
+2
-1
sound/soc/kirkwood/kirkwood-openrd.c
sound/soc/kirkwood/kirkwood-openrd.c
+2
-1
sound/soc/s3c24xx/s3c-pcm.c
sound/soc/s3c24xx/s3c-pcm.c
+16
-10
sound/soc/s3c24xx/s3c-pcm.h
sound/soc/s3c24xx/s3c-pcm.h
+2
-1
sound/soc/s3c24xx/smdk2443_wm9710.c
sound/soc/s3c24xx/smdk2443_wm9710.c
+1
-1
sound/soc/s3c24xx/smdk64xx_wm8580.c
sound/soc/s3c24xx/smdk64xx_wm8580.c
+1
-1
sound/soc/s3c24xx/smdk_wm9713.c
sound/soc/s3c24xx/smdk_wm9713.c
+1
-1
sound/soc/sh/Kconfig
sound/soc/sh/Kconfig
+3
-3
sound/soc/sh/fsi-ak4642.c
sound/soc/sh/fsi-ak4642.c
+2
-2
sound/soc/sh/fsi-da7210.c
sound/soc/sh/fsi-da7210.c
+1
-1
sound/soc/sh/fsi-hdmi.c
sound/soc/sh/fsi-hdmi.c
+1
-2
sound/soc/sh/fsi.c
sound/soc/sh/fsi.c
+93
-84
sound/soc/sh/migor.c
sound/soc/sh/migor.c
+13
-2
sound/soc/sh/siu.h
sound/soc/sh/siu.h
+2
-1
sound/soc/sh/siu_dai.c
sound/soc/sh/siu_dai.c
+29
-12
sound/soc/sh/siu_pcm.c
sound/soc/sh/siu_pcm.c
+1
-1
sound/soc/soc-core.c
sound/soc/soc-core.c
+93
-0
未找到文件。
arch/sh/kernel/cpu/sh4a/setup-sh7722.c
浏览文件 @
611ad378
...
@@ -551,7 +551,7 @@ static struct resource siu_resources[] = {
...
@@ -551,7 +551,7 @@ static struct resource siu_resources[] = {
};
};
static
struct
platform_device
siu_device
=
{
static
struct
platform_device
siu_device
=
{
.
name
=
"s
h_siu
"
,
.
name
=
"s
iu-pcm-audio
"
,
.
id
=
-
1
,
.
id
=
-
1
,
.
dev
=
{
.
dev
=
{
.
platform_data
=
&
siu_platform_data
,
.
platform_data
=
&
siu_platform_data
,
...
...
drivers/staging/xgifb/TODO
浏览文件 @
611ad378
...
@@ -12,4 +12,4 @@ TODO:
...
@@ -12,4 +12,4 @@ TODO:
- get rid of non-linux related stuff
- get rid of non-linux related stuff
Please send patches to:
Please send patches to:
Arnaud Patard <a
patard@mandriva.com
>
Arnaud Patard <a
rnaud.patard@rtp-net.org
>
drivers/video/Kconfig
浏览文件 @
611ad378
...
@@ -1919,6 +1919,7 @@ config FB_SH_MOBILE_HDMI
...
@@ -1919,6 +1919,7 @@ config FB_SH_MOBILE_HDMI
tristate "SuperH Mobile HDMI controller support"
tristate "SuperH Mobile HDMI controller support"
depends on FB_SH_MOBILE_LCDC
depends on FB_SH_MOBILE_LCDC
select FB_MODE_HELPERS
select FB_MODE_HELPERS
select SND_SOC
---help---
---help---
Driver for the on-chip SH-Mobile HDMI controller.
Driver for the on-chip SH-Mobile HDMI controller.
...
...
drivers/video/sh_mobile_hdmi.c
浏览文件 @
611ad378
...
@@ -224,13 +224,9 @@ static u8 hdmi_read(struct sh_hdmi *hdmi, u8 reg)
...
@@ -224,13 +224,9 @@ static u8 hdmi_read(struct sh_hdmi *hdmi, u8 reg)
return
ioread8
(
hdmi
->
base
+
reg
);
return
ioread8
(
hdmi
->
base
+
reg
);
}
}
/************************************************************************
/*
* HDMI sound
*/
HDMI sound
************************************************************************/
static
unsigned
int
sh_hdmi_snd_read
(
struct
snd_soc_codec
*
codec
,
static
unsigned
int
sh_hdmi_snd_read
(
struct
snd_soc_codec
*
codec
,
unsigned
int
reg
)
unsigned
int
reg
)
{
{
...
@@ -253,9 +249,12 @@ static struct snd_soc_dai_driver sh_hdmi_dai = {
...
@@ -253,9 +249,12 @@ static struct snd_soc_dai_driver sh_hdmi_dai = {
.
name
=
"sh_mobile_hdmi-hifi"
,
.
name
=
"sh_mobile_hdmi-hifi"
,
.
playback
=
{
.
playback
=
{
.
stream_name
=
"Playback"
,
.
stream_name
=
"Playback"
,
.
channels_min
=
1
,
.
channels_min
=
2
,
.
channels_max
=
2
,
.
channels_max
=
8
,
.
rates
=
SNDRV_PCM_RATE_8000_48000
,
.
rates
=
SNDRV_PCM_RATE_32000
|
SNDRV_PCM_RATE_44100
|
SNDRV_PCM_RATE_48000
|
SNDRV_PCM_RATE_88200
|
SNDRV_PCM_RATE_96000
|
SNDRV_PCM_RATE_176400
|
SNDRV_PCM_RATE_192000
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
|
SNDRV_PCM_FMTBIT_S24_LE
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
|
SNDRV_PCM_FMTBIT_S24_LE
,
},
},
};
};
...
@@ -273,13 +272,10 @@ static struct snd_soc_codec_driver soc_codec_dev_sh_hdmi = {
...
@@ -273,13 +272,10 @@ static struct snd_soc_codec_driver soc_codec_dev_sh_hdmi = {
.
write
=
sh_hdmi_snd_write
,
.
write
=
sh_hdmi_snd_write
,
};
};
/************************************************************************
/*
* HDMI video
*/
HDMI video
************************************************************************/
/* External video parameter settings */
/* External video parameter settings */
static
void
hdmi_external_video_param
(
struct
sh_hdmi
*
hdmi
)
static
void
hdmi_external_video_param
(
struct
sh_hdmi
*
hdmi
)
{
{
...
@@ -396,20 +392,20 @@ static void sh_hdmi_audio_config(struct sh_hdmi *hdmi)
...
@@ -396,20 +392,20 @@ static void sh_hdmi_audio_config(struct sh_hdmi *hdmi)
* [6:5] set required down sampling rate if required
* [6:5] set required down sampling rate if required
* [4:3] set required audio source
* [4:3] set required audio source
*/
*/
switch
(
pdata
->
flags
&
HDMI_SRC_MASK
)
{
switch
(
pdata
->
flags
&
HDMI_S
ND_S
RC_MASK
)
{
default:
default:
/*
FALL THROUGH
*/
/*
fall through
*/
case
HDMI_SRC_I2S
:
case
HDMI_S
ND_S
RC_I2S
:
data
=
(
0x0
<<
3
)
;
data
=
0x0
<<
3
;
break
;
break
;
case
HDMI_SRC_SPDIF
:
case
HDMI_S
ND_S
RC_SPDIF
:
data
=
(
0x1
<<
3
)
;
data
=
0x1
<<
3
;
break
;
break
;
case
HDMI_SRC_DSD
:
case
HDMI_S
ND_S
RC_DSD
:
data
=
(
0x2
<<
3
)
;
data
=
0x2
<<
3
;
break
;
break
;
case
HDMI_SRC_HBR
:
case
HDMI_S
ND_S
RC_HBR
:
data
=
(
0x3
<<
3
)
;
data
=
0x3
<<
3
;
break
;
break
;
}
}
hdmi_write
(
hdmi
,
data
,
HDMI_AUDIO_SETTING_1
);
hdmi_write
(
hdmi
,
data
,
HDMI_AUDIO_SETTING_1
);
...
@@ -971,7 +967,7 @@ static int __init sh_hdmi_probe(struct platform_device *pdev)
...
@@ -971,7 +967,7 @@ static int __init sh_hdmi_probe(struct platform_device *pdev)
ret
=
snd_soc_register_codec
(
&
pdev
->
dev
,
ret
=
snd_soc_register_codec
(
&
pdev
->
dev
,
&
soc_codec_dev_sh_hdmi
,
&
sh_hdmi_dai
,
1
);
&
soc_codec_dev_sh_hdmi
,
&
sh_hdmi_dai
,
1
);
if
(
ret
<
0
)
if
(
ret
<
0
)
goto
e
getclk
;
goto
e
sndreg
;
hdmi
->
dev
=
&
pdev
->
dev
;
hdmi
->
dev
=
&
pdev
->
dev
;
...
@@ -1058,6 +1054,8 @@ static int __init sh_hdmi_probe(struct platform_device *pdev)
...
@@ -1058,6 +1054,8 @@ static int __init sh_hdmi_probe(struct platform_device *pdev)
erate:
erate:
clk_put
(
hdmi
->
hdmi_clk
);
clk_put
(
hdmi
->
hdmi_clk
);
egetclk:
egetclk:
snd_soc_unregister_codec
(
&
pdev
->
dev
);
esndreg:
kfree
(
hdmi
);
kfree
(
hdmi
);
return
ret
;
return
ret
;
...
...
include/video/sh_mobile_hdmi.h
浏览文件 @
611ad378
...
@@ -23,11 +23,11 @@ struct device;
...
@@ -23,11 +23,11 @@ struct device;
*/
*/
/* Audio source select */
/* Audio source select */
#define HDMI_S
RC_MASK
(0xF << 0)
#define HDMI_S
ND_SRC_MASK
(0xF << 0)
#define HDMI_S
RC_I2S
(0 << 0)
/* default */
#define HDMI_S
ND_SRC_I2S
(0 << 0)
/* default */
#define HDMI_S
RC_SPDIF
(1 << 0)
#define HDMI_S
ND_SRC_SPDIF
(1 << 0)
#define HDMI_S
RC_DSD
(2 << 0)
#define HDMI_S
ND_SRC_DSD
(2 << 0)
#define HDMI_S
RC_HBR
(3 << 0)
#define HDMI_S
ND_SRC_HBR
(3 << 0)
struct
sh_mobile_hdmi_info
{
struct
sh_mobile_hdmi_info
{
struct
sh_mobile_lcdc_chan_cfg
*
lcd_chan
;
struct
sh_mobile_lcdc_chan_cfg
*
lcd_chan
;
...
...
sound/soc/codecs/Kconfig
浏览文件 @
611ad378
...
@@ -67,6 +67,7 @@ config SND_SOC_ALL_CODECS
...
@@ -67,6 +67,7 @@ config SND_SOC_ALL_CODECS
select SND_SOC_WM8971 if I2C
select SND_SOC_WM8971 if I2C
select SND_SOC_WM8974 if I2C
select SND_SOC_WM8974 if I2C
select SND_SOC_WM8978 if I2C
select SND_SOC_WM8978 if I2C
select SND_SOC_WM8985 if SND_SOC_I2C_AND_SPI
select SND_SOC_WM8988 if SND_SOC_I2C_AND_SPI
select SND_SOC_WM8988 if SND_SOC_I2C_AND_SPI
select SND_SOC_WM8990 if I2C
select SND_SOC_WM8990 if I2C
select SND_SOC_WM8993 if I2C
select SND_SOC_WM8993 if I2C
...
@@ -269,6 +270,9 @@ config SND_SOC_WM8974
...
@@ -269,6 +270,9 @@ config SND_SOC_WM8974
config SND_SOC_WM8978
config SND_SOC_WM8978
tristate
tristate
config SND_SOC_WM8985
tristate
config SND_SOC_WM8988
config SND_SOC_WM8988
tristate
tristate
...
...
sound/soc/codecs/Makefile
浏览文件 @
611ad378
...
@@ -52,6 +52,7 @@ snd-soc-wm8962-objs := wm8962.o wm8962-tables.o
...
@@ -52,6 +52,7 @@ snd-soc-wm8962-objs := wm8962.o wm8962-tables.o
snd-soc-wm8971-objs
:=
wm8971.o
snd-soc-wm8971-objs
:=
wm8971.o
snd-soc-wm8974-objs
:=
wm8974.o
snd-soc-wm8974-objs
:=
wm8974.o
snd-soc-wm8978-objs
:=
wm8978.o
snd-soc-wm8978-objs
:=
wm8978.o
snd-soc-wm8985-objs
:=
wm8985.o
snd-soc-wm8988-objs
:=
wm8988.o
snd-soc-wm8988-objs
:=
wm8988.o
snd-soc-wm8990-objs
:=
wm8990.o
snd-soc-wm8990-objs
:=
wm8990.o
snd-soc-wm8993-objs
:=
wm8993.o
snd-soc-wm8993-objs
:=
wm8993.o
...
@@ -124,6 +125,7 @@ obj-$(CONFIG_SND_SOC_WM8962) += snd-soc-wm8962.o
...
@@ -124,6 +125,7 @@ obj-$(CONFIG_SND_SOC_WM8962) += snd-soc-wm8962.o
obj-$(CONFIG_SND_SOC_WM8971)
+=
snd-soc-wm8971.o
obj-$(CONFIG_SND_SOC_WM8971)
+=
snd-soc-wm8971.o
obj-$(CONFIG_SND_SOC_WM8974)
+=
snd-soc-wm8974.o
obj-$(CONFIG_SND_SOC_WM8974)
+=
snd-soc-wm8974.o
obj-$(CONFIG_SND_SOC_WM8978)
+=
snd-soc-wm8978.o
obj-$(CONFIG_SND_SOC_WM8978)
+=
snd-soc-wm8978.o
obj-$(CONFIG_SND_SOC_WM8985)
+=
snd-soc-wm8985.o
obj-$(CONFIG_SND_SOC_WM8988)
+=
snd-soc-wm8988.o
obj-$(CONFIG_SND_SOC_WM8988)
+=
snd-soc-wm8988.o
obj-$(CONFIG_SND_SOC_WM8990)
+=
snd-soc-wm8990.o
obj-$(CONFIG_SND_SOC_WM8990)
+=
snd-soc-wm8990.o
obj-$(CONFIG_SND_SOC_WM8993)
+=
snd-soc-wm8993.o
obj-$(CONFIG_SND_SOC_WM8993)
+=
snd-soc-wm8993.o
...
...
sound/soc/codecs/ad1980.c
浏览文件 @
611ad378
...
@@ -247,6 +247,7 @@ static struct snd_soc_codec_driver soc_codec_dev_ad1980 = {
...
@@ -247,6 +247,7 @@ static struct snd_soc_codec_driver soc_codec_dev_ad1980 = {
.
remove
=
ad1980_soc_remove
,
.
remove
=
ad1980_soc_remove
,
.
reg_cache_size
=
ARRAY_SIZE
(
ad1980_reg
),
.
reg_cache_size
=
ARRAY_SIZE
(
ad1980_reg
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
ad1980_reg
,
.
reg_cache_step
=
2
,
.
reg_cache_step
=
2
,
.
write
=
ac97_write
,
.
write
=
ac97_write
,
.
read
=
ac97_read
,
.
read
=
ac97_read
,
...
...
sound/soc/codecs/ak4642.c
浏览文件 @
611ad378
...
@@ -422,7 +422,7 @@ static int ak4642_probe(struct snd_soc_codec *codec)
...
@@ -422,7 +422,7 @@ static int ak4642_probe(struct snd_soc_codec *codec)
dev_info
(
codec
->
dev
,
"AK4642 Audio Codec %s"
,
AK4642_VERSION
);
dev_info
(
codec
->
dev
,
"AK4642 Audio Codec %s"
,
AK4642_VERSION
);
codec
->
hw_write
=
(
hw_write_t
)
i2c_master_send
;
codec
->
hw_write
=
(
hw_write_t
)
i2c_master_send
;
codec
->
control_data
=
ak4642
->
control_data
;
codec
->
control_data
=
ak4642
->
control_data
;
snd_soc_add_controls
(
codec
,
ak4642_snd_controls
,
snd_soc_add_controls
(
codec
,
ak4642_snd_controls
,
ARRAY_SIZE
(
ak4642_snd_controls
));
ARRAY_SIZE
(
ak4642_snd_controls
));
...
@@ -431,12 +431,12 @@ static int ak4642_probe(struct snd_soc_codec *codec)
...
@@ -431,12 +431,12 @@ static int ak4642_probe(struct snd_soc_codec *codec)
}
}
static
struct
snd_soc_codec_driver
soc_codec_dev_ak4642
=
{
static
struct
snd_soc_codec_driver
soc_codec_dev_ak4642
=
{
.
probe
=
ak4642_probe
,
.
probe
=
ak4642_probe
,
.
resume
=
ak4642_resume
,
.
resume
=
ak4642_resume
,
.
read
=
ak4642_read_reg_cache
,
.
read
=
ak4642_read_reg_cache
,
.
write
=
ak4642_write
,
.
write
=
ak4642_write
,
.
reg_cache_size
=
ARRAY_SIZE
(
ak4642_reg
),
.
reg_cache_size
=
ARRAY_SIZE
(
ak4642_reg
),
.
reg_word_size
=
sizeof
(
u8
),
.
reg_word_size
=
sizeof
(
u8
),
.
reg_cache_default
=
ak4642_reg
,
.
reg_cache_default
=
ak4642_reg
,
};
};
...
@@ -448,7 +448,7 @@ static __devinit int ak4642_i2c_probe(struct i2c_client *i2c,
...
@@ -448,7 +448,7 @@ static __devinit int ak4642_i2c_probe(struct i2c_client *i2c,
int
ret
;
int
ret
;
ak4642
=
kzalloc
(
sizeof
(
struct
ak4642_priv
),
GFP_KERNEL
);
ak4642
=
kzalloc
(
sizeof
(
struct
ak4642_priv
),
GFP_KERNEL
);
if
(
ak4642
==
NULL
)
if
(
!
ak4642
)
return
-
ENOMEM
;
return
-
ENOMEM
;
i2c_set_clientdata
(
i2c
,
ak4642
);
i2c_set_clientdata
(
i2c
,
ak4642
);
...
@@ -481,9 +481,9 @@ static struct i2c_driver ak4642_i2c_driver = {
...
@@ -481,9 +481,9 @@ static struct i2c_driver ak4642_i2c_driver = {
.
name
=
"ak4642-codec"
,
.
name
=
"ak4642-codec"
,
.
owner
=
THIS_MODULE
,
.
owner
=
THIS_MODULE
,
},
},
.
probe
=
ak4642_i2c_probe
,
.
probe
=
ak4642_i2c_probe
,
.
remove
=
__devexit_p
(
ak4642_i2c_remove
),
.
remove
=
__devexit_p
(
ak4642_i2c_remove
),
.
id_table
=
ak4642_i2c_id
,
.
id_table
=
ak4642_i2c_id
,
};
};
#endif
#endif
...
...
sound/soc/codecs/ak4671.c
浏览文件 @
611ad378
...
@@ -642,7 +642,6 @@ static int ak4671_probe(struct snd_soc_codec *codec)
...
@@ -642,7 +642,6 @@ static int ak4671_probe(struct snd_soc_codec *codec)
int
ret
;
int
ret
;
codec
->
hw_write
=
(
hw_write_t
)
i2c_master_send
;
codec
->
hw_write
=
(
hw_write_t
)
i2c_master_send
;
codec
->
bias_level
=
SND_SOC_BIAS_OFF
;
ret
=
snd_soc_codec_set_cache_io
(
codec
,
8
,
8
,
ak4671
->
control_type
);
ret
=
snd_soc_codec_set_cache_io
(
codec
,
8
,
8
,
ak4671
->
control_type
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
...
...
sound/soc/codecs/cs42l51.c
浏览文件 @
611ad378
...
@@ -649,6 +649,6 @@ static void __exit cs42l51_exit(void)
...
@@ -649,6 +649,6 @@ static void __exit cs42l51_exit(void)
}
}
module_exit
(
cs42l51_exit
);
module_exit
(
cs42l51_exit
);
MODULE_AUTHOR
(
"Arnaud Patard <a
patard@mandriva.com
>"
);
MODULE_AUTHOR
(
"Arnaud Patard <a
rnaud.patard@rtp-net.org
>"
);
MODULE_DESCRIPTION
(
"Cirrus Logic CS42L51 ALSA SoC Codec Driver"
);
MODULE_DESCRIPTION
(
"Cirrus Logic CS42L51 ALSA SoC Codec Driver"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_LICENSE
(
"GPL"
);
sound/soc/codecs/da7210.c
浏览文件 @
611ad378
...
@@ -454,7 +454,7 @@ static int da7210_probe(struct snd_soc_codec *codec)
...
@@ -454,7 +454,7 @@ static int da7210_probe(struct snd_soc_codec *codec)
dev_info
(
codec
->
dev
,
"DA7210 Audio Codec %s
\n
"
,
DA7210_VERSION
);
dev_info
(
codec
->
dev
,
"DA7210 Audio Codec %s
\n
"
,
DA7210_VERSION
);
codec
->
control_data
=
da7210
->
control_data
;
codec
->
control_data
=
da7210
->
control_data
;
codec
->
hw_write
=
(
hw_write_t
)
i2c_master_send
;
codec
->
hw_write
=
(
hw_write_t
)
i2c_master_send
;
/* FIXME
/* FIXME
...
@@ -547,11 +547,11 @@ static int da7210_probe(struct snd_soc_codec *codec)
...
@@ -547,11 +547,11 @@ static int da7210_probe(struct snd_soc_codec *codec)
}
}
static
struct
snd_soc_codec_driver
soc_codec_dev_da7210
=
{
static
struct
snd_soc_codec_driver
soc_codec_dev_da7210
=
{
.
probe
=
da7210_probe
,
.
probe
=
da7210_probe
,
.
read
=
da7210_read
,
.
read
=
da7210_read
,
.
write
=
da7210_write
,
.
write
=
da7210_write
,
.
reg_cache_size
=
ARRAY_SIZE
(
da7210_reg
),
.
reg_cache_size
=
ARRAY_SIZE
(
da7210_reg
),
.
reg_word_size
=
sizeof
(
u8
),
.
reg_word_size
=
sizeof
(
u8
),
.
reg_cache_default
=
da7210_reg
,
.
reg_cache_default
=
da7210_reg
,
};
};
...
@@ -597,9 +597,9 @@ static struct i2c_driver da7210_i2c_driver = {
...
@@ -597,9 +597,9 @@ static struct i2c_driver da7210_i2c_driver = {
.
name
=
"da7210-codec"
,
.
name
=
"da7210-codec"
,
.
owner
=
THIS_MODULE
,
.
owner
=
THIS_MODULE
,
},
},
.
probe
=
da7210_i2c_probe
,
.
probe
=
da7210_i2c_probe
,
.
remove
=
__devexit_p
(
da7210_i2c_remove
),
.
remove
=
__devexit_p
(
da7210_i2c_remove
),
.
id_table
=
da7210_i2c_id
,
.
id_table
=
da7210_i2c_id
,
};
};
#endif
#endif
...
...
sound/soc/codecs/ssm2602.c
浏览文件 @
611ad378
...
@@ -560,7 +560,6 @@ static int ssm2602_probe(struct snd_soc_codec *codec)
...
@@ -560,7 +560,6 @@ static int ssm2602_probe(struct snd_soc_codec *codec)
pr_info
(
"ssm2602 Audio Codec %s"
,
SSM2602_VERSION
);
pr_info
(
"ssm2602 Audio Codec %s"
,
SSM2602_VERSION
);
codec
->
bias_level
=
SND_SOC_BIAS_OFF
,
codec
->
control_data
=
ssm2602
->
control_data
;
codec
->
control_data
=
ssm2602
->
control_data
;
ssm2602_reset
(
codec
);
ssm2602_reset
(
codec
);
...
...
sound/soc/codecs/tlv320dac33.c
浏览文件 @
611ad378
...
@@ -1385,7 +1385,6 @@ static int dac33_soc_probe(struct snd_soc_codec *codec)
...
@@ -1385,7 +1385,6 @@ static int dac33_soc_probe(struct snd_soc_codec *codec)
codec
->
control_data
=
dac33
->
control_data
;
codec
->
control_data
=
dac33
->
control_data
;
codec
->
hw_write
=
(
hw_write_t
)
i2c_master_send
;
codec
->
hw_write
=
(
hw_write_t
)
i2c_master_send
;
codec
->
bias_level
=
SND_SOC_BIAS_OFF
;
codec
->
idle_bias_off
=
1
;
codec
->
idle_bias_off
=
1
;
dac33
->
codec
=
codec
;
dac33
->
codec
=
codec
;
...
...
sound/soc/codecs/twl4030.c
浏览文件 @
611ad378
...
@@ -2245,7 +2245,6 @@ static int twl4030_soc_probe(struct snd_soc_codec *codec)
...
@@ -2245,7 +2245,6 @@ static int twl4030_soc_probe(struct snd_soc_codec *codec)
snd_soc_codec_set_drvdata
(
codec
,
twl4030
);
snd_soc_codec_set_drvdata
(
codec
,
twl4030
);
/* Set the defaults, and power up the codec */
/* Set the defaults, and power up the codec */
twl4030
->
sysclk
=
twl4030_codec_get_mclk
()
/
1000
;
twl4030
->
sysclk
=
twl4030_codec_get_mclk
()
/
1000
;
codec
->
bias_level
=
SND_SOC_BIAS_OFF
;
codec
->
idle_bias_off
=
1
;
codec
->
idle_bias_off
=
1
;
twl4030_init_chip
(
codec
);
twl4030_init_chip
(
codec
);
...
...
sound/soc/codecs/wm8510.c
浏览文件 @
611ad378
...
@@ -569,7 +569,6 @@ static int wm8510_probe(struct snd_soc_codec *codec)
...
@@ -569,7 +569,6 @@ static int wm8510_probe(struct snd_soc_codec *codec)
wm8510_reset
(
codec
);
wm8510_reset
(
codec
);
/* power on device */
/* power on device */
codec
->
bias_level
=
SND_SOC_BIAS_OFF
;
wm8510_set_bias_level
(
codec
,
SND_SOC_BIAS_STANDBY
);
wm8510_set_bias_level
(
codec
,
SND_SOC_BIAS_STANDBY
);
snd_soc_add_controls
(
codec
,
wm8510_snd_controls
,
snd_soc_add_controls
(
codec
,
wm8510_snd_controls
,
ARRAY_SIZE
(
wm8510_snd_controls
));
ARRAY_SIZE
(
wm8510_snd_controls
));
...
...
sound/soc/codecs/wm8580.c
浏览文件 @
611ad378
...
@@ -907,7 +907,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8580 = {
...
@@ -907,7 +907,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8580 = {
.
probe
=
wm8580_probe
,
.
probe
=
wm8580_probe
,
.
remove
=
wm8580_remove
,
.
remove
=
wm8580_remove
,
.
set_bias_level
=
wm8580_set_bias_level
,
.
set_bias_level
=
wm8580_set_bias_level
,
.
reg_cache_size
=
sizeof
(
wm8580_reg
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm8580_reg
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
&
wm8580_reg
,
.
reg_cache_default
=
&
wm8580_reg
,
};
};
...
...
sound/soc/codecs/wm8711.c
浏览文件 @
611ad378
...
@@ -418,7 +418,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8711 = {
...
@@ -418,7 +418,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8711 = {
.
suspend
=
wm8711_suspend
,
.
suspend
=
wm8711_suspend
,
.
resume
=
wm8711_resume
,
.
resume
=
wm8711_resume
,
.
set_bias_level
=
wm8711_set_bias_level
,
.
set_bias_level
=
wm8711_set_bias_level
,
.
reg_cache_size
=
sizeof
(
wm8711_reg
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm8711_reg
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
wm8711_reg
,
.
reg_cache_default
=
wm8711_reg
,
};
};
...
...
sound/soc/codecs/wm8728.c
浏览文件 @
611ad378
...
@@ -272,7 +272,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8728 = {
...
@@ -272,7 +272,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8728 = {
.
suspend
=
wm8728_suspend
,
.
suspend
=
wm8728_suspend
,
.
resume
=
wm8728_resume
,
.
resume
=
wm8728_resume
,
.
set_bias_level
=
wm8728_set_bias_level
,
.
set_bias_level
=
wm8728_set_bias_level
,
.
reg_cache_size
=
sizeof
(
wm8728_reg_defaults
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm8728_reg_defaults
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
wm8728_reg_defaults
,
.
reg_cache_default
=
wm8728_reg_defaults
,
};
};
...
...
sound/soc/codecs/wm8731.c
浏览文件 @
611ad378
...
@@ -488,8 +488,6 @@ static int wm8731_probe(struct snd_soc_codec *codec)
...
@@ -488,8 +488,6 @@ static int wm8731_probe(struct snd_soc_codec *codec)
struct
wm8731_priv
*
wm8731
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8731_priv
*
wm8731
=
snd_soc_codec_get_drvdata
(
codec
);
int
ret
=
0
,
i
;
int
ret
=
0
,
i
;
codec
->
bias_level
=
SND_SOC_BIAS_OFF
,
ret
=
snd_soc_codec_set_cache_io
(
codec
,
7
,
9
,
wm8731
->
control_type
);
ret
=
snd_soc_codec_set_cache_io
(
codec
,
7
,
9
,
wm8731
->
control_type
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
dev_err
(
codec
->
dev
,
"Failed to set cache I/O: %d
\n
"
,
ret
);
dev_err
(
codec
->
dev
,
"Failed to set cache I/O: %d
\n
"
,
ret
);
...
@@ -567,7 +565,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8731 = {
...
@@ -567,7 +565,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8731 = {
.
suspend
=
wm8731_suspend
,
.
suspend
=
wm8731_suspend
,
.
resume
=
wm8731_resume
,
.
resume
=
wm8731_resume
,
.
set_bias_level
=
wm8731_set_bias_level
,
.
set_bias_level
=
wm8731_set_bias_level
,
.
reg_cache_size
=
sizeof
(
wm8731_reg
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm8731_reg
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
wm8731_reg
,
.
reg_cache_default
=
wm8731_reg
,
};
};
...
...
sound/soc/codecs/wm8741.c
浏览文件 @
611ad378
...
@@ -453,7 +453,7 @@ static int wm8741_probe(struct snd_soc_codec *codec)
...
@@ -453,7 +453,7 @@ static int wm8741_probe(struct snd_soc_codec *codec)
static
struct
snd_soc_codec_driver
soc_codec_dev_wm8741
=
{
static
struct
snd_soc_codec_driver
soc_codec_dev_wm8741
=
{
.
probe
=
wm8741_probe
,
.
probe
=
wm8741_probe
,
.
resume
=
wm8741_resume
,
.
resume
=
wm8741_resume
,
.
reg_cache_size
=
sizeof
(
wm8741_reg_defaults
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm8741_reg_defaults
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
&
wm8741_reg_defaults
,
.
reg_cache_default
=
&
wm8741_reg_defaults
,
};
};
...
...
sound/soc/codecs/wm8750.c
浏览文件 @
611ad378
...
@@ -747,7 +747,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8750 = {
...
@@ -747,7 +747,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8750 = {
.
suspend
=
wm8750_suspend
,
.
suspend
=
wm8750_suspend
,
.
resume
=
wm8750_resume
,
.
resume
=
wm8750_resume
,
.
set_bias_level
=
wm8750_set_bias_level
,
.
set_bias_level
=
wm8750_set_bias_level
,
.
reg_cache_size
=
sizeof
(
wm8750_reg
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm8750_reg
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
wm8750_reg
,
.
reg_cache_default
=
wm8750_reg
,
};
};
...
...
sound/soc/codecs/wm8753.c
浏览文件 @
611ad378
...
@@ -1550,7 +1550,6 @@ static int wm8753_probe(struct snd_soc_codec *codec)
...
@@ -1550,7 +1550,6 @@ static int wm8753_probe(struct snd_soc_codec *codec)
struct
wm8753_priv
*
wm8753
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8753_priv
*
wm8753
=
snd_soc_codec_get_drvdata
(
codec
);
int
ret
=
0
,
reg
;
int
ret
=
0
,
reg
;
codec
->
bias_level
=
SND_SOC_BIAS_OFF
;
INIT_DELAYED_WORK
(
&
codec
->
delayed_work
,
wm8753_work
);
INIT_DELAYED_WORK
(
&
codec
->
delayed_work
,
wm8753_work
);
ret
=
snd_soc_codec_set_cache_io
(
codec
,
7
,
9
,
wm8753
->
control_type
);
ret
=
snd_soc_codec_set_cache_io
(
codec
,
7
,
9
,
wm8753
->
control_type
);
...
@@ -1617,7 +1616,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8753 = {
...
@@ -1617,7 +1616,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8753 = {
.
suspend
=
wm8753_suspend
,
.
suspend
=
wm8753_suspend
,
.
resume
=
wm8753_resume
,
.
resume
=
wm8753_resume
,
.
set_bias_level
=
wm8753_set_bias_level
,
.
set_bias_level
=
wm8753_set_bias_level
,
.
reg_cache_size
=
sizeof
(
wm8753_reg
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm8753_reg
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
wm8753_reg
,
.
reg_cache_default
=
wm8753_reg
,
};
};
...
...
sound/soc/codecs/wm8776.c
浏览文件 @
611ad378
...
@@ -448,7 +448,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8776 = {
...
@@ -448,7 +448,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8776 = {
.
suspend
=
wm8776_suspend
,
.
suspend
=
wm8776_suspend
,
.
resume
=
wm8776_resume
,
.
resume
=
wm8776_resume
,
.
set_bias_level
=
wm8776_set_bias_level
,
.
set_bias_level
=
wm8776_set_bias_level
,
.
reg_cache_size
=
sizeof
(
wm8776_reg
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm8776_reg
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
wm8776_reg
,
.
reg_cache_default
=
wm8776_reg
,
};
};
...
...
sound/soc/codecs/wm8900.c
浏览文件 @
611ad378
...
@@ -1256,7 +1256,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8900 = {
...
@@ -1256,7 +1256,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8900 = {
.
resume
=
wm8900_resume
,
.
resume
=
wm8900_resume
,
.
set_bias_level
=
wm8900_set_bias_level
,
.
set_bias_level
=
wm8900_set_bias_level
,
.
volatile_register
=
wm8900_volatile_register
,
.
volatile_register
=
wm8900_volatile_register
,
.
reg_cache_size
=
sizeof
(
wm8900_reg_defaults
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm8900_reg_defaults
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
wm8900_reg_defaults
,
.
reg_cache_default
=
wm8900_reg_defaults
,
};
};
...
...
sound/soc/codecs/wm8940.c
浏览文件 @
611ad378
...
@@ -750,7 +750,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8940 = {
...
@@ -750,7 +750,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8940 = {
.
suspend
=
wm8940_suspend
,
.
suspend
=
wm8940_suspend
,
.
resume
=
wm8940_resume
,
.
resume
=
wm8940_resume
,
.
set_bias_level
=
wm8940_set_bias_level
,
.
set_bias_level
=
wm8940_set_bias_level
,
.
reg_cache_size
=
sizeof
(
wm8940_reg_defaults
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm8940_reg_defaults
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
wm8940_reg_defaults
,
.
reg_cache_default
=
wm8940_reg_defaults
,
};
};
...
...
sound/soc/codecs/wm8961.c
浏览文件 @
611ad378
...
@@ -1075,7 +1075,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8961 = {
...
@@ -1075,7 +1075,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8961 = {
.
suspend
=
wm8961_suspend
,
.
suspend
=
wm8961_suspend
,
.
resume
=
wm8961_resume
,
.
resume
=
wm8961_resume
,
.
set_bias_level
=
wm8961_set_bias_level
,
.
set_bias_level
=
wm8961_set_bias_level
,
.
reg_cache_size
=
sizeof
(
wm8961_reg_defaults
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm8961_reg_defaults
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
wm8961_reg_defaults
,
.
reg_cache_default
=
wm8961_reg_defaults
,
.
volatile_register
=
wm8961_volatile_register
,
.
volatile_register
=
wm8961_volatile_register
,
...
...
sound/soc/codecs/wm8962.c
浏览文件 @
611ad378
...
@@ -1780,7 +1780,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8962 = {
...
@@ -1780,7 +1780,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8962 = {
.
remove
=
wm8962_remove
,
.
remove
=
wm8962_remove
,
.
resume
=
wm8962_resume
,
.
resume
=
wm8962_resume
,
.
set_bias_level
=
wm8962_set_bias_level
,
.
set_bias_level
=
wm8962_set_bias_level
,
.
reg_cache_size
=
WM8962_MAX_REGISTER
,
.
reg_cache_size
=
WM8962_MAX_REGISTER
+
1
,
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
wm8962_reg
,
.
reg_cache_default
=
wm8962_reg
,
.
volatile_register
=
wm8962_volatile_register
,
.
volatile_register
=
wm8962_volatile_register
,
...
...
sound/soc/codecs/wm8985.c
0 → 100644
浏览文件 @
611ad378
/*
* wm8985.c -- WM8985 ALSA SoC Audio driver
*
* Copyright 2010 Wolfson Microelectronics plc
*
* Author: Dimitris Papastamos <dp@opensource.wolfsonmicro.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* TODO:
* o Add OUT3/OUT4 mixer controls.
*/
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/pm.h>
#include <linux/i2c.h>
#include <linux/regulator/consumer.h>
#include <linux/spi/spi.h>
#include <linux/slab.h>
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/soc-dapm.h>
#include <sound/initval.h>
#include <sound/tlv.h>
#include "wm8985.h"
#define WM8985_NUM_SUPPLIES 4
static
const
char
*
wm8985_supply_names
[
WM8985_NUM_SUPPLIES
]
=
{
"DCVDD"
,
"DBVDD"
,
"AVDD1"
,
"AVDD2"
};
static
const
u16
wm8985_reg_defs
[]
=
{
0x0000
,
/* R0 - Software Reset */
0x0000
,
/* R1 - Power management 1 */
0x0000
,
/* R2 - Power management 2 */
0x0000
,
/* R3 - Power management 3 */
0x0050
,
/* R4 - Audio Interface */
0x0000
,
/* R5 - Companding control */
0x0140
,
/* R6 - Clock Gen control */
0x0000
,
/* R7 - Additional control */
0x0000
,
/* R8 - GPIO Control */
0x0000
,
/* R9 - Jack Detect Control 1 */
0x0000
,
/* R10 - DAC Control */
0x00FF
,
/* R11 - Left DAC digital Vol */
0x00FF
,
/* R12 - Right DAC digital vol */
0x0000
,
/* R13 - Jack Detect Control 2 */
0x0100
,
/* R14 - ADC Control */
0x00FF
,
/* R15 - Left ADC Digital Vol */
0x00FF
,
/* R16 - Right ADC Digital Vol */
0x0000
,
/* R17 */
0x012C
,
/* R18 - EQ1 - low shelf */
0x002C
,
/* R19 - EQ2 - peak 1 */
0x002C
,
/* R20 - EQ3 - peak 2 */
0x002C
,
/* R21 - EQ4 - peak 3 */
0x002C
,
/* R22 - EQ5 - high shelf */
0x0000
,
/* R23 */
0x0032
,
/* R24 - DAC Limiter 1 */
0x0000
,
/* R25 - DAC Limiter 2 */
0x0000
,
/* R26 */
0x0000
,
/* R27 - Notch Filter 1 */
0x0000
,
/* R28 - Notch Filter 2 */
0x0000
,
/* R29 - Notch Filter 3 */
0x0000
,
/* R30 - Notch Filter 4 */
0x0000
,
/* R31 */
0x0038
,
/* R32 - ALC control 1 */
0x000B
,
/* R33 - ALC control 2 */
0x0032
,
/* R34 - ALC control 3 */
0x0000
,
/* R35 - Noise Gate */
0x0008
,
/* R36 - PLL N */
0x000C
,
/* R37 - PLL K 1 */
0x0093
,
/* R38 - PLL K 2 */
0x00E9
,
/* R39 - PLL K 3 */
0x0000
,
/* R40 */
0x0000
,
/* R41 - 3D control */
0x0000
,
/* R42 - OUT4 to ADC */
0x0000
,
/* R43 - Beep control */
0x0033
,
/* R44 - Input ctrl */
0x0010
,
/* R45 - Left INP PGA gain ctrl */
0x0010
,
/* R46 - Right INP PGA gain ctrl */
0x0100
,
/* R47 - Left ADC BOOST ctrl */
0x0100
,
/* R48 - Right ADC BOOST ctrl */
0x0002
,
/* R49 - Output ctrl */
0x0001
,
/* R50 - Left mixer ctrl */
0x0001
,
/* R51 - Right mixer ctrl */
0x0039
,
/* R52 - LOUT1 (HP) volume ctrl */
0x0039
,
/* R53 - ROUT1 (HP) volume ctrl */
0x0039
,
/* R54 - LOUT2 (SPK) volume ctrl */
0x0039
,
/* R55 - ROUT2 (SPK) volume ctrl */
0x0001
,
/* R56 - OUT3 mixer ctrl */
0x0001
,
/* R57 - OUT4 (MONO) mix ctrl */
0x0001
,
/* R58 */
0x0000
,
/* R59 */
0x0004
,
/* R60 - OUTPUT ctrl */
0x0000
,
/* R61 - BIAS CTRL */
0x0180
,
/* R62 */
0x0000
/* R63 */
};
/*
* latch bit 8 of these registers to ensure instant
* volume updates
*/
static
const
int
volume_update_regs
[]
=
{
WM8985_LEFT_DAC_DIGITAL_VOL
,
WM8985_RIGHT_DAC_DIGITAL_VOL
,
WM8985_LEFT_ADC_DIGITAL_VOL
,
WM8985_RIGHT_ADC_DIGITAL_VOL
,
WM8985_LOUT2_SPK_VOLUME_CTRL
,
WM8985_ROUT2_SPK_VOLUME_CTRL
,
WM8985_LOUT1_HP_VOLUME_CTRL
,
WM8985_ROUT1_HP_VOLUME_CTRL
,
WM8985_LEFT_INP_PGA_GAIN_CTRL
,
WM8985_RIGHT_INP_PGA_GAIN_CTRL
};
struct
wm8985_priv
{
enum
snd_soc_control_type
control_type
;
struct
regulator_bulk_data
supplies
[
WM8985_NUM_SUPPLIES
];
unsigned
int
sysclk
;
unsigned
int
bclk
;
};
static
const
struct
{
int
div
;
int
ratio
;
}
fs_ratios
[]
=
{
{
10
,
128
},
{
15
,
192
},
{
20
,
256
},
{
30
,
384
},
{
40
,
512
},
{
60
,
768
},
{
80
,
1024
},
{
120
,
1536
}
};
static
const
int
srates
[]
=
{
48000
,
32000
,
24000
,
16000
,
12000
,
8000
};
static
const
int
bclk_divs
[]
=
{
1
,
2
,
4
,
8
,
16
,
32
};
static
int
eqmode_get
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
);
static
int
eqmode_put
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
);
static
const
DECLARE_TLV_DB_SCALE
(
dac_tlv
,
-
12700
,
50
,
1
);
static
const
DECLARE_TLV_DB_SCALE
(
adc_tlv
,
-
12700
,
50
,
1
);
static
const
DECLARE_TLV_DB_SCALE
(
out_tlv
,
-
5700
,
100
,
0
);
static
const
DECLARE_TLV_DB_SCALE
(
lim_thresh_tlv
,
-
600
,
100
,
0
);
static
const
DECLARE_TLV_DB_SCALE
(
lim_boost_tlv
,
0
,
100
,
0
);
static
const
DECLARE_TLV_DB_SCALE
(
alc_min_tlv
,
-
1200
,
600
,
0
);
static
const
DECLARE_TLV_DB_SCALE
(
alc_max_tlv
,
-
675
,
600
,
0
);
static
const
DECLARE_TLV_DB_SCALE
(
alc_tar_tlv
,
-
2250
,
150
,
0
);
static
const
DECLARE_TLV_DB_SCALE
(
pga_vol_tlv
,
-
1200
,
75
,
0
);
static
const
DECLARE_TLV_DB_SCALE
(
boost_tlv
,
-
1200
,
300
,
1
);
static
const
DECLARE_TLV_DB_SCALE
(
eq_tlv
,
-
1200
,
100
,
0
);
static
const
DECLARE_TLV_DB_SCALE
(
aux_tlv
,
-
1500
,
300
,
0
);
static
const
DECLARE_TLV_DB_SCALE
(
bypass_tlv
,
-
1500
,
300
,
0
);
static
const
DECLARE_TLV_DB_SCALE
(
pga_boost_tlv
,
0
,
2000
,
0
);
static
const
char
*
alc_sel_text
[]
=
{
"Off"
,
"Right"
,
"Left"
,
"Stereo"
};
static
const
SOC_ENUM_SINGLE_DECL
(
alc_sel
,
WM8985_ALC_CONTROL_1
,
7
,
alc_sel_text
);
static
const
char
*
alc_mode_text
[]
=
{
"ALC"
,
"Limiter"
};
static
const
SOC_ENUM_SINGLE_DECL
(
alc_mode
,
WM8985_ALC_CONTROL_3
,
8
,
alc_mode_text
);
static
const
char
*
filter_mode_text
[]
=
{
"Audio"
,
"Application"
};
static
const
SOC_ENUM_SINGLE_DECL
(
filter_mode
,
WM8985_ADC_CONTROL
,
7
,
filter_mode_text
);
static
const
char
*
eq_bw_text
[]
=
{
"Narrow"
,
"Wide"
};
static
const
char
*
eqmode_text
[]
=
{
"Capture"
,
"Playback"
};
static
const
SOC_ENUM_SINGLE_DECL
(
eqmode
,
WM8985_EQ1_LOW_SHELF
,
8
,
eqmode_text
);
static
const
char
*
eq1_cutoff_text
[]
=
{
"80Hz"
,
"105Hz"
,
"135Hz"
,
"175Hz"
};
static
const
SOC_ENUM_SINGLE_DECL
(
eq1_cutoff
,
WM8985_EQ1_LOW_SHELF
,
5
,
eq1_cutoff_text
);
static
const
char
*
eq2_cutoff_text
[]
=
{
"230Hz"
,
"300Hz"
,
"385Hz"
,
"500Hz"
};
static
const
SOC_ENUM_SINGLE_DECL
(
eq2_bw
,
WM8985_EQ2_PEAK_1
,
8
,
eq_bw_text
);
static
const
SOC_ENUM_SINGLE_DECL
(
eq2_cutoff
,
WM8985_EQ2_PEAK_1
,
5
,
eq2_cutoff_text
);
static
const
char
*
eq3_cutoff_text
[]
=
{
"650Hz"
,
"850Hz"
,
"1.1kHz"
,
"1.4kHz"
};
static
const
SOC_ENUM_SINGLE_DECL
(
eq3_bw
,
WM8985_EQ3_PEAK_2
,
8
,
eq_bw_text
);
static
const
SOC_ENUM_SINGLE_DECL
(
eq3_cutoff
,
WM8985_EQ3_PEAK_2
,
5
,
eq3_cutoff_text
);
static
const
char
*
eq4_cutoff_text
[]
=
{
"1.8kHz"
,
"2.4kHz"
,
"3.2kHz"
,
"4.1kHz"
};
static
const
SOC_ENUM_SINGLE_DECL
(
eq4_bw
,
WM8985_EQ4_PEAK_3
,
8
,
eq_bw_text
);
static
const
SOC_ENUM_SINGLE_DECL
(
eq4_cutoff
,
WM8985_EQ4_PEAK_3
,
5
,
eq4_cutoff_text
);
static
const
char
*
eq5_cutoff_text
[]
=
{
"5.3kHz"
,
"6.9kHz"
,
"9kHz"
,
"11.7kHz"
};
static
const
SOC_ENUM_SINGLE_DECL
(
eq5_cutoff
,
WM8985_EQ5_HIGH_SHELF
,
5
,
eq5_cutoff_text
);
static
const
char
*
speaker_mode_text
[]
=
{
"Class A/B"
,
"Class D"
};
static
const
SOC_ENUM_SINGLE_DECL
(
speaker_mode
,
0x17
,
8
,
speaker_mode_text
);
static
const
char
*
depth_3d_text
[]
=
{
"Off"
,
"6.67%"
,
"13.3%"
,
"20%"
,
"26.7%"
,
"33.3%"
,
"40%"
,
"46.6%"
,
"53.3%"
,
"60%"
,
"66.7%"
,
"73.3%"
,
"80%"
,
"86.7%"
,
"93.3%"
,
"100%"
};
static
const
SOC_ENUM_SINGLE_DECL
(
depth_3d
,
WM8985_3D_CONTROL
,
0
,
depth_3d_text
);
static
const
struct
snd_kcontrol_new
wm8985_snd_controls
[]
=
{
SOC_SINGLE
(
"Digital Loopback Switch"
,
WM8985_COMPANDING_CONTROL
,
0
,
1
,
0
),
SOC_ENUM
(
"ALC Capture Function"
,
alc_sel
),
SOC_SINGLE_TLV
(
"ALC Capture Max Volume"
,
WM8985_ALC_CONTROL_1
,
3
,
7
,
0
,
alc_max_tlv
),
SOC_SINGLE_TLV
(
"ALC Capture Min Volume"
,
WM8985_ALC_CONTROL_1
,
0
,
7
,
0
,
alc_min_tlv
),
SOC_SINGLE_TLV
(
"ALC Capture Target Volume"
,
WM8985_ALC_CONTROL_2
,
0
,
15
,
0
,
alc_tar_tlv
),
SOC_SINGLE
(
"ALC Capture Attack"
,
WM8985_ALC_CONTROL_3
,
0
,
10
,
0
),
SOC_SINGLE
(
"ALC Capture Hold"
,
WM8985_ALC_CONTROL_2
,
4
,
10
,
0
),
SOC_SINGLE
(
"ALC Capture Decay"
,
WM8985_ALC_CONTROL_3
,
4
,
10
,
0
),
SOC_ENUM
(
"ALC Mode"
,
alc_mode
),
SOC_SINGLE
(
"ALC Capture NG Switch"
,
WM8985_NOISE_GATE
,
3
,
1
,
0
),
SOC_SINGLE
(
"ALC Capture NG Threshold"
,
WM8985_NOISE_GATE
,
0
,
7
,
1
),
SOC_DOUBLE_R_TLV
(
"Capture Volume"
,
WM8985_LEFT_ADC_DIGITAL_VOL
,
WM8985_RIGHT_ADC_DIGITAL_VOL
,
0
,
255
,
0
,
adc_tlv
),
SOC_DOUBLE_R
(
"Capture PGA ZC Switch"
,
WM8985_LEFT_INP_PGA_GAIN_CTRL
,
WM8985_RIGHT_INP_PGA_GAIN_CTRL
,
7
,
1
,
0
),
SOC_DOUBLE_R_TLV
(
"Capture PGA Volume"
,
WM8985_LEFT_INP_PGA_GAIN_CTRL
,
WM8985_RIGHT_INP_PGA_GAIN_CTRL
,
0
,
63
,
0
,
pga_vol_tlv
),
SOC_DOUBLE_R_TLV
(
"Capture PGA Boost Volume"
,
WM8985_LEFT_ADC_BOOST_CTRL
,
WM8985_RIGHT_ADC_BOOST_CTRL
,
8
,
1
,
0
,
pga_boost_tlv
),
SOC_DOUBLE
(
"ADC Inversion Switch"
,
WM8985_ADC_CONTROL
,
0
,
1
,
1
,
0
),
SOC_SINGLE
(
"ADC 128x Oversampling Switch"
,
WM8985_ADC_CONTROL
,
8
,
1
,
0
),
SOC_DOUBLE_R_TLV
(
"Playback Volume"
,
WM8985_LEFT_DAC_DIGITAL_VOL
,
WM8985_RIGHT_DAC_DIGITAL_VOL
,
0
,
255
,
0
,
dac_tlv
),
SOC_SINGLE
(
"DAC Playback Limiter Switch"
,
WM8985_DAC_LIMITER_1
,
8
,
1
,
0
),
SOC_SINGLE
(
"DAC Playback Limiter Decay"
,
WM8985_DAC_LIMITER_1
,
4
,
10
,
0
),
SOC_SINGLE
(
"DAC Playback Limiter Attack"
,
WM8985_DAC_LIMITER_1
,
0
,
11
,
0
),
SOC_SINGLE_TLV
(
"DAC Playback Limiter Threshold"
,
WM8985_DAC_LIMITER_2
,
4
,
7
,
1
,
lim_thresh_tlv
),
SOC_SINGLE_TLV
(
"DAC Playback Limiter Boost Volume"
,
WM8985_DAC_LIMITER_2
,
0
,
12
,
0
,
lim_boost_tlv
),
SOC_DOUBLE
(
"DAC Inversion Switch"
,
WM8985_DAC_CONTROL
,
0
,
1
,
1
,
0
),
SOC_SINGLE
(
"DAC Auto Mute Switch"
,
WM8985_DAC_CONTROL
,
2
,
1
,
0
),
SOC_SINGLE
(
"DAC 128x Oversampling Switch"
,
WM8985_DAC_CONTROL
,
3
,
1
,
0
),
SOC_DOUBLE_R_TLV
(
"Headphone Playback Volume"
,
WM8985_LOUT1_HP_VOLUME_CTRL
,
WM8985_ROUT1_HP_VOLUME_CTRL
,
0
,
63
,
0
,
out_tlv
),
SOC_DOUBLE_R
(
"Headphone Playback ZC Switch"
,
WM8985_LOUT1_HP_VOLUME_CTRL
,
WM8985_ROUT1_HP_VOLUME_CTRL
,
7
,
1
,
0
),
SOC_DOUBLE_R
(
"Headphone Switch"
,
WM8985_LOUT1_HP_VOLUME_CTRL
,
WM8985_ROUT1_HP_VOLUME_CTRL
,
6
,
1
,
1
),
SOC_DOUBLE_R_TLV
(
"Speaker Playback Volume"
,
WM8985_LOUT2_SPK_VOLUME_CTRL
,
WM8985_ROUT2_SPK_VOLUME_CTRL
,
0
,
63
,
0
,
out_tlv
),
SOC_DOUBLE_R
(
"Speaker Playback ZC Switch"
,
WM8985_LOUT2_SPK_VOLUME_CTRL
,
WM8985_ROUT2_SPK_VOLUME_CTRL
,
7
,
1
,
0
),
SOC_DOUBLE_R
(
"Speaker Switch"
,
WM8985_LOUT2_SPK_VOLUME_CTRL
,
WM8985_ROUT2_SPK_VOLUME_CTRL
,
6
,
1
,
1
),
SOC_SINGLE
(
"High Pass Filter Switch"
,
WM8985_ADC_CONTROL
,
8
,
1
,
0
),
SOC_ENUM
(
"High Pass Filter Mode"
,
filter_mode
),
SOC_SINGLE
(
"High Pass Filter Cutoff"
,
WM8985_ADC_CONTROL
,
4
,
7
,
0
),
SOC_DOUBLE_R_TLV
(
"Aux Bypass Volume"
,
WM8985_LEFT_MIXER_CTRL
,
WM8985_RIGHT_MIXER_CTRL
,
6
,
7
,
0
,
aux_tlv
),
SOC_DOUBLE_R_TLV
(
"Input PGA Bypass Volume"
,
WM8985_LEFT_MIXER_CTRL
,
WM8985_RIGHT_MIXER_CTRL
,
2
,
7
,
0
,
bypass_tlv
),
SOC_ENUM_EXT
(
"Equalizer Function"
,
eqmode
,
eqmode_get
,
eqmode_put
),
SOC_ENUM
(
"EQ1 Cutoff"
,
eq1_cutoff
),
SOC_SINGLE_TLV
(
"EQ1 Volume"
,
WM8985_EQ1_LOW_SHELF
,
0
,
24
,
1
,
eq_tlv
),
SOC_ENUM
(
"EQ2 Bandwith"
,
eq2_bw
),
SOC_ENUM
(
"EQ2 Cutoff"
,
eq2_cutoff
),
SOC_SINGLE_TLV
(
"EQ2 Volume"
,
WM8985_EQ2_PEAK_1
,
0
,
24
,
1
,
eq_tlv
),
SOC_ENUM
(
"EQ3 Bandwith"
,
eq3_bw
),
SOC_ENUM
(
"EQ3 Cutoff"
,
eq3_cutoff
),
SOC_SINGLE_TLV
(
"EQ3 Volume"
,
WM8985_EQ3_PEAK_2
,
0
,
24
,
1
,
eq_tlv
),
SOC_ENUM
(
"EQ4 Bandwith"
,
eq4_bw
),
SOC_ENUM
(
"EQ4 Cutoff"
,
eq4_cutoff
),
SOC_SINGLE_TLV
(
"EQ4 Volume"
,
WM8985_EQ4_PEAK_3
,
0
,
24
,
1
,
eq_tlv
),
SOC_ENUM
(
"EQ5 Cutoff"
,
eq5_cutoff
),
SOC_SINGLE_TLV
(
"EQ5 Volume"
,
WM8985_EQ5_HIGH_SHELF
,
0
,
24
,
1
,
eq_tlv
),
SOC_ENUM
(
"3D Depth"
,
depth_3d
),
SOC_ENUM
(
"Speaker Mode"
,
speaker_mode
)
};
static
const
struct
snd_kcontrol_new
left_out_mixer
[]
=
{
SOC_DAPM_SINGLE
(
"Line Switch"
,
WM8985_LEFT_MIXER_CTRL
,
1
,
1
,
0
),
SOC_DAPM_SINGLE
(
"Aux Switch"
,
WM8985_LEFT_MIXER_CTRL
,
5
,
1
,
0
),
SOC_DAPM_SINGLE
(
"PCM Switch"
,
WM8985_LEFT_MIXER_CTRL
,
0
,
1
,
0
),
};
static
const
struct
snd_kcontrol_new
right_out_mixer
[]
=
{
SOC_DAPM_SINGLE
(
"Line Switch"
,
WM8985_RIGHT_MIXER_CTRL
,
1
,
1
,
0
),
SOC_DAPM_SINGLE
(
"Aux Switch"
,
WM8985_RIGHT_MIXER_CTRL
,
5
,
1
,
0
),
SOC_DAPM_SINGLE
(
"PCM Switch"
,
WM8985_RIGHT_MIXER_CTRL
,
0
,
1
,
0
),
};
static
const
struct
snd_kcontrol_new
left_input_mixer
[]
=
{
SOC_DAPM_SINGLE
(
"L2 Switch"
,
WM8985_INPUT_CTRL
,
2
,
1
,
0
),
SOC_DAPM_SINGLE
(
"MicN Switch"
,
WM8985_INPUT_CTRL
,
1
,
1
,
0
),
SOC_DAPM_SINGLE
(
"MicP Switch"
,
WM8985_INPUT_CTRL
,
0
,
1
,
0
),
};
static
const
struct
snd_kcontrol_new
right_input_mixer
[]
=
{
SOC_DAPM_SINGLE
(
"R2 Switch"
,
WM8985_INPUT_CTRL
,
6
,
1
,
0
),
SOC_DAPM_SINGLE
(
"MicN Switch"
,
WM8985_INPUT_CTRL
,
5
,
1
,
0
),
SOC_DAPM_SINGLE
(
"MicP Switch"
,
WM8985_INPUT_CTRL
,
4
,
1
,
0
),
};
static
const
struct
snd_kcontrol_new
left_boost_mixer
[]
=
{
SOC_DAPM_SINGLE_TLV
(
"L2 Volume"
,
WM8985_LEFT_ADC_BOOST_CTRL
,
4
,
7
,
0
,
boost_tlv
),
SOC_DAPM_SINGLE_TLV
(
"AUXL Volume"
,
WM8985_LEFT_ADC_BOOST_CTRL
,
0
,
7
,
0
,
boost_tlv
)
};
static
const
struct
snd_kcontrol_new
right_boost_mixer
[]
=
{
SOC_DAPM_SINGLE_TLV
(
"R2 Volume"
,
WM8985_RIGHT_ADC_BOOST_CTRL
,
4
,
7
,
0
,
boost_tlv
),
SOC_DAPM_SINGLE_TLV
(
"AUXR Volume"
,
WM8985_RIGHT_ADC_BOOST_CTRL
,
0
,
7
,
0
,
boost_tlv
)
};
static
const
struct
snd_soc_dapm_widget
wm8985_dapm_widgets
[]
=
{
SND_SOC_DAPM_DAC
(
"Left DAC"
,
"Left Playback"
,
WM8985_POWER_MANAGEMENT_3
,
0
,
0
),
SND_SOC_DAPM_DAC
(
"Right DAC"
,
"Right Playback"
,
WM8985_POWER_MANAGEMENT_3
,
1
,
0
),
SND_SOC_DAPM_ADC
(
"Left ADC"
,
"Left Capture"
,
WM8985_POWER_MANAGEMENT_2
,
0
,
0
),
SND_SOC_DAPM_ADC
(
"Right ADC"
,
"Right Capture"
,
WM8985_POWER_MANAGEMENT_2
,
1
,
0
),
SND_SOC_DAPM_MIXER
(
"Left Output Mixer"
,
WM8985_POWER_MANAGEMENT_3
,
2
,
0
,
left_out_mixer
,
ARRAY_SIZE
(
left_out_mixer
)),
SND_SOC_DAPM_MIXER
(
"Right Output Mixer"
,
WM8985_POWER_MANAGEMENT_3
,
3
,
0
,
right_out_mixer
,
ARRAY_SIZE
(
right_out_mixer
)),
SND_SOC_DAPM_MIXER
(
"Left Input Mixer"
,
WM8985_POWER_MANAGEMENT_2
,
2
,
0
,
left_input_mixer
,
ARRAY_SIZE
(
left_input_mixer
)),
SND_SOC_DAPM_MIXER
(
"Right Input Mixer"
,
WM8985_POWER_MANAGEMENT_2
,
3
,
0
,
right_input_mixer
,
ARRAY_SIZE
(
right_input_mixer
)),
SND_SOC_DAPM_MIXER
(
"Left Boost Mixer"
,
WM8985_POWER_MANAGEMENT_2
,
4
,
0
,
left_boost_mixer
,
ARRAY_SIZE
(
left_boost_mixer
)),
SND_SOC_DAPM_MIXER
(
"Right Boost Mixer"
,
WM8985_POWER_MANAGEMENT_2
,
5
,
0
,
right_boost_mixer
,
ARRAY_SIZE
(
right_boost_mixer
)),
SND_SOC_DAPM_PGA
(
"Left Capture PGA"
,
WM8985_LEFT_INP_PGA_GAIN_CTRL
,
6
,
1
,
NULL
,
0
),
SND_SOC_DAPM_PGA
(
"Right Capture PGA"
,
WM8985_RIGHT_INP_PGA_GAIN_CTRL
,
6
,
1
,
NULL
,
0
),
SND_SOC_DAPM_PGA
(
"Left Headphone Out"
,
WM8985_POWER_MANAGEMENT_2
,
7
,
0
,
NULL
,
0
),
SND_SOC_DAPM_PGA
(
"Right Headphone Out"
,
WM8985_POWER_MANAGEMENT_2
,
8
,
0
,
NULL
,
0
),
SND_SOC_DAPM_PGA
(
"Left Speaker Out"
,
WM8985_POWER_MANAGEMENT_3
,
5
,
0
,
NULL
,
0
),
SND_SOC_DAPM_PGA
(
"Right Speaker Out"
,
WM8985_POWER_MANAGEMENT_3
,
6
,
0
,
NULL
,
0
),
SND_SOC_DAPM_MICBIAS
(
"Mic Bias"
,
WM8985_POWER_MANAGEMENT_1
,
4
,
0
),
SND_SOC_DAPM_INPUT
(
"LIN"
),
SND_SOC_DAPM_INPUT
(
"LIP"
),
SND_SOC_DAPM_INPUT
(
"RIN"
),
SND_SOC_DAPM_INPUT
(
"RIP"
),
SND_SOC_DAPM_INPUT
(
"AUXL"
),
SND_SOC_DAPM_INPUT
(
"AUXR"
),
SND_SOC_DAPM_INPUT
(
"L2"
),
SND_SOC_DAPM_INPUT
(
"R2"
),
SND_SOC_DAPM_OUTPUT
(
"HPL"
),
SND_SOC_DAPM_OUTPUT
(
"HPR"
),
SND_SOC_DAPM_OUTPUT
(
"SPKL"
),
SND_SOC_DAPM_OUTPUT
(
"SPKR"
)
};
static
const
struct
snd_soc_dapm_route
audio_map
[]
=
{
{
"Right Output Mixer"
,
"PCM Switch"
,
"Right DAC"
},
{
"Right Output Mixer"
,
"Aux Switch"
,
"AUXR"
},
{
"Right Output Mixer"
,
"Line Switch"
,
"Right Boost Mixer"
},
{
"Left Output Mixer"
,
"PCM Switch"
,
"Left DAC"
},
{
"Left Output Mixer"
,
"Aux Switch"
,
"AUXL"
},
{
"Left Output Mixer"
,
"Line Switch"
,
"Left Boost Mixer"
},
{
"Right Headphone Out"
,
NULL
,
"Right Output Mixer"
},
{
"HPR"
,
NULL
,
"Right Headphone Out"
},
{
"Left Headphone Out"
,
NULL
,
"Left Output Mixer"
},
{
"HPL"
,
NULL
,
"Left Headphone Out"
},
{
"Right Speaker Out"
,
NULL
,
"Right Output Mixer"
},
{
"SPKR"
,
NULL
,
"Right Speaker Out"
},
{
"Left Speaker Out"
,
NULL
,
"Left Output Mixer"
},
{
"SPKL"
,
NULL
,
"Left Speaker Out"
},
{
"Right ADC"
,
NULL
,
"Right Boost Mixer"
},
{
"Right Boost Mixer"
,
"AUXR Volume"
,
"AUXR"
},
{
"Right Boost Mixer"
,
NULL
,
"Right Capture PGA"
},
{
"Right Boost Mixer"
,
"R2 Volume"
,
"R2"
},
{
"Left ADC"
,
NULL
,
"Left Boost Mixer"
},
{
"Left Boost Mixer"
,
"AUXL Volume"
,
"AUXL"
},
{
"Left Boost Mixer"
,
NULL
,
"Left Capture PGA"
},
{
"Left Boost Mixer"
,
"L2 Volume"
,
"L2"
},
{
"Right Capture PGA"
,
NULL
,
"Right Input Mixer"
},
{
"Left Capture PGA"
,
NULL
,
"Left Input Mixer"
},
{
"Right Input Mixer"
,
"R2 Switch"
,
"R2"
},
{
"Right Input Mixer"
,
"MicN Switch"
,
"RIN"
},
{
"Right Input Mixer"
,
"MicP Switch"
,
"RIP"
},
{
"Left Input Mixer"
,
"L2 Switch"
,
"L2"
},
{
"Left Input Mixer"
,
"MicN Switch"
,
"LIN"
},
{
"Left Input Mixer"
,
"MicP Switch"
,
"LIP"
},
};
static
int
eqmode_get
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
unsigned
int
reg
;
reg
=
snd_soc_read
(
codec
,
WM8985_EQ1_LOW_SHELF
);
if
(
reg
&
WM8985_EQ3DMODE
)
ucontrol
->
value
.
integer
.
value
[
0
]
=
1
;
else
ucontrol
->
value
.
integer
.
value
[
0
]
=
0
;
return
0
;
}
static
int
eqmode_put
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_codec
*
codec
=
snd_kcontrol_chip
(
kcontrol
);
unsigned
int
regpwr2
,
regpwr3
;
unsigned
int
reg_eq
;
if
(
ucontrol
->
value
.
integer
.
value
[
0
]
!=
0
&&
ucontrol
->
value
.
integer
.
value
[
0
]
!=
1
)
return
-
EINVAL
;
reg_eq
=
snd_soc_read
(
codec
,
WM8985_EQ1_LOW_SHELF
);
switch
((
reg_eq
&
WM8985_EQ3DMODE
)
>>
WM8985_EQ3DMODE_SHIFT
)
{
case
0
:
if
(
!
ucontrol
->
value
.
integer
.
value
[
0
])
return
0
;
break
;
case
1
:
if
(
ucontrol
->
value
.
integer
.
value
[
0
])
return
0
;
break
;
}
regpwr2
=
snd_soc_read
(
codec
,
WM8985_POWER_MANAGEMENT_2
);
regpwr3
=
snd_soc_read
(
codec
,
WM8985_POWER_MANAGEMENT_3
);
/* disable the DACs and ADCs */
snd_soc_update_bits
(
codec
,
WM8985_POWER_MANAGEMENT_2
,
WM8985_ADCENR_MASK
|
WM8985_ADCENL_MASK
,
0
);
snd_soc_update_bits
(
codec
,
WM8985_POWER_MANAGEMENT_3
,
WM8985_DACENR_MASK
|
WM8985_DACENL_MASK
,
0
);
snd_soc_update_bits
(
codec
,
WM8985_ADDITIONAL_CONTROL
,
WM8985_M128ENB_MASK
,
WM8985_M128ENB
);
/* set the desired eqmode */
snd_soc_update_bits
(
codec
,
WM8985_EQ1_LOW_SHELF
,
WM8985_EQ3DMODE_MASK
,
ucontrol
->
value
.
integer
.
value
[
0
]
<<
WM8985_EQ3DMODE_SHIFT
);
/* restore DAC/ADC configuration */
snd_soc_write
(
codec
,
WM8985_POWER_MANAGEMENT_2
,
regpwr2
);
snd_soc_write
(
codec
,
WM8985_POWER_MANAGEMENT_3
,
regpwr3
);
return
0
;
}
static
int
wm8985_add_widgets
(
struct
snd_soc_codec
*
codec
)
{
snd_soc_dapm_new_controls
(
codec
,
wm8985_dapm_widgets
,
ARRAY_SIZE
(
wm8985_dapm_widgets
));
snd_soc_dapm_add_routes
(
codec
,
audio_map
,
ARRAY_SIZE
(
audio_map
));
return
0
;
}
static
int
wm8985_reset
(
struct
snd_soc_codec
*
codec
)
{
return
snd_soc_write
(
codec
,
WM8985_SOFTWARE_RESET
,
0x0
);
}
static
int
wm8985_dac_mute
(
struct
snd_soc_dai
*
dai
,
int
mute
)
{
struct
snd_soc_codec
*
codec
=
dai
->
codec
;
return
snd_soc_update_bits
(
codec
,
WM8985_DAC_CONTROL
,
WM8985_SOFTMUTE_MASK
,
!!
mute
<<
WM8985_SOFTMUTE_SHIFT
);
}
static
int
wm8985_set_fmt
(
struct
snd_soc_dai
*
dai
,
unsigned
int
fmt
)
{
struct
wm8985_priv
*
wm8985
;
struct
snd_soc_codec
*
codec
;
u16
format
,
master
,
bcp
,
lrp
;
codec
=
dai
->
codec
;
wm8985
=
snd_soc_codec_get_drvdata
(
codec
);
switch
(
fmt
&
SND_SOC_DAIFMT_FORMAT_MASK
)
{
case
SND_SOC_DAIFMT_I2S
:
format
=
0x2
;
break
;
case
SND_SOC_DAIFMT_RIGHT_J
:
format
=
0x0
;
break
;
case
SND_SOC_DAIFMT_LEFT_J
:
format
=
0x1
;
break
;
case
SND_SOC_DAIFMT_DSP_A
:
case
SND_SOC_DAIFMT_DSP_B
:
format
=
0x3
;
break
;
default:
dev_err
(
dai
->
dev
,
"Unknown dai format
\n
"
);
return
-
EINVAL
;
}
snd_soc_update_bits
(
codec
,
WM8985_AUDIO_INTERFACE
,
WM8985_FMT_MASK
,
format
<<
WM8985_FMT_SHIFT
);
switch
(
fmt
&
SND_SOC_DAIFMT_MASTER_MASK
)
{
case
SND_SOC_DAIFMT_CBM_CFM
:
master
=
1
;
break
;
case
SND_SOC_DAIFMT_CBS_CFS
:
master
=
0
;
break
;
default:
dev_err
(
dai
->
dev
,
"Unknown master/slave configuration
\n
"
);
return
-
EINVAL
;
}
snd_soc_update_bits
(
codec
,
WM8985_CLOCK_GEN_CONTROL
,
WM8985_MS_MASK
,
master
<<
WM8985_MS_SHIFT
);
/* frame inversion is not valid for dsp modes */
switch
(
fmt
&
SND_SOC_DAIFMT_FORMAT_MASK
)
{
case
SND_SOC_DAIFMT_DSP_A
:
case
SND_SOC_DAIFMT_DSP_B
:
switch
(
fmt
&
SND_SOC_DAIFMT_INV_MASK
)
{
case
SND_SOC_DAIFMT_IB_IF
:
case
SND_SOC_DAIFMT_NB_IF
:
return
-
EINVAL
;
default:
break
;
}
break
;
default:
break
;
}
bcp
=
lrp
=
0
;
switch
(
fmt
&
SND_SOC_DAIFMT_INV_MASK
)
{
case
SND_SOC_DAIFMT_NB_NF
:
break
;
case
SND_SOC_DAIFMT_IB_IF
:
bcp
=
lrp
=
1
;
break
;
case
SND_SOC_DAIFMT_IB_NF
:
bcp
=
1
;
break
;
case
SND_SOC_DAIFMT_NB_IF
:
lrp
=
1
;
break
;
default:
dev_err
(
dai
->
dev
,
"Unknown polarity configuration
\n
"
);
return
-
EINVAL
;
}
snd_soc_update_bits
(
codec
,
WM8985_AUDIO_INTERFACE
,
WM8985_LRP_MASK
,
lrp
<<
WM8985_LRP_SHIFT
);
snd_soc_update_bits
(
codec
,
WM8985_AUDIO_INTERFACE
,
WM8985_BCP_MASK
,
bcp
<<
WM8985_BCP_SHIFT
);
return
0
;
}
static
int
wm8985_hw_params
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
params
,
struct
snd_soc_dai
*
dai
)
{
size_t
i
;
struct
snd_soc_codec
*
codec
;
struct
wm8985_priv
*
wm8985
;
u16
blen
,
srate_idx
;
unsigned
int
tmp
;
int
srate_best
;
codec
=
dai
->
codec
;
wm8985
=
snd_soc_codec_get_drvdata
(
codec
);
wm8985
->
bclk
=
snd_soc_params_to_bclk
(
params
);
if
((
int
)
wm8985
->
bclk
<
0
)
return
wm8985
->
bclk
;
switch
(
params_format
(
params
))
{
case
SNDRV_PCM_FORMAT_S16_LE
:
blen
=
0x0
;
break
;
case
SNDRV_PCM_FORMAT_S20_3LE
:
blen
=
0x1
;
break
;
case
SNDRV_PCM_FORMAT_S24_LE
:
blen
=
0x2
;
break
;
case
SNDRV_PCM_FORMAT_S32_LE
:
blen
=
0x3
;
break
;
default:
dev_err
(
dai
->
dev
,
"Unsupported word length %u
\n
"
,
params_format
(
params
));
return
-
EINVAL
;
}
snd_soc_update_bits
(
codec
,
WM8985_AUDIO_INTERFACE
,
WM8985_WL_MASK
,
blen
<<
WM8985_WL_SHIFT
);
/*
* match to the nearest possible sample rate and rely
* on the array index to configure the SR register
*/
srate_idx
=
0
;
srate_best
=
abs
(
srates
[
0
]
-
params_rate
(
params
));
for
(
i
=
1
;
i
<
ARRAY_SIZE
(
srates
);
++
i
)
{
if
(
abs
(
srates
[
i
]
-
params_rate
(
params
))
>=
srate_best
)
continue
;
srate_idx
=
i
;
srate_best
=
abs
(
srates
[
i
]
-
params_rate
(
params
));
}
dev_dbg
(
dai
->
dev
,
"Selected SRATE = %d
\n
"
,
srates
[
srate_idx
]);
snd_soc_update_bits
(
codec
,
WM8985_ADDITIONAL_CONTROL
,
WM8985_SR_MASK
,
srate_idx
<<
WM8985_SR_SHIFT
);
dev_dbg
(
dai
->
dev
,
"Target BCLK = %uHz
\n
"
,
wm8985
->
bclk
);
dev_dbg
(
dai
->
dev
,
"SYSCLK = %uHz
\n
"
,
wm8985
->
sysclk
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
fs_ratios
);
++
i
)
{
if
(
wm8985
->
sysclk
/
params_rate
(
params
)
==
fs_ratios
[
i
].
ratio
)
break
;
}
if
(
i
==
ARRAY_SIZE
(
fs_ratios
))
{
dev_err
(
dai
->
dev
,
"Unable to configure MCLK ratio %u/%u
\n
"
,
wm8985
->
sysclk
,
params_rate
(
params
));
return
-
EINVAL
;
}
dev_dbg
(
dai
->
dev
,
"MCLK ratio = %dfs
\n
"
,
fs_ratios
[
i
].
ratio
);
snd_soc_update_bits
(
codec
,
WM8985_CLOCK_GEN_CONTROL
,
WM8985_MCLKDIV_MASK
,
i
<<
WM8985_MCLKDIV_SHIFT
);
/* select the appropriate bclk divider */
tmp
=
(
wm8985
->
sysclk
/
fs_ratios
[
i
].
div
)
*
10
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
bclk_divs
);
++
i
)
{
if
(
wm8985
->
bclk
==
tmp
/
bclk_divs
[
i
])
break
;
}
if
(
i
==
ARRAY_SIZE
(
bclk_divs
))
{
dev_err
(
dai
->
dev
,
"No matching BCLK divider found
\n
"
);
return
-
EINVAL
;
}
dev_dbg
(
dai
->
dev
,
"BCLK div = %d
\n
"
,
i
);
snd_soc_update_bits
(
codec
,
WM8985_CLOCK_GEN_CONTROL
,
WM8985_BCLKDIV_MASK
,
i
<<
WM8985_BCLKDIV_SHIFT
);
return
0
;
}
struct
pll_div
{
u32
div2
:
1
;
u32
n
:
4
;
u32
k
:
24
;
};
#define FIXED_PLL_SIZE ((1ULL << 24) * 10)
static
int
pll_factors
(
struct
pll_div
*
pll_div
,
unsigned
int
target
,
unsigned
int
source
)
{
u64
Kpart
;
unsigned
long
int
K
,
Ndiv
,
Nmod
;
pll_div
->
div2
=
0
;
Ndiv
=
target
/
source
;
if
(
Ndiv
<
6
)
{
source
>>=
1
;
pll_div
->
div2
=
1
;
Ndiv
=
target
/
source
;
}
if
(
Ndiv
<
6
||
Ndiv
>
12
)
{
printk
(
KERN_ERR
"%s: WM8985 N value is not within"
" the recommended range: %lu
\n
"
,
__func__
,
Ndiv
);
return
-
EINVAL
;
}
pll_div
->
n
=
Ndiv
;
Nmod
=
target
%
source
;
Kpart
=
FIXED_PLL_SIZE
*
(
u64
)
Nmod
;
do_div
(
Kpart
,
source
);
K
=
Kpart
&
0xffffffff
;
if
((
K
%
10
)
>=
5
)
K
+=
5
;
K
/=
10
;
pll_div
->
k
=
K
;
return
0
;
}
static
int
wm8985_set_pll
(
struct
snd_soc_dai
*
dai
,
int
pll_id
,
int
source
,
unsigned
int
freq_in
,
unsigned
int
freq_out
)
{
int
ret
;
struct
snd_soc_codec
*
codec
;
struct
pll_div
pll_div
;
codec
=
dai
->
codec
;
if
(
freq_in
&&
freq_out
)
{
ret
=
pll_factors
(
&
pll_div
,
freq_out
*
4
*
2
,
freq_in
);
if
(
ret
)
return
ret
;
}
/* disable the PLL before reprogramming it */
snd_soc_update_bits
(
codec
,
WM8985_POWER_MANAGEMENT_1
,
WM8985_PLLEN_MASK
,
0
);
if
(
!
freq_in
||
!
freq_out
)
return
0
;
/* set PLLN and PRESCALE */
snd_soc_write
(
codec
,
WM8985_PLL_N
,
(
pll_div
.
div2
<<
WM8985_PLL_PRESCALE_SHIFT
)
|
pll_div
.
n
);
/* set PLLK */
snd_soc_write
(
codec
,
WM8985_PLL_K_3
,
pll_div
.
k
&
0x1ff
);
snd_soc_write
(
codec
,
WM8985_PLL_K_2
,
(
pll_div
.
k
>>
9
)
&
0x1ff
);
snd_soc_write
(
codec
,
WM8985_PLL_K_1
,
(
pll_div
.
k
>>
18
));
/* set the source of the clock to be the PLL */
snd_soc_update_bits
(
codec
,
WM8985_CLOCK_GEN_CONTROL
,
WM8985_CLKSEL_MASK
,
WM8985_CLKSEL
);
/* enable the PLL */
snd_soc_update_bits
(
codec
,
WM8985_POWER_MANAGEMENT_1
,
WM8985_PLLEN_MASK
,
WM8985_PLLEN
);
return
0
;
}
static
int
wm8985_set_sysclk
(
struct
snd_soc_dai
*
dai
,
int
clk_id
,
unsigned
int
freq
,
int
dir
)
{
struct
snd_soc_codec
*
codec
;
struct
wm8985_priv
*
wm8985
;
codec
=
dai
->
codec
;
wm8985
=
snd_soc_codec_get_drvdata
(
codec
);
switch
(
clk_id
)
{
case
WM8985_CLKSRC_MCLK
:
snd_soc_update_bits
(
codec
,
WM8985_CLOCK_GEN_CONTROL
,
WM8985_CLKSEL_MASK
,
0
);
snd_soc_update_bits
(
codec
,
WM8985_POWER_MANAGEMENT_1
,
WM8985_PLLEN_MASK
,
0
);
break
;
case
WM8985_CLKSRC_PLL
:
snd_soc_update_bits
(
codec
,
WM8985_CLOCK_GEN_CONTROL
,
WM8985_CLKSEL_MASK
,
WM8985_CLKSEL
);
break
;
default:
dev_err
(
dai
->
dev
,
"Unknown clock source %d
\n
"
,
clk_id
);
return
-
EINVAL
;
}
wm8985
->
sysclk
=
freq
;
return
0
;
}
static
void
wm8985_sync_cache
(
struct
snd_soc_codec
*
codec
)
{
short
i
;
u16
*
cache
;
if
(
!
codec
->
cache_sync
)
return
;
codec
->
cache_only
=
0
;
/* restore cache */
cache
=
codec
->
reg_cache
;
for
(
i
=
0
;
i
<
codec
->
driver
->
reg_cache_size
;
i
++
)
{
if
(
i
==
WM8985_SOFTWARE_RESET
||
cache
[
i
]
==
wm8985_reg_defs
[
i
])
continue
;
snd_soc_write
(
codec
,
i
,
cache
[
i
]);
}
codec
->
cache_sync
=
0
;
}
static
int
wm8985_set_bias_level
(
struct
snd_soc_codec
*
codec
,
enum
snd_soc_bias_level
level
)
{
int
ret
;
struct
wm8985_priv
*
wm8985
;
wm8985
=
snd_soc_codec_get_drvdata
(
codec
);
switch
(
level
)
{
case
SND_SOC_BIAS_ON
:
case
SND_SOC_BIAS_PREPARE
:
/* VMID at 75k */
snd_soc_update_bits
(
codec
,
WM8985_POWER_MANAGEMENT_1
,
WM8985_VMIDSEL_MASK
,
1
<<
WM8985_VMIDSEL_SHIFT
);
break
;
case
SND_SOC_BIAS_STANDBY
:
if
(
codec
->
bias_level
==
SND_SOC_BIAS_OFF
)
{
ret
=
regulator_bulk_enable
(
ARRAY_SIZE
(
wm8985
->
supplies
),
wm8985
->
supplies
);
if
(
ret
)
{
dev_err
(
codec
->
dev
,
"Failed to enable supplies: %d
\n
"
,
ret
);
return
ret
;
}
wm8985_sync_cache
(
codec
);
/* enable anti-pop features */
snd_soc_update_bits
(
codec
,
WM8985_OUT4_TO_ADC
,
WM8985_POBCTRL_MASK
,
WM8985_POBCTRL
);
/* enable thermal shutdown */
snd_soc_update_bits
(
codec
,
WM8985_OUTPUT_CTRL0
,
WM8985_TSDEN_MASK
,
WM8985_TSDEN
);
snd_soc_update_bits
(
codec
,
WM8985_OUTPUT_CTRL0
,
WM8985_TSOPCTRL_MASK
,
WM8985_TSOPCTRL
);
/* enable BIASEN */
snd_soc_update_bits
(
codec
,
WM8985_POWER_MANAGEMENT_1
,
WM8985_BIASEN_MASK
,
WM8985_BIASEN
);
/* VMID at 75k */
snd_soc_update_bits
(
codec
,
WM8985_POWER_MANAGEMENT_1
,
WM8985_VMIDSEL_MASK
,
1
<<
WM8985_VMIDSEL_SHIFT
);
msleep
(
500
);
/* disable anti-pop features */
snd_soc_update_bits
(
codec
,
WM8985_OUT4_TO_ADC
,
WM8985_POBCTRL_MASK
,
0
);
}
/* VMID at 300k */
snd_soc_update_bits
(
codec
,
WM8985_POWER_MANAGEMENT_1
,
WM8985_VMIDSEL_MASK
,
2
<<
WM8985_VMIDSEL_SHIFT
);
break
;
case
SND_SOC_BIAS_OFF
:
/* disable thermal shutdown */
snd_soc_update_bits
(
codec
,
WM8985_OUTPUT_CTRL0
,
WM8985_TSOPCTRL_MASK
,
0
);
snd_soc_update_bits
(
codec
,
WM8985_OUTPUT_CTRL0
,
WM8985_TSDEN_MASK
,
0
);
/* disable VMIDSEL and BIASEN */
snd_soc_update_bits
(
codec
,
WM8985_POWER_MANAGEMENT_1
,
WM8985_VMIDSEL_MASK
|
WM8985_BIASEN_MASK
,
0
);
snd_soc_write
(
codec
,
WM8985_POWER_MANAGEMENT_1
,
0
);
snd_soc_write
(
codec
,
WM8985_POWER_MANAGEMENT_2
,
0
);
snd_soc_write
(
codec
,
WM8985_POWER_MANAGEMENT_3
,
0
);
codec
->
cache_sync
=
1
;
regulator_bulk_disable
(
ARRAY_SIZE
(
wm8985
->
supplies
),
wm8985
->
supplies
);
break
;
}
codec
->
bias_level
=
level
;
return
0
;
}
#ifdef CONFIG_PM
static
int
wm8985_suspend
(
struct
snd_soc_codec
*
codec
,
pm_message_t
state
)
{
wm8985_set_bias_level
(
codec
,
SND_SOC_BIAS_OFF
);
return
0
;
}
static
int
wm8985_resume
(
struct
snd_soc_codec
*
codec
)
{
wm8985_set_bias_level
(
codec
,
SND_SOC_BIAS_STANDBY
);
return
0
;
}
#else
#define wm8985_suspend NULL
#define wm8985_resume NULL
#endif
static
int
wm8985_remove
(
struct
snd_soc_codec
*
codec
)
{
struct
wm8985_priv
*
wm8985
;
wm8985
=
snd_soc_codec_get_drvdata
(
codec
);
wm8985_set_bias_level
(
codec
,
SND_SOC_BIAS_OFF
);
regulator_bulk_free
(
ARRAY_SIZE
(
wm8985
->
supplies
),
wm8985
->
supplies
);
return
0
;
}
static
int
wm8985_probe
(
struct
snd_soc_codec
*
codec
)
{
size_t
i
;
struct
wm8985_priv
*
wm8985
;
int
ret
;
u16
*
cache
;
wm8985
=
snd_soc_codec_get_drvdata
(
codec
);
ret
=
snd_soc_codec_set_cache_io
(
codec
,
7
,
9
,
wm8985
->
control_type
);
if
(
ret
<
0
)
{
dev_err
(
codec
->
dev
,
"Failed to set cache i/o: %d
\n
"
,
ret
);
return
ret
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
wm8985
->
supplies
);
i
++
)
wm8985
->
supplies
[
i
].
supply
=
wm8985_supply_names
[
i
];
ret
=
regulator_bulk_get
(
codec
->
dev
,
ARRAY_SIZE
(
wm8985
->
supplies
),
wm8985
->
supplies
);
if
(
ret
)
{
dev_err
(
codec
->
dev
,
"Failed to request supplies: %d
\n
"
,
ret
);
return
ret
;
}
ret
=
regulator_bulk_enable
(
ARRAY_SIZE
(
wm8985
->
supplies
),
wm8985
->
supplies
);
if
(
ret
)
{
dev_err
(
codec
->
dev
,
"Failed to enable supplies: %d
\n
"
,
ret
);
goto
err_reg_get
;
}
ret
=
wm8985_reset
(
codec
);
if
(
ret
<
0
)
{
dev_err
(
codec
->
dev
,
"Failed to issue reset: %d
\n
"
,
ret
);
goto
err_reg_enable
;
}
cache
=
codec
->
reg_cache
;
/* latch volume update bits */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
volume_update_regs
);
++
i
)
cache
[
volume_update_regs
[
i
]]
|=
0x100
;
/* enable BIASCUT */
cache
[
WM8985_BIAS_CTRL
]
|=
WM8985_BIASCUT
;
codec
->
cache_sync
=
1
;
snd_soc_add_controls
(
codec
,
wm8985_snd_controls
,
ARRAY_SIZE
(
wm8985_snd_controls
));
wm8985_add_widgets
(
codec
);
wm8985_set_bias_level
(
codec
,
SND_SOC_BIAS_STANDBY
);
return
0
;
err_reg_enable:
regulator_bulk_disable
(
ARRAY_SIZE
(
wm8985
->
supplies
),
wm8985
->
supplies
);
err_reg_get:
regulator_bulk_free
(
ARRAY_SIZE
(
wm8985
->
supplies
),
wm8985
->
supplies
);
return
ret
;
}
static
struct
snd_soc_dai_ops
wm8985_dai_ops
=
{
.
digital_mute
=
wm8985_dac_mute
,
.
hw_params
=
wm8985_hw_params
,
.
set_fmt
=
wm8985_set_fmt
,
.
set_sysclk
=
wm8985_set_sysclk
,
.
set_pll
=
wm8985_set_pll
};
#define WM8985_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
static
struct
snd_soc_dai_driver
wm8985_dai
=
{
.
name
=
"wm8985-hifi"
,
.
playback
=
{
.
stream_name
=
"Playback"
,
.
channels_min
=
2
,
.
channels_max
=
2
,
.
rates
=
SNDRV_PCM_RATE_8000_48000
,
.
formats
=
WM8985_FORMATS
,
},
.
capture
=
{
.
stream_name
=
"Capture"
,
.
channels_min
=
2
,
.
channels_max
=
2
,
.
rates
=
SNDRV_PCM_RATE_8000_48000
,
.
formats
=
WM8985_FORMATS
,
},
.
ops
=
&
wm8985_dai_ops
,
.
symmetric_rates
=
1
};
static
struct
snd_soc_codec_driver
soc_codec_dev_wm8985
=
{
.
probe
=
wm8985_probe
,
.
remove
=
wm8985_remove
,
.
suspend
=
wm8985_suspend
,
.
resume
=
wm8985_resume
,
.
set_bias_level
=
wm8985_set_bias_level
,
.
reg_cache_size
=
ARRAY_SIZE
(
wm8985_reg_defs
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
wm8985_reg_defs
};
#if defined(CONFIG_SPI_MASTER)
static
int
__devinit
wm8985_spi_probe
(
struct
spi_device
*
spi
)
{
struct
wm8985_priv
*
wm8985
;
int
ret
;
wm8985
=
kzalloc
(
sizeof
*
wm8985
,
GFP_KERNEL
);
if
(
IS_ERR
(
wm8985
))
return
PTR_ERR
(
wm8985
);
wm8985
->
control_type
=
SND_SOC_SPI
;
spi_set_drvdata
(
spi
,
wm8985
);
ret
=
snd_soc_register_codec
(
&
spi
->
dev
,
&
soc_codec_dev_wm8985
,
&
wm8985_dai
,
1
);
if
(
ret
<
0
)
kfree
(
wm8985
);
return
ret
;
}
static
int
__devexit
wm8985_spi_remove
(
struct
spi_device
*
spi
)
{
snd_soc_unregister_codec
(
&
spi
->
dev
);
kfree
(
spi_get_drvdata
(
spi
));
return
0
;
}
static
struct
spi_driver
wm8985_spi_driver
=
{
.
driver
=
{
.
name
=
"wm8985"
,
.
bus
=
&
spi_bus_type
,
.
owner
=
THIS_MODULE
,
},
.
probe
=
wm8985_spi_probe
,
.
remove
=
__devexit_p
(
wm8985_spi_remove
)
};
#endif
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
static
__devinit
int
wm8985_i2c_probe
(
struct
i2c_client
*
i2c
,
const
struct
i2c_device_id
*
id
)
{
struct
wm8985_priv
*
wm8985
;
int
ret
;
wm8985
=
kzalloc
(
sizeof
*
wm8985
,
GFP_KERNEL
);
if
(
IS_ERR
(
wm8985
))
return
PTR_ERR
(
wm8985
);
wm8985
->
control_type
=
SND_SOC_I2C
;
i2c_set_clientdata
(
i2c
,
wm8985
);
ret
=
snd_soc_register_codec
(
&
i2c
->
dev
,
&
soc_codec_dev_wm8985
,
&
wm8985_dai
,
1
);
if
(
ret
<
0
)
kfree
(
wm8985
);
return
ret
;
}
static
__devexit
int
wm8985_i2c_remove
(
struct
i2c_client
*
client
)
{
snd_soc_unregister_codec
(
&
client
->
dev
);
kfree
(
i2c_get_clientdata
(
client
));
return
0
;
}
static
const
struct
i2c_device_id
wm8985_i2c_id
[]
=
{
{
"wm8985"
,
0
},
{
}
};
MODULE_DEVICE_TABLE
(
i2c
,
wm8985_i2c_id
);
static
struct
i2c_driver
wm8985_i2c_driver
=
{
.
driver
=
{
.
name
=
"wm8985"
,
.
owner
=
THIS_MODULE
,
},
.
probe
=
wm8985_i2c_probe
,
.
remove
=
__devexit_p
(
wm8985_i2c_remove
),
.
id_table
=
wm8985_i2c_id
};
#endif
static
int
__init
wm8985_modinit
(
void
)
{
int
ret
=
0
;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
ret
=
i2c_add_driver
(
&
wm8985_i2c_driver
);
if
(
ret
)
{
printk
(
KERN_ERR
"Failed to register wm8985 I2C driver: %d
\n
"
,
ret
);
}
#endif
#if defined(CONFIG_SPI_MASTER)
ret
=
spi_register_driver
(
&
wm8985_spi_driver
);
if
(
ret
!=
0
)
{
printk
(
KERN_ERR
"Failed to register wm8985 SPI driver: %d
\n
"
,
ret
);
}
#endif
return
ret
;
}
module_init
(
wm8985_modinit
);
static
void
__exit
wm8985_exit
(
void
)
{
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
i2c_del_driver
(
&
wm8985_i2c_driver
);
#endif
#if defined(CONFIG_SPI_MASTER)
spi_unregister_driver
(
&
wm8985_spi_driver
);
#endif
}
module_exit
(
wm8985_exit
);
MODULE_DESCRIPTION
(
"ASoC WM8985 driver"
);
MODULE_AUTHOR
(
"Dimitris Papastamos <dp@opensource.wolfsonmicro.com>"
);
MODULE_LICENSE
(
"GPL"
);
sound/soc/codecs/wm8985.h
0 → 100644
浏览文件 @
611ad378
/*
* wm8985.h -- WM8985 ASoC driver
*
* Copyright 2010 Wolfson Microelectronics plc
*
* Author: Dimitris Papastamos <dp@opensource.wolfsonmicro.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef _WM8985_H
#define _WM8985_H
#define WM8985_SOFTWARE_RESET 0x00
#define WM8985_POWER_MANAGEMENT_1 0x01
#define WM8985_POWER_MANAGEMENT_2 0x02
#define WM8985_POWER_MANAGEMENT_3 0x03
#define WM8985_AUDIO_INTERFACE 0x04
#define WM8985_COMPANDING_CONTROL 0x05
#define WM8985_CLOCK_GEN_CONTROL 0x06
#define WM8985_ADDITIONAL_CONTROL 0x07
#define WM8985_GPIO_CONTROL 0x08
#define WM8985_JACK_DETECT_CONTROL_1 0x09
#define WM8985_DAC_CONTROL 0x0A
#define WM8985_LEFT_DAC_DIGITAL_VOL 0x0B
#define WM8985_RIGHT_DAC_DIGITAL_VOL 0x0C
#define WM8985_JACK_DETECT_CONTROL_2 0x0D
#define WM8985_ADC_CONTROL 0x0E
#define WM8985_LEFT_ADC_DIGITAL_VOL 0x0F
#define WM8985_RIGHT_ADC_DIGITAL_VOL 0x10
#define WM8985_EQ1_LOW_SHELF 0x12
#define WM8985_EQ2_PEAK_1 0x13
#define WM8985_EQ3_PEAK_2 0x14
#define WM8985_EQ4_PEAK_3 0x15
#define WM8985_EQ5_HIGH_SHELF 0x16
#define WM8985_DAC_LIMITER_1 0x18
#define WM8985_DAC_LIMITER_2 0x19
#define WM8985_NOTCH_FILTER_1 0x1B
#define WM8985_NOTCH_FILTER_2 0x1C
#define WM8985_NOTCH_FILTER_3 0x1D
#define WM8985_NOTCH_FILTER_4 0x1E
#define WM8985_ALC_CONTROL_1 0x20
#define WM8985_ALC_CONTROL_2 0x21
#define WM8985_ALC_CONTROL_3 0x22
#define WM8985_NOISE_GATE 0x23
#define WM8985_PLL_N 0x24
#define WM8985_PLL_K_1 0x25
#define WM8985_PLL_K_2 0x26
#define WM8985_PLL_K_3 0x27
#define WM8985_3D_CONTROL 0x29
#define WM8985_OUT4_TO_ADC 0x2A
#define WM8985_BEEP_CONTROL 0x2B
#define WM8985_INPUT_CTRL 0x2C
#define WM8985_LEFT_INP_PGA_GAIN_CTRL 0x2D
#define WM8985_RIGHT_INP_PGA_GAIN_CTRL 0x2E
#define WM8985_LEFT_ADC_BOOST_CTRL 0x2F
#define WM8985_RIGHT_ADC_BOOST_CTRL 0x30
#define WM8985_OUTPUT_CTRL0 0x31
#define WM8985_LEFT_MIXER_CTRL 0x32
#define WM8985_RIGHT_MIXER_CTRL 0x33
#define WM8985_LOUT1_HP_VOLUME_CTRL 0x34
#define WM8985_ROUT1_HP_VOLUME_CTRL 0x35
#define WM8985_LOUT2_SPK_VOLUME_CTRL 0x36
#define WM8985_ROUT2_SPK_VOLUME_CTRL 0x37
#define WM8985_OUT3_MIXER_CTRL 0x38
#define WM8985_OUT4_MONO_MIX_CTRL 0x39
#define WM8985_OUTPUT_CTRL1 0x3C
#define WM8985_BIAS_CTRL 0x3D
#define WM8985_REGISTER_COUNT 59
#define WM8985_MAX_REGISTER 0x3F
/*
* Field Definitions.
*/
/*
* R0 (0x00) - Software Reset
*/
#define WM8985_SOFTWARE_RESET_MASK 0x01FF
/* SOFTWARE_RESET - [8:0] */
#define WM8985_SOFTWARE_RESET_SHIFT 0
/* SOFTWARE_RESET - [8:0] */
#define WM8985_SOFTWARE_RESET_WIDTH 9
/* SOFTWARE_RESET - [8:0] */
/*
* R1 (0x01) - Power management 1
*/
#define WM8985_OUT4MIXEN 0x0080
/* OUT4MIXEN */
#define WM8985_OUT4MIXEN_MASK 0x0080
/* OUT4MIXEN */
#define WM8985_OUT4MIXEN_SHIFT 7
/* OUT4MIXEN */
#define WM8985_OUT4MIXEN_WIDTH 1
/* OUT4MIXEN */
#define WM8985_OUT3MIXEN 0x0040
/* OUT3MIXEN */
#define WM8985_OUT3MIXEN_MASK 0x0040
/* OUT3MIXEN */
#define WM8985_OUT3MIXEN_SHIFT 6
/* OUT3MIXEN */
#define WM8985_OUT3MIXEN_WIDTH 1
/* OUT3MIXEN */
#define WM8985_PLLEN 0x0020
/* PLLEN */
#define WM8985_PLLEN_MASK 0x0020
/* PLLEN */
#define WM8985_PLLEN_SHIFT 5
/* PLLEN */
#define WM8985_PLLEN_WIDTH 1
/* PLLEN */
#define WM8985_MICBEN 0x0010
/* MICBEN */
#define WM8985_MICBEN_MASK 0x0010
/* MICBEN */
#define WM8985_MICBEN_SHIFT 4
/* MICBEN */
#define WM8985_MICBEN_WIDTH 1
/* MICBEN */
#define WM8985_BIASEN 0x0008
/* BIASEN */
#define WM8985_BIASEN_MASK 0x0008
/* BIASEN */
#define WM8985_BIASEN_SHIFT 3
/* BIASEN */
#define WM8985_BIASEN_WIDTH 1
/* BIASEN */
#define WM8985_BUFIOEN 0x0004
/* BUFIOEN */
#define WM8985_BUFIOEN_MASK 0x0004
/* BUFIOEN */
#define WM8985_BUFIOEN_SHIFT 2
/* BUFIOEN */
#define WM8985_BUFIOEN_WIDTH 1
/* BUFIOEN */
#define WM8985_VMIDSEL 0x0003
/* VMIDSEL */
#define WM8985_VMIDSEL_MASK 0x0003
/* VMIDSEL - [1:0] */
#define WM8985_VMIDSEL_SHIFT 0
/* VMIDSEL - [1:0] */
#define WM8985_VMIDSEL_WIDTH 2
/* VMIDSEL - [1:0] */
/*
* R2 (0x02) - Power management 2
*/
#define WM8985_ROUT1EN 0x0100
/* ROUT1EN */
#define WM8985_ROUT1EN_MASK 0x0100
/* ROUT1EN */
#define WM8985_ROUT1EN_SHIFT 8
/* ROUT1EN */
#define WM8985_ROUT1EN_WIDTH 1
/* ROUT1EN */
#define WM8985_LOUT1EN 0x0080
/* LOUT1EN */
#define WM8985_LOUT1EN_MASK 0x0080
/* LOUT1EN */
#define WM8985_LOUT1EN_SHIFT 7
/* LOUT1EN */
#define WM8985_LOUT1EN_WIDTH 1
/* LOUT1EN */
#define WM8985_SLEEP 0x0040
/* SLEEP */
#define WM8985_SLEEP_MASK 0x0040
/* SLEEP */
#define WM8985_SLEEP_SHIFT 6
/* SLEEP */
#define WM8985_SLEEP_WIDTH 1
/* SLEEP */
#define WM8985_BOOSTENR 0x0020
/* BOOSTENR */
#define WM8985_BOOSTENR_MASK 0x0020
/* BOOSTENR */
#define WM8985_BOOSTENR_SHIFT 5
/* BOOSTENR */
#define WM8985_BOOSTENR_WIDTH 1
/* BOOSTENR */
#define WM8985_BOOSTENL 0x0010
/* BOOSTENL */
#define WM8985_BOOSTENL_MASK 0x0010
/* BOOSTENL */
#define WM8985_BOOSTENL_SHIFT 4
/* BOOSTENL */
#define WM8985_BOOSTENL_WIDTH 1
/* BOOSTENL */
#define WM8985_INPGAENR 0x0008
/* INPGAENR */
#define WM8985_INPGAENR_MASK 0x0008
/* INPGAENR */
#define WM8985_INPGAENR_SHIFT 3
/* INPGAENR */
#define WM8985_INPGAENR_WIDTH 1
/* INPGAENR */
#define WM8985_INPPGAENL 0x0004
/* INPPGAENL */
#define WM8985_INPPGAENL_MASK 0x0004
/* INPPGAENL */
#define WM8985_INPPGAENL_SHIFT 2
/* INPPGAENL */
#define WM8985_INPPGAENL_WIDTH 1
/* INPPGAENL */
#define WM8985_ADCENR 0x0002
/* ADCENR */
#define WM8985_ADCENR_MASK 0x0002
/* ADCENR */
#define WM8985_ADCENR_SHIFT 1
/* ADCENR */
#define WM8985_ADCENR_WIDTH 1
/* ADCENR */
#define WM8985_ADCENL 0x0001
/* ADCENL */
#define WM8985_ADCENL_MASK 0x0001
/* ADCENL */
#define WM8985_ADCENL_SHIFT 0
/* ADCENL */
#define WM8985_ADCENL_WIDTH 1
/* ADCENL */
/*
* R3 (0x03) - Power management 3
*/
#define WM8985_OUT4EN 0x0100
/* OUT4EN */
#define WM8985_OUT4EN_MASK 0x0100
/* OUT4EN */
#define WM8985_OUT4EN_SHIFT 8
/* OUT4EN */
#define WM8985_OUT4EN_WIDTH 1
/* OUT4EN */
#define WM8985_OUT3EN 0x0080
/* OUT3EN */
#define WM8985_OUT3EN_MASK 0x0080
/* OUT3EN */
#define WM8985_OUT3EN_SHIFT 7
/* OUT3EN */
#define WM8985_OUT3EN_WIDTH 1
/* OUT3EN */
#define WM8985_ROUT2EN 0x0040
/* ROUT2EN */
#define WM8985_ROUT2EN_MASK 0x0040
/* ROUT2EN */
#define WM8985_ROUT2EN_SHIFT 6
/* ROUT2EN */
#define WM8985_ROUT2EN_WIDTH 1
/* ROUT2EN */
#define WM8985_LOUT2EN 0x0020
/* LOUT2EN */
#define WM8985_LOUT2EN_MASK 0x0020
/* LOUT2EN */
#define WM8985_LOUT2EN_SHIFT 5
/* LOUT2EN */
#define WM8985_LOUT2EN_WIDTH 1
/* LOUT2EN */
#define WM8985_RMIXEN 0x0008
/* RMIXEN */
#define WM8985_RMIXEN_MASK 0x0008
/* RMIXEN */
#define WM8985_RMIXEN_SHIFT 3
/* RMIXEN */
#define WM8985_RMIXEN_WIDTH 1
/* RMIXEN */
#define WM8985_LMIXEN 0x0004
/* LMIXEN */
#define WM8985_LMIXEN_MASK 0x0004
/* LMIXEN */
#define WM8985_LMIXEN_SHIFT 2
/* LMIXEN */
#define WM8985_LMIXEN_WIDTH 1
/* LMIXEN */
#define WM8985_DACENR 0x0002
/* DACENR */
#define WM8985_DACENR_MASK 0x0002
/* DACENR */
#define WM8985_DACENR_SHIFT 1
/* DACENR */
#define WM8985_DACENR_WIDTH 1
/* DACENR */
#define WM8985_DACENL 0x0001
/* DACENL */
#define WM8985_DACENL_MASK 0x0001
/* DACENL */
#define WM8985_DACENL_SHIFT 0
/* DACENL */
#define WM8985_DACENL_WIDTH 1
/* DACENL */
/*
* R4 (0x04) - Audio Interface
*/
#define WM8985_BCP 0x0100
/* BCP */
#define WM8985_BCP_MASK 0x0100
/* BCP */
#define WM8985_BCP_SHIFT 8
/* BCP */
#define WM8985_BCP_WIDTH 1
/* BCP */
#define WM8985_LRP 0x0080
/* LRP */
#define WM8985_LRP_MASK 0x0080
/* LRP */
#define WM8985_LRP_SHIFT 7
/* LRP */
#define WM8985_LRP_WIDTH 1
/* LRP */
#define WM8985_WL_MASK 0x0060
/* WL - [6:5] */
#define WM8985_WL_SHIFT 5
/* WL - [6:5] */
#define WM8985_WL_WIDTH 2
/* WL - [6:5] */
#define WM8985_FMT_MASK 0x0018
/* FMT - [4:3] */
#define WM8985_FMT_SHIFT 3
/* FMT - [4:3] */
#define WM8985_FMT_WIDTH 2
/* FMT - [4:3] */
#define WM8985_DLRSWAP 0x0004
/* DLRSWAP */
#define WM8985_DLRSWAP_MASK 0x0004
/* DLRSWAP */
#define WM8985_DLRSWAP_SHIFT 2
/* DLRSWAP */
#define WM8985_DLRSWAP_WIDTH 1
/* DLRSWAP */
#define WM8985_ALRSWAP 0x0002
/* ALRSWAP */
#define WM8985_ALRSWAP_MASK 0x0002
/* ALRSWAP */
#define WM8985_ALRSWAP_SHIFT 1
/* ALRSWAP */
#define WM8985_ALRSWAP_WIDTH 1
/* ALRSWAP */
#define WM8985_MONO 0x0001
/* MONO */
#define WM8985_MONO_MASK 0x0001
/* MONO */
#define WM8985_MONO_SHIFT 0
/* MONO */
#define WM8985_MONO_WIDTH 1
/* MONO */
/*
* R5 (0x05) - Companding control
*/
#define WM8985_WL8 0x0020
/* WL8 */
#define WM8985_WL8_MASK 0x0020
/* WL8 */
#define WM8985_WL8_SHIFT 5
/* WL8 */
#define WM8985_WL8_WIDTH 1
/* WL8 */
#define WM8985_DAC_COMP_MASK 0x0018
/* DAC_COMP - [4:3] */
#define WM8985_DAC_COMP_SHIFT 3
/* DAC_COMP - [4:3] */
#define WM8985_DAC_COMP_WIDTH 2
/* DAC_COMP - [4:3] */
#define WM8985_ADC_COMP_MASK 0x0006
/* ADC_COMP - [2:1] */
#define WM8985_ADC_COMP_SHIFT 1
/* ADC_COMP - [2:1] */
#define WM8985_ADC_COMP_WIDTH 2
/* ADC_COMP - [2:1] */
#define WM8985_LOOPBACK 0x0001
/* LOOPBACK */
#define WM8985_LOOPBACK_MASK 0x0001
/* LOOPBACK */
#define WM8985_LOOPBACK_SHIFT 0
/* LOOPBACK */
#define WM8985_LOOPBACK_WIDTH 1
/* LOOPBACK */
/*
* R6 (0x06) - Clock Gen control
*/
#define WM8985_CLKSEL 0x0100
/* CLKSEL */
#define WM8985_CLKSEL_MASK 0x0100
/* CLKSEL */
#define WM8985_CLKSEL_SHIFT 8
/* CLKSEL */
#define WM8985_CLKSEL_WIDTH 1
/* CLKSEL */
#define WM8985_MCLKDIV_MASK 0x00E0
/* MCLKDIV - [7:5] */
#define WM8985_MCLKDIV_SHIFT 5
/* MCLKDIV - [7:5] */
#define WM8985_MCLKDIV_WIDTH 3
/* MCLKDIV - [7:5] */
#define WM8985_BCLKDIV_MASK 0x001C
/* BCLKDIV - [4:2] */
#define WM8985_BCLKDIV_SHIFT 2
/* BCLKDIV - [4:2] */
#define WM8985_BCLKDIV_WIDTH 3
/* BCLKDIV - [4:2] */
#define WM8985_MS 0x0001
/* MS */
#define WM8985_MS_MASK 0x0001
/* MS */
#define WM8985_MS_SHIFT 0
/* MS */
#define WM8985_MS_WIDTH 1
/* MS */
/*
* R7 (0x07) - Additional control
*/
#define WM8985_M128ENB 0x0100
/* M128ENB */
#define WM8985_M128ENB_MASK 0x0100
/* M128ENB */
#define WM8985_M128ENB_SHIFT 8
/* M128ENB */
#define WM8985_M128ENB_WIDTH 1
/* M128ENB */
#define WM8985_DCLKDIV_MASK 0x00F0
/* DCLKDIV - [7:4] */
#define WM8985_DCLKDIV_SHIFT 4
/* DCLKDIV - [7:4] */
#define WM8985_DCLKDIV_WIDTH 4
/* DCLKDIV - [7:4] */
#define WM8985_SR_MASK 0x000E
/* SR - [3:1] */
#define WM8985_SR_SHIFT 1
/* SR - [3:1] */
#define WM8985_SR_WIDTH 3
/* SR - [3:1] */
#define WM8985_SLOWCLKEN 0x0001
/* SLOWCLKEN */
#define WM8985_SLOWCLKEN_MASK 0x0001
/* SLOWCLKEN */
#define WM8985_SLOWCLKEN_SHIFT 0
/* SLOWCLKEN */
#define WM8985_SLOWCLKEN_WIDTH 1
/* SLOWCLKEN */
/*
* R8 (0x08) - GPIO Control
*/
#define WM8985_GPIO1GP 0x0100
/* GPIO1GP */
#define WM8985_GPIO1GP_MASK 0x0100
/* GPIO1GP */
#define WM8985_GPIO1GP_SHIFT 8
/* GPIO1GP */
#define WM8985_GPIO1GP_WIDTH 1
/* GPIO1GP */
#define WM8985_GPIO1GPU 0x0080
/* GPIO1GPU */
#define WM8985_GPIO1GPU_MASK 0x0080
/* GPIO1GPU */
#define WM8985_GPIO1GPU_SHIFT 7
/* GPIO1GPU */
#define WM8985_GPIO1GPU_WIDTH 1
/* GPIO1GPU */
#define WM8985_GPIO1GPD 0x0040
/* GPIO1GPD */
#define WM8985_GPIO1GPD_MASK 0x0040
/* GPIO1GPD */
#define WM8985_GPIO1GPD_SHIFT 6
/* GPIO1GPD */
#define WM8985_GPIO1GPD_WIDTH 1
/* GPIO1GPD */
#define WM8985_GPIO1POL 0x0008
/* GPIO1POL */
#define WM8985_GPIO1POL_MASK 0x0008
/* GPIO1POL */
#define WM8985_GPIO1POL_SHIFT 3
/* GPIO1POL */
#define WM8985_GPIO1POL_WIDTH 1
/* GPIO1POL */
#define WM8985_GPIO1SEL_MASK 0x0007
/* GPIO1SEL - [2:0] */
#define WM8985_GPIO1SEL_SHIFT 0
/* GPIO1SEL - [2:0] */
#define WM8985_GPIO1SEL_WIDTH 3
/* GPIO1SEL - [2:0] */
/*
* R9 (0x09) - Jack Detect Control 1
*/
#define WM8985_JD_EN 0x0040
/* JD_EN */
#define WM8985_JD_EN_MASK 0x0040
/* JD_EN */
#define WM8985_JD_EN_SHIFT 6
/* JD_EN */
#define WM8985_JD_EN_WIDTH 1
/* JD_EN */
#define WM8985_JD_SEL_MASK 0x0030
/* JD_SEL - [5:4] */
#define WM8985_JD_SEL_SHIFT 4
/* JD_SEL - [5:4] */
#define WM8985_JD_SEL_WIDTH 2
/* JD_SEL - [5:4] */
/*
* R10 (0x0A) - DAC Control
*/
#define WM8985_SOFTMUTE 0x0040
/* SOFTMUTE */
#define WM8985_SOFTMUTE_MASK 0x0040
/* SOFTMUTE */
#define WM8985_SOFTMUTE_SHIFT 6
/* SOFTMUTE */
#define WM8985_SOFTMUTE_WIDTH 1
/* SOFTMUTE */
#define WM8985_DACOSR128 0x0008
/* DACOSR128 */
#define WM8985_DACOSR128_MASK 0x0008
/* DACOSR128 */
#define WM8985_DACOSR128_SHIFT 3
/* DACOSR128 */
#define WM8985_DACOSR128_WIDTH 1
/* DACOSR128 */
#define WM8985_AMUTE 0x0004
/* AMUTE */
#define WM8985_AMUTE_MASK 0x0004
/* AMUTE */
#define WM8985_AMUTE_SHIFT 2
/* AMUTE */
#define WM8985_AMUTE_WIDTH 1
/* AMUTE */
#define WM8985_DACPOLR 0x0002
/* DACPOLR */
#define WM8985_DACPOLR_MASK 0x0002
/* DACPOLR */
#define WM8985_DACPOLR_SHIFT 1
/* DACPOLR */
#define WM8985_DACPOLR_WIDTH 1
/* DACPOLR */
#define WM8985_DACPOLL 0x0001
/* DACPOLL */
#define WM8985_DACPOLL_MASK 0x0001
/* DACPOLL */
#define WM8985_DACPOLL_SHIFT 0
/* DACPOLL */
#define WM8985_DACPOLL_WIDTH 1
/* DACPOLL */
/*
* R11 (0x0B) - Left DAC digital Vol
*/
#define WM8985_DACVU 0x0100
/* DACVU */
#define WM8985_DACVU_MASK 0x0100
/* DACVU */
#define WM8985_DACVU_SHIFT 8
/* DACVU */
#define WM8985_DACVU_WIDTH 1
/* DACVU */
#define WM8985_DACVOLL_MASK 0x00FF
/* DACVOLL - [7:0] */
#define WM8985_DACVOLL_SHIFT 0
/* DACVOLL - [7:0] */
#define WM8985_DACVOLL_WIDTH 8
/* DACVOLL - [7:0] */
/*
* R12 (0x0C) - Right DAC digital vol
*/
#define WM8985_DACVU 0x0100
/* DACVU */
#define WM8985_DACVU_MASK 0x0100
/* DACVU */
#define WM8985_DACVU_SHIFT 8
/* DACVU */
#define WM8985_DACVU_WIDTH 1
/* DACVU */
#define WM8985_DACVOLR_MASK 0x00FF
/* DACVOLR - [7:0] */
#define WM8985_DACVOLR_SHIFT 0
/* DACVOLR - [7:0] */
#define WM8985_DACVOLR_WIDTH 8
/* DACVOLR - [7:0] */
/*
* R13 (0x0D) - Jack Detect Control 2
*/
#define WM8985_JD_EN1_MASK 0x00F0
/* JD_EN1 - [7:4] */
#define WM8985_JD_EN1_SHIFT 4
/* JD_EN1 - [7:4] */
#define WM8985_JD_EN1_WIDTH 4
/* JD_EN1 - [7:4] */
#define WM8985_JD_EN0_MASK 0x000F
/* JD_EN0 - [3:0] */
#define WM8985_JD_EN0_SHIFT 0
/* JD_EN0 - [3:0] */
#define WM8985_JD_EN0_WIDTH 4
/* JD_EN0 - [3:0] */
/*
* R14 (0x0E) - ADC Control
*/
#define WM8985_HPFEN 0x0100
/* HPFEN */
#define WM8985_HPFEN_MASK 0x0100
/* HPFEN */
#define WM8985_HPFEN_SHIFT 8
/* HPFEN */
#define WM8985_HPFEN_WIDTH 1
/* HPFEN */
#define WM8985_HPFAPP 0x0080
/* HPFAPP */
#define WM8985_HPFAPP_MASK 0x0080
/* HPFAPP */
#define WM8985_HPFAPP_SHIFT 7
/* HPFAPP */
#define WM8985_HPFAPP_WIDTH 1
/* HPFAPP */
#define WM8985_HPFCUT_MASK 0x0070
/* HPFCUT - [6:4] */
#define WM8985_HPFCUT_SHIFT 4
/* HPFCUT - [6:4] */
#define WM8985_HPFCUT_WIDTH 3
/* HPFCUT - [6:4] */
#define WM8985_ADCOSR128 0x0008
/* ADCOSR128 */
#define WM8985_ADCOSR128_MASK 0x0008
/* ADCOSR128 */
#define WM8985_ADCOSR128_SHIFT 3
/* ADCOSR128 */
#define WM8985_ADCOSR128_WIDTH 1
/* ADCOSR128 */
#define WM8985_ADCRPOL 0x0002
/* ADCRPOL */
#define WM8985_ADCRPOL_MASK 0x0002
/* ADCRPOL */
#define WM8985_ADCRPOL_SHIFT 1
/* ADCRPOL */
#define WM8985_ADCRPOL_WIDTH 1
/* ADCRPOL */
#define WM8985_ADCLPOL 0x0001
/* ADCLPOL */
#define WM8985_ADCLPOL_MASK 0x0001
/* ADCLPOL */
#define WM8985_ADCLPOL_SHIFT 0
/* ADCLPOL */
#define WM8985_ADCLPOL_WIDTH 1
/* ADCLPOL */
/*
* R15 (0x0F) - Left ADC Digital Vol
*/
#define WM8985_ADCVU 0x0100
/* ADCVU */
#define WM8985_ADCVU_MASK 0x0100
/* ADCVU */
#define WM8985_ADCVU_SHIFT 8
/* ADCVU */
#define WM8985_ADCVU_WIDTH 1
/* ADCVU */
#define WM8985_ADCVOLL_MASK 0x00FF
/* ADCVOLL - [7:0] */
#define WM8985_ADCVOLL_SHIFT 0
/* ADCVOLL - [7:0] */
#define WM8985_ADCVOLL_WIDTH 8
/* ADCVOLL - [7:0] */
/*
* R16 (0x10) - Right ADC Digital Vol
*/
#define WM8985_ADCVU 0x0100
/* ADCVU */
#define WM8985_ADCVU_MASK 0x0100
/* ADCVU */
#define WM8985_ADCVU_SHIFT 8
/* ADCVU */
#define WM8985_ADCVU_WIDTH 1
/* ADCVU */
#define WM8985_ADCVOLR_MASK 0x00FF
/* ADCVOLR - [7:0] */
#define WM8985_ADCVOLR_SHIFT 0
/* ADCVOLR - [7:0] */
#define WM8985_ADCVOLR_WIDTH 8
/* ADCVOLR - [7:0] */
/*
* R18 (0x12) - EQ1 - low shelf
*/
#define WM8985_EQ3DMODE 0x0100
/* EQ3DMODE */
#define WM8985_EQ3DMODE_MASK 0x0100
/* EQ3DMODE */
#define WM8985_EQ3DMODE_SHIFT 8
/* EQ3DMODE */
#define WM8985_EQ3DMODE_WIDTH 1
/* EQ3DMODE */
#define WM8985_EQ1C_MASK 0x0060
/* EQ1C - [6:5] */
#define WM8985_EQ1C_SHIFT 5
/* EQ1C - [6:5] */
#define WM8985_EQ1C_WIDTH 2
/* EQ1C - [6:5] */
#define WM8985_EQ1G_MASK 0x001F
/* EQ1G - [4:0] */
#define WM8985_EQ1G_SHIFT 0
/* EQ1G - [4:0] */
#define WM8985_EQ1G_WIDTH 5
/* EQ1G - [4:0] */
/*
* R19 (0x13) - EQ2 - peak 1
*/
#define WM8985_EQ2BW 0x0100
/* EQ2BW */
#define WM8985_EQ2BW_MASK 0x0100
/* EQ2BW */
#define WM8985_EQ2BW_SHIFT 8
/* EQ2BW */
#define WM8985_EQ2BW_WIDTH 1
/* EQ2BW */
#define WM8985_EQ2C_MASK 0x0060
/* EQ2C - [6:5] */
#define WM8985_EQ2C_SHIFT 5
/* EQ2C - [6:5] */
#define WM8985_EQ2C_WIDTH 2
/* EQ2C - [6:5] */
#define WM8985_EQ2G_MASK 0x001F
/* EQ2G - [4:0] */
#define WM8985_EQ2G_SHIFT 0
/* EQ2G - [4:0] */
#define WM8985_EQ2G_WIDTH 5
/* EQ2G - [4:0] */
/*
* R20 (0x14) - EQ3 - peak 2
*/
#define WM8985_EQ3BW 0x0100
/* EQ3BW */
#define WM8985_EQ3BW_MASK 0x0100
/* EQ3BW */
#define WM8985_EQ3BW_SHIFT 8
/* EQ3BW */
#define WM8985_EQ3BW_WIDTH 1
/* EQ3BW */
#define WM8985_EQ3C_MASK 0x0060
/* EQ3C - [6:5] */
#define WM8985_EQ3C_SHIFT 5
/* EQ3C - [6:5] */
#define WM8985_EQ3C_WIDTH 2
/* EQ3C - [6:5] */
#define WM8985_EQ3G_MASK 0x001F
/* EQ3G - [4:0] */
#define WM8985_EQ3G_SHIFT 0
/* EQ3G - [4:0] */
#define WM8985_EQ3G_WIDTH 5
/* EQ3G - [4:0] */
/*
* R21 (0x15) - EQ4 - peak 3
*/
#define WM8985_EQ4BW 0x0100
/* EQ4BW */
#define WM8985_EQ4BW_MASK 0x0100
/* EQ4BW */
#define WM8985_EQ4BW_SHIFT 8
/* EQ4BW */
#define WM8985_EQ4BW_WIDTH 1
/* EQ4BW */
#define WM8985_EQ4C_MASK 0x0060
/* EQ4C - [6:5] */
#define WM8985_EQ4C_SHIFT 5
/* EQ4C - [6:5] */
#define WM8985_EQ4C_WIDTH 2
/* EQ4C - [6:5] */
#define WM8985_EQ4G_MASK 0x001F
/* EQ4G - [4:0] */
#define WM8985_EQ4G_SHIFT 0
/* EQ4G - [4:0] */
#define WM8985_EQ4G_WIDTH 5
/* EQ4G - [4:0] */
/*
* R22 (0x16) - EQ5 - high shelf
*/
#define WM8985_EQ5C_MASK 0x0060
/* EQ5C - [6:5] */
#define WM8985_EQ5C_SHIFT 5
/* EQ5C - [6:5] */
#define WM8985_EQ5C_WIDTH 2
/* EQ5C - [6:5] */
#define WM8985_EQ5G_MASK 0x001F
/* EQ5G - [4:0] */
#define WM8985_EQ5G_SHIFT 0
/* EQ5G - [4:0] */
#define WM8985_EQ5G_WIDTH 5
/* EQ5G - [4:0] */
/*
* R24 (0x18) - DAC Limiter 1
*/
#define WM8985_LIMEN 0x0100
/* LIMEN */
#define WM8985_LIMEN_MASK 0x0100
/* LIMEN */
#define WM8985_LIMEN_SHIFT 8
/* LIMEN */
#define WM8985_LIMEN_WIDTH 1
/* LIMEN */
#define WM8985_LIMDCY_MASK 0x00F0
/* LIMDCY - [7:4] */
#define WM8985_LIMDCY_SHIFT 4
/* LIMDCY - [7:4] */
#define WM8985_LIMDCY_WIDTH 4
/* LIMDCY - [7:4] */
#define WM8985_LIMATK_MASK 0x000F
/* LIMATK - [3:0] */
#define WM8985_LIMATK_SHIFT 0
/* LIMATK - [3:0] */
#define WM8985_LIMATK_WIDTH 4
/* LIMATK - [3:0] */
/*
* R25 (0x19) - DAC Limiter 2
*/
#define WM8985_LIMLVL_MASK 0x0070
/* LIMLVL - [6:4] */
#define WM8985_LIMLVL_SHIFT 4
/* LIMLVL - [6:4] */
#define WM8985_LIMLVL_WIDTH 3
/* LIMLVL - [6:4] */
#define WM8985_LIMBOOST_MASK 0x000F
/* LIMBOOST - [3:0] */
#define WM8985_LIMBOOST_SHIFT 0
/* LIMBOOST - [3:0] */
#define WM8985_LIMBOOST_WIDTH 4
/* LIMBOOST - [3:0] */
/*
* R27 (0x1B) - Notch Filter 1
*/
#define WM8985_NFU 0x0100
/* NFU */
#define WM8985_NFU_MASK 0x0100
/* NFU */
#define WM8985_NFU_SHIFT 8
/* NFU */
#define WM8985_NFU_WIDTH 1
/* NFU */
#define WM8985_NFEN 0x0080
/* NFEN */
#define WM8985_NFEN_MASK 0x0080
/* NFEN */
#define WM8985_NFEN_SHIFT 7
/* NFEN */
#define WM8985_NFEN_WIDTH 1
/* NFEN */
#define WM8985_NFA0_13_7_MASK 0x007F
/* NFA0(13:7) - [6:0] */
#define WM8985_NFA0_13_7_SHIFT 0
/* NFA0(13:7) - [6:0] */
#define WM8985_NFA0_13_7_WIDTH 7
/* NFA0(13:7) - [6:0] */
/*
* R28 (0x1C) - Notch Filter 2
*/
#define WM8985_NFU 0x0100
/* NFU */
#define WM8985_NFU_MASK 0x0100
/* NFU */
#define WM8985_NFU_SHIFT 8
/* NFU */
#define WM8985_NFU_WIDTH 1
/* NFU */
#define WM8985_NFA0_6_0_MASK 0x007F
/* NFA0(6:0) - [6:0] */
#define WM8985_NFA0_6_0_SHIFT 0
/* NFA0(6:0) - [6:0] */
#define WM8985_NFA0_6_0_WIDTH 7
/* NFA0(6:0) - [6:0] */
/*
* R29 (0x1D) - Notch Filter 3
*/
#define WM8985_NFU 0x0100
/* NFU */
#define WM8985_NFU_MASK 0x0100
/* NFU */
#define WM8985_NFU_SHIFT 8
/* NFU */
#define WM8985_NFU_WIDTH 1
/* NFU */
#define WM8985_NFA1_13_7_MASK 0x007F
/* NFA1(13:7) - [6:0] */
#define WM8985_NFA1_13_7_SHIFT 0
/* NFA1(13:7) - [6:0] */
#define WM8985_NFA1_13_7_WIDTH 7
/* NFA1(13:7) - [6:0] */
/*
* R30 (0x1E) - Notch Filter 4
*/
#define WM8985_NFU 0x0100
/* NFU */
#define WM8985_NFU_MASK 0x0100
/* NFU */
#define WM8985_NFU_SHIFT 8
/* NFU */
#define WM8985_NFU_WIDTH 1
/* NFU */
#define WM8985_NFA1_6_0_MASK 0x007F
/* NFA1(6:0) - [6:0] */
#define WM8985_NFA1_6_0_SHIFT 0
/* NFA1(6:0) - [6:0] */
#define WM8985_NFA1_6_0_WIDTH 7
/* NFA1(6:0) - [6:0] */
/*
* R32 (0x20) - ALC control 1
*/
#define WM8985_ALCSEL_MASK 0x0180
/* ALCSEL - [8:7] */
#define WM8985_ALCSEL_SHIFT 7
/* ALCSEL - [8:7] */
#define WM8985_ALCSEL_WIDTH 2
/* ALCSEL - [8:7] */
#define WM8985_ALCMAX_MASK 0x0038
/* ALCMAX - [5:3] */
#define WM8985_ALCMAX_SHIFT 3
/* ALCMAX - [5:3] */
#define WM8985_ALCMAX_WIDTH 3
/* ALCMAX - [5:3] */
#define WM8985_ALCMIN_MASK 0x0007
/* ALCMIN - [2:0] */
#define WM8985_ALCMIN_SHIFT 0
/* ALCMIN - [2:0] */
#define WM8985_ALCMIN_WIDTH 3
/* ALCMIN - [2:0] */
/*
* R33 (0x21) - ALC control 2
*/
#define WM8985_ALCHLD_MASK 0x00F0
/* ALCHLD - [7:4] */
#define WM8985_ALCHLD_SHIFT 4
/* ALCHLD - [7:4] */
#define WM8985_ALCHLD_WIDTH 4
/* ALCHLD - [7:4] */
#define WM8985_ALCLVL_MASK 0x000F
/* ALCLVL - [3:0] */
#define WM8985_ALCLVL_SHIFT 0
/* ALCLVL - [3:0] */
#define WM8985_ALCLVL_WIDTH 4
/* ALCLVL - [3:0] */
/*
* R34 (0x22) - ALC control 3
*/
#define WM8985_ALCMODE 0x0100
/* ALCMODE */
#define WM8985_ALCMODE_MASK 0x0100
/* ALCMODE */
#define WM8985_ALCMODE_SHIFT 8
/* ALCMODE */
#define WM8985_ALCMODE_WIDTH 1
/* ALCMODE */
#define WM8985_ALCDCY_MASK 0x00F0
/* ALCDCY - [7:4] */
#define WM8985_ALCDCY_SHIFT 4
/* ALCDCY - [7:4] */
#define WM8985_ALCDCY_WIDTH 4
/* ALCDCY - [7:4] */
#define WM8985_ALCATK_MASK 0x000F
/* ALCATK - [3:0] */
#define WM8985_ALCATK_SHIFT 0
/* ALCATK - [3:0] */
#define WM8985_ALCATK_WIDTH 4
/* ALCATK - [3:0] */
/*
* R35 (0x23) - Noise Gate
*/
#define WM8985_NGEN 0x0008
/* NGEN */
#define WM8985_NGEN_MASK 0x0008
/* NGEN */
#define WM8985_NGEN_SHIFT 3
/* NGEN */
#define WM8985_NGEN_WIDTH 1
/* NGEN */
#define WM8985_NGTH_MASK 0x0007
/* NGTH - [2:0] */
#define WM8985_NGTH_SHIFT 0
/* NGTH - [2:0] */
#define WM8985_NGTH_WIDTH 3
/* NGTH - [2:0] */
/*
* R36 (0x24) - PLL N
*/
#define WM8985_PLL_PRESCALE 0x0010
/* PLL_PRESCALE */
#define WM8985_PLL_PRESCALE_MASK 0x0010
/* PLL_PRESCALE */
#define WM8985_PLL_PRESCALE_SHIFT 4
/* PLL_PRESCALE */
#define WM8985_PLL_PRESCALE_WIDTH 1
/* PLL_PRESCALE */
#define WM8985_PLLN_MASK 0x000F
/* PLLN - [3:0] */
#define WM8985_PLLN_SHIFT 0
/* PLLN - [3:0] */
#define WM8985_PLLN_WIDTH 4
/* PLLN - [3:0] */
/*
* R37 (0x25) - PLL K 1
*/
#define WM8985_PLLK_23_18_MASK 0x003F
/* PLLK(23:18) - [5:0] */
#define WM8985_PLLK_23_18_SHIFT 0
/* PLLK(23:18) - [5:0] */
#define WM8985_PLLK_23_18_WIDTH 6
/* PLLK(23:18) - [5:0] */
/*
* R38 (0x26) - PLL K 2
*/
#define WM8985_PLLK_17_9_MASK 0x01FF
/* PLLK(17:9) - [8:0] */
#define WM8985_PLLK_17_9_SHIFT 0
/* PLLK(17:9) - [8:0] */
#define WM8985_PLLK_17_9_WIDTH 9
/* PLLK(17:9) - [8:0] */
/*
* R39 (0x27) - PLL K 3
*/
#define WM8985_PLLK_8_0_MASK 0x01FF
/* PLLK(8:0) - [8:0] */
#define WM8985_PLLK_8_0_SHIFT 0
/* PLLK(8:0) - [8:0] */
#define WM8985_PLLK_8_0_WIDTH 9
/* PLLK(8:0) - [8:0] */
/*
* R41 (0x29) - 3D control
*/
#define WM8985_DEPTH3D_MASK 0x000F
/* DEPTH3D - [3:0] */
#define WM8985_DEPTH3D_SHIFT 0
/* DEPTH3D - [3:0] */
#define WM8985_DEPTH3D_WIDTH 4
/* DEPTH3D - [3:0] */
/*
* R42 (0x2A) - OUT4 to ADC
*/
#define WM8985_OUT4_2ADCVOL_MASK 0x01C0
/* OUT4_2ADCVOL - [8:6] */
#define WM8985_OUT4_2ADCVOL_SHIFT 6
/* OUT4_2ADCVOL - [8:6] */
#define WM8985_OUT4_2ADCVOL_WIDTH 3
/* OUT4_2ADCVOL - [8:6] */
#define WM8985_OUT4_2LNR 0x0020
/* OUT4_2LNR */
#define WM8985_OUT4_2LNR_MASK 0x0020
/* OUT4_2LNR */
#define WM8985_OUT4_2LNR_SHIFT 5
/* OUT4_2LNR */
#define WM8985_OUT4_2LNR_WIDTH 1
/* OUT4_2LNR */
#define WM8985_POBCTRL 0x0004
/* POBCTRL */
#define WM8985_POBCTRL_MASK 0x0004
/* POBCTRL */
#define WM8985_POBCTRL_SHIFT 2
/* POBCTRL */
#define WM8985_POBCTRL_WIDTH 1
/* POBCTRL */
#define WM8985_DELEN 0x0002
/* DELEN */
#define WM8985_DELEN_MASK 0x0002
/* DELEN */
#define WM8985_DELEN_SHIFT 1
/* DELEN */
#define WM8985_DELEN_WIDTH 1
/* DELEN */
#define WM8985_OUT1DEL 0x0001
/* OUT1DEL */
#define WM8985_OUT1DEL_MASK 0x0001
/* OUT1DEL */
#define WM8985_OUT1DEL_SHIFT 0
/* OUT1DEL */
#define WM8985_OUT1DEL_WIDTH 1
/* OUT1DEL */
/*
* R43 (0x2B) - Beep control
*/
#define WM8985_BYPL2RMIX 0x0100
/* BYPL2RMIX */
#define WM8985_BYPL2RMIX_MASK 0x0100
/* BYPL2RMIX */
#define WM8985_BYPL2RMIX_SHIFT 8
/* BYPL2RMIX */
#define WM8985_BYPL2RMIX_WIDTH 1
/* BYPL2RMIX */
#define WM8985_BYPR2LMIX 0x0080
/* BYPR2LMIX */
#define WM8985_BYPR2LMIX_MASK 0x0080
/* BYPR2LMIX */
#define WM8985_BYPR2LMIX_SHIFT 7
/* BYPR2LMIX */
#define WM8985_BYPR2LMIX_WIDTH 1
/* BYPR2LMIX */
#define WM8985_MUTERPGA2INV 0x0020
/* MUTERPGA2INV */
#define WM8985_MUTERPGA2INV_MASK 0x0020
/* MUTERPGA2INV */
#define WM8985_MUTERPGA2INV_SHIFT 5
/* MUTERPGA2INV */
#define WM8985_MUTERPGA2INV_WIDTH 1
/* MUTERPGA2INV */
#define WM8985_INVROUT2 0x0010
/* INVROUT2 */
#define WM8985_INVROUT2_MASK 0x0010
/* INVROUT2 */
#define WM8985_INVROUT2_SHIFT 4
/* INVROUT2 */
#define WM8985_INVROUT2_WIDTH 1
/* INVROUT2 */
#define WM8985_BEEPVOL_MASK 0x000E
/* BEEPVOL - [3:1] */
#define WM8985_BEEPVOL_SHIFT 1
/* BEEPVOL - [3:1] */
#define WM8985_BEEPVOL_WIDTH 3
/* BEEPVOL - [3:1] */
#define WM8985_BEEPEN 0x0001
/* BEEPEN */
#define WM8985_BEEPEN_MASK 0x0001
/* BEEPEN */
#define WM8985_BEEPEN_SHIFT 0
/* BEEPEN */
#define WM8985_BEEPEN_WIDTH 1
/* BEEPEN */
/*
* R44 (0x2C) - Input ctrl
*/
#define WM8985_MBVSEL 0x0100
/* MBVSEL */
#define WM8985_MBVSEL_MASK 0x0100
/* MBVSEL */
#define WM8985_MBVSEL_SHIFT 8
/* MBVSEL */
#define WM8985_MBVSEL_WIDTH 1
/* MBVSEL */
#define WM8985_R2_2INPPGA 0x0040
/* R2_2INPPGA */
#define WM8985_R2_2INPPGA_MASK 0x0040
/* R2_2INPPGA */
#define WM8985_R2_2INPPGA_SHIFT 6
/* R2_2INPPGA */
#define WM8985_R2_2INPPGA_WIDTH 1
/* R2_2INPPGA */
#define WM8985_RIN2INPPGA 0x0020
/* RIN2INPPGA */
#define WM8985_RIN2INPPGA_MASK 0x0020
/* RIN2INPPGA */
#define WM8985_RIN2INPPGA_SHIFT 5
/* RIN2INPPGA */
#define WM8985_RIN2INPPGA_WIDTH 1
/* RIN2INPPGA */
#define WM8985_RIP2INPPGA 0x0010
/* RIP2INPPGA */
#define WM8985_RIP2INPPGA_MASK 0x0010
/* RIP2INPPGA */
#define WM8985_RIP2INPPGA_SHIFT 4
/* RIP2INPPGA */
#define WM8985_RIP2INPPGA_WIDTH 1
/* RIP2INPPGA */
#define WM8985_L2_2INPPGA 0x0004
/* L2_2INPPGA */
#define WM8985_L2_2INPPGA_MASK 0x0004
/* L2_2INPPGA */
#define WM8985_L2_2INPPGA_SHIFT 2
/* L2_2INPPGA */
#define WM8985_L2_2INPPGA_WIDTH 1
/* L2_2INPPGA */
#define WM8985_LIN2INPPGA 0x0002
/* LIN2INPPGA */
#define WM8985_LIN2INPPGA_MASK 0x0002
/* LIN2INPPGA */
#define WM8985_LIN2INPPGA_SHIFT 1
/* LIN2INPPGA */
#define WM8985_LIN2INPPGA_WIDTH 1
/* LIN2INPPGA */
#define WM8985_LIP2INPPGA 0x0001
/* LIP2INPPGA */
#define WM8985_LIP2INPPGA_MASK 0x0001
/* LIP2INPPGA */
#define WM8985_LIP2INPPGA_SHIFT 0
/* LIP2INPPGA */
#define WM8985_LIP2INPPGA_WIDTH 1
/* LIP2INPPGA */
/*
* R45 (0x2D) - Left INP PGA gain ctrl
*/
#define WM8985_INPGAVU 0x0100
/* INPGAVU */
#define WM8985_INPGAVU_MASK 0x0100
/* INPGAVU */
#define WM8985_INPGAVU_SHIFT 8
/* INPGAVU */
#define WM8985_INPGAVU_WIDTH 1
/* INPGAVU */
#define WM8985_INPPGAZCL 0x0080
/* INPPGAZCL */
#define WM8985_INPPGAZCL_MASK 0x0080
/* INPPGAZCL */
#define WM8985_INPPGAZCL_SHIFT 7
/* INPPGAZCL */
#define WM8985_INPPGAZCL_WIDTH 1
/* INPPGAZCL */
#define WM8985_INPPGAMUTEL 0x0040
/* INPPGAMUTEL */
#define WM8985_INPPGAMUTEL_MASK 0x0040
/* INPPGAMUTEL */
#define WM8985_INPPGAMUTEL_SHIFT 6
/* INPPGAMUTEL */
#define WM8985_INPPGAMUTEL_WIDTH 1
/* INPPGAMUTEL */
#define WM8985_INPPGAVOLL_MASK 0x003F
/* INPPGAVOLL - [5:0] */
#define WM8985_INPPGAVOLL_SHIFT 0
/* INPPGAVOLL - [5:0] */
#define WM8985_INPPGAVOLL_WIDTH 6
/* INPPGAVOLL - [5:0] */
/*
* R46 (0x2E) - Right INP PGA gain ctrl
*/
#define WM8985_INPGAVU 0x0100
/* INPGAVU */
#define WM8985_INPGAVU_MASK 0x0100
/* INPGAVU */
#define WM8985_INPGAVU_SHIFT 8
/* INPGAVU */
#define WM8985_INPGAVU_WIDTH 1
/* INPGAVU */
#define WM8985_INPPGAZCR 0x0080
/* INPPGAZCR */
#define WM8985_INPPGAZCR_MASK 0x0080
/* INPPGAZCR */
#define WM8985_INPPGAZCR_SHIFT 7
/* INPPGAZCR */
#define WM8985_INPPGAZCR_WIDTH 1
/* INPPGAZCR */
#define WM8985_INPPGAMUTER 0x0040
/* INPPGAMUTER */
#define WM8985_INPPGAMUTER_MASK 0x0040
/* INPPGAMUTER */
#define WM8985_INPPGAMUTER_SHIFT 6
/* INPPGAMUTER */
#define WM8985_INPPGAMUTER_WIDTH 1
/* INPPGAMUTER */
#define WM8985_INPPGAVOLR_MASK 0x003F
/* INPPGAVOLR - [5:0] */
#define WM8985_INPPGAVOLR_SHIFT 0
/* INPPGAVOLR - [5:0] */
#define WM8985_INPPGAVOLR_WIDTH 6
/* INPPGAVOLR - [5:0] */
/*
* R47 (0x2F) - Left ADC BOOST ctrl
*/
#define WM8985_PGABOOSTL 0x0100
/* PGABOOSTL */
#define WM8985_PGABOOSTL_MASK 0x0100
/* PGABOOSTL */
#define WM8985_PGABOOSTL_SHIFT 8
/* PGABOOSTL */
#define WM8985_PGABOOSTL_WIDTH 1
/* PGABOOSTL */
#define WM8985_L2_2BOOSTVOL_MASK 0x0070
/* L2_2BOOSTVOL - [6:4] */
#define WM8985_L2_2BOOSTVOL_SHIFT 4
/* L2_2BOOSTVOL - [6:4] */
#define WM8985_L2_2BOOSTVOL_WIDTH 3
/* L2_2BOOSTVOL - [6:4] */
#define WM8985_AUXL2BOOSTVOL_MASK 0x0007
/* AUXL2BOOSTVOL - [2:0] */
#define WM8985_AUXL2BOOSTVOL_SHIFT 0
/* AUXL2BOOSTVOL - [2:0] */
#define WM8985_AUXL2BOOSTVOL_WIDTH 3
/* AUXL2BOOSTVOL - [2:0] */
/*
* R48 (0x30) - Right ADC BOOST ctrl
*/
#define WM8985_PGABOOSTR 0x0100
/* PGABOOSTR */
#define WM8985_PGABOOSTR_MASK 0x0100
/* PGABOOSTR */
#define WM8985_PGABOOSTR_SHIFT 8
/* PGABOOSTR */
#define WM8985_PGABOOSTR_WIDTH 1
/* PGABOOSTR */
#define WM8985_R2_2BOOSTVOL_MASK 0x0070
/* R2_2BOOSTVOL - [6:4] */
#define WM8985_R2_2BOOSTVOL_SHIFT 4
/* R2_2BOOSTVOL - [6:4] */
#define WM8985_R2_2BOOSTVOL_WIDTH 3
/* R2_2BOOSTVOL - [6:4] */
#define WM8985_AUXR2BOOSTVOL_MASK 0x0007
/* AUXR2BOOSTVOL - [2:0] */
#define WM8985_AUXR2BOOSTVOL_SHIFT 0
/* AUXR2BOOSTVOL - [2:0] */
#define WM8985_AUXR2BOOSTVOL_WIDTH 3
/* AUXR2BOOSTVOL - [2:0] */
/*
* R49 (0x31) - Output ctrl
*/
#define WM8985_DACL2RMIX 0x0040
/* DACL2RMIX */
#define WM8985_DACL2RMIX_MASK 0x0040
/* DACL2RMIX */
#define WM8985_DACL2RMIX_SHIFT 6
/* DACL2RMIX */
#define WM8985_DACL2RMIX_WIDTH 1
/* DACL2RMIX */
#define WM8985_DACR2LMIX 0x0020
/* DACR2LMIX */
#define WM8985_DACR2LMIX_MASK 0x0020
/* DACR2LMIX */
#define WM8985_DACR2LMIX_SHIFT 5
/* DACR2LMIX */
#define WM8985_DACR2LMIX_WIDTH 1
/* DACR2LMIX */
#define WM8985_OUT4BOOST 0x0010
/* OUT4BOOST */
#define WM8985_OUT4BOOST_MASK 0x0010
/* OUT4BOOST */
#define WM8985_OUT4BOOST_SHIFT 4
/* OUT4BOOST */
#define WM8985_OUT4BOOST_WIDTH 1
/* OUT4BOOST */
#define WM8985_OUT3BOOST 0x0008
/* OUT3BOOST */
#define WM8985_OUT3BOOST_MASK 0x0008
/* OUT3BOOST */
#define WM8985_OUT3BOOST_SHIFT 3
/* OUT3BOOST */
#define WM8985_OUT3BOOST_WIDTH 1
/* OUT3BOOST */
#define WM8985_TSOPCTRL 0x0004
/* TSOPCTRL */
#define WM8985_TSOPCTRL_MASK 0x0004
/* TSOPCTRL */
#define WM8985_TSOPCTRL_SHIFT 2
/* TSOPCTRL */
#define WM8985_TSOPCTRL_WIDTH 1
/* TSOPCTRL */
#define WM8985_TSDEN 0x0002
/* TSDEN */
#define WM8985_TSDEN_MASK 0x0002
/* TSDEN */
#define WM8985_TSDEN_SHIFT 1
/* TSDEN */
#define WM8985_TSDEN_WIDTH 1
/* TSDEN */
#define WM8985_VROI 0x0001
/* VROI */
#define WM8985_VROI_MASK 0x0001
/* VROI */
#define WM8985_VROI_SHIFT 0
/* VROI */
#define WM8985_VROI_WIDTH 1
/* VROI */
/*
* R50 (0x32) - Left mixer ctrl
*/
#define WM8985_AUXLMIXVOL_MASK 0x01C0
/* AUXLMIXVOL - [8:6] */
#define WM8985_AUXLMIXVOL_SHIFT 6
/* AUXLMIXVOL - [8:6] */
#define WM8985_AUXLMIXVOL_WIDTH 3
/* AUXLMIXVOL - [8:6] */
#define WM8985_AUXL2LMIX 0x0020
/* AUXL2LMIX */
#define WM8985_AUXL2LMIX_MASK 0x0020
/* AUXL2LMIX */
#define WM8985_AUXL2LMIX_SHIFT 5
/* AUXL2LMIX */
#define WM8985_AUXL2LMIX_WIDTH 1
/* AUXL2LMIX */
#define WM8985_BYPLMIXVOL_MASK 0x001C
/* BYPLMIXVOL - [4:2] */
#define WM8985_BYPLMIXVOL_SHIFT 2
/* BYPLMIXVOL - [4:2] */
#define WM8985_BYPLMIXVOL_WIDTH 3
/* BYPLMIXVOL - [4:2] */
#define WM8985_BYPL2LMIX 0x0002
/* BYPL2LMIX */
#define WM8985_BYPL2LMIX_MASK 0x0002
/* BYPL2LMIX */
#define WM8985_BYPL2LMIX_SHIFT 1
/* BYPL2LMIX */
#define WM8985_BYPL2LMIX_WIDTH 1
/* BYPL2LMIX */
#define WM8985_DACL2LMIX 0x0001
/* DACL2LMIX */
#define WM8985_DACL2LMIX_MASK 0x0001
/* DACL2LMIX */
#define WM8985_DACL2LMIX_SHIFT 0
/* DACL2LMIX */
#define WM8985_DACL2LMIX_WIDTH 1
/* DACL2LMIX */
/*
* R51 (0x33) - Right mixer ctrl
*/
#define WM8985_AUXRMIXVOL_MASK 0x01C0
/* AUXRMIXVOL - [8:6] */
#define WM8985_AUXRMIXVOL_SHIFT 6
/* AUXRMIXVOL - [8:6] */
#define WM8985_AUXRMIXVOL_WIDTH 3
/* AUXRMIXVOL - [8:6] */
#define WM8985_AUXR2RMIX 0x0020
/* AUXR2RMIX */
#define WM8985_AUXR2RMIX_MASK 0x0020
/* AUXR2RMIX */
#define WM8985_AUXR2RMIX_SHIFT 5
/* AUXR2RMIX */
#define WM8985_AUXR2RMIX_WIDTH 1
/* AUXR2RMIX */
#define WM8985_BYPRMIXVOL_MASK 0x001C
/* BYPRMIXVOL - [4:2] */
#define WM8985_BYPRMIXVOL_SHIFT 2
/* BYPRMIXVOL - [4:2] */
#define WM8985_BYPRMIXVOL_WIDTH 3
/* BYPRMIXVOL - [4:2] */
#define WM8985_BYPR2RMIX 0x0002
/* BYPR2RMIX */
#define WM8985_BYPR2RMIX_MASK 0x0002
/* BYPR2RMIX */
#define WM8985_BYPR2RMIX_SHIFT 1
/* BYPR2RMIX */
#define WM8985_BYPR2RMIX_WIDTH 1
/* BYPR2RMIX */
#define WM8985_DACR2RMIX 0x0001
/* DACR2RMIX */
#define WM8985_DACR2RMIX_MASK 0x0001
/* DACR2RMIX */
#define WM8985_DACR2RMIX_SHIFT 0
/* DACR2RMIX */
#define WM8985_DACR2RMIX_WIDTH 1
/* DACR2RMIX */
/*
* R52 (0x34) - LOUT1 (HP) volume ctrl
*/
#define WM8985_OUT1VU 0x0100
/* OUT1VU */
#define WM8985_OUT1VU_MASK 0x0100
/* OUT1VU */
#define WM8985_OUT1VU_SHIFT 8
/* OUT1VU */
#define WM8985_OUT1VU_WIDTH 1
/* OUT1VU */
#define WM8985_LOUT1ZC 0x0080
/* LOUT1ZC */
#define WM8985_LOUT1ZC_MASK 0x0080
/* LOUT1ZC */
#define WM8985_LOUT1ZC_SHIFT 7
/* LOUT1ZC */
#define WM8985_LOUT1ZC_WIDTH 1
/* LOUT1ZC */
#define WM8985_LOUT1MUTE 0x0040
/* LOUT1MUTE */
#define WM8985_LOUT1MUTE_MASK 0x0040
/* LOUT1MUTE */
#define WM8985_LOUT1MUTE_SHIFT 6
/* LOUT1MUTE */
#define WM8985_LOUT1MUTE_WIDTH 1
/* LOUT1MUTE */
#define WM8985_LOUT1VOL_MASK 0x003F
/* LOUT1VOL - [5:0] */
#define WM8985_LOUT1VOL_SHIFT 0
/* LOUT1VOL - [5:0] */
#define WM8985_LOUT1VOL_WIDTH 6
/* LOUT1VOL - [5:0] */
/*
* R53 (0x35) - ROUT1 (HP) volume ctrl
*/
#define WM8985_OUT1VU 0x0100
/* OUT1VU */
#define WM8985_OUT1VU_MASK 0x0100
/* OUT1VU */
#define WM8985_OUT1VU_SHIFT 8
/* OUT1VU */
#define WM8985_OUT1VU_WIDTH 1
/* OUT1VU */
#define WM8985_ROUT1ZC 0x0080
/* ROUT1ZC */
#define WM8985_ROUT1ZC_MASK 0x0080
/* ROUT1ZC */
#define WM8985_ROUT1ZC_SHIFT 7
/* ROUT1ZC */
#define WM8985_ROUT1ZC_WIDTH 1
/* ROUT1ZC */
#define WM8985_ROUT1MUTE 0x0040
/* ROUT1MUTE */
#define WM8985_ROUT1MUTE_MASK 0x0040
/* ROUT1MUTE */
#define WM8985_ROUT1MUTE_SHIFT 6
/* ROUT1MUTE */
#define WM8985_ROUT1MUTE_WIDTH 1
/* ROUT1MUTE */
#define WM8985_ROUT1VOL_MASK 0x003F
/* ROUT1VOL - [5:0] */
#define WM8985_ROUT1VOL_SHIFT 0
/* ROUT1VOL - [5:0] */
#define WM8985_ROUT1VOL_WIDTH 6
/* ROUT1VOL - [5:0] */
/*
* R54 (0x36) - LOUT2 (SPK) volume ctrl
*/
#define WM8985_OUT2VU 0x0100
/* OUT2VU */
#define WM8985_OUT2VU_MASK 0x0100
/* OUT2VU */
#define WM8985_OUT2VU_SHIFT 8
/* OUT2VU */
#define WM8985_OUT2VU_WIDTH 1
/* OUT2VU */
#define WM8985_LOUT2ZC 0x0080
/* LOUT2ZC */
#define WM8985_LOUT2ZC_MASK 0x0080
/* LOUT2ZC */
#define WM8985_LOUT2ZC_SHIFT 7
/* LOUT2ZC */
#define WM8985_LOUT2ZC_WIDTH 1
/* LOUT2ZC */
#define WM8985_LOUT2MUTE 0x0040
/* LOUT2MUTE */
#define WM8985_LOUT2MUTE_MASK 0x0040
/* LOUT2MUTE */
#define WM8985_LOUT2MUTE_SHIFT 6
/* LOUT2MUTE */
#define WM8985_LOUT2MUTE_WIDTH 1
/* LOUT2MUTE */
#define WM8985_LOUT2VOL_MASK 0x003F
/* LOUT2VOL - [5:0] */
#define WM8985_LOUT2VOL_SHIFT 0
/* LOUT2VOL - [5:0] */
#define WM8985_LOUT2VOL_WIDTH 6
/* LOUT2VOL - [5:0] */
/*
* R55 (0x37) - ROUT2 (SPK) volume ctrl
*/
#define WM8985_OUT2VU 0x0100
/* OUT2VU */
#define WM8985_OUT2VU_MASK 0x0100
/* OUT2VU */
#define WM8985_OUT2VU_SHIFT 8
/* OUT2VU */
#define WM8985_OUT2VU_WIDTH 1
/* OUT2VU */
#define WM8985_ROUT2ZC 0x0080
/* ROUT2ZC */
#define WM8985_ROUT2ZC_MASK 0x0080
/* ROUT2ZC */
#define WM8985_ROUT2ZC_SHIFT 7
/* ROUT2ZC */
#define WM8985_ROUT2ZC_WIDTH 1
/* ROUT2ZC */
#define WM8985_ROUT2MUTE 0x0040
/* ROUT2MUTE */
#define WM8985_ROUT2MUTE_MASK 0x0040
/* ROUT2MUTE */
#define WM8985_ROUT2MUTE_SHIFT 6
/* ROUT2MUTE */
#define WM8985_ROUT2MUTE_WIDTH 1
/* ROUT2MUTE */
#define WM8985_ROUT2VOL_MASK 0x003F
/* ROUT2VOL - [5:0] */
#define WM8985_ROUT2VOL_SHIFT 0
/* ROUT2VOL - [5:0] */
#define WM8985_ROUT2VOL_WIDTH 6
/* ROUT2VOL - [5:0] */
/*
* R56 (0x38) - OUT3 mixer ctrl
*/
#define WM8985_OUT3MUTE 0x0040
/* OUT3MUTE */
#define WM8985_OUT3MUTE_MASK 0x0040
/* OUT3MUTE */
#define WM8985_OUT3MUTE_SHIFT 6
/* OUT3MUTE */
#define WM8985_OUT3MUTE_WIDTH 1
/* OUT3MUTE */
#define WM8985_OUT4_2OUT3 0x0008
/* OUT4_2OUT3 */
#define WM8985_OUT4_2OUT3_MASK 0x0008
/* OUT4_2OUT3 */
#define WM8985_OUT4_2OUT3_SHIFT 3
/* OUT4_2OUT3 */
#define WM8985_OUT4_2OUT3_WIDTH 1
/* OUT4_2OUT3 */
#define WM8985_BYPL2OUT3 0x0004
/* BYPL2OUT3 */
#define WM8985_BYPL2OUT3_MASK 0x0004
/* BYPL2OUT3 */
#define WM8985_BYPL2OUT3_SHIFT 2
/* BYPL2OUT3 */
#define WM8985_BYPL2OUT3_WIDTH 1
/* BYPL2OUT3 */
#define WM8985_LMIX2OUT3 0x0002
/* LMIX2OUT3 */
#define WM8985_LMIX2OUT3_MASK 0x0002
/* LMIX2OUT3 */
#define WM8985_LMIX2OUT3_SHIFT 1
/* LMIX2OUT3 */
#define WM8985_LMIX2OUT3_WIDTH 1
/* LMIX2OUT3 */
#define WM8985_LDAC2OUT3 0x0001
/* LDAC2OUT3 */
#define WM8985_LDAC2OUT3_MASK 0x0001
/* LDAC2OUT3 */
#define WM8985_LDAC2OUT3_SHIFT 0
/* LDAC2OUT3 */
#define WM8985_LDAC2OUT3_WIDTH 1
/* LDAC2OUT3 */
/*
* R57 (0x39) - OUT4 (MONO) mix ctrl
*/
#define WM8985_OUT3_2OUT4 0x0080
/* OUT3_2OUT4 */
#define WM8985_OUT3_2OUT4_MASK 0x0080
/* OUT3_2OUT4 */
#define WM8985_OUT3_2OUT4_SHIFT 7
/* OUT3_2OUT4 */
#define WM8985_OUT3_2OUT4_WIDTH 1
/* OUT3_2OUT4 */
#define WM8985_OUT4MUTE 0x0040
/* OUT4MUTE */
#define WM8985_OUT4MUTE_MASK 0x0040
/* OUT4MUTE */
#define WM8985_OUT4MUTE_SHIFT 6
/* OUT4MUTE */
#define WM8985_OUT4MUTE_WIDTH 1
/* OUT4MUTE */
#define WM8985_OUT4ATTN 0x0020
/* OUT4ATTN */
#define WM8985_OUT4ATTN_MASK 0x0020
/* OUT4ATTN */
#define WM8985_OUT4ATTN_SHIFT 5
/* OUT4ATTN */
#define WM8985_OUT4ATTN_WIDTH 1
/* OUT4ATTN */
#define WM8985_LMIX2OUT4 0x0010
/* LMIX2OUT4 */
#define WM8985_LMIX2OUT4_MASK 0x0010
/* LMIX2OUT4 */
#define WM8985_LMIX2OUT4_SHIFT 4
/* LMIX2OUT4 */
#define WM8985_LMIX2OUT4_WIDTH 1
/* LMIX2OUT4 */
#define WM8985_LDAC2OUT4 0x0008
/* LDAC2OUT4 */
#define WM8985_LDAC2OUT4_MASK 0x0008
/* LDAC2OUT4 */
#define WM8985_LDAC2OUT4_SHIFT 3
/* LDAC2OUT4 */
#define WM8985_LDAC2OUT4_WIDTH 1
/* LDAC2OUT4 */
#define WM8985_BYPR2OUT4 0x0004
/* BYPR2OUT4 */
#define WM8985_BYPR2OUT4_MASK 0x0004
/* BYPR2OUT4 */
#define WM8985_BYPR2OUT4_SHIFT 2
/* BYPR2OUT4 */
#define WM8985_BYPR2OUT4_WIDTH 1
/* BYPR2OUT4 */
#define WM8985_RMIX2OUT4 0x0002
/* RMIX2OUT4 */
#define WM8985_RMIX2OUT4_MASK 0x0002
/* RMIX2OUT4 */
#define WM8985_RMIX2OUT4_SHIFT 1
/* RMIX2OUT4 */
#define WM8985_RMIX2OUT4_WIDTH 1
/* RMIX2OUT4 */
#define WM8985_RDAC2OUT4 0x0001
/* RDAC2OUT4 */
#define WM8985_RDAC2OUT4_MASK 0x0001
/* RDAC2OUT4 */
#define WM8985_RDAC2OUT4_SHIFT 0
/* RDAC2OUT4 */
#define WM8985_RDAC2OUT4_WIDTH 1
/* RDAC2OUT4 */
/*
* R60 (0x3C) - OUTPUT ctrl
*/
#define WM8985_VIDBUFFTST_MASK 0x01E0
/* VIDBUFFTST - [8:5] */
#define WM8985_VIDBUFFTST_SHIFT 5
/* VIDBUFFTST - [8:5] */
#define WM8985_VIDBUFFTST_WIDTH 4
/* VIDBUFFTST - [8:5] */
#define WM8985_HPTOG 0x0008
/* HPTOG */
#define WM8985_HPTOG_MASK 0x0008
/* HPTOG */
#define WM8985_HPTOG_SHIFT 3
/* HPTOG */
#define WM8985_HPTOG_WIDTH 1
/* HPTOG */
/*
* R61 (0x3D) - BIAS CTRL
*/
#define WM8985_BIASCUT 0x0100
/* BIASCUT */
#define WM8985_BIASCUT_MASK 0x0100
/* BIASCUT */
#define WM8985_BIASCUT_SHIFT 8
/* BIASCUT */
#define WM8985_BIASCUT_WIDTH 1
/* BIASCUT */
#define WM8985_HALFIPBIAS 0x0080
/* HALFIPBIAS */
#define WM8985_HALFIPBIAS_MASK 0x0080
/* HALFIPBIAS */
#define WM8985_HALFIPBIAS_SHIFT 7
/* HALFIPBIAS */
#define WM8985_HALFIPBIAS_WIDTH 1
/* HALFIPBIAS */
#define WM8985_VBBIASTST_MASK 0x0060
/* VBBIASTST - [6:5] */
#define WM8985_VBBIASTST_SHIFT 5
/* VBBIASTST - [6:5] */
#define WM8985_VBBIASTST_WIDTH 2
/* VBBIASTST - [6:5] */
#define WM8985_BUFBIAS_MASK 0x0018
/* BUFBIAS - [4:3] */
#define WM8985_BUFBIAS_SHIFT 3
/* BUFBIAS - [4:3] */
#define WM8985_BUFBIAS_WIDTH 2
/* BUFBIAS - [4:3] */
#define WM8985_ADCBIAS_MASK 0x0006
/* ADCBIAS - [2:1] */
#define WM8985_ADCBIAS_SHIFT 1
/* ADCBIAS - [2:1] */
#define WM8985_ADCBIAS_WIDTH 2
/* ADCBIAS - [2:1] */
#define WM8985_HALFOPBIAS 0x0001
/* HALFOPBIAS */
#define WM8985_HALFOPBIAS_MASK 0x0001
/* HALFOPBIAS */
#define WM8985_HALFOPBIAS_SHIFT 0
/* HALFOPBIAS */
#define WM8985_HALFOPBIAS_WIDTH 1
/* HALFOPBIAS */
enum
clk_src
{
WM8985_CLKSRC_MCLK
,
WM8985_CLKSRC_PLL
};
#define WM8985_PLL 0
#endif
sound/soc/codecs/wm8988.c
浏览文件 @
611ad378
...
@@ -809,7 +809,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8988 = {
...
@@ -809,7 +809,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8988 = {
.
suspend
=
wm8988_suspend
,
.
suspend
=
wm8988_suspend
,
.
resume
=
wm8988_resume
,
.
resume
=
wm8988_resume
,
.
set_bias_level
=
wm8988_set_bias_level
,
.
set_bias_level
=
wm8988_set_bias_level
,
.
reg_cache_size
=
sizeof
(
wm8988_reg
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm8988_reg
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
wm8988_reg
,
.
reg_cache_default
=
wm8988_reg
,
};
};
...
...
sound/soc/codecs/wm8990.c
浏览文件 @
611ad378
...
@@ -1354,7 +1354,6 @@ static int wm8990_probe(struct snd_soc_codec *codec)
...
@@ -1354,7 +1354,6 @@ static int wm8990_probe(struct snd_soc_codec *codec)
wm8990_reset
(
codec
);
wm8990_reset
(
codec
);
/* charge output caps */
/* charge output caps */
codec
->
bias_level
=
SND_SOC_BIAS_OFF
;
wm8990_set_bias_level
(
codec
,
SND_SOC_BIAS_STANDBY
);
wm8990_set_bias_level
(
codec
,
SND_SOC_BIAS_STANDBY
);
reg
=
snd_soc_read
(
codec
,
WM8990_AUDIO_INTERFACE_4
);
reg
=
snd_soc_read
(
codec
,
WM8990_AUDIO_INTERFACE_4
);
...
...
sound/soc/codecs/wm8993.c
浏览文件 @
611ad378
...
@@ -1586,7 +1586,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8993 = {
...
@@ -1586,7 +1586,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8993 = {
.
suspend
=
wm8993_suspend
,
.
suspend
=
wm8993_suspend
,
.
resume
=
wm8993_resume
,
.
resume
=
wm8993_resume
,
.
set_bias_level
=
wm8993_set_bias_level
,
.
set_bias_level
=
wm8993_set_bias_level
,
.
reg_cache_size
=
sizeof
(
wm8993_reg_defaults
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm8993_reg_defaults
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
wm8993_reg_defaults
,
.
reg_cache_default
=
wm8993_reg_defaults
,
.
volatile_register
=
wm8993_volatile
,
.
volatile_register
=
wm8993_volatile
,
...
...
sound/soc/codecs/wm9081.c
浏览文件 @
611ad378
...
@@ -1317,7 +1317,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm9081 = {
...
@@ -1317,7 +1317,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm9081 = {
.
suspend
=
wm9081_suspend
,
.
suspend
=
wm9081_suspend
,
.
resume
=
wm9081_resume
,
.
resume
=
wm9081_resume
,
.
set_bias_level
=
wm9081_set_bias_level
,
.
set_bias_level
=
wm9081_set_bias_level
,
.
reg_cache_size
=
sizeof
(
wm9081_reg_defaults
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm9081_reg_defaults
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_default
=
wm9081_reg_defaults
,
.
reg_cache_default
=
wm9081_reg_defaults
,
.
volatile_register
=
wm9081_volatile_register
,
.
volatile_register
=
wm9081_volatile_register
,
...
...
sound/soc/codecs/wm9705.c
浏览文件 @
611ad378
...
@@ -385,7 +385,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm9705 = {
...
@@ -385,7 +385,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm9705 = {
.
resume
=
wm9705_soc_resume
,
.
resume
=
wm9705_soc_resume
,
.
read
=
ac97_read
,
.
read
=
ac97_read
,
.
write
=
ac97_write
,
.
write
=
ac97_write
,
.
reg_cache_size
=
sizeof
(
wm9705_reg
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm9705_reg
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_step
=
2
,
.
reg_cache_step
=
2
,
.
reg_cache_default
=
wm9705_reg
,
.
reg_cache_default
=
wm9705_reg
,
...
...
sound/soc/codecs/wm9712.c
浏览文件 @
611ad378
...
@@ -674,7 +674,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm9712 = {
...
@@ -674,7 +674,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm9712 = {
.
read
=
ac97_read
,
.
read
=
ac97_read
,
.
write
=
ac97_write
,
.
write
=
ac97_write
,
.
set_bias_level
=
wm9712_set_bias_level
,
.
set_bias_level
=
wm9712_set_bias_level
,
.
reg_cache_size
=
sizeof
(
wm9712_reg
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm9712_reg
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_step
=
2
,
.
reg_cache_step
=
2
,
.
reg_cache_default
=
wm9712_reg
,
.
reg_cache_default
=
wm9712_reg
,
...
...
sound/soc/codecs/wm9713.c
浏览文件 @
611ad378
...
@@ -1257,7 +1257,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm9713 = {
...
@@ -1257,7 +1257,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm9713 = {
.
read
=
ac97_read
,
.
read
=
ac97_read
,
.
write
=
ac97_write
,
.
write
=
ac97_write
,
.
set_bias_level
=
wm9713_set_bias_level
,
.
set_bias_level
=
wm9713_set_bias_level
,
.
reg_cache_size
=
sizeof
(
wm9713_reg
),
.
reg_cache_size
=
ARRAY_SIZE
(
wm9713_reg
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_word_size
=
sizeof
(
u16
),
.
reg_cache_step
=
2
,
.
reg_cache_step
=
2
,
.
reg_cache_default
=
wm9713_reg
,
.
reg_cache_default
=
wm9713_reg
,
...
...
sound/soc/kirkwood/kirkwood-dma.c
浏览文件 @
611ad378
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
* kirkwood-dma.c
* kirkwood-dma.c
*
*
* (c) 2010 Arnaud Patard <apatard@mandriva.com>
* (c) 2010 Arnaud Patard <apatard@mandriva.com>
* (c) 2010 Arnaud Patard <arnaud.patard@rtp-net.org>
*
*
* This program is free software; you can redistribute it and/or modify it
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* under the terms of the GNU General Public License as published by the
...
@@ -397,7 +398,7 @@ static void __exit kirkwood_pcm_exit(void)
...
@@ -397,7 +398,7 @@ static void __exit kirkwood_pcm_exit(void)
}
}
module_exit
(
kirkwood_pcm_exit
);
module_exit
(
kirkwood_pcm_exit
);
MODULE_AUTHOR
(
"Arnaud Patard <a
patard@mandriva.com
>"
);
MODULE_AUTHOR
(
"Arnaud Patard <a
rnaud.patard@rtp-net.org
>"
);
MODULE_DESCRIPTION
(
"Marvell Kirkwood Audio DMA module"
);
MODULE_DESCRIPTION
(
"Marvell Kirkwood Audio DMA module"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_ALIAS
(
"platform:kirkwood-pcm-audio"
);
MODULE_ALIAS
(
"platform:kirkwood-pcm-audio"
);
sound/soc/kirkwood/kirkwood-i2s.c
浏览文件 @
611ad378
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
* kirkwood-i2s.c
* kirkwood-i2s.c
*
*
* (c) 2010 Arnaud Patard <apatard@mandriva.com>
* (c) 2010 Arnaud Patard <apatard@mandriva.com>
* (c) 2010 Arnaud Patard <arnaud.patard@rtp-net.org>
*
*
* This program is free software; you can redistribute it and/or modify it
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* under the terms of the GNU General Public License as published by the
...
@@ -495,7 +496,7 @@ static void __exit kirkwood_i2s_exit(void)
...
@@ -495,7 +496,7 @@ static void __exit kirkwood_i2s_exit(void)
module_exit
(
kirkwood_i2s_exit
);
module_exit
(
kirkwood_i2s_exit
);
/* Module information */
/* Module information */
MODULE_AUTHOR
(
"Arnaud Patard, <a
patard@mandriva.com
>"
);
MODULE_AUTHOR
(
"Arnaud Patard, <a
rnaud.patard@rtp-net.org
>"
);
MODULE_DESCRIPTION
(
"Kirkwood I2S SoC Interface"
);
MODULE_DESCRIPTION
(
"Kirkwood I2S SoC Interface"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_ALIAS
(
"platform:kirkwood-i2s"
);
MODULE_ALIAS
(
"platform:kirkwood-i2s"
);
sound/soc/kirkwood/kirkwood-openrd.c
浏览文件 @
611ad378
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
* kirkwood-openrd.c
* kirkwood-openrd.c
*
*
* (c) 2010 Arnaud Patard <apatard@mandriva.com>
* (c) 2010 Arnaud Patard <apatard@mandriva.com>
* (c) 2010 Arnaud Patard <arnaud.patard@rtp-net.org>
*
*
* This program is free software; you can redistribute it and/or modify it
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* under the terms of the GNU General Public License as published by the
...
@@ -113,7 +114,7 @@ module_init(openrd_client_init);
...
@@ -113,7 +114,7 @@ module_init(openrd_client_init);
module_exit
(
openrd_client_exit
);
module_exit
(
openrd_client_exit
);
/* Module information */
/* Module information */
MODULE_AUTHOR
(
"Arnaud Patard <a
patard@mandriva.com
>"
);
MODULE_AUTHOR
(
"Arnaud Patard <a
rnaud.patard@rtp-net.org
>"
);
MODULE_DESCRIPTION
(
"ALSA SoC OpenRD Client"
);
MODULE_DESCRIPTION
(
"ALSA SoC OpenRD Client"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_ALIAS
(
"platform:soc-audio"
);
MODULE_ALIAS
(
"platform:soc-audio"
);
sound/soc/s3c24xx/s3c-pcm.c
浏览文件 @
611ad378
...
@@ -78,7 +78,7 @@ static void s3c_pcm_snd_txctrl(struct s3c_pcm_info *pcm, int on)
...
@@ -78,7 +78,7 @@ static void s3c_pcm_snd_txctrl(struct s3c_pcm_info *pcm, int on)
ctl
|=
S3C_PCM_CTL_TXDMA_EN
;
ctl
|=
S3C_PCM_CTL_TXDMA_EN
;
ctl
|=
S3C_PCM_CTL_TXFIFO_EN
;
ctl
|=
S3C_PCM_CTL_TXFIFO_EN
;
ctl
|=
S3C_PCM_CTL_ENABLE
;
ctl
|=
S3C_PCM_CTL_ENABLE
;
ctl
|=
(
0x
20
<<
S3C_PCM_CTL_TXDIPSTICK_SHIFT
);
ctl
|=
(
0x
4
<<
S3C_PCM_CTL_TXDIPSTICK_SHIFT
);
clkctl
|=
S3C_PCM_CLKCTL_SERCLK_EN
;
clkctl
|=
S3C_PCM_CLKCTL_SERCLK_EN
;
}
else
{
}
else
{
ctl
&=
~
S3C_PCM_CTL_TXDMA_EN
;
ctl
&=
~
S3C_PCM_CTL_TXDMA_EN
;
...
@@ -102,11 +102,14 @@ static void s3c_pcm_snd_rxctrl(struct s3c_pcm_info *pcm, int on)
...
@@ -102,11 +102,14 @@ static void s3c_pcm_snd_rxctrl(struct s3c_pcm_info *pcm, int on)
ctl
=
readl
(
regs
+
S3C_PCM_CTL
);
ctl
=
readl
(
regs
+
S3C_PCM_CTL
);
clkctl
=
readl
(
regs
+
S3C_PCM_CLKCTL
);
clkctl
=
readl
(
regs
+
S3C_PCM_CLKCTL
);
ctl
&=
~
(
S3C_PCM_CTL_RXDIPSTICK_MASK
<<
S3C_PCM_CTL_RXDIPSTICK_SHIFT
);
if
(
on
)
{
if
(
on
)
{
ctl
|=
S3C_PCM_CTL_RXDMA_EN
;
ctl
|=
S3C_PCM_CTL_RXDMA_EN
;
ctl
|=
S3C_PCM_CTL_RXFIFO_EN
;
ctl
|=
S3C_PCM_CTL_RXFIFO_EN
;
ctl
|=
S3C_PCM_CTL_ENABLE
;
ctl
|=
S3C_PCM_CTL_ENABLE
;
ctl
|=
(
0x20
<<
S3C_PCM_CTL_RXDIPSTICK_SHIFT
);
clkctl
|=
S3C_PCM_CLKCTL_SERCLK_EN
;
clkctl
|=
S3C_PCM_CLKCTL_SERCLK_EN
;
}
else
{
}
else
{
ctl
&=
~
S3C_PCM_CTL_RXDMA_EN
;
ctl
&=
~
S3C_PCM_CTL_RXDMA_EN
;
...
@@ -361,8 +364,6 @@ static struct snd_soc_dai_ops s3c_pcm_dai_ops = {
...
@@ -361,8 +364,6 @@ static struct snd_soc_dai_ops s3c_pcm_dai_ops = {
#define S3C_PCM_RATES SNDRV_PCM_RATE_8000_96000
#define S3C_PCM_RATES SNDRV_PCM_RATE_8000_96000
#define S3C_PCM_DAI_DECLARE \
#define S3C_PCM_DAI_DECLARE \
{ \
.name = "samsung-dai", \
.symmetric_rates = 1, \
.symmetric_rates = 1, \
.ops = &s3c_pcm_dai_ops, \
.ops = &s3c_pcm_dai_ops, \
.playback = { \
.playback = { \
...
@@ -376,12 +377,17 @@ static struct snd_soc_dai_ops s3c_pcm_dai_ops = {
...
@@ -376,12 +377,17 @@ static struct snd_soc_dai_ops s3c_pcm_dai_ops = {
.channels_max = 2, \
.channels_max = 2, \
.rates = S3C_PCM_RATES, \
.rates = S3C_PCM_RATES, \
.formats = SNDRV_PCM_FMTBIT_S16_LE, \
.formats = SNDRV_PCM_FMTBIT_S16_LE, \
}, \
}
}
struct
snd_soc_dai_driver
s3c_pcm_dai
[]
=
{
struct
snd_soc_dai_driver
s3c_pcm_dai
[]
=
{
S3C_PCM_DAI_DECLARE
,
[
0
]
=
{
S3C_PCM_DAI_DECLARE
,
.
name
=
"samsung-pcm.0"
,
S3C_PCM_DAI_DECLARE
,
},
[
1
]
=
{
.
name
=
"samsung-pcm.1"
,
S3C_PCM_DAI_DECLARE
,
},
};
};
EXPORT_SYMBOL_GPL
(
s3c_pcm_dai
);
EXPORT_SYMBOL_GPL
(
s3c_pcm_dai
);
...
@@ -465,7 +471,7 @@ static __devinit int s3c_pcm_dev_probe(struct platform_device *pdev)
...
@@ -465,7 +471,7 @@ static __devinit int s3c_pcm_dev_probe(struct platform_device *pdev)
}
}
clk_enable
(
pcm
->
pclk
);
clk_enable
(
pcm
->
pclk
);
ret
=
snd_soc_register_dai
(
&
pdev
->
dev
,
s3c_pcm_dai
);
ret
=
snd_soc_register_dai
(
&
pdev
->
dev
,
&
s3c_pcm_dai
[
pdev
->
id
]
);
if
(
ret
!=
0
)
{
if
(
ret
!=
0
)
{
dev_err
(
&
pdev
->
dev
,
"failed to get pcm_clock
\n
"
);
dev_err
(
&
pdev
->
dev
,
"failed to get pcm_clock
\n
"
);
goto
err5
;
goto
err5
;
...
@@ -522,7 +528,7 @@ static struct platform_driver s3c_pcm_driver = {
...
@@ -522,7 +528,7 @@ static struct platform_driver s3c_pcm_driver = {
.
probe
=
s3c_pcm_dev_probe
,
.
probe
=
s3c_pcm_dev_probe
,
.
remove
=
s3c_pcm_dev_remove
,
.
remove
=
s3c_pcm_dev_remove
,
.
driver
=
{
.
driver
=
{
.
name
=
"samsung-pcm
-audio
"
,
.
name
=
"samsung-pcm"
,
.
owner
=
THIS_MODULE
,
.
owner
=
THIS_MODULE
,
},
},
};
};
...
@@ -543,4 +549,4 @@ module_exit(s3c_pcm_exit);
...
@@ -543,4 +549,4 @@ module_exit(s3c_pcm_exit);
MODULE_AUTHOR
(
"Jaswinder Singh, <jassi.brar@samsung.com>"
);
MODULE_AUTHOR
(
"Jaswinder Singh, <jassi.brar@samsung.com>"
);
MODULE_DESCRIPTION
(
"S3C PCM Controller Driver"
);
MODULE_DESCRIPTION
(
"S3C PCM Controller Driver"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_ALIAS
(
"platform:samsung-pcm
-audio
"
);
MODULE_ALIAS
(
"platform:samsung-pcm"
);
sound/soc/s3c24xx/s3c-pcm.h
浏览文件 @
611ad378
...
@@ -22,7 +22,8 @@
...
@@ -22,7 +22,8 @@
/* PCM_CTL Bit-Fields */
/* PCM_CTL Bit-Fields */
#define S3C_PCM_CTL_TXDIPSTICK_MASK (0x3f)
#define S3C_PCM_CTL_TXDIPSTICK_MASK (0x3f)
#define S3C_PCM_CTL_TXDIPSTICK_SHIFT (13)
#define S3C_PCM_CTL_TXDIPSTICK_SHIFT (13)
#define S3C_PCM_CTL_RXDIPSTICK_MSK (0x3f<<7)
#define S3C_PCM_CTL_RXDIPSTICK_MASK (0x3f)
#define S3C_PCM_CTL_RXDIPSTICK_SHIFT (7)
#define S3C_PCM_CTL_TXDMA_EN (0x1<<6)
#define S3C_PCM_CTL_TXDMA_EN (0x1<<6)
#define S3C_PCM_CTL_RXDMA_EN (0x1<<5)
#define S3C_PCM_CTL_RXDMA_EN (0x1<<5)
#define S3C_PCM_CTL_TXMSB_AFTER_FSYNC (0x1<<4)
#define S3C_PCM_CTL_TXMSB_AFTER_FSYNC (0x1<<4)
...
...
sound/soc/s3c24xx/smdk2443_wm9710.c
浏览文件 @
611ad378
...
@@ -28,7 +28,7 @@ static struct snd_soc_dai_link smdk2443_dai[] = {
...
@@ -28,7 +28,7 @@ static struct snd_soc_dai_link smdk2443_dai[] = {
{
{
.
name
=
"AC97"
,
.
name
=
"AC97"
,
.
stream_name
=
"AC97 HiFi"
,
.
stream_name
=
"AC97 HiFi"
,
.
cpu_dai_name
=
"s3c-ac97
-dai
"
,
.
cpu_dai_name
=
"s3c-ac97"
,
.
codec_dai_name
=
"ac97-hifi"
,
.
codec_dai_name
=
"ac97-hifi"
,
.
codec_name
=
"ac97-codec"
,
.
codec_name
=
"ac97-codec"
,
.
platform_name
=
"s3c24xx-pcm-audio"
,
.
platform_name
=
"s3c24xx-pcm-audio"
,
...
...
sound/soc/s3c24xx/smdk64xx_wm8580.c
浏览文件 @
611ad378
...
@@ -242,7 +242,7 @@ static struct snd_soc_dai_link smdk64xx_dai[] = {
...
@@ -242,7 +242,7 @@ static struct snd_soc_dai_link smdk64xx_dai[] = {
};
};
static
struct
snd_soc_card
smdk64xx
=
{
static
struct
snd_soc_card
smdk64xx
=
{
.
name
=
"
smdk64xx
"
,
.
name
=
"
SMDK64xx 5.1
"
,
.
dai_link
=
smdk64xx_dai
,
.
dai_link
=
smdk64xx_dai
,
.
num_links
=
ARRAY_SIZE
(
smdk64xx_dai
),
.
num_links
=
ARRAY_SIZE
(
smdk64xx_dai
),
};
};
...
...
sound/soc/s3c24xx/smdk_wm9713.c
浏览文件 @
611ad378
...
@@ -47,7 +47,7 @@ static struct snd_soc_dai_link smdk_dai = {
...
@@ -47,7 +47,7 @@ static struct snd_soc_dai_link smdk_dai = {
.
name
=
"AC97"
,
.
name
=
"AC97"
,
.
stream_name
=
"AC97 PCM"
,
.
stream_name
=
"AC97 PCM"
,
.
platform_name
=
"s3c24xx-pcm-audio"
,
.
platform_name
=
"s3c24xx-pcm-audio"
,
.
cpu_dai_name
=
"s3c-ac97
-dai
"
,
.
cpu_dai_name
=
"s3c-ac97"
,
.
codec_dai_name
=
"wm9713-hifi"
,
.
codec_dai_name
=
"wm9713-hifi"
,
.
codec_name
=
"wm9713-codec"
,
.
codec_name
=
"wm9713-codec"
,
};
};
...
...
sound/soc/sh/Kconfig
浏览文件 @
611ad378
...
@@ -47,7 +47,7 @@ config SND_SH7760_AC97
...
@@ -47,7 +47,7 @@ config SND_SH7760_AC97
AC97 unit of the SH7760.
AC97 unit of the SH7760.
config SND_FSI_AK4642
config SND_FSI_AK4642
bool
"FSI-AK4642 sound support"
tristate
"FSI-AK4642 sound support"
depends on SND_SOC_SH4_FSI && I2C_SH_MOBILE
depends on SND_SOC_SH4_FSI && I2C_SH_MOBILE
select SND_SOC_AK4642
select SND_SOC_AK4642
help
help
...
@@ -55,7 +55,7 @@ config SND_FSI_AK4642
...
@@ -55,7 +55,7 @@ config SND_FSI_AK4642
FSI - AK4642 unit
FSI - AK4642 unit
config SND_FSI_DA7210
config SND_FSI_DA7210
bool
"FSI-DA7210 sound support"
tristate
"FSI-DA7210 sound support"
depends on SND_SOC_SH4_FSI && I2C_SH_MOBILE
depends on SND_SOC_SH4_FSI && I2C_SH_MOBILE
select SND_SOC_DA7210
select SND_SOC_DA7210
help
help
...
@@ -63,7 +63,7 @@ config SND_FSI_DA7210
...
@@ -63,7 +63,7 @@ config SND_FSI_DA7210
FSI - DA7210 unit
FSI - DA7210 unit
config SND_FSI_HDMI
config SND_FSI_HDMI
bool
"FSI-HDMI sound support"
tristate
"FSI-HDMI sound support"
depends on SND_SOC_SH4_FSI && FB_SH_MOBILE_HDMI
depends on SND_SOC_SH4_FSI && FB_SH_MOBILE_HDMI
help
help
This option enables generic sound support for the
This option enables generic sound support for the
...
...
sound/soc/sh/fsi-ak4642.c
浏览文件 @
611ad378
...
@@ -32,7 +32,7 @@ static struct snd_soc_dai_link fsi_dai_link = {
...
@@ -32,7 +32,7 @@ static struct snd_soc_dai_link fsi_dai_link = {
.
cpu_dai_name
=
"fsia-dai"
,
/* fsi A */
.
cpu_dai_name
=
"fsia-dai"
,
/* fsi A */
.
codec_dai_name
=
"ak4642-hifi"
,
.
codec_dai_name
=
"ak4642-hifi"
,
#ifdef CONFIG_MACH_AP4EVB
#ifdef CONFIG_MACH_AP4EVB
.
platform_name
=
"sh_fsi2
.0
"
,
.
platform_name
=
"sh_fsi2"
,
.
codec_name
=
"ak4642-codec.0-0013"
,
.
codec_name
=
"ak4642-codec.0-0013"
,
#else
#else
.
platform_name
=
"sh_fsi.0"
,
.
platform_name
=
"sh_fsi.0"
,
...
@@ -43,7 +43,7 @@ static struct snd_soc_dai_link fsi_dai_link = {
...
@@ -43,7 +43,7 @@ static struct snd_soc_dai_link fsi_dai_link = {
};
};
static
struct
snd_soc_card
fsi_soc_card
=
{
static
struct
snd_soc_card
fsi_soc_card
=
{
.
name
=
"FSI"
,
.
name
=
"FSI
(AK4642)
"
,
.
dai_link
=
&
fsi_dai_link
,
.
dai_link
=
&
fsi_dai_link
,
.
num_links
=
1
,
.
num_links
=
1
,
};
};
...
...
sound/soc/sh/fsi-da7210.c
浏览文件 @
611ad378
...
@@ -33,7 +33,7 @@ static struct snd_soc_dai_link fsi_da7210_dai = {
...
@@ -33,7 +33,7 @@ static struct snd_soc_dai_link fsi_da7210_dai = {
};
};
static
struct
snd_soc_card
fsi_soc_card
=
{
static
struct
snd_soc_card
fsi_soc_card
=
{
.
name
=
"FSI"
,
.
name
=
"FSI
(DA7210)
"
,
.
dai_link
=
&
fsi_da7210_dai
,
.
dai_link
=
&
fsi_da7210_dai
,
.
num_links
=
1
,
.
num_links
=
1
,
};
};
...
...
sound/soc/sh/fsi-hdmi.c
浏览文件 @
611ad378
...
@@ -11,7 +11,6 @@
...
@@ -11,7 +11,6 @@
#include <linux/platform_device.h>
#include <linux/platform_device.h>
#include <sound/sh_fsi.h>
#include <sound/sh_fsi.h>
#include <video/sh_mobile_hdmi.h>
static
struct
snd_soc_dai_link
fsi_dai_link
=
{
static
struct
snd_soc_dai_link
fsi_dai_link
=
{
.
name
=
"HDMI"
,
.
name
=
"HDMI"
,
...
@@ -23,7 +22,7 @@ static struct snd_soc_dai_link fsi_dai_link = {
...
@@ -23,7 +22,7 @@ static struct snd_soc_dai_link fsi_dai_link = {
};
};
static
struct
snd_soc_card
fsi_soc_card
=
{
static
struct
snd_soc_card
fsi_soc_card
=
{
.
name
=
"FSI"
,
.
name
=
"FSI
(SH MOBILE HDMI)
"
,
.
dai_link
=
&
fsi_dai_link
,
.
dai_link
=
&
fsi_dai_link
,
.
num_links
=
1
,
.
num_links
=
1
,
};
};
...
...
sound/soc/sh/fsi.c
浏览文件 @
611ad378
...
@@ -101,13 +101,10 @@
...
@@ -101,13 +101,10 @@
#define FSI_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE)
#define FSI_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE)
/************************************************************************
/*
* struct
*/
struct
************************************************************************/
struct
fsi_priv
{
struct
fsi_priv
{
void
__iomem
*
base
;
void
__iomem
*
base
;
struct
snd_pcm_substream
*
substream
;
struct
snd_pcm_substream
*
substream
;
...
@@ -142,13 +139,10 @@ struct fsi_master {
...
@@ -142,13 +139,10 @@ struct fsi_master {
spinlock_t
lock
;
spinlock_t
lock
;
};
};
/************************************************************************
/*
* basic read write function
*/
basic read write function
************************************************************************/
static
void
__fsi_reg_write
(
u32
reg
,
u32
data
)
static
void
__fsi_reg_write
(
u32
reg
,
u32
data
)
{
{
/* valid data area is 24bit */
/* valid data area is 24bit */
...
@@ -251,13 +245,10 @@ static void fsi_master_mask_set(struct fsi_master *master,
...
@@ -251,13 +245,10 @@ static void fsi_master_mask_set(struct fsi_master *master,
spin_unlock_irqrestore
(
&
master
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
master
->
lock
,
flags
);
}
}
/************************************************************************
/*
* basic function
*/
basic function
************************************************************************/
static
struct
fsi_master
*
fsi_get_master
(
struct
fsi_priv
*
fsi
)
static
struct
fsi_master
*
fsi_get_master
(
struct
fsi_priv
*
fsi
)
{
{
return
fsi
->
master
;
return
fsi
->
master
;
...
@@ -357,13 +348,63 @@ static int fsi_get_fifo_residue(struct fsi_priv *fsi, int is_play)
...
@@ -357,13 +348,63 @@ static int fsi_get_fifo_residue(struct fsi_priv *fsi, int is_play)
return
residue
;
return
residue
;
}
}
/************************************************************************
/*
* dma function
*/
static
u8
*
fsi_dma_get_area
(
struct
fsi_priv
*
fsi
)
{
return
fsi
->
substream
->
runtime
->
dma_area
+
fsi
->
byte_offset
;
}
static
void
fsi_dma_soft_push16
(
struct
fsi_priv
*
fsi
,
int
size
)
{
u16
*
start
;
int
i
;
start
=
(
u16
*
)
fsi_dma_get_area
(
fsi
);
for
(
i
=
0
;
i
<
size
;
i
++
)
fsi_reg_write
(
fsi
,
DODT
,
((
u32
)
*
(
start
+
i
)
<<
8
));
}
static
void
fsi_dma_soft_pop16
(
struct
fsi_priv
*
fsi
,
int
size
)
{
u16
*
start
;
int
i
;
start
=
(
u16
*
)
fsi_dma_get_area
(
fsi
);
for
(
i
=
0
;
i
<
size
;
i
++
)
*
(
start
+
i
)
=
(
u16
)(
fsi_reg_read
(
fsi
,
DIDT
)
>>
8
);
}
static
void
fsi_dma_soft_push32
(
struct
fsi_priv
*
fsi
,
int
size
)
{
u32
*
start
;
int
i
;
start
=
(
u32
*
)
fsi_dma_get_area
(
fsi
);
for
(
i
=
0
;
i
<
size
;
i
++
)
fsi_reg_write
(
fsi
,
DODT
,
*
(
start
+
i
));
}
static
void
fsi_dma_soft_pop32
(
struct
fsi_priv
*
fsi
,
int
size
)
{
u32
*
start
;
int
i
;
start
=
(
u32
*
)
fsi_dma_get_area
(
fsi
);
irq function
for
(
i
=
0
;
i
<
size
;
i
++
)
*
(
start
+
i
)
=
fsi_reg_read
(
fsi
,
DIDT
);
}
/*
* irq function
*/
************************************************************************/
static
void
fsi_irq_enable
(
struct
fsi_priv
*
fsi
,
int
is_play
)
static
void
fsi_irq_enable
(
struct
fsi_priv
*
fsi
,
int
is_play
)
{
{
u32
data
=
fsi_port_ab_io_bit
(
fsi
,
is_play
);
u32
data
=
fsi_port_ab_io_bit
(
fsi
,
is_play
);
...
@@ -404,13 +445,11 @@ static void fsi_irq_clear_status(struct fsi_priv *fsi)
...
@@ -404,13 +445,11 @@ static void fsi_irq_clear_status(struct fsi_priv *fsi)
fsi_master_mask_set
(
master
,
master
->
core
->
int_st
,
data
,
0
);
fsi_master_mask_set
(
master
,
master
->
core
->
int_st
,
data
,
0
);
}
}
/************************************************************************
/*
* SPDIF master clock function
*
SPDIF master clock function
* These functions are used later FSI2
*/
These functions are used later FSI2
************************************************************************/
static
void
fsi_spdif_clk_ctrl
(
struct
fsi_priv
*
fsi
,
int
enable
)
static
void
fsi_spdif_clk_ctrl
(
struct
fsi_priv
*
fsi
,
int
enable
)
{
{
struct
fsi_master
*
master
=
fsi_get_master
(
fsi
);
struct
fsi_master
*
master
=
fsi_get_master
(
fsi
);
...
@@ -427,13 +466,10 @@ static void fsi_spdif_clk_ctrl(struct fsi_priv *fsi, int enable)
...
@@ -427,13 +466,10 @@ static void fsi_spdif_clk_ctrl(struct fsi_priv *fsi, int enable)
fsi_master_mask_set
(
master
,
fsi
->
mst_ctrl
,
val
,
0
);
fsi_master_mask_set
(
master
,
fsi
->
mst_ctrl
,
val
,
0
);
}
}
/************************************************************************
/*
* ctrl function
*/
ctrl function
************************************************************************/
static
void
fsi_clk_ctrl
(
struct
fsi_priv
*
fsi
,
int
enable
)
static
void
fsi_clk_ctrl
(
struct
fsi_priv
*
fsi
,
int
enable
)
{
{
u32
val
=
fsi_is_port_a
(
fsi
)
?
(
1
<<
0
)
:
(
1
<<
4
);
u32
val
=
fsi_is_port_a
(
fsi
)
?
(
1
<<
0
)
:
(
1
<<
4
);
...
@@ -512,8 +548,7 @@ static int fsi_data_push(struct fsi_priv *fsi, int startup)
...
@@ -512,8 +548,7 @@ static int fsi_data_push(struct fsi_priv *fsi, int startup)
int
send
;
int
send
;
int
fifo_free
;
int
fifo_free
;
int
width
;
int
width
;
u8
*
start
;
int
over_period
;
int
i
,
over_period
;
if
(
!
fsi
||
if
(
!
fsi
||
!
fsi
->
substream
||
!
fsi
->
substream
||
...
@@ -550,18 +585,12 @@ static int fsi_data_push(struct fsi_priv *fsi, int startup)
...
@@ -550,18 +585,12 @@ static int fsi_data_push(struct fsi_priv *fsi, int startup)
if
(
fifo_free
<
send
)
if
(
fifo_free
<
send
)
send
=
fifo_free
;
send
=
fifo_free
;
start
=
runtime
->
dma_area
;
start
+=
fsi
->
byte_offset
;
switch
(
width
)
{
switch
(
width
)
{
case
2
:
case
2
:
for
(
i
=
0
;
i
<
send
;
i
++
)
fsi_dma_soft_push16
(
fsi
,
send
);
fsi_reg_write
(
fsi
,
DODT
,
((
u32
)
*
((
u16
*
)
start
+
i
)
<<
8
));
break
;
break
;
case
4
:
case
4
:
for
(
i
=
0
;
i
<
send
;
i
++
)
fsi_dma_soft_push32
(
fsi
,
send
);
fsi_reg_write
(
fsi
,
DODT
,
*
((
u32
*
)
start
+
i
));
break
;
break
;
default:
default:
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -596,8 +625,7 @@ static int fsi_data_pop(struct fsi_priv *fsi, int startup)
...
@@ -596,8 +625,7 @@ static int fsi_data_pop(struct fsi_priv *fsi, int startup)
int
free
;
int
free
;
int
fifo_fill
;
int
fifo_fill
;
int
width
;
int
width
;
u8
*
start
;
int
over_period
;
int
i
,
over_period
;
if
(
!
fsi
||
if
(
!
fsi
||
!
fsi
->
substream
||
!
fsi
->
substream
||
...
@@ -633,18 +661,12 @@ static int fsi_data_pop(struct fsi_priv *fsi, int startup)
...
@@ -633,18 +661,12 @@ static int fsi_data_pop(struct fsi_priv *fsi, int startup)
if
(
free
<
fifo_fill
)
if
(
free
<
fifo_fill
)
fifo_fill
=
free
;
fifo_fill
=
free
;
start
=
runtime
->
dma_area
;
start
+=
fsi
->
byte_offset
;
switch
(
width
)
{
switch
(
width
)
{
case
2
:
case
2
:
for
(
i
=
0
;
i
<
fifo_fill
;
i
++
)
fsi_dma_soft_pop16
(
fsi
,
fifo_fill
);
*
((
u16
*
)
start
+
i
)
=
(
u16
)(
fsi_reg_read
(
fsi
,
DIDT
)
>>
8
);
break
;
break
;
case
4
:
case
4
:
for
(
i
=
0
;
i
<
fifo_fill
;
i
++
)
fsi_dma_soft_pop32
(
fsi
,
fifo_fill
);
*
((
u32
*
)
start
+
i
)
=
fsi_reg_read
(
fsi
,
DIDT
);
break
;
break
;
default:
default:
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -694,13 +716,10 @@ static irqreturn_t fsi_interrupt(int irq, void *data)
...
@@ -694,13 +716,10 @@ static irqreturn_t fsi_interrupt(int irq, void *data)
return
IRQ_HANDLED
;
return
IRQ_HANDLED
;
}
}
/************************************************************************
/*
* dai ops
*/
dai ops
************************************************************************/
static
int
fsi_dai_startup
(
struct
snd_pcm_substream
*
substream
,
static
int
fsi_dai_startup
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
)
struct
snd_soc_dai
*
dai
)
{
{
...
@@ -919,13 +938,10 @@ static struct snd_soc_dai_ops fsi_dai_ops = {
...
@@ -919,13 +938,10 @@ static struct snd_soc_dai_ops fsi_dai_ops = {
.
hw_params
=
fsi_dai_hw_params
,
.
hw_params
=
fsi_dai_hw_params
,
};
};
/************************************************************************
/*
* pcm ops
*/
pcm ops
************************************************************************/
static
struct
snd_pcm_hardware
fsi_pcm_hardware
=
{
static
struct
snd_pcm_hardware
fsi_pcm_hardware
=
{
.
info
=
SNDRV_PCM_INFO_INTERLEAVED
|
.
info
=
SNDRV_PCM_INFO_INTERLEAVED
|
SNDRV_PCM_INFO_MMAP
|
SNDRV_PCM_INFO_MMAP
|
...
@@ -991,13 +1007,10 @@ static struct snd_pcm_ops fsi_pcm_ops = {
...
@@ -991,13 +1007,10 @@ static struct snd_pcm_ops fsi_pcm_ops = {
.
pointer
=
fsi_pointer
,
.
pointer
=
fsi_pointer
,
};
};
/************************************************************************
/*
* snd_soc_platform
*/
snd_soc_platform
************************************************************************/
#define PREALLOC_BUFFER (32 * 1024)
#define PREALLOC_BUFFER (32 * 1024)
#define PREALLOC_BUFFER_MAX (32 * 1024)
#define PREALLOC_BUFFER_MAX (32 * 1024)
...
@@ -1021,13 +1034,10 @@ static int fsi_pcm_new(struct snd_card *card,
...
@@ -1021,13 +1034,10 @@ static int fsi_pcm_new(struct snd_card *card,
PREALLOC_BUFFER
,
PREALLOC_BUFFER_MAX
);
PREALLOC_BUFFER
,
PREALLOC_BUFFER_MAX
);
}
}
/************************************************************************
/*
* alsa struct
*/
alsa struct
************************************************************************/
static
struct
snd_soc_dai_driver
fsi_soc_dai
[]
=
{
static
struct
snd_soc_dai_driver
fsi_soc_dai
[]
=
{
{
{
.
name
=
"fsia-dai"
,
.
name
=
"fsia-dai"
,
...
@@ -1069,13 +1079,10 @@ static struct snd_soc_platform_driver fsi_soc_platform = {
...
@@ -1069,13 +1079,10 @@ static struct snd_soc_platform_driver fsi_soc_platform = {
.
pcm_free
=
fsi_pcm_free
,
.
pcm_free
=
fsi_pcm_free
,
};
};
/************************************************************************
/*
* platform function
*/
platform function
************************************************************************/
static
int
fsi_probe
(
struct
platform_device
*
pdev
)
static
int
fsi_probe
(
struct
platform_device
*
pdev
)
{
{
struct
fsi_master
*
master
;
struct
fsi_master
*
master
;
...
@@ -1219,6 +1226,7 @@ static struct platform_device_id fsi_id_table[] = {
...
@@ -1219,6 +1226,7 @@ static struct platform_device_id fsi_id_table[] = {
{
"sh_fsi"
,
(
kernel_ulong_t
)
&
fsi1_core
},
{
"sh_fsi"
,
(
kernel_ulong_t
)
&
fsi1_core
},
{
"sh_fsi2"
,
(
kernel_ulong_t
)
&
fsi2_core
},
{
"sh_fsi2"
,
(
kernel_ulong_t
)
&
fsi2_core
},
};
};
MODULE_DEVICE_TABLE
(
platform
,
fsi_id_table
);
static
struct
platform_driver
fsi_driver
=
{
static
struct
platform_driver
fsi_driver
=
{
.
driver
=
{
.
driver
=
{
...
@@ -1239,6 +1247,7 @@ static void __exit fsi_mobile_exit(void)
...
@@ -1239,6 +1247,7 @@ static void __exit fsi_mobile_exit(void)
{
{
platform_driver_unregister
(
&
fsi_driver
);
platform_driver_unregister
(
&
fsi_driver
);
}
}
module_init
(
fsi_mobile_init
);
module_init
(
fsi_mobile_init
);
module_exit
(
fsi_mobile_exit
);
module_exit
(
fsi_mobile_exit
);
...
...
sound/soc/sh/migor.c
浏览文件 @
611ad378
...
@@ -12,6 +12,7 @@
...
@@ -12,6 +12,7 @@
#include <linux/firmware.h>
#include <linux/firmware.h>
#include <linux/module.h>
#include <linux/module.h>
#include <asm/clkdev.h>
#include <asm/clock.h>
#include <asm/clock.h>
#include <cpu/sh7722.h>
#include <cpu/sh7722.h>
...
@@ -40,12 +41,12 @@ static struct clk_ops siumckb_clk_ops = {
...
@@ -40,12 +41,12 @@ static struct clk_ops siumckb_clk_ops = {
};
};
static
struct
clk
siumckb_clk
=
{
static
struct
clk
siumckb_clk
=
{
.
name
=
"siumckb_clk"
,
.
id
=
-
1
,
.
ops
=
&
siumckb_clk_ops
,
.
ops
=
&
siumckb_clk_ops
,
.
rate
=
0
,
/* initialised at run-time */
.
rate
=
0
,
/* initialised at run-time */
};
};
static
struct
clk_lookup
*
siumckb_lookup
;
static
int
migor_hw_params
(
struct
snd_pcm_substream
*
substream
,
static
int
migor_hw_params
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
params
)
struct
snd_pcm_hw_params
*
params
)
{
{
...
@@ -177,6 +178,13 @@ static int __init migor_init(void)
...
@@ -177,6 +178,13 @@ static int __init migor_init(void)
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
return
ret
;
siumckb_lookup
=
clkdev_alloc
(
&
siumckb_clk
,
"siumckb_clk"
,
NULL
);
if
(
!
siumckb_lookup
)
{
ret
=
-
ENOMEM
;
goto
eclkdevalloc
;
}
clkdev_add
(
siumckb_lookup
);
/* Port number used on this machine: port B */
/* Port number used on this machine: port B */
migor_snd_device
=
platform_device_alloc
(
"soc-audio"
,
1
);
migor_snd_device
=
platform_device_alloc
(
"soc-audio"
,
1
);
if
(
!
migor_snd_device
)
{
if
(
!
migor_snd_device
)
{
...
@@ -195,12 +203,15 @@ static int __init migor_init(void)
...
@@ -195,12 +203,15 @@ static int __init migor_init(void)
epdevadd:
epdevadd:
platform_device_put
(
migor_snd_device
);
platform_device_put
(
migor_snd_device
);
epdevalloc:
epdevalloc:
clkdev_drop
(
siumckb_lookup
);
eclkdevalloc:
clk_unregister
(
&
siumckb_clk
);
clk_unregister
(
&
siumckb_clk
);
return
ret
;
return
ret
;
}
}
static
void
__exit
migor_exit
(
void
)
static
void
__exit
migor_exit
(
void
)
{
{
clkdev_drop
(
siumckb_lookup
);
clk_unregister
(
&
siumckb_clk
);
clk_unregister
(
&
siumckb_clk
);
platform_device_unregister
(
migor_snd_device
);
platform_device_unregister
(
migor_snd_device
);
}
}
...
...
sound/soc/sh/siu.h
浏览文件 @
611ad378
...
@@ -98,7 +98,9 @@ enum {
...
@@ -98,7 +98,9 @@ enum {
SIU_CLKB_EXT
SIU_CLKB_EXT
};
};
struct
device
;
struct
siu_info
{
struct
siu_info
{
struct
device
*
dev
;
int
port_id
;
int
port_id
;
u32
__iomem
*
pram
;
u32
__iomem
*
pram
;
u32
__iomem
*
xram
;
u32
__iomem
*
xram
;
...
@@ -182,7 +184,6 @@ static inline u32 siu_read32(u32 __iomem *addr)
...
@@ -182,7 +184,6 @@ static inline u32 siu_read32(u32 __iomem *addr)
#define SIU_BRRB (0x10c / sizeof(u32))
#define SIU_BRRB (0x10c / sizeof(u32))
extern
struct
snd_soc_platform_driver
siu_platform
;
extern
struct
snd_soc_platform_driver
siu_platform
;
extern
struct
snd_soc_dai_driver
siu_i2s_dai
;
extern
struct
siu_info
*
siu_i2s_data
;
extern
struct
siu_info
*
siu_i2s_data
;
int
siu_init_port
(
int
port
,
struct
siu_port
**
port_info
,
struct
snd_card
*
card
);
int
siu_init_port
(
int
port
,
struct
siu_port
**
port_info
,
struct
snd_card
*
card
);
...
...
sound/soc/sh/siu_dai.c
浏览文件 @
611ad378
...
@@ -71,8 +71,7 @@ struct port_flag {
...
@@ -71,8 +71,7 @@ struct port_flag {
struct
format_flag
capture
;
struct
format_flag
capture
;
};
};
struct
siu_info
*
siu_i2s_data
=
NULL
;
struct
siu_info
*
siu_i2s_data
;
EXPORT_SYMBOL_GPL
(
siu_i2s_data
);
static
struct
port_flag
siu_flags
[
SIU_PORT_NUM
]
=
{
static
struct
port_flag
siu_flags
[
SIU_PORT_NUM
]
=
{
[
SIU_PORT_A
]
=
{
[
SIU_PORT_A
]
=
{
...
@@ -113,7 +112,7 @@ static void siu_dai_start(struct siu_port *port_info)
...
@@ -113,7 +112,7 @@ static void siu_dai_start(struct siu_port *port_info)
dev_dbg
(
port_info
->
pcm
->
card
->
dev
,
"%s
\n
"
,
__func__
);
dev_dbg
(
port_info
->
pcm
->
card
->
dev
,
"%s
\n
"
,
__func__
);
/* Turn on SIU clock */
/* Turn on SIU clock */
pm_runtime_get_sync
(
port_info
->
pcm
->
card
->
dev
);
pm_runtime_get_sync
(
info
->
dev
);
/* Issue software reset to siu */
/* Issue software reset to siu */
siu_write32
(
base
+
SIU_SRCTL
,
0
);
siu_write32
(
base
+
SIU_SRCTL
,
0
);
...
@@ -160,7 +159,7 @@ static void siu_dai_stop(struct siu_port *port_info)
...
@@ -160,7 +159,7 @@ static void siu_dai_stop(struct siu_port *port_info)
siu_write32
(
base
+
SIU_SRCTL
,
0
);
siu_write32
(
base
+
SIU_SRCTL
,
0
);
/* Turn off SIU clock */
/* Turn off SIU clock */
pm_runtime_put_sync
(
port_info
->
pcm
->
card
->
dev
);
pm_runtime_put_sync
(
info
->
dev
);
}
}
static
void
siu_dai_spbAselect
(
struct
siu_port
*
port_info
)
static
void
siu_dai_spbAselect
(
struct
siu_port
*
port_info
)
...
@@ -675,20 +674,36 @@ static int siu_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
...
@@ -675,20 +674,36 @@ static int siu_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
}
}
siu_clk
=
clk_get
(
dai
->
dev
,
siu_name
);
siu_clk
=
clk_get
(
dai
->
dev
,
siu_name
);
if
(
IS_ERR
(
siu_clk
))
if
(
IS_ERR
(
siu_clk
))
{
dev_err
(
dai
->
dev
,
"%s: cannot get a SIU clock: %ld
\n
"
,
__func__
,
PTR_ERR
(
siu_clk
));
return
PTR_ERR
(
siu_clk
);
return
PTR_ERR
(
siu_clk
);
}
parent_clk
=
clk_get
(
dai
->
dev
,
parent_name
);
parent_clk
=
clk_get
(
dai
->
dev
,
parent_name
);
if
(
!
IS_ERR
(
parent_clk
))
{
if
(
IS_ERR
(
parent_clk
))
{
ret
=
clk_set_parent
(
siu_clk
,
parent_clk
);
ret
=
PTR_ERR
(
parent_clk
);
if
(
!
ret
)
dev_err
(
dai
->
dev
,
"cannot get a SIU clock parent: %d
\n
"
,
ret
);
clk_set_rate
(
siu_clk
,
freq
);
goto
epclkget
;
clk_put
(
parent_clk
);
}
ret
=
clk_set_parent
(
siu_clk
,
parent_clk
);
if
(
ret
<
0
)
{
dev_err
(
dai
->
dev
,
"cannot reparent the SIU clock: %d
\n
"
,
ret
);
goto
eclksetp
;
}
}
ret
=
clk_set_rate
(
siu_clk
,
freq
);
if
(
ret
<
0
)
dev_err
(
dai
->
dev
,
"cannot set SIU clock rate: %d
\n
"
,
ret
);
/* TODO: when clkdev gets reference counting we'll move these to siu_dai_shutdown() */
eclksetp:
clk_put
(
parent_clk
);
epclkget:
clk_put
(
siu_clk
);
clk_put
(
siu_clk
);
return
0
;
return
ret
;
}
}
static
struct
snd_soc_dai_ops
siu_dai_ops
=
{
static
struct
snd_soc_dai_ops
siu_dai_ops
=
{
...
@@ -700,7 +715,7 @@ static struct snd_soc_dai_ops siu_dai_ops = {
...
@@ -700,7 +715,7 @@ static struct snd_soc_dai_ops siu_dai_ops = {
};
};
static
struct
snd_soc_dai_driver
siu_i2s_dai
=
{
static
struct
snd_soc_dai_driver
siu_i2s_dai
=
{
.
name
=
"s
ui
-i2s-dai"
,
.
name
=
"s
iu
-i2s-dai"
,
.
playback
=
{
.
playback
=
{
.
channels_min
=
2
,
.
channels_min
=
2
,
.
channels_max
=
2
,
.
channels_max
=
2
,
...
@@ -727,6 +742,7 @@ static int __devinit siu_probe(struct platform_device *pdev)
...
@@ -727,6 +742,7 @@ static int __devinit siu_probe(struct platform_device *pdev)
if
(
!
info
)
if
(
!
info
)
return
-
ENOMEM
;
return
-
ENOMEM
;
siu_i2s_data
=
info
;
siu_i2s_data
=
info
;
info
->
dev
=
&
pdev
->
dev
;
ret
=
request_firmware
(
&
fw_entry
,
"siu_spb.bin"
,
&
pdev
->
dev
);
ret
=
request_firmware
(
&
fw_entry
,
"siu_spb.bin"
,
&
pdev
->
dev
);
if
(
ret
)
if
(
ret
)
...
@@ -828,6 +844,7 @@ static int __devexit siu_remove(struct platform_device *pdev)
...
@@ -828,6 +844,7 @@ static int __devexit siu_remove(struct platform_device *pdev)
static
struct
platform_driver
siu_driver
=
{
static
struct
platform_driver
siu_driver
=
{
.
driver
=
{
.
driver
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"siu-pcm-audio"
,
.
name
=
"siu-pcm-audio"
,
},
},
.
probe
=
siu_probe
,
.
probe
=
siu_probe
,
...
...
sound/soc/sh/siu_pcm.c
浏览文件 @
611ad378
...
@@ -341,7 +341,7 @@ static int siu_pcm_open(struct snd_pcm_substream *ss)
...
@@ -341,7 +341,7 @@ static int siu_pcm_open(struct snd_pcm_substream *ss)
{
{
/* Playback / Capture */
/* Playback / Capture */
struct
snd_soc_pcm_runtime
*
rtd
=
ss
->
private_data
;
struct
snd_soc_pcm_runtime
*
rtd
=
ss
->
private_data
;
struct
siu_platform
*
pdata
=
snd_soc_platform_get_drvdata
(
rtd
->
platform
)
;
struct
siu_platform
*
pdata
=
rtd
->
platform
->
dev
->
platform_data
;
struct
siu_info
*
info
=
siu_i2s_data
;
struct
siu_info
*
info
=
siu_i2s_data
;
struct
siu_port
*
port_info
=
siu_port_info
(
ss
);
struct
siu_port
*
port_info
=
siu_port_info
(
ss
);
struct
siu_stream
*
siu_stream
;
struct
siu_stream
*
siu_stream
;
...
...
sound/soc/soc-core.c
浏览文件 @
611ad378
...
@@ -270,6 +270,87 @@ static void soc_cleanup_codec_debugfs(struct snd_soc_codec *codec)
...
@@ -270,6 +270,87 @@ static void soc_cleanup_codec_debugfs(struct snd_soc_codec *codec)
debugfs_remove_recursive
(
codec
->
debugfs_codec_root
);
debugfs_remove_recursive
(
codec
->
debugfs_codec_root
);
}
}
static
ssize_t
codec_list_read_file
(
struct
file
*
file
,
char
__user
*
user_buf
,
size_t
count
,
loff_t
*
ppos
)
{
char
*
buf
=
kmalloc
(
PAGE_SIZE
,
GFP_KERNEL
);
ssize_t
ret
=
0
;
struct
snd_soc_codec
*
codec
;
if
(
!
buf
)
return
-
ENOMEM
;
list_for_each_entry
(
codec
,
&
codec_list
,
list
)
ret
+=
snprintf
(
buf
+
ret
,
PAGE_SIZE
-
ret
,
"%s
\n
"
,
codec
->
name
);
if
(
ret
>=
0
)
ret
=
simple_read_from_buffer
(
user_buf
,
count
,
ppos
,
buf
,
ret
);
kfree
(
buf
);
return
ret
;
}
static
const
struct
file_operations
codec_list_fops
=
{
.
read
=
codec_list_read_file
,
.
llseek
=
default_llseek
,
/* read accesses f_pos */
};
static
ssize_t
dai_list_read_file
(
struct
file
*
file
,
char
__user
*
user_buf
,
size_t
count
,
loff_t
*
ppos
)
{
char
*
buf
=
kmalloc
(
PAGE_SIZE
,
GFP_KERNEL
);
ssize_t
ret
=
0
;
struct
snd_soc_dai
*
dai
;
if
(
!
buf
)
return
-
ENOMEM
;
list_for_each_entry
(
dai
,
&
dai_list
,
list
)
ret
+=
snprintf
(
buf
+
ret
,
PAGE_SIZE
-
ret
,
"%s
\n
"
,
dai
->
name
);
if
(
ret
>=
0
)
ret
=
simple_read_from_buffer
(
user_buf
,
count
,
ppos
,
buf
,
ret
);
kfree
(
buf
);
return
ret
;
}
static
const
struct
file_operations
dai_list_fops
=
{
.
read
=
dai_list_read_file
,
.
llseek
=
default_llseek
,
/* read accesses f_pos */
};
static
ssize_t
platform_list_read_file
(
struct
file
*
file
,
char
__user
*
user_buf
,
size_t
count
,
loff_t
*
ppos
)
{
char
*
buf
=
kmalloc
(
PAGE_SIZE
,
GFP_KERNEL
);
ssize_t
ret
=
0
;
struct
snd_soc_platform
*
platform
;
if
(
!
buf
)
return
-
ENOMEM
;
list_for_each_entry
(
platform
,
&
platform_list
,
list
)
ret
+=
snprintf
(
buf
+
ret
,
PAGE_SIZE
-
ret
,
"%s
\n
"
,
platform
->
name
);
if
(
ret
>=
0
)
ret
=
simple_read_from_buffer
(
user_buf
,
count
,
ppos
,
buf
,
ret
);
kfree
(
buf
);
return
ret
;
}
static
const
struct
file_operations
platform_list_fops
=
{
.
read
=
platform_list_read_file
,
.
llseek
=
default_llseek
,
/* read accesses f_pos */
};
#else
#else
static
inline
void
soc_init_codec_debugfs
(
struct
snd_soc_codec
*
codec
)
static
inline
void
soc_init_codec_debugfs
(
struct
snd_soc_codec
*
codec
)
...
@@ -3191,6 +3272,18 @@ static int __init snd_soc_init(void)
...
@@ -3191,6 +3272,18 @@ static int __init snd_soc_init(void)
"ASoC: Failed to create debugfs directory
\n
"
);
"ASoC: Failed to create debugfs directory
\n
"
);
debugfs_root
=
NULL
;
debugfs_root
=
NULL
;
}
}
if
(
!
debugfs_create_file
(
"codecs"
,
0444
,
debugfs_root
,
NULL
,
&
codec_list_fops
))
pr_warn
(
"ASoC: Failed to create CODEC list debugfs file
\n
"
);
if
(
!
debugfs_create_file
(
"dais"
,
0444
,
debugfs_root
,
NULL
,
&
dai_list_fops
))
pr_warn
(
"ASoC: Failed to create DAI list debugfs file
\n
"
);
if
(
!
debugfs_create_file
(
"platforms"
,
0444
,
debugfs_root
,
NULL
,
&
platform_list_fops
))
pr_warn
(
"ASoC: Failed to create platform list debugfs file
\n
"
);
#endif
#endif
return
platform_driver_register
(
&
soc_driver
);
return
platform_driver_register
(
&
soc_driver
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录