Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
0d664db6
Commit
0d664db6
authored
Jun 17, 2013
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/fsl' into asoc-next
parents
5ec393bc
8de2ae2a
Changes
19
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
512 additions
and
231 deletions
+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
No files found.
Documentation/devicetree/bindings/sound/imx-audio-wm8962.txt
0 → 100644
View file @
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
View file @
0d664db6
...
...
@@ -108,18 +108,13 @@ if SND_IMX_SOC
config SND_SOC_IMX_SSI
tristate
config SND_SOC_IMX_PCM
tristate
config SND_SOC_IMX_PCM_FIQ
bool
select FIQ
select SND_SOC_IMX_PCM
config SND_SOC_IMX_PCM_DMA
bool
select SND_SOC_GENERIC_DMAENGINE_PCM
select SND_SOC_IMX_PCM
config SND_SOC_IMX_AUDMUX
tristate
...
...
@@ -173,6 +168,18 @@ config SND_SOC_EUKREA_TLV320
Enable I2S based access to the TLV320AIC23B codec attached
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
tristate "SoC Audio support for i.MX boards with sgtl5000"
depends on OF && I2C
...
...
sound/soc/fsl/Makefile
View file @
0d664db6
...
...
@@ -30,18 +30,11 @@ obj-$(CONFIG_SND_MPC52xx_SOC_EFIKA) += efika-audio-fabric.o
# i.MX Platform Support
snd-soc-imx-ssi-objs
:=
imx-ssi.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_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
snd-soc-eukrea-tlv320-objs
:=
eukrea-tlv320.o
...
...
@@ -49,6 +42,7 @@ snd-soc-phycore-ac97-objs := phycore-ac97.o
snd-soc-mx27vis-aic32x4-objs
:=
mx27vis-aic32x4.o
snd-soc-wm1133-ev1-objs
:=
wm1133-ev1.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
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
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_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
sound/soc/fsl/eukrea-tlv320.c
View file @
0d664db6
...
...
@@ -80,7 +80,7 @@ static struct snd_soc_dai_link eukrea_tlv320_dai = {
.
name
=
"tlv320aic23"
,
.
stream_name
=
"TLV320AIC23"
,
.
codec_dai_name
=
"tlv320aic23-hifi"
,
.
platform_name
=
"imx-
fiq-pcm-audio
.0"
,
.
platform_name
=
"imx-
ssi
.0"
,
.
codec_name
=
"tlv320aic23-codec.0-001a"
,
.
cpu_dai_name
=
"imx-ssi.0"
,
.
ops
=
&
eukrea_tlv320_snd_ops
,
...
...
sound/soc/fsl/fsl_ssi.c
View file @
0d664db6
...
...
@@ -122,7 +122,6 @@ struct fsl_ssi_private {
bool
new_binding
;
bool
ssi_on_imx
;
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_rx
;
struct
imx_dma_data
filter_data_tx
;
...
...
@@ -809,13 +808,9 @@ static int fsl_ssi_probe(struct platform_device *pdev)
}
if
(
ssi_private
->
ssi_on_imx
)
{
ssi_private
->
imx_pcm_pdev
=
platform_device_register_simple
(
"imx-pcm-audio"
,
-
1
,
NULL
,
0
);
if
(
IS_ERR
(
ssi_private
->
imx_pcm_pdev
))
{
ret
=
PTR_ERR
(
ssi_private
->
imx_pcm_pdev
);
ret
=
imx_pcm_dma_init
(
pdev
);
if
(
ret
)
goto
error_dev
;
}
}
/*
...
...
@@ -854,7 +849,7 @@ static int fsl_ssi_probe(struct platform_device *pdev)
error_dai:
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
);
error_dev:
...
...
@@ -889,7 +884,7 @@ static int fsl_ssi_remove(struct platform_device *pdev)
if
(
!
ssi_private
->
new_binding
)
platform_device_unregister
(
ssi_private
->
pdev
);
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_put
(
ssi_private
->
clk
);
}
...
...
sound/soc/fsl/imx-audmux.c
View file @
0d664db6
...
...
@@ -26,7 +26,6 @@
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/pinctrl/consumer.h>
#include "imx-audmux.h"
...
...
@@ -247,7 +246,6 @@ EXPORT_SYMBOL_GPL(imx_audmux_v2_configure_port);
static
int
imx_audmux_probe
(
struct
platform_device
*
pdev
)
{
struct
resource
*
res
;
struct
pinctrl
*
pinctrl
;
const
struct
of_device_id
*
of_id
=
of_match_device
(
imx_audmux_dt_ids
,
&
pdev
->
dev
);
...
...
@@ -256,12 +254,6 @@ static int imx_audmux_probe(struct platform_device *pdev)
if
(
IS_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"
);
if
(
IS_ERR
(
audmux_clk
))
{
dev_dbg
(
&
pdev
->
dev
,
"cannot get clock: %ld
\n
"
,
...
...
sound/soc/fsl/imx-mc13783.c
View file @
0d664db6
...
...
@@ -64,7 +64,7 @@ static struct snd_soc_dai_link imx_mc13783_dai_mc13783[] = {
.
codec_dai_name
=
"mc13783-hifi"
,
.
codec_name
=
"mc13783-codec"
,
.
cpu_dai_name
=
"imx-ssi.0"
,
.
platform_name
=
"imx-
pcm-audio
.0"
,
.
platform_name
=
"imx-
ssi
.0"
,
.
ops
=
&
imx_mc13783_hifi_ops
,
.
symmetric_rates
=
1
,
.
dai_fmt
=
FMT_SSI
,
...
...
sound/soc/fsl/imx-pcm-dma.c
View file @
0d664db6
...
...
@@ -67,8 +67,10 @@ int imx_pcm_dma_init(struct platform_device *pdev)
SND_DMAENGINE_PCM_FLAG_NO_DT
|
SND_DMAENGINE_PCM_FLAG_COMPAT
);
}
EXPORT_SYMBOL_GPL
(
imx_pcm_dma_init
);
void
imx_pcm_dma_exit
(
struct
platform_device
*
pdev
)
{
snd_dmaengine_pcm_unregister
(
&
pdev
->
dev
);
}
EXPORT_SYMBOL_GPL
(
imx_pcm_dma_exit
);
sound/soc/fsl/imx-pcm-fiq.c
View file @
0d664db6
...
...
@@ -225,6 +225,22 @@ static int snd_imx_close(struct snd_pcm_substream *substream)
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
=
{
.
open
=
snd_imx_open
,
.
close
=
snd_imx_close
,
...
...
@@ -236,6 +252,54 @@ static struct snd_pcm_ops imx_pcm_ops = {
.
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
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
;
}
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
)
{
mxc_set_irq_fiq
(
ssi_irq
,
0
);
...
...
@@ -314,3 +399,10 @@ int imx_pcm_fiq_init(struct platform_device *pdev)
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
deleted
100644 → 0
View file @
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
View file @
0d664db6
...
...
@@ -32,11 +32,6 @@ imx_pcm_dma_params_init_data(struct imx_dma_data *dma_data,
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
int
imx_pcm_dma_init
(
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)
#ifdef CONFIG_SND_SOC_IMX_PCM_FIQ
int
imx_pcm_fiq_init
(
struct
platform_device
*
pdev
);
void
imx_pcm_fiq_exit
(
struct
platform_device
*
pdev
);
#else
static
inline
int
imx_pcm_fiq_init
(
struct
platform_device
*
pdev
)
{
return
-
ENODEV
;
}
static
inline
void
imx_pcm_fiq_exit
(
struct
platform_device
*
pdev
)
{
}
#endif
#endif
/* _IMX_PCM_H */
sound/soc/fsl/imx-sgtl5000.c
View file @
0d664db6
...
...
@@ -149,7 +149,7 @@ static int imx_sgtl5000_probe(struct platform_device *pdev)
data
->
dai
.
codec_dai_name
=
"sgtl5000"
;
data
->
dai
.
codec_of_node
=
codec_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
.
dai_fmt
=
SND_SOC_DAIFMT_I2S
|
SND_SOC_DAIFMT_NB_NF
|
SND_SOC_DAIFMT_CBM_CFM
;
...
...
@@ -174,6 +174,11 @@ static int imx_sgtl5000_probe(struct platform_device *pdev)
}
platform_set_drvdata
(
pdev
,
data
);
of_node_put
(
ssi_np
);
of_node_put
(
codec_np
);
return
0
;
clk_fail:
clk_put
(
data
->
codec_clk
);
fail:
...
...
sound/soc/fsl/imx-ssi.c
View file @
0d664db6
...
...
@@ -590,41 +590,19 @@ static int imx_ssi_probe(struct platform_device *pdev)
goto
failed_register
;
}
ssi
->
soc_platform_pdev_fiq
=
platform_device_alloc
(
"imx-fiq-pcm-audio"
,
pdev
->
id
);
if
(
!
ssi
->
soc_platform_pdev_fiq
)
{
ret
=
-
ENOMEM
;
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
;
}
ret
=
imx_pcm_fiq_init
(
pdev
);
if
(
ret
)
goto
failed_pcm_fiq
;
ssi
->
soc_platform_pdev
=
platform_device_alloc
(
"imx-pcm-audio"
,
pdev
->
id
);
if
(
!
ssi
->
soc_platform_pdev
)
{
ret
=
-
ENOMEM
;
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
;
}
ret
=
imx_pcm_dma_init
(
pdev
);
if
(
ret
)
goto
failed_pcm_dma
;
return
0
;
failed_pdev_add:
platform_device_put
(
ssi
->
soc_platform_pdev
);
failed_pdev_alloc:
platform_device_del
(
ssi
->
soc_platform_pdev_fiq
);
failed_pdev_fiq_add:
platform_device_put
(
ssi
->
soc_platform_pdev_fiq
);
failed_pdev_fiq_alloc:
failed_pcm_dma:
imx_pcm_fiq_exit
(
pdev
);
failed_pcm_fiq:
snd_soc_unregister_component
(
&
pdev
->
dev
);
failed_register:
release_mem_region
(
res
->
start
,
resource_size
(
res
));
...
...
@@ -639,8 +617,8 @@ static int imx_ssi_remove(struct platform_device *pdev)
struct
resource
*
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
struct
imx_ssi
*
ssi
=
platform_get_drvdata
(
pdev
);
platform_device_unregister
(
ssi
->
soc_platform_
pdev
);
platform_device_unregister
(
ssi
->
soc_platform_pdev_fiq
);
imx_pcm_dma_exit
(
pdev
);
imx_pcm_fiq_exit
(
pdev
);
snd_soc_unregister_component
(
&
pdev
->
dev
);
...
...
sound/soc/fsl/imx-ssi.h
View file @
0d664db6
...
...
@@ -211,9 +211,6 @@ struct imx_ssi {
struct
imx_dma_data
filter_data_rx
;
int
enabled
;
struct
platform_device
*
soc_platform_pdev
;
struct
platform_device
*
soc_platform_pdev_fiq
;
};
#endif
/* _IMX_SSI_H */
sound/soc/fsl/imx-wm8962.c
0 → 100644
View file @
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
View file @
0d664db6
...
...
@@ -161,7 +161,7 @@ static struct snd_soc_dai_link mx27vis_aic32x4_dai = {
.
name
=
"tlv320aic32x4"
,
.
stream_name
=
"TLV320AIC32X4"
,
.
codec_dai_name
=
"tlv320aic32x4-hifi"
,
.
platform_name
=
"imx-
pcm-audio
.0"
,
.
platform_name
=
"imx-
ssi
.0"
,
.
codec_name
=
"tlv320aic32x4.0-0018"
,
.
cpu_dai_name
=
"imx-ssi.0"
,
.
ops
=
&
mx27vis_aic32x4_snd_ops
,
...
...
sound/soc/fsl/phycore-ac97.c
View file @
0d664db6
...
...
@@ -33,7 +33,7 @@ static struct snd_soc_dai_link imx_phycore_dai_ac97[] = {
.
codec_dai_name
=
"wm9712-hifi"
,
.
codec_name
=
"wm9712-codec"
,
.
cpu_dai_name
=
"imx-ssi.0"
,
.
platform_name
=
"imx-
fiq-pcm-audio
.0"
,
.
platform_name
=
"imx-
ssi
.0"
,
.
ops
=
&
imx_phycore_hifi_ops
,
},
};
...
...
sound/soc/fsl/wm1133-ev1.c
View file @
0d664db6
...
...
@@ -245,7 +245,7 @@ static struct snd_soc_dai_link wm1133_ev1_dai = {
.
stream_name
=
"Audio"
,
.
cpu_dai_name
=
"imx-ssi.0"
,
.
codec_dai_name
=
"wm8350-hifi"
,
.
platform_name
=
"imx-
fiq-pcm-audio
.0"
,
.
platform_name
=
"imx-
ssi
.0"
,
.
codec_name
=
"wm8350-codec.0-0x1a"
,
.
init
=
wm1133_ev1_init
,
.
ops
=
&
wm1133_ev1_ops
,
...
...
sound/soc/mxs/mxs-sgtl5000.c
View file @
0d664db6
...
...
@@ -90,17 +90,11 @@ static struct snd_soc_dai_link mxs_sgtl5000_dai[] = {
.
name
=
"HiFi Tx"
,
.
stream_name
=
"HiFi Playback"
,
.
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
,
},
{
.
name
=
"HiFi Rx"
,
.
stream_name
=
"HiFi Capture"
,
.
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
,
},
};
...
...
@@ -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
*
saif_np
[
2
],
*
codec_np
;
int
i
,
ret
=
0
;
int
i
;
if
(
!
np
)
return
1
;
/* no device tree */
...
...
@@ -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
[
1
]);
return
ret
;
return
0
;
}
static
int
mxs_sgtl5000_probe
(
struct
platform_device
*
pdev
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment