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
59338599
Commit
59338599
authored
Jun 17, 2013
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/ep93xx' into asoc-next
parents
e95e939d
be87f75e
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
21 additions
and
151 deletions
+21
-151
sound/soc/cirrus/Kconfig
sound/soc/cirrus/Kconfig
+1
-1
sound/soc/cirrus/ep93xx-ac97.c
sound/soc/cirrus/ep93xx-ac97.c
+4
-12
sound/soc/cirrus/ep93xx-i2s.c
sound/soc/cirrus/ep93xx-i2s.c
+5
-11
sound/soc/cirrus/ep93xx-pcm.c
sound/soc/cirrus/ep93xx-pcm.c
+11
-127
No files found.
sound/soc/cirrus/Kconfig
View file @
59338599
config SND_EP93XX_SOC
tristate "SoC Audio support for the Cirrus Logic EP93xx series"
depends on ARCH_EP93XX && SND_SOC
select SND_SOC_DMAENGINE_PCM
select SND_SOC_
GENERIC_
DMAENGINE_PCM
help
Say Y or M if you want to add support for codecs attached to
the EP93xx I2S or AC97 interfaces.
...
...
sound/soc/cirrus/ep93xx-ac97.c
View file @
59338599
...
...
@@ -314,22 +314,15 @@ static int ep93xx_ac97_trigger(struct snd_pcm_substream *substream,
return
0
;
}
static
int
ep93xx_ac97_startup
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
)
static
int
ep93xx_ac97_dai_probe
(
struct
snd_soc_dai
*
dai
)
{
struct
ep93xx_dma_data
*
dma_data
;
dai
->
playback_dma_data
=
&
ep93xx_ac97_pcm_out
;
dai
->
capture_dma_data
=
&
ep93xx_ac97_pcm_in
;
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
dma_data
=
&
ep93xx_ac97_pcm_out
;
else
dma_data
=
&
ep93xx_ac97_pcm_in
;
snd_soc_dai_set_dma_data
(
dai
,
substream
,
dma_data
);
return
0
;
}
static
const
struct
snd_soc_dai_ops
ep93xx_ac97_dai_ops
=
{
.
startup
=
ep93xx_ac97_startup
,
.
trigger
=
ep93xx_ac97_trigger
,
};
...
...
@@ -337,6 +330,7 @@ static struct snd_soc_dai_driver ep93xx_ac97_dai = {
.
name
=
"ep93xx-ac97"
,
.
id
=
0
,
.
ac97_control
=
1
,
.
probe
=
ep93xx_ac97_dai_probe
,
.
playback
=
{
.
stream_name
=
"AC97 Playback"
,
.
channels_min
=
2
,
...
...
@@ -403,7 +397,6 @@ static int ep93xx_ac97_probe(struct platform_device *pdev)
return
0
;
fail:
platform_set_drvdata
(
pdev
,
NULL
);
ep93xx_ac97_info
=
NULL
;
dev_set_drvdata
(
&
pdev
->
dev
,
NULL
);
return
ret
;
...
...
@@ -418,7 +411,6 @@ static int ep93xx_ac97_remove(struct platform_device *pdev)
/* disable the AC97 controller */
ep93xx_ac97_write_reg
(
info
,
AC97GCR
,
0
);
platform_set_drvdata
(
pdev
,
NULL
);
ep93xx_ac97_info
=
NULL
;
dev_set_drvdata
(
&
pdev
->
dev
,
NULL
);
...
...
sound/soc/cirrus/ep93xx-i2s.c
View file @
59338599
...
...
@@ -60,11 +60,10 @@ struct ep93xx_i2s_info {
struct
clk
*
mclk
;
struct
clk
*
sclk
;
struct
clk
*
lrclk
;
struct
ep93xx_dma_data
*
dma_data
;
void
__iomem
*
regs
;
};
struct
ep93xx_dma_data
ep93xx_i2s_dma_data
[]
=
{
st
atic
st
ruct
ep93xx_dma_data
ep93xx_i2s_dma_data
[]
=
{
[
SNDRV_PCM_STREAM_PLAYBACK
]
=
{
.
name
=
"i2s-pcm-out"
,
.
port
=
EP93XX_DMA_I2S1
,
...
...
@@ -139,15 +138,11 @@ static void ep93xx_i2s_disable(struct ep93xx_i2s_info *info, int stream)
}
}
static
int
ep93xx_i2s_startup
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
)
static
int
ep93xx_i2s_dai_probe
(
struct
snd_soc_dai
*
dai
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
ep93xx_i2s_info
*
info
=
snd_soc_dai_get_drvdata
(
dai
);
struct
snd_soc_dai
*
cpu_dai
=
rtd
->
cpu_dai
;
dai
->
playback_dma_data
=
&
ep93xx_i2s_dma_data
[
SNDRV_PCM_STREAM_PLAYBACK
];
dai
->
capture_dma_data
=
&
ep93xx_i2s_dma_data
[
SNDRV_PCM_STREAM_CAPTURE
];
snd_soc_dai_set_dma_data
(
cpu_dai
,
substream
,
&
info
->
dma_data
[
substream
->
stream
]);
return
0
;
}
...
...
@@ -338,7 +333,6 @@ static int ep93xx_i2s_resume(struct snd_soc_dai *dai)
#endif
static
const
struct
snd_soc_dai_ops
ep93xx_i2s_dai_ops
=
{
.
startup
=
ep93xx_i2s_startup
,
.
shutdown
=
ep93xx_i2s_shutdown
,
.
hw_params
=
ep93xx_i2s_hw_params
,
.
set_sysclk
=
ep93xx_i2s_set_sysclk
,
...
...
@@ -349,6 +343,7 @@ static const struct snd_soc_dai_ops ep93xx_i2s_dai_ops = {
static
struct
snd_soc_dai_driver
ep93xx_i2s_dai
=
{
.
symmetric_rates
=
1
,
.
probe
=
ep93xx_i2s_dai_probe
,
.
suspend
=
ep93xx_i2s_suspend
,
.
resume
=
ep93xx_i2s_resume
,
.
playback
=
{
...
...
@@ -407,7 +402,6 @@ static int ep93xx_i2s_probe(struct platform_device *pdev)
}
dev_set_drvdata
(
&
pdev
->
dev
,
info
);
info
->
dma_data
=
ep93xx_i2s_dma_data
;
err
=
snd_soc_register_component
(
&
pdev
->
dev
,
&
ep93xx_i2s_component
,
&
ep93xx_i2s_dai
,
1
);
...
...
sound/soc/cirrus/ep93xx-pcm.c
View file @
59338599
...
...
@@ -14,20 +14,14 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/slab.h>
#include <linux/platform_device.h>
#include <linux/dmaengine.h>
#include <linux/dma-mapping.h>
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/dmaengine_pcm.h>
#include <linux/platform_data/dma-ep93xx.h>
#include <mach/hardware.h>
#include <mach/ep93xx-regs.h>
static
const
struct
snd_pcm_hardware
ep93xx_pcm_hardware
=
{
.
info
=
(
SNDRV_PCM_INFO_MMAP
|
...
...
@@ -63,134 +57,24 @@ static bool ep93xx_pcm_dma_filter(struct dma_chan *chan, void *filter_param)
return
false
;
}
static
int
ep93xx_pcm_open
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
snd_soc_set_runtime_hwparams
(
substream
,
&
ep93xx_pcm_hardware
);
return
snd_dmaengine_pcm_open_request_chan
(
substream
,
ep93xx_pcm_dma_filter
,
snd_soc_dai_get_dma_data
(
rtd
->
cpu_dai
,
substream
));
}
static
int
ep93xx_pcm_hw_params
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
params
)
{
snd_pcm_set_runtime_buffer
(
substream
,
&
substream
->
dma_buffer
);
return
0
;
}
static
int
ep93xx_pcm_hw_free
(
struct
snd_pcm_substream
*
substream
)
{
snd_pcm_set_runtime_buffer
(
substream
,
NULL
);
return
0
;
}
static
int
ep93xx_pcm_mmap
(
struct
snd_pcm_substream
*
substream
,
struct
vm_area_struct
*
vma
)
{
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
return
dma_mmap_writecombine
(
substream
->
pcm
->
card
->
dev
,
vma
,
runtime
->
dma_area
,
runtime
->
dma_addr
,
runtime
->
dma_bytes
);
}
static
struct
snd_pcm_ops
ep93xx_pcm_ops
=
{
.
open
=
ep93xx_pcm_open
,
.
close
=
snd_dmaengine_pcm_close_release_chan
,
.
ioctl
=
snd_pcm_lib_ioctl
,
.
hw_params
=
ep93xx_pcm_hw_params
,
.
hw_free
=
ep93xx_pcm_hw_free
,
.
trigger
=
snd_dmaengine_pcm_trigger
,
.
pointer
=
snd_dmaengine_pcm_pointer_no_residue
,
.
mmap
=
ep93xx_pcm_mmap
,
};
static
int
ep93xx_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
=
ep93xx_pcm_hardware
.
buffer_bytes_max
;
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
);
buf
->
bytes
=
size
;
return
(
buf
->
area
==
NULL
)
?
-
ENOMEM
:
0
;
}
static
void
ep93xx_pcm_free_dma_buffers
(
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
u64
ep93xx_pcm_dmamask
=
DMA_BIT_MASK
(
32
);
static
int
ep93xx_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
=
&
ep93xx_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
=
ep93xx_pcm_preallocate_dma_buffer
(
pcm
,
SNDRV_PCM_STREAM_PLAYBACK
);
if
(
ret
)
return
ret
;
}
if
(
pcm
->
streams
[
SNDRV_PCM_STREAM_CAPTURE
].
substream
)
{
ret
=
ep93xx_pcm_preallocate_dma_buffer
(
pcm
,
SNDRV_PCM_STREAM_CAPTURE
);
if
(
ret
)
return
ret
;
}
return
0
;
}
static
struct
snd_soc_platform_driver
ep93xx_soc_platform
=
{
.
ops
=
&
ep93xx_pcm_ops
,
.
pcm_new
=
&
ep93xx_pcm_new
,
.
pcm_free
=
&
ep93xx_pcm_free_dma_buffers
,
static
const
struct
snd_dmaengine_pcm_config
ep93xx_dmaengine_pcm_config
=
{
.
pcm_hardware
=
&
ep93xx_pcm_hardware
,
.
compat_filter_fn
=
ep93xx_pcm_dma_filter
,
.
prealloc_buffer_size
=
131072
,
};
static
int
ep93xx_soc_platform_probe
(
struct
platform_device
*
pdev
)
{
return
snd_soc_register_platform
(
&
pdev
->
dev
,
&
ep93xx_soc_platform
);
return
snd_dmaengine_pcm_register
(
&
pdev
->
dev
,
&
ep93xx_dmaengine_pcm_config
,
SND_DMAENGINE_PCM_FLAG_NO_RESIDUE
|
SND_DMAENGINE_PCM_FLAG_NO_DT
|
SND_DMAENGINE_PCM_FLAG_COMPAT
);
}
static
int
ep93xx_soc_platform_remove
(
struct
platform_device
*
pdev
)
{
snd_
soc_unregister_platform
(
&
pdev
->
dev
);
snd_
dmaengine_pcm_unregister
(
&
pdev
->
dev
);
return
0
;
}
...
...
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