Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
0d664db6
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
0d664db6
编写于
6月 17, 2013
作者:
M
Mark Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'asoc/topic/fsl' into asoc-next
上级
5ec393bc
8de2ae2a
变更
19
隐藏空白更改
内联
并排
Showing
19 changed file
with
512 addition
and
231 deletion
+512
-231
Documentation/devicetree/bindings/sound/imx-audio-wm8962.txt
Documentation/devicetree/bindings/sound/imx-audio-wm8962.txt
+46
-0
sound/soc/fsl/Kconfig
sound/soc/fsl/Kconfig
+12
-5
sound/soc/fsl/Makefile
sound/soc/fsl/Makefile
+4
-9
sound/soc/fsl/eukrea-tlv320.c
sound/soc/fsl/eukrea-tlv320.c
+1
-1
sound/soc/fsl/fsl_ssi.c
sound/soc/fsl/fsl_ssi.c
+4
-9
sound/soc/fsl/imx-audmux.c
sound/soc/fsl/imx-audmux.c
+0
-8
sound/soc/fsl/imx-mc13783.c
sound/soc/fsl/imx-mc13783.c
+1
-1
sound/soc/fsl/imx-pcm-dma.c
sound/soc/fsl/imx-pcm-dma.c
+2
-0
sound/soc/fsl/imx-pcm-fiq.c
sound/soc/fsl/imx-pcm-fiq.c
+92
-0
sound/soc/fsl/imx-pcm.c
sound/soc/fsl/imx-pcm.c
+0
-145
sound/soc/fsl/imx-pcm.h
sound/soc/fsl/imx-pcm.h
+5
-5
sound/soc/fsl/imx-sgtl5000.c
sound/soc/fsl/imx-sgtl5000.c
+6
-1
sound/soc/fsl/imx-ssi.c
sound/soc/fsl/imx-ssi.c
+11
-33
sound/soc/fsl/imx-ssi.h
sound/soc/fsl/imx-ssi.h
+0
-3
sound/soc/fsl/imx-wm8962.c
sound/soc/fsl/imx-wm8962.c
+323
-0
sound/soc/fsl/mx27vis-aic32x4.c
sound/soc/fsl/mx27vis-aic32x4.c
+1
-1
sound/soc/fsl/phycore-ac97.c
sound/soc/fsl/phycore-ac97.c
+1
-1
sound/soc/fsl/wm1133-ev1.c
sound/soc/fsl/wm1133-ev1.c
+1
-1
sound/soc/mxs/mxs-sgtl5000.c
sound/soc/mxs/mxs-sgtl5000.c
+2
-8
未找到文件。
Documentation/devicetree/bindings/sound/imx-audio-wm8962.txt
0 → 100644
浏览文件 @
0d664db6
Freescale i.MX audio complex with WM8962 codec
Required properties:
- compatible : "fsl,imx-audio-wm8962"
- model : The user-visible name of this sound complex
- ssi-controller : The phandle of the i.MX SSI controller
- audio-codec : The phandle of the WM8962 audio codec
- audio-routing : A list of the connections between audio components.
Each entry is a pair of strings, the first being the connection's sink,
the second being the connection's source. Valid names could be power
supplies, WM8962 pins, and the jacks on the board:
Power supplies:
* Mic Bias
Board connectors:
* Mic Jack
* Headphone Jack
* Ext Spk
- mux-int-port : The internal port of the i.MX audio muxer (AUDMUX)
- mux-ext-port : The external port of the i.MX audio muxer
Note: The AUDMUX port numbering should start at 1, which is consistent with
hardware manual.
Example:
sound {
compatible = "fsl,imx6q-sabresd-wm8962",
"fsl,imx-audio-wm8962";
model = "wm8962-audio";
ssi-controller = <&ssi2>;
audio-codec = <&codec>;
audio-routing =
"Headphone Jack", "HPOUTL",
"Headphone Jack", "HPOUTR",
"Ext Spk", "SPKOUTL",
"Ext Spk", "SPKOUTR",
"MICBIAS", "AMIC",
"IN3R", "MICBIAS",
"DMIC", "MICBIAS",
"DMICDAT", "DMIC";
mux-int-port = <2>;
mux-ext-port = <3>;
};
sound/soc/fsl/Kconfig
浏览文件 @
0d664db6
...
@@ -108,18 +108,13 @@ if SND_IMX_SOC
...
@@ -108,18 +108,13 @@ if SND_IMX_SOC
config SND_SOC_IMX_SSI
config SND_SOC_IMX_SSI
tristate
tristate
config SND_SOC_IMX_PCM
tristate
config SND_SOC_IMX_PCM_FIQ
config SND_SOC_IMX_PCM_FIQ
bool
bool
select FIQ
select FIQ
select SND_SOC_IMX_PCM
config SND_SOC_IMX_PCM_DMA
config SND_SOC_IMX_PCM_DMA
bool
bool
select SND_SOC_GENERIC_DMAENGINE_PCM
select SND_SOC_GENERIC_DMAENGINE_PCM
select SND_SOC_IMX_PCM
config SND_SOC_IMX_AUDMUX
config SND_SOC_IMX_AUDMUX
tristate
tristate
...
@@ -173,6 +168,18 @@ config SND_SOC_EUKREA_TLV320
...
@@ -173,6 +168,18 @@ config SND_SOC_EUKREA_TLV320
Enable I2S based access to the TLV320AIC23B codec attached
Enable I2S based access to the TLV320AIC23B codec attached
to the SSI interface
to the SSI interface
config SND_SOC_IMX_WM8962
tristate "SoC Audio support for i.MX boards with wm8962"
depends on OF && I2C
select SND_SOC_WM8962
select SND_SOC_IMX_PCM_DMA
select SND_SOC_IMX_AUDMUX
select SND_SOC_FSL_SSI
select SND_SOC_FSL_UTILS
help
Say Y if you want to add support for SoC audio on an i.MX board with
a wm8962 codec.
config SND_SOC_IMX_SGTL5000
config SND_SOC_IMX_SGTL5000
tristate "SoC Audio support for i.MX boards with sgtl5000"
tristate "SoC Audio support for i.MX boards with sgtl5000"
depends on OF && I2C
depends on OF && I2C
...
...
sound/soc/fsl/Makefile
浏览文件 @
0d664db6
...
@@ -30,18 +30,11 @@ obj-$(CONFIG_SND_MPC52xx_SOC_EFIKA) += efika-audio-fabric.o
...
@@ -30,18 +30,11 @@ obj-$(CONFIG_SND_MPC52xx_SOC_EFIKA) += efika-audio-fabric.o
# i.MX Platform Support
# i.MX Platform Support
snd-soc-imx-ssi-objs
:=
imx-ssi.o
snd-soc-imx-ssi-objs
:=
imx-ssi.o
snd-soc-imx-audmux-objs
:=
imx-audmux.o
snd-soc-imx-audmux-objs
:=
imx-audmux.o
snd-soc-imx-pcm-objs
:=
imx-pcm.o
ifneq
($(CONFIG_SND_SOC_IMX_PCM_FIQ),)
snd-soc-imx-pcm-objs
+=
imx-pcm-fiq.o
endif
ifneq
($(CONFIG_SND_SOC_IMX_PCM_DMA),)
snd-soc-imx-pcm-objs
+=
imx-pcm-dma.o
endif
obj-$(CONFIG_SND_SOC_IMX_SSI)
+=
snd-soc-imx-ssi.o
obj-$(CONFIG_SND_SOC_IMX_SSI)
+=
snd-soc-imx-ssi.o
obj-$(CONFIG_SND_SOC_IMX_AUDMUX)
+=
snd-soc-imx-audmux.o
obj-$(CONFIG_SND_SOC_IMX_AUDMUX)
+=
snd-soc-imx-audmux.o
obj-$(CONFIG_SND_SOC_IMX_PCM)
+=
snd-soc-imx-pcm.o
obj-$(CONFIG_SND_SOC_IMX_PCM_FIQ)
+=
imx-pcm-fiq.o
obj-$(CONFIG_SND_SOC_IMX_PCM_DMA)
+=
imx-pcm-dma.o
# i.MX Machine Support
# i.MX Machine Support
snd-soc-eukrea-tlv320-objs
:=
eukrea-tlv320.o
snd-soc-eukrea-tlv320-objs
:=
eukrea-tlv320.o
...
@@ -49,6 +42,7 @@ snd-soc-phycore-ac97-objs := phycore-ac97.o
...
@@ -49,6 +42,7 @@ snd-soc-phycore-ac97-objs := phycore-ac97.o
snd-soc-mx27vis-aic32x4-objs
:=
mx27vis-aic32x4.o
snd-soc-mx27vis-aic32x4-objs
:=
mx27vis-aic32x4.o
snd-soc-wm1133-ev1-objs
:=
wm1133-ev1.o
snd-soc-wm1133-ev1-objs
:=
wm1133-ev1.o
snd-soc-imx-sgtl5000-objs
:=
imx-sgtl5000.o
snd-soc-imx-sgtl5000-objs
:=
imx-sgtl5000.o
snd-soc-imx-wm8962-objs
:=
imx-wm8962.o
snd-soc-imx-mc13783-objs
:=
imx-mc13783.o
snd-soc-imx-mc13783-objs
:=
imx-mc13783.o
obj-$(CONFIG_SND_SOC_EUKREA_TLV320)
+=
snd-soc-eukrea-tlv320.o
obj-$(CONFIG_SND_SOC_EUKREA_TLV320)
+=
snd-soc-eukrea-tlv320.o
...
@@ -56,4 +50,5 @@ obj-$(CONFIG_SND_SOC_PHYCORE_AC97) += snd-soc-phycore-ac97.o
...
@@ -56,4 +50,5 @@ obj-$(CONFIG_SND_SOC_PHYCORE_AC97) += snd-soc-phycore-ac97.o
obj-$(CONFIG_SND_SOC_MX27VIS_AIC32X4)
+=
snd-soc-mx27vis-aic32x4.o
obj-$(CONFIG_SND_SOC_MX27VIS_AIC32X4)
+=
snd-soc-mx27vis-aic32x4.o
obj-$(CONFIG_SND_MXC_SOC_WM1133_EV1)
+=
snd-soc-wm1133-ev1.o
obj-$(CONFIG_SND_MXC_SOC_WM1133_EV1)
+=
snd-soc-wm1133-ev1.o
obj-$(CONFIG_SND_SOC_IMX_SGTL5000)
+=
snd-soc-imx-sgtl5000.o
obj-$(CONFIG_SND_SOC_IMX_SGTL5000)
+=
snd-soc-imx-sgtl5000.o
obj-$(CONFIG_SND_SOC_IMX_WM8962)
+=
snd-soc-imx-wm8962.o
obj-$(CONFIG_SND_SOC_IMX_MC13783)
+=
snd-soc-imx-mc13783.o
obj-$(CONFIG_SND_SOC_IMX_MC13783)
+=
snd-soc-imx-mc13783.o
sound/soc/fsl/eukrea-tlv320.c
浏览文件 @
0d664db6
...
@@ -80,7 +80,7 @@ static struct snd_soc_dai_link eukrea_tlv320_dai = {
...
@@ -80,7 +80,7 @@ static struct snd_soc_dai_link eukrea_tlv320_dai = {
.
name
=
"tlv320aic23"
,
.
name
=
"tlv320aic23"
,
.
stream_name
=
"TLV320AIC23"
,
.
stream_name
=
"TLV320AIC23"
,
.
codec_dai_name
=
"tlv320aic23-hifi"
,
.
codec_dai_name
=
"tlv320aic23-hifi"
,
.
platform_name
=
"imx-
fiq-pcm-audio
.0"
,
.
platform_name
=
"imx-
ssi
.0"
,
.
codec_name
=
"tlv320aic23-codec.0-001a"
,
.
codec_name
=
"tlv320aic23-codec.0-001a"
,
.
cpu_dai_name
=
"imx-ssi.0"
,
.
cpu_dai_name
=
"imx-ssi.0"
,
.
ops
=
&
eukrea_tlv320_snd_ops
,
.
ops
=
&
eukrea_tlv320_snd_ops
,
...
...
sound/soc/fsl/fsl_ssi.c
浏览文件 @
0d664db6
...
@@ -122,7 +122,6 @@ struct fsl_ssi_private {
...
@@ -122,7 +122,6 @@ struct fsl_ssi_private {
bool
new_binding
;
bool
new_binding
;
bool
ssi_on_imx
;
bool
ssi_on_imx
;
struct
clk
*
clk
;
struct
clk
*
clk
;
struct
platform_device
*
imx_pcm_pdev
;
struct
snd_dmaengine_dai_dma_data
dma_params_tx
;
struct
snd_dmaengine_dai_dma_data
dma_params_tx
;
struct
snd_dmaengine_dai_dma_data
dma_params_rx
;
struct
snd_dmaengine_dai_dma_data
dma_params_rx
;
struct
imx_dma_data
filter_data_tx
;
struct
imx_dma_data
filter_data_tx
;
...
@@ -809,13 +808,9 @@ static int fsl_ssi_probe(struct platform_device *pdev)
...
@@ -809,13 +808,9 @@ static int fsl_ssi_probe(struct platform_device *pdev)
}
}
if
(
ssi_private
->
ssi_on_imx
)
{
if
(
ssi_private
->
ssi_on_imx
)
{
ssi_private
->
imx_pcm_pdev
=
ret
=
imx_pcm_dma_init
(
pdev
);
platform_device_register_simple
(
"imx-pcm-audio"
,
if
(
ret
)
-
1
,
NULL
,
0
);
if
(
IS_ERR
(
ssi_private
->
imx_pcm_pdev
))
{
ret
=
PTR_ERR
(
ssi_private
->
imx_pcm_pdev
);
goto
error_dev
;
goto
error_dev
;
}
}
}
/*
/*
...
@@ -854,7 +849,7 @@ static int fsl_ssi_probe(struct platform_device *pdev)
...
@@ -854,7 +849,7 @@ static int fsl_ssi_probe(struct platform_device *pdev)
error_dai:
error_dai:
if
(
ssi_private
->
ssi_on_imx
)
if
(
ssi_private
->
ssi_on_imx
)
platform_device_unregister
(
ssi_private
->
imx_pcm_
pdev
);
imx_pcm_dma_exit
(
pdev
);
snd_soc_unregister_component
(
&
pdev
->
dev
);
snd_soc_unregister_component
(
&
pdev
->
dev
);
error_dev:
error_dev:
...
@@ -889,7 +884,7 @@ static int fsl_ssi_remove(struct platform_device *pdev)
...
@@ -889,7 +884,7 @@ static int fsl_ssi_remove(struct platform_device *pdev)
if
(
!
ssi_private
->
new_binding
)
if
(
!
ssi_private
->
new_binding
)
platform_device_unregister
(
ssi_private
->
pdev
);
platform_device_unregister
(
ssi_private
->
pdev
);
if
(
ssi_private
->
ssi_on_imx
)
{
if
(
ssi_private
->
ssi_on_imx
)
{
platform_device_unregister
(
ssi_private
->
imx_pcm_
pdev
);
imx_pcm_dma_exit
(
pdev
);
clk_disable_unprepare
(
ssi_private
->
clk
);
clk_disable_unprepare
(
ssi_private
->
clk
);
clk_put
(
ssi_private
->
clk
);
clk_put
(
ssi_private
->
clk
);
}
}
...
...
sound/soc/fsl/imx-audmux.c
浏览文件 @
0d664db6
...
@@ -26,7 +26,6 @@
...
@@ -26,7 +26,6 @@
#include <linux/of_device.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/pinctrl/consumer.h>
#include "imx-audmux.h"
#include "imx-audmux.h"
...
@@ -247,7 +246,6 @@ EXPORT_SYMBOL_GPL(imx_audmux_v2_configure_port);
...
@@ -247,7 +246,6 @@ EXPORT_SYMBOL_GPL(imx_audmux_v2_configure_port);
static
int
imx_audmux_probe
(
struct
platform_device
*
pdev
)
static
int
imx_audmux_probe
(
struct
platform_device
*
pdev
)
{
{
struct
resource
*
res
;
struct
resource
*
res
;
struct
pinctrl
*
pinctrl
;
const
struct
of_device_id
*
of_id
=
const
struct
of_device_id
*
of_id
=
of_match_device
(
imx_audmux_dt_ids
,
&
pdev
->
dev
);
of_match_device
(
imx_audmux_dt_ids
,
&
pdev
->
dev
);
...
@@ -256,12 +254,6 @@ static int imx_audmux_probe(struct platform_device *pdev)
...
@@ -256,12 +254,6 @@ static int imx_audmux_probe(struct platform_device *pdev)
if
(
IS_ERR
(
audmux_base
))
if
(
IS_ERR
(
audmux_base
))
return
PTR_ERR
(
audmux_base
);
return
PTR_ERR
(
audmux_base
);
pinctrl
=
devm_pinctrl_get_select_default
(
&
pdev
->
dev
);
if
(
IS_ERR
(
pinctrl
))
{
dev_err
(
&
pdev
->
dev
,
"setup pinctrl failed!"
);
return
PTR_ERR
(
pinctrl
);
}
audmux_clk
=
devm_clk_get
(
&
pdev
->
dev
,
"audmux"
);
audmux_clk
=
devm_clk_get
(
&
pdev
->
dev
,
"audmux"
);
if
(
IS_ERR
(
audmux_clk
))
{
if
(
IS_ERR
(
audmux_clk
))
{
dev_dbg
(
&
pdev
->
dev
,
"cannot get clock: %ld
\n
"
,
dev_dbg
(
&
pdev
->
dev
,
"cannot get clock: %ld
\n
"
,
...
...
sound/soc/fsl/imx-mc13783.c
浏览文件 @
0d664db6
...
@@ -64,7 +64,7 @@ static struct snd_soc_dai_link imx_mc13783_dai_mc13783[] = {
...
@@ -64,7 +64,7 @@ static struct snd_soc_dai_link imx_mc13783_dai_mc13783[] = {
.
codec_dai_name
=
"mc13783-hifi"
,
.
codec_dai_name
=
"mc13783-hifi"
,
.
codec_name
=
"mc13783-codec"
,
.
codec_name
=
"mc13783-codec"
,
.
cpu_dai_name
=
"imx-ssi.0"
,
.
cpu_dai_name
=
"imx-ssi.0"
,
.
platform_name
=
"imx-
pcm-audio
.0"
,
.
platform_name
=
"imx-
ssi
.0"
,
.
ops
=
&
imx_mc13783_hifi_ops
,
.
ops
=
&
imx_mc13783_hifi_ops
,
.
symmetric_rates
=
1
,
.
symmetric_rates
=
1
,
.
dai_fmt
=
FMT_SSI
,
.
dai_fmt
=
FMT_SSI
,
...
...
sound/soc/fsl/imx-pcm-dma.c
浏览文件 @
0d664db6
...
@@ -67,8 +67,10 @@ int imx_pcm_dma_init(struct platform_device *pdev)
...
@@ -67,8 +67,10 @@ int imx_pcm_dma_init(struct platform_device *pdev)
SND_DMAENGINE_PCM_FLAG_NO_DT
|
SND_DMAENGINE_PCM_FLAG_NO_DT
|
SND_DMAENGINE_PCM_FLAG_COMPAT
);
SND_DMAENGINE_PCM_FLAG_COMPAT
);
}
}
EXPORT_SYMBOL_GPL
(
imx_pcm_dma_init
);
void
imx_pcm_dma_exit
(
struct
platform_device
*
pdev
)
void
imx_pcm_dma_exit
(
struct
platform_device
*
pdev
)
{
{
snd_dmaengine_pcm_unregister
(
&
pdev
->
dev
);
snd_dmaengine_pcm_unregister
(
&
pdev
->
dev
);
}
}
EXPORT_SYMBOL_GPL
(
imx_pcm_dma_exit
);
sound/soc/fsl/imx-pcm-fiq.c
浏览文件 @
0d664db6
...
@@ -225,6 +225,22 @@ static int snd_imx_close(struct snd_pcm_substream *substream)
...
@@ -225,6 +225,22 @@ static int snd_imx_close(struct snd_pcm_substream *substream)
return
0
;
return
0
;
}
}
static
int
snd_imx_pcm_mmap
(
struct
snd_pcm_substream
*
substream
,
struct
vm_area_struct
*
vma
)
{
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
int
ret
;
ret
=
dma_mmap_writecombine
(
substream
->
pcm
->
card
->
dev
,
vma
,
runtime
->
dma_area
,
runtime
->
dma_addr
,
runtime
->
dma_bytes
);
pr_debug
(
"%s: ret: %d %p 0x%08x 0x%08x
\n
"
,
__func__
,
ret
,
runtime
->
dma_area
,
runtime
->
dma_addr
,
runtime
->
dma_bytes
);
return
ret
;
}
static
struct
snd_pcm_ops
imx_pcm_ops
=
{
static
struct
snd_pcm_ops
imx_pcm_ops
=
{
.
open
=
snd_imx_open
,
.
open
=
snd_imx_open
,
.
close
=
snd_imx_close
,
.
close
=
snd_imx_close
,
...
@@ -236,6 +252,54 @@ static struct snd_pcm_ops imx_pcm_ops = {
...
@@ -236,6 +252,54 @@ static struct snd_pcm_ops imx_pcm_ops = {
.
mmap
=
snd_imx_pcm_mmap
,
.
mmap
=
snd_imx_pcm_mmap
,
};
};
static
int
imx_pcm_preallocate_dma_buffer
(
struct
snd_pcm
*
pcm
,
int
stream
)
{
struct
snd_pcm_substream
*
substream
=
pcm
->
streams
[
stream
].
substream
;
struct
snd_dma_buffer
*
buf
=
&
substream
->
dma_buffer
;
size_t
size
=
IMX_SSI_DMABUF_SIZE
;
buf
->
dev
.
type
=
SNDRV_DMA_TYPE_DEV
;
buf
->
dev
.
dev
=
pcm
->
card
->
dev
;
buf
->
private_data
=
NULL
;
buf
->
area
=
dma_alloc_writecombine
(
pcm
->
card
->
dev
,
size
,
&
buf
->
addr
,
GFP_KERNEL
);
if
(
!
buf
->
area
)
return
-
ENOMEM
;
buf
->
bytes
=
size
;
return
0
;
}
static
u64
imx_pcm_dmamask
=
DMA_BIT_MASK
(
32
);
static
int
imx_pcm_new
(
struct
snd_soc_pcm_runtime
*
rtd
)
{
struct
snd_card
*
card
=
rtd
->
card
->
snd_card
;
struct
snd_pcm
*
pcm
=
rtd
->
pcm
;
int
ret
=
0
;
if
(
!
card
->
dev
->
dma_mask
)
card
->
dev
->
dma_mask
=
&
imx_pcm_dmamask
;
if
(
!
card
->
dev
->
coherent_dma_mask
)
card
->
dev
->
coherent_dma_mask
=
DMA_BIT_MASK
(
32
);
if
(
pcm
->
streams
[
SNDRV_PCM_STREAM_PLAYBACK
].
substream
)
{
ret
=
imx_pcm_preallocate_dma_buffer
(
pcm
,
SNDRV_PCM_STREAM_PLAYBACK
);
if
(
ret
)
goto
out
;
}
if
(
pcm
->
streams
[
SNDRV_PCM_STREAM_CAPTURE
].
substream
)
{
ret
=
imx_pcm_preallocate_dma_buffer
(
pcm
,
SNDRV_PCM_STREAM_CAPTURE
);
if
(
ret
)
goto
out
;
}
out:
return
ret
;
}
static
int
ssi_irq
=
0
;
static
int
ssi_irq
=
0
;
static
int
imx_pcm_fiq_new
(
struct
snd_soc_pcm_runtime
*
rtd
)
static
int
imx_pcm_fiq_new
(
struct
snd_soc_pcm_runtime
*
rtd
)
...
@@ -268,6 +332,27 @@ static int imx_pcm_fiq_new(struct snd_soc_pcm_runtime *rtd)
...
@@ -268,6 +332,27 @@ static int imx_pcm_fiq_new(struct snd_soc_pcm_runtime *rtd)
return
0
;
return
0
;
}
}
static
void
imx_pcm_free
(
struct
snd_pcm
*
pcm
)
{
struct
snd_pcm_substream
*
substream
;
struct
snd_dma_buffer
*
buf
;
int
stream
;
for
(
stream
=
0
;
stream
<
2
;
stream
++
)
{
substream
=
pcm
->
streams
[
stream
].
substream
;
if
(
!
substream
)
continue
;
buf
=
&
substream
->
dma_buffer
;
if
(
!
buf
->
area
)
continue
;
dma_free_writecombine
(
pcm
->
card
->
dev
,
buf
->
bytes
,
buf
->
area
,
buf
->
addr
);
buf
->
area
=
NULL
;
}
}
static
void
imx_pcm_fiq_free
(
struct
snd_pcm
*
pcm
)
static
void
imx_pcm_fiq_free
(
struct
snd_pcm
*
pcm
)
{
{
mxc_set_irq_fiq
(
ssi_irq
,
0
);
mxc_set_irq_fiq
(
ssi_irq
,
0
);
...
@@ -314,3 +399,10 @@ int imx_pcm_fiq_init(struct platform_device *pdev)
...
@@ -314,3 +399,10 @@ int imx_pcm_fiq_init(struct platform_device *pdev)
return
ret
;
return
ret
;
}
}
EXPORT_SYMBOL_GPL
(
imx_pcm_fiq_init
);
void
imx_pcm_fiq_exit
(
struct
platform_device
*
pdev
)
{
snd_soc_unregister_platform
(
&
pdev
->
dev
);
}
EXPORT_SYMBOL_GPL
(
imx_pcm_fiq_exit
);
sound/soc/fsl/imx-pcm.c
已删除
100644 → 0
浏览文件 @
5ec393bc
/*
* Copyright 2009 Sascha Hauer <s.hauer@pengutronix.de>
*
* This code is based on code copyrighted by Freescale,
* Liam Girdwood, Javier Martin and probably others.
*
* 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
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
#include <linux/dma-mapping.h>
#include <linux/module.h>
#include <sound/pcm.h>
#include <sound/soc.h>
#include "imx-pcm.h"
int
snd_imx_pcm_mmap
(
struct
snd_pcm_substream
*
substream
,
struct
vm_area_struct
*
vma
)
{
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
int
ret
;
ret
=
dma_mmap_writecombine
(
substream
->
pcm
->
card
->
dev
,
vma
,
runtime
->
dma_area
,
runtime
->
dma_addr
,
runtime
->
dma_bytes
);
pr_debug
(
"%s: ret: %d %p 0x%08x 0x%08x
\n
"
,
__func__
,
ret
,
runtime
->
dma_area
,
runtime
->
dma_addr
,
runtime
->
dma_bytes
);
return
ret
;
}
EXPORT_SYMBOL_GPL
(
snd_imx_pcm_mmap
);
static
int
imx_pcm_preallocate_dma_buffer
(
struct
snd_pcm
*
pcm
,
int
stream
)
{
struct
snd_pcm_substream
*
substream
=
pcm
->
streams
[
stream
].
substream
;
struct
snd_dma_buffer
*
buf
=
&
substream
->
dma_buffer
;
size_t
size
=
IMX_SSI_DMABUF_SIZE
;
buf
->
dev
.
type
=
SNDRV_DMA_TYPE_DEV
;
buf
->
dev
.
dev
=
pcm
->
card
->
dev
;
buf
->
private_data
=
NULL
;
buf
->
area
=
dma_alloc_writecombine
(
pcm
->
card
->
dev
,
size
,
&
buf
->
addr
,
GFP_KERNEL
);
if
(
!
buf
->
area
)
return
-
ENOMEM
;
buf
->
bytes
=
size
;
return
0
;
}
static
u64
imx_pcm_dmamask
=
DMA_BIT_MASK
(
32
);
int
imx_pcm_new
(
struct
snd_soc_pcm_runtime
*
rtd
)
{
struct
snd_card
*
card
=
rtd
->
card
->
snd_card
;
struct
snd_pcm
*
pcm
=
rtd
->
pcm
;
int
ret
=
0
;
if
(
!
card
->
dev
->
dma_mask
)
card
->
dev
->
dma_mask
=
&
imx_pcm_dmamask
;
if
(
!
card
->
dev
->
coherent_dma_mask
)
card
->
dev
->
coherent_dma_mask
=
DMA_BIT_MASK
(
32
);
if
(
pcm
->
streams
[
SNDRV_PCM_STREAM_PLAYBACK
].
substream
)
{
ret
=
imx_pcm_preallocate_dma_buffer
(
pcm
,
SNDRV_PCM_STREAM_PLAYBACK
);
if
(
ret
)
goto
out
;
}
if
(
pcm
->
streams
[
SNDRV_PCM_STREAM_CAPTURE
].
substream
)
{
ret
=
imx_pcm_preallocate_dma_buffer
(
pcm
,
SNDRV_PCM_STREAM_CAPTURE
);
if
(
ret
)
goto
out
;
}
out:
return
ret
;
}
EXPORT_SYMBOL_GPL
(
imx_pcm_new
);
void
imx_pcm_free
(
struct
snd_pcm
*
pcm
)
{
struct
snd_pcm_substream
*
substream
;
struct
snd_dma_buffer
*
buf
;
int
stream
;
for
(
stream
=
0
;
stream
<
2
;
stream
++
)
{
substream
=
pcm
->
streams
[
stream
].
substream
;
if
(
!
substream
)
continue
;
buf
=
&
substream
->
dma_buffer
;
if
(
!
buf
->
area
)
continue
;
dma_free_writecombine
(
pcm
->
card
->
dev
,
buf
->
bytes
,
buf
->
area
,
buf
->
addr
);
buf
->
area
=
NULL
;
}
}
EXPORT_SYMBOL_GPL
(
imx_pcm_free
);
static
int
imx_pcm_probe
(
struct
platform_device
*
pdev
)
{
if
(
strcmp
(
pdev
->
id_entry
->
name
,
"imx-fiq-pcm-audio"
)
==
0
)
return
imx_pcm_fiq_init
(
pdev
);
return
imx_pcm_dma_init
(
pdev
);
}
static
int
imx_pcm_remove
(
struct
platform_device
*
pdev
)
{
if
(
strcmp
(
pdev
->
id_entry
->
name
,
"imx-fiq-pcm-audio"
)
==
0
)
snd_soc_unregister_platform
(
&
pdev
->
dev
);
else
imx_pcm_dma_exit
(
pdev
);
return
0
;
}
static
struct
platform_device_id
imx_pcm_devtype
[]
=
{
{
.
name
=
"imx-pcm-audio"
,
},
{
.
name
=
"imx-fiq-pcm-audio"
,
},
{
/* sentinel */
}
};
MODULE_DEVICE_TABLE
(
platform
,
imx_pcm_devtype
);
static
struct
platform_driver
imx_pcm_driver
=
{
.
driver
=
{
.
name
=
"imx-pcm"
,
.
owner
=
THIS_MODULE
,
},
.
id_table
=
imx_pcm_devtype
,
.
probe
=
imx_pcm_probe
,
.
remove
=
imx_pcm_remove
,
};
module_platform_driver
(
imx_pcm_driver
);
MODULE_DESCRIPTION
(
"Freescale i.MX PCM driver"
);
MODULE_AUTHOR
(
"Sascha Hauer <s.hauer@pengutronix.de>"
);
MODULE_LICENSE
(
"GPL"
);
sound/soc/fsl/imx-pcm.h
浏览文件 @
0d664db6
...
@@ -32,11 +32,6 @@ imx_pcm_dma_params_init_data(struct imx_dma_data *dma_data,
...
@@ -32,11 +32,6 @@ imx_pcm_dma_params_init_data(struct imx_dma_data *dma_data,
dma_data
->
peripheral_type
=
IMX_DMATYPE_SSI
;
dma_data
->
peripheral_type
=
IMX_DMATYPE_SSI
;
}
}
int
snd_imx_pcm_mmap
(
struct
snd_pcm_substream
*
substream
,
struct
vm_area_struct
*
vma
);
int
imx_pcm_new
(
struct
snd_soc_pcm_runtime
*
rtd
);
void
imx_pcm_free
(
struct
snd_pcm
*
pcm
);
#ifdef CONFIG_SND_SOC_IMX_PCM_DMA
#ifdef CONFIG_SND_SOC_IMX_PCM_DMA
int
imx_pcm_dma_init
(
struct
platform_device
*
pdev
);
int
imx_pcm_dma_init
(
struct
platform_device
*
pdev
);
void
imx_pcm_dma_exit
(
struct
platform_device
*
pdev
);
void
imx_pcm_dma_exit
(
struct
platform_device
*
pdev
);
...
@@ -53,11 +48,16 @@ static inline void imx_pcm_dma_exit(struct platform_device *pdev)
...
@@ -53,11 +48,16 @@ static inline void imx_pcm_dma_exit(struct platform_device *pdev)
#ifdef CONFIG_SND_SOC_IMX_PCM_FIQ
#ifdef CONFIG_SND_SOC_IMX_PCM_FIQ
int
imx_pcm_fiq_init
(
struct
platform_device
*
pdev
);
int
imx_pcm_fiq_init
(
struct
platform_device
*
pdev
);
void
imx_pcm_fiq_exit
(
struct
platform_device
*
pdev
);
#else
#else
static
inline
int
imx_pcm_fiq_init
(
struct
platform_device
*
pdev
)
static
inline
int
imx_pcm_fiq_init
(
struct
platform_device
*
pdev
)
{
{
return
-
ENODEV
;
return
-
ENODEV
;
}
}
static
inline
void
imx_pcm_fiq_exit
(
struct
platform_device
*
pdev
)
{
}
#endif
#endif
#endif
/* _IMX_PCM_H */
#endif
/* _IMX_PCM_H */
sound/soc/fsl/imx-sgtl5000.c
浏览文件 @
0d664db6
...
@@ -149,7 +149,7 @@ static int imx_sgtl5000_probe(struct platform_device *pdev)
...
@@ -149,7 +149,7 @@ static int imx_sgtl5000_probe(struct platform_device *pdev)
data
->
dai
.
codec_dai_name
=
"sgtl5000"
;
data
->
dai
.
codec_dai_name
=
"sgtl5000"
;
data
->
dai
.
codec_of_node
=
codec_np
;
data
->
dai
.
codec_of_node
=
codec_np
;
data
->
dai
.
cpu_of_node
=
ssi_np
;
data
->
dai
.
cpu_of_node
=
ssi_np
;
data
->
dai
.
platform_
name
=
"imx-pcm-audio"
;
data
->
dai
.
platform_
of_node
=
ssi_np
;
data
->
dai
.
init
=
&
imx_sgtl5000_dai_init
;
data
->
dai
.
init
=
&
imx_sgtl5000_dai_init
;
data
->
dai
.
dai_fmt
=
SND_SOC_DAIFMT_I2S
|
SND_SOC_DAIFMT_NB_NF
|
data
->
dai
.
dai_fmt
=
SND_SOC_DAIFMT_I2S
|
SND_SOC_DAIFMT_NB_NF
|
SND_SOC_DAIFMT_CBM_CFM
;
SND_SOC_DAIFMT_CBM_CFM
;
...
@@ -174,6 +174,11 @@ static int imx_sgtl5000_probe(struct platform_device *pdev)
...
@@ -174,6 +174,11 @@ static int imx_sgtl5000_probe(struct platform_device *pdev)
}
}
platform_set_drvdata
(
pdev
,
data
);
platform_set_drvdata
(
pdev
,
data
);
of_node_put
(
ssi_np
);
of_node_put
(
codec_np
);
return
0
;
clk_fail:
clk_fail:
clk_put
(
data
->
codec_clk
);
clk_put
(
data
->
codec_clk
);
fail:
fail:
...
...
sound/soc/fsl/imx-ssi.c
浏览文件 @
0d664db6
...
@@ -590,41 +590,19 @@ static int imx_ssi_probe(struct platform_device *pdev)
...
@@ -590,41 +590,19 @@ static int imx_ssi_probe(struct platform_device *pdev)
goto
failed_register
;
goto
failed_register
;
}
}
ssi
->
soc_platform_pdev_fiq
=
platform_device_alloc
(
"imx-fiq-pcm-audio"
,
pdev
->
id
);
ret
=
imx_pcm_fiq_init
(
pdev
);
if
(
!
ssi
->
soc_platform_pdev_fiq
)
{
if
(
ret
)
ret
=
-
ENOMEM
;
goto
failed_pcm_fiq
;
goto
failed_pdev_fiq_alloc
;
}
platform_set_drvdata
(
ssi
->
soc_platform_pdev_fiq
,
ssi
);
ret
=
platform_device_add
(
ssi
->
soc_platform_pdev_fiq
);
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"failed to add platform device
\n
"
);
goto
failed_pdev_fiq_add
;
}
ssi
->
soc_platform_pdev
=
platform_device_alloc
(
"imx-pcm-audio"
,
pdev
->
id
);
ret
=
imx_pcm_dma_init
(
pdev
);
if
(
!
ssi
->
soc_platform_pdev
)
{
if
(
ret
)
ret
=
-
ENOMEM
;
goto
failed_pcm_dma
;
goto
failed_pdev_alloc
;
}
platform_set_drvdata
(
ssi
->
soc_platform_pdev
,
ssi
);
ret
=
platform_device_add
(
ssi
->
soc_platform_pdev
);
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"failed to add platform device
\n
"
);
goto
failed_pdev_add
;
}
return
0
;
return
0
;
failed_pdev_add:
failed_pcm_dma:
platform_device_put
(
ssi
->
soc_platform_pdev
);
imx_pcm_fiq_exit
(
pdev
);
failed_pdev_alloc:
failed_pcm_fiq:
platform_device_del
(
ssi
->
soc_platform_pdev_fiq
);
failed_pdev_fiq_add:
platform_device_put
(
ssi
->
soc_platform_pdev_fiq
);
failed_pdev_fiq_alloc:
snd_soc_unregister_component
(
&
pdev
->
dev
);
snd_soc_unregister_component
(
&
pdev
->
dev
);
failed_register:
failed_register:
release_mem_region
(
res
->
start
,
resource_size
(
res
));
release_mem_region
(
res
->
start
,
resource_size
(
res
));
...
@@ -639,8 +617,8 @@ static int imx_ssi_remove(struct platform_device *pdev)
...
@@ -639,8 +617,8 @@ static int imx_ssi_remove(struct platform_device *pdev)
struct
resource
*
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
struct
resource
*
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
struct
imx_ssi
*
ssi
=
platform_get_drvdata
(
pdev
);
struct
imx_ssi
*
ssi
=
platform_get_drvdata
(
pdev
);
platform_device_unregister
(
ssi
->
soc_platform_
pdev
);
imx_pcm_dma_exit
(
pdev
);
platform_device_unregister
(
ssi
->
soc_platform_pdev_fiq
);
imx_pcm_fiq_exit
(
pdev
);
snd_soc_unregister_component
(
&
pdev
->
dev
);
snd_soc_unregister_component
(
&
pdev
->
dev
);
...
...
sound/soc/fsl/imx-ssi.h
浏览文件 @
0d664db6
...
@@ -211,9 +211,6 @@ struct imx_ssi {
...
@@ -211,9 +211,6 @@ struct imx_ssi {
struct
imx_dma_data
filter_data_rx
;
struct
imx_dma_data
filter_data_rx
;
int
enabled
;
int
enabled
;
struct
platform_device
*
soc_platform_pdev
;
struct
platform_device
*
soc_platform_pdev_fiq
;
};
};
#endif
/* _IMX_SSI_H */
#endif
/* _IMX_SSI_H */
sound/soc/fsl/imx-wm8962.c
0 → 100644
浏览文件 @
0d664db6
/*
* Copyright 2013 Freescale Semiconductor, Inc.
*
* Based on imx-sgtl5000.c
* Copyright 2012 Freescale Semiconductor, Inc.
* Copyright 2012 Linaro Ltd.
*
* The code contained herein is licensed under the GNU General Public
* License. You may obtain a copy of the GNU General Public License
* Version 2 or later at the following locations:
*
* http://www.opensource.org/licenses/gpl-license.html
* http://www.gnu.org/copyleft/gpl.html
*/
#include <linux/module.h>
#include <linux/of_platform.h>
#include <linux/of_i2c.h>
#include <linux/slab.h>
#include <linux/clk.h>
#include <sound/soc.h>
#include <sound/pcm_params.h>
#include <sound/soc-dapm.h>
#include <linux/pinctrl/consumer.h>
#include "../codecs/wm8962.h"
#include "imx-audmux.h"
#define DAI_NAME_SIZE 32
struct
imx_wm8962_data
{
struct
snd_soc_dai_link
dai
;
struct
snd_soc_card
card
;
char
codec_dai_name
[
DAI_NAME_SIZE
];
char
platform_name
[
DAI_NAME_SIZE
];
struct
clk
*
codec_clk
;
unsigned
int
clk_frequency
;
};
struct
imx_priv
{
struct
platform_device
*
pdev
;
};
static
struct
imx_priv
card_priv
;
static
const
struct
snd_soc_dapm_widget
imx_wm8962_dapm_widgets
[]
=
{
SND_SOC_DAPM_HP
(
"Headphone Jack"
,
NULL
),
SND_SOC_DAPM_SPK
(
"Ext Spk"
,
NULL
),
SND_SOC_DAPM_MIC
(
"AMIC"
,
NULL
),
SND_SOC_DAPM_MIC
(
"DMIC"
,
NULL
),
};
static
int
sample_rate
=
44100
;
static
snd_pcm_format_t
sample_format
=
SNDRV_PCM_FORMAT_S16_LE
;
static
int
imx_hifi_hw_params
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
params
)
{
sample_rate
=
params_rate
(
params
);
sample_format
=
params_format
(
params
);
return
0
;
}
static
struct
snd_soc_ops
imx_hifi_ops
=
{
.
hw_params
=
imx_hifi_hw_params
,
};
static
int
imx_wm8962_set_bias_level
(
struct
snd_soc_card
*
card
,
struct
snd_soc_dapm_context
*
dapm
,
enum
snd_soc_bias_level
level
)
{
struct
snd_soc_dai
*
codec_dai
=
card
->
rtd
[
0
].
codec_dai
;
struct
imx_priv
*
priv
=
&
card_priv
;
struct
imx_wm8962_data
*
data
=
platform_get_drvdata
(
priv
->
pdev
);
struct
device
*
dev
=
&
priv
->
pdev
->
dev
;
unsigned
int
pll_out
;
int
ret
;
if
(
dapm
->
dev
!=
codec_dai
->
dev
)
return
0
;
switch
(
level
)
{
case
SND_SOC_BIAS_PREPARE
:
if
(
dapm
->
bias_level
==
SND_SOC_BIAS_STANDBY
)
{
if
(
sample_format
==
SNDRV_PCM_FORMAT_S24_LE
)
pll_out
=
sample_rate
*
384
;
else
pll_out
=
sample_rate
*
256
;
ret
=
snd_soc_dai_set_pll
(
codec_dai
,
WM8962_FLL
,
WM8962_FLL_MCLK
,
data
->
clk_frequency
,
pll_out
);
if
(
ret
<
0
)
{
dev_err
(
dev
,
"failed to start FLL: %d
\n
"
,
ret
);
return
ret
;
}
ret
=
snd_soc_dai_set_sysclk
(
codec_dai
,
WM8962_SYSCLK_FLL
,
pll_out
,
SND_SOC_CLOCK_IN
);
if
(
ret
<
0
)
{
dev_err
(
dev
,
"failed to set SYSCLK: %d
\n
"
,
ret
);
return
ret
;
}
}
break
;
case
SND_SOC_BIAS_STANDBY
:
if
(
dapm
->
bias_level
==
SND_SOC_BIAS_PREPARE
)
{
ret
=
snd_soc_dai_set_sysclk
(
codec_dai
,
WM8962_SYSCLK_MCLK
,
data
->
clk_frequency
,
SND_SOC_CLOCK_IN
);
if
(
ret
<
0
)
{
dev_err
(
dev
,
"failed to switch away from FLL: %d
\n
"
,
ret
);
return
ret
;
}
ret
=
snd_soc_dai_set_pll
(
codec_dai
,
WM8962_FLL
,
0
,
0
,
0
);
if
(
ret
<
0
)
{
dev_err
(
dev
,
"failed to stop FLL: %d
\n
"
,
ret
);
return
ret
;
}
}
break
;
default:
break
;
}
dapm
->
bias_level
=
level
;
return
0
;
}
static
int
imx_wm8962_late_probe
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_dai
*
codec_dai
=
card
->
rtd
[
0
].
codec_dai
;
struct
imx_priv
*
priv
=
&
card_priv
;
struct
imx_wm8962_data
*
data
=
platform_get_drvdata
(
priv
->
pdev
);
struct
device
*
dev
=
&
priv
->
pdev
->
dev
;
int
ret
;
ret
=
snd_soc_dai_set_sysclk
(
codec_dai
,
WM8962_SYSCLK_MCLK
,
data
->
clk_frequency
,
SND_SOC_CLOCK_IN
);
if
(
ret
<
0
)
dev_err
(
dev
,
"failed to set sysclk in %s
\n
"
,
__func__
);
return
ret
;
}
static
int
imx_wm8962_probe
(
struct
platform_device
*
pdev
)
{
struct
device_node
*
np
=
pdev
->
dev
.
of_node
;
struct
device_node
*
ssi_np
,
*
codec_np
;
struct
platform_device
*
ssi_pdev
;
struct
imx_priv
*
priv
=
&
card_priv
;
struct
i2c_client
*
codec_dev
;
struct
imx_wm8962_data
*
data
;
int
int_port
,
ext_port
;
int
ret
;
priv
->
pdev
=
pdev
;
ret
=
of_property_read_u32
(
np
,
"mux-int-port"
,
&
int_port
);
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"mux-int-port missing or invalid
\n
"
);
return
ret
;
}
ret
=
of_property_read_u32
(
np
,
"mux-ext-port"
,
&
ext_port
);
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"mux-ext-port missing or invalid
\n
"
);
return
ret
;
}
/*
* The port numbering in the hardware manual starts at 1, while
* the audmux API expects it starts at 0.
*/
int_port
--
;
ext_port
--
;
ret
=
imx_audmux_v2_configure_port
(
int_port
,
IMX_AUDMUX_V2_PTCR_SYN
|
IMX_AUDMUX_V2_PTCR_TFSEL
(
ext_port
)
|
IMX_AUDMUX_V2_PTCR_TCSEL
(
ext_port
)
|
IMX_AUDMUX_V2_PTCR_TFSDIR
|
IMX_AUDMUX_V2_PTCR_TCLKDIR
,
IMX_AUDMUX_V2_PDCR_RXDSEL
(
ext_port
));
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"audmux internal port setup failed
\n
"
);
return
ret
;
}
imx_audmux_v2_configure_port
(
ext_port
,
IMX_AUDMUX_V2_PTCR_SYN
,
IMX_AUDMUX_V2_PDCR_RXDSEL
(
int_port
));
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"audmux external port setup failed
\n
"
);
return
ret
;
}
ssi_np
=
of_parse_phandle
(
pdev
->
dev
.
of_node
,
"ssi-controller"
,
0
);
codec_np
=
of_parse_phandle
(
pdev
->
dev
.
of_node
,
"audio-codec"
,
0
);
if
(
!
ssi_np
||
!
codec_np
)
{
dev_err
(
&
pdev
->
dev
,
"phandle missing or invalid
\n
"
);
ret
=
-
EINVAL
;
goto
fail
;
}
ssi_pdev
=
of_find_device_by_node
(
ssi_np
);
if
(
!
ssi_pdev
)
{
dev_err
(
&
pdev
->
dev
,
"failed to find SSI platform device
\n
"
);
ret
=
-
EINVAL
;
goto
fail
;
}
codec_dev
=
of_find_i2c_device_by_node
(
codec_np
);
if
(
!
codec_dev
||
!
codec_dev
->
driver
)
{
dev_err
(
&
pdev
->
dev
,
"failed to find codec platform device
\n
"
);
return
-
EINVAL
;
}
data
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
*
data
),
GFP_KERNEL
);
if
(
!
data
)
{
ret
=
-
ENOMEM
;
goto
fail
;
}
data
->
codec_clk
=
devm_clk_get
(
&
codec_dev
->
dev
,
NULL
);
if
(
IS_ERR
(
data
->
codec_clk
))
{
ret
=
PTR_ERR
(
data
->
codec_clk
);
dev_err
(
&
codec_dev
->
dev
,
"failed to get codec clk: %d
\n
"
,
ret
);
goto
fail
;
}
data
->
clk_frequency
=
clk_get_rate
(
data
->
codec_clk
);
ret
=
clk_prepare_enable
(
data
->
codec_clk
);
if
(
ret
)
{
dev_err
(
&
codec_dev
->
dev
,
"failed to enable codec clk: %d
\n
"
,
ret
);
goto
fail
;
}
data
->
dai
.
name
=
"HiFi"
;
data
->
dai
.
stream_name
=
"HiFi"
;
data
->
dai
.
codec_dai_name
=
"wm8962"
;
data
->
dai
.
codec_of_node
=
codec_np
;
data
->
dai
.
cpu_dai_name
=
dev_name
(
&
ssi_pdev
->
dev
);
data
->
dai
.
platform_of_node
=
ssi_np
;
data
->
dai
.
ops
=
&
imx_hifi_ops
;
data
->
dai
.
dai_fmt
=
SND_SOC_DAIFMT_I2S
|
SND_SOC_DAIFMT_NB_NF
|
SND_SOC_DAIFMT_CBM_CFM
;
data
->
card
.
dev
=
&
pdev
->
dev
;
ret
=
snd_soc_of_parse_card_name
(
&
data
->
card
,
"model"
);
if
(
ret
)
goto
clk_fail
;
ret
=
snd_soc_of_parse_audio_routing
(
&
data
->
card
,
"audio-routing"
);
if
(
ret
)
goto
clk_fail
;
data
->
card
.
num_links
=
1
;
data
->
card
.
dai_link
=
&
data
->
dai
;
data
->
card
.
dapm_widgets
=
imx_wm8962_dapm_widgets
;
data
->
card
.
num_dapm_widgets
=
ARRAY_SIZE
(
imx_wm8962_dapm_widgets
);
data
->
card
.
late_probe
=
imx_wm8962_late_probe
;
data
->
card
.
set_bias_level
=
imx_wm8962_set_bias_level
;
ret
=
snd_soc_register_card
(
&
data
->
card
);
if
(
ret
)
{
dev_err
(
&
pdev
->
dev
,
"snd_soc_register_card failed (%d)
\n
"
,
ret
);
goto
clk_fail
;
}
platform_set_drvdata
(
pdev
,
data
);
of_node_put
(
ssi_np
);
of_node_put
(
codec_np
);
return
0
;
clk_fail:
if
(
!
IS_ERR
(
data
->
codec_clk
))
clk_disable_unprepare
(
data
->
codec_clk
);
fail:
if
(
ssi_np
)
of_node_put
(
ssi_np
);
if
(
codec_np
)
of_node_put
(
codec_np
);
return
ret
;
}
static
int
imx_wm8962_remove
(
struct
platform_device
*
pdev
)
{
struct
imx_wm8962_data
*
data
=
platform_get_drvdata
(
pdev
);
if
(
!
IS_ERR
(
data
->
codec_clk
))
clk_disable_unprepare
(
data
->
codec_clk
);
snd_soc_unregister_card
(
&
data
->
card
);
return
0
;
}
static
const
struct
of_device_id
imx_wm8962_dt_ids
[]
=
{
{
.
compatible
=
"fsl,imx-audio-wm8962"
,
},
{
/* sentinel */
}
};
MODULE_DEVICE_TABLE
(
of
,
imx_wm8962_dt_ids
);
static
struct
platform_driver
imx_wm8962_driver
=
{
.
driver
=
{
.
name
=
"imx-wm8962"
,
.
owner
=
THIS_MODULE
,
.
of_match_table
=
imx_wm8962_dt_ids
,
},
.
probe
=
imx_wm8962_probe
,
.
remove
=
imx_wm8962_remove
,
};
module_platform_driver
(
imx_wm8962_driver
);
MODULE_AUTHOR
(
"Freescale Semiconductor, Inc."
);
MODULE_DESCRIPTION
(
"Freescale i.MX WM8962 ASoC machine driver"
);
MODULE_LICENSE
(
"GPL v2"
);
MODULE_ALIAS
(
"platform:imx-wm8962"
);
sound/soc/fsl/mx27vis-aic32x4.c
浏览文件 @
0d664db6
...
@@ -161,7 +161,7 @@ static struct snd_soc_dai_link mx27vis_aic32x4_dai = {
...
@@ -161,7 +161,7 @@ static struct snd_soc_dai_link mx27vis_aic32x4_dai = {
.
name
=
"tlv320aic32x4"
,
.
name
=
"tlv320aic32x4"
,
.
stream_name
=
"TLV320AIC32X4"
,
.
stream_name
=
"TLV320AIC32X4"
,
.
codec_dai_name
=
"tlv320aic32x4-hifi"
,
.
codec_dai_name
=
"tlv320aic32x4-hifi"
,
.
platform_name
=
"imx-
pcm-audio
.0"
,
.
platform_name
=
"imx-
ssi
.0"
,
.
codec_name
=
"tlv320aic32x4.0-0018"
,
.
codec_name
=
"tlv320aic32x4.0-0018"
,
.
cpu_dai_name
=
"imx-ssi.0"
,
.
cpu_dai_name
=
"imx-ssi.0"
,
.
ops
=
&
mx27vis_aic32x4_snd_ops
,
.
ops
=
&
mx27vis_aic32x4_snd_ops
,
...
...
sound/soc/fsl/phycore-ac97.c
浏览文件 @
0d664db6
...
@@ -33,7 +33,7 @@ static struct snd_soc_dai_link imx_phycore_dai_ac97[] = {
...
@@ -33,7 +33,7 @@ static struct snd_soc_dai_link imx_phycore_dai_ac97[] = {
.
codec_dai_name
=
"wm9712-hifi"
,
.
codec_dai_name
=
"wm9712-hifi"
,
.
codec_name
=
"wm9712-codec"
,
.
codec_name
=
"wm9712-codec"
,
.
cpu_dai_name
=
"imx-ssi.0"
,
.
cpu_dai_name
=
"imx-ssi.0"
,
.
platform_name
=
"imx-
fiq-pcm-audio
.0"
,
.
platform_name
=
"imx-
ssi
.0"
,
.
ops
=
&
imx_phycore_hifi_ops
,
.
ops
=
&
imx_phycore_hifi_ops
,
},
},
};
};
...
...
sound/soc/fsl/wm1133-ev1.c
浏览文件 @
0d664db6
...
@@ -245,7 +245,7 @@ static struct snd_soc_dai_link wm1133_ev1_dai = {
...
@@ -245,7 +245,7 @@ static struct snd_soc_dai_link wm1133_ev1_dai = {
.
stream_name
=
"Audio"
,
.
stream_name
=
"Audio"
,
.
cpu_dai_name
=
"imx-ssi.0"
,
.
cpu_dai_name
=
"imx-ssi.0"
,
.
codec_dai_name
=
"wm8350-hifi"
,
.
codec_dai_name
=
"wm8350-hifi"
,
.
platform_name
=
"imx-
fiq-pcm-audio
.0"
,
.
platform_name
=
"imx-
ssi
.0"
,
.
codec_name
=
"wm8350-codec.0-0x1a"
,
.
codec_name
=
"wm8350-codec.0-0x1a"
,
.
init
=
wm1133_ev1_init
,
.
init
=
wm1133_ev1_init
,
.
ops
=
&
wm1133_ev1_ops
,
.
ops
=
&
wm1133_ev1_ops
,
...
...
sound/soc/mxs/mxs-sgtl5000.c
浏览文件 @
0d664db6
...
@@ -90,17 +90,11 @@ static struct snd_soc_dai_link mxs_sgtl5000_dai[] = {
...
@@ -90,17 +90,11 @@ static struct snd_soc_dai_link mxs_sgtl5000_dai[] = {
.
name
=
"HiFi Tx"
,
.
name
=
"HiFi Tx"
,
.
stream_name
=
"HiFi Playback"
,
.
stream_name
=
"HiFi Playback"
,
.
codec_dai_name
=
"sgtl5000"
,
.
codec_dai_name
=
"sgtl5000"
,
.
codec_name
=
"sgtl5000.0-000a"
,
.
cpu_dai_name
=
"mxs-saif.0"
,
.
platform_name
=
"mxs-saif.0"
,
.
ops
=
&
mxs_sgtl5000_hifi_ops
,
.
ops
=
&
mxs_sgtl5000_hifi_ops
,
},
{
},
{
.
name
=
"HiFi Rx"
,
.
name
=
"HiFi Rx"
,
.
stream_name
=
"HiFi Capture"
,
.
stream_name
=
"HiFi Capture"
,
.
codec_dai_name
=
"sgtl5000"
,
.
codec_dai_name
=
"sgtl5000"
,
.
codec_name
=
"sgtl5000.0-000a"
,
.
cpu_dai_name
=
"mxs-saif.1"
,
.
platform_name
=
"mxs-saif.1"
,
.
ops
=
&
mxs_sgtl5000_hifi_ops
,
.
ops
=
&
mxs_sgtl5000_hifi_ops
,
},
},
};
};
...
@@ -116,7 +110,7 @@ static int mxs_sgtl5000_probe_dt(struct platform_device *pdev)
...
@@ -116,7 +110,7 @@ static int mxs_sgtl5000_probe_dt(struct platform_device *pdev)
{
{
struct
device_node
*
np
=
pdev
->
dev
.
of_node
;
struct
device_node
*
np
=
pdev
->
dev
.
of_node
;
struct
device_node
*
saif_np
[
2
],
*
codec_np
;
struct
device_node
*
saif_np
[
2
],
*
codec_np
;
int
i
,
ret
=
0
;
int
i
;
if
(
!
np
)
if
(
!
np
)
return
1
;
/* no device tree */
return
1
;
/* no device tree */
...
@@ -142,7 +136,7 @@ static int mxs_sgtl5000_probe_dt(struct platform_device *pdev)
...
@@ -142,7 +136,7 @@ static int mxs_sgtl5000_probe_dt(struct platform_device *pdev)
of_node_put
(
saif_np
[
0
]);
of_node_put
(
saif_np
[
0
]);
of_node_put
(
saif_np
[
1
]);
of_node_put
(
saif_np
[
1
]);
return
ret
;
return
0
;
}
}
static
int
mxs_sgtl5000_probe
(
struct
platform_device
*
pdev
)
static
int
mxs_sgtl5000_probe
(
struct
platform_device
*
pdev
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录