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
nexedi
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
Show 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