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
38e8c895
Commit
38e8c895
authored
Apr 12, 2013
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/dma' into asoc-next
parents
d66e065c
69b6f196
Changes
51
Show whitespace changes
Inline
Side-by-side
Showing
51 changed files
with
356 additions
and
655 deletions
+356
-655
include/sound/dmaengine_pcm.h
include/sound/dmaengine_pcm.h
+24
-3
sound/soc/atmel/atmel-pcm-dma.c
sound/soc/atmel/atmel-pcm-dma.c
+7
-18
sound/soc/cirrus/edb93xx.c
sound/soc/cirrus/edb93xx.c
+0
-1
sound/soc/cirrus/ep93xx-ac97.c
sound/soc/cirrus/ep93xx-ac97.c
+5
-4
sound/soc/cirrus/ep93xx-i2s.c
sound/soc/cirrus/ep93xx-i2s.c
+8
-8
sound/soc/cirrus/ep93xx-pcm.c
sound/soc/cirrus/ep93xx-pcm.c
+3
-34
sound/soc/cirrus/ep93xx-pcm.h
sound/soc/cirrus/ep93xx-pcm.h
+0
-20
sound/soc/cirrus/simone.c
sound/soc/cirrus/simone.c
+0
-2
sound/soc/cirrus/snappercl15.c
sound/soc/cirrus/snappercl15.c
+0
-1
sound/soc/fsl/fsl_ssi.c
sound/soc/fsl/fsl_ssi.c
+22
-14
sound/soc/fsl/imx-pcm-dma.c
sound/soc/fsl/imx-pcm-dma.c
+9
-49
sound/soc/fsl/imx-pcm-fiq.c
sound/soc/fsl/imx-pcm-fiq.c
+2
-2
sound/soc/fsl/imx-pcm.h
sound/soc/fsl/imx-pcm.h
+13
-6
sound/soc/fsl/imx-ssi.c
sound/soc/fsl/imx-ssi.c
+18
-11
sound/soc/fsl/imx-ssi.h
sound/soc/fsl/imx-ssi.h
+5
-2
sound/soc/mxs/mxs-pcm.c
sound/soc/mxs/mxs-pcm.c
+5
-38
sound/soc/mxs/mxs-pcm.h
sound/soc/mxs/mxs-pcm.h
+3
-1
sound/soc/mxs/mxs-saif.c
sound/soc/mxs/mxs-saif.c
+3
-3
sound/soc/omap/am3517evm.c
sound/soc/omap/am3517evm.c
+0
-1
sound/soc/omap/ams-delta.c
sound/soc/omap/ams-delta.c
+0
-1
sound/soc/omap/mcbsp.c
sound/soc/omap/mcbsp.c
+8
-6
sound/soc/omap/mcbsp.h
sound/soc/omap/mcbsp.h
+4
-3
sound/soc/omap/n810.c
sound/soc/omap/n810.c
+0
-1
sound/soc/omap/omap-abe-twl6040.c
sound/soc/omap/omap-abe-twl6040.c
+0
-1
sound/soc/omap/omap-dmic.c
sound/soc/omap/omap-dmic.c
+13
-25
sound/soc/omap/omap-hdmi.c
sound/soc/omap/omap-hdmi.c
+10
-14
sound/soc/omap/omap-mcbsp.c
sound/soc/omap/omap-mcbsp.c
+8
-10
sound/soc/omap/omap-mcpdm.c
sound/soc/omap/omap-mcpdm.c
+65
-44
sound/soc/omap/omap-pcm.c
sound/soc/omap/omap-pcm.c
+7
-76
sound/soc/omap/omap-pcm.h
sound/soc/omap/omap-pcm.h
+0
-40
sound/soc/omap/omap-twl4030.c
sound/soc/omap/omap-twl4030.c
+0
-1
sound/soc/omap/omap3pandora.c
sound/soc/omap/omap3pandora.c
+7
-2
sound/soc/omap/osk5912.c
sound/soc/omap/osk5912.c
+0
-1
sound/soc/omap/rx51.c
sound/soc/omap/rx51.c
+0
-1
sound/soc/pxa/mmp-pcm.c
sound/soc/pxa/mmp-pcm.c
+5
-28
sound/soc/soc-dmaengine-pcm.c
sound/soc/soc-dmaengine-pcm.c
+39
-29
sound/soc/spear/spear_pcm.c
sound/soc/spear/spear_pcm.c
+2
-16
sound/soc/tegra/tegra20_ac97.c
sound/soc/tegra/tegra20_ac97.c
+7
-6
sound/soc/tegra/tegra20_ac97.h
sound/soc/tegra/tegra20_ac97.h
+2
-2
sound/soc/tegra/tegra20_i2s.c
sound/soc/tegra/tegra20_i2s.c
+7
-6
sound/soc/tegra/tegra20_i2s.h
sound/soc/tegra/tegra20_i2s.h
+2
-2
sound/soc/tegra/tegra20_spdif.c
sound/soc/tegra/tegra20_spdif.c
+4
-3
sound/soc/tegra/tegra20_spdif.h
sound/soc/tegra/tegra20_spdif.h
+2
-2
sound/soc/tegra/tegra30_ahub.c
sound/soc/tegra/tegra30_ahub.c
+4
-4
sound/soc/tegra/tegra30_ahub.h
sound/soc/tegra/tegra30_ahub.h
+4
-4
sound/soc/tegra/tegra30_i2s.c
sound/soc/tegra/tegra30_i2s.c
+7
-6
sound/soc/tegra/tegra30_i2s.h
sound/soc/tegra/tegra30_i2s.h
+2
-2
sound/soc/tegra/tegra_pcm.c
sound/soc/tegra/tegra_pcm.c
+4
-20
sound/soc/tegra/tegra_pcm.h
sound/soc/tegra/tegra_pcm.h
+0
-7
sound/soc/ux500/ux500_pcm.c
sound/soc/ux500/ux500_pcm.c
+16
-60
sound/soc/ux500/ux500_pcm.h
sound/soc/ux500/ux500_pcm.h
+0
-14
No files found.
include/sound/dmaengine_pcm.h
View file @
38e8c895
...
...
@@ -32,9 +32,6 @@ snd_pcm_substream_to_dma_direction(const struct snd_pcm_substream *substream)
return
DMA_DEV_TO_MEM
;
}
void
snd_dmaengine_pcm_set_data
(
struct
snd_pcm_substream
*
substream
,
void
*
data
);
void
*
snd_dmaengine_pcm_get_data
(
struct
snd_pcm_substream
*
substream
);
int
snd_hwparams_to_dma_slave_config
(
const
struct
snd_pcm_substream
*
substream
,
const
struct
snd_pcm_hw_params
*
params
,
struct
dma_slave_config
*
slave_config
);
int
snd_dmaengine_pcm_trigger
(
struct
snd_pcm_substream
*
substream
,
int
cmd
);
...
...
@@ -47,4 +44,28 @@ int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream);
struct
dma_chan
*
snd_dmaengine_pcm_get_chan
(
struct
snd_pcm_substream
*
substream
);
/**
* struct snd_dmaengine_dai_dma_data - DAI DMA configuration data
* @addr: Address of the DAI data source or destination register.
* @addr_width: Width of the DAI data source or destination register.
* @maxburst: Maximum number of words(note: words, as in units of the
* src_addr_width member, not bytes) that can be send to or received from the
* DAI in one burst.
* @slave_id: Slave requester id for the DMA channel.
* @filter_data: Custom DMA channel filter data, this will usually be used when
* requesting the DMA channel.
*/
struct
snd_dmaengine_dai_dma_data
{
dma_addr_t
addr
;
enum
dma_slave_buswidth
addr_width
;
u32
maxburst
;
unsigned
int
slave_id
;
void
*
filter_data
;
};
void
snd_dmaengine_pcm_set_config_from_dai_data
(
const
struct
snd_pcm_substream
*
substream
,
const
struct
snd_dmaengine_dai_dma_data
*
dma_data
,
struct
dma_slave_config
*
config
);
#endif
sound/soc/atmel/atmel-pcm-dma.c
View file @
38e8c895
...
...
@@ -67,9 +67,10 @@ static const struct snd_pcm_hardware atmel_pcm_dma_hardware = {
static
void
atmel_pcm_dma_irq
(
u32
ssc_sr
,
struct
snd_pcm_substream
*
substream
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
atmel_pcm_dma_params
*
prtd
;
prtd
=
snd_
dmaengine_pcm_get_data
(
substream
);
prtd
=
snd_
soc_dai_get_dma_data
(
rtd
->
cpu_dai
,
substream
);
if
(
ssc_sr
&
prtd
->
mask
->
ssc_error
)
{
if
(
snd_pcm_running
(
substream
))
...
...
@@ -104,15 +105,13 @@ static bool filter(struct dma_chan *chan, void *slave)
}
static
int
atmel_pcm_configure_dma
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
params
)
struct
snd_pcm_hw_params
*
params
,
struct
atmel_pcm_dma_params
*
prtd
)
{
struct
atmel_pcm_dma_params
*
prtd
;
struct
ssc_device
*
ssc
;
struct
dma_chan
*
dma_chan
;
struct
dma_slave_config
slave_config
;
int
ret
;
prtd
=
snd_dmaengine_pcm_get_data
(
substream
);
ssc
=
prtd
->
ssc
;
ret
=
snd_hwparams_to_dma_slave_config
(
substream
,
params
,
...
...
@@ -130,8 +129,6 @@ static int atmel_pcm_configure_dma(struct snd_pcm_substream *substream,
slave_config
.
src_maxburst
=
1
;
}
slave_config
.
device_fc
=
false
;
dma_chan
=
snd_dmaengine_pcm_get_chan
(
substream
);
if
(
dmaengine_slave_config
(
dma_chan
,
&
slave_config
))
{
pr_err
(
"atmel-pcm: failed to configure dma channel
\n
"
);
...
...
@@ -164,9 +161,7 @@ static int atmel_pcm_hw_params(struct snd_pcm_substream *substream,
return
-
EINVAL
;
}
snd_dmaengine_pcm_set_data
(
substream
,
prtd
);
ret
=
atmel_pcm_configure_dma
(
substream
,
params
);
ret
=
atmel_pcm_configure_dma
(
substream
,
params
,
prtd
);
if
(
ret
)
{
pr_err
(
"atmel-pcm: failed to configure dmai
\n
"
);
goto
err
;
...
...
@@ -182,9 +177,10 @@ static int atmel_pcm_hw_params(struct snd_pcm_substream *substream,
static
int
atmel_pcm_dma_prepare
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
atmel_pcm_dma_params
*
prtd
;
prtd
=
snd_
dmaengine_pcm_get_data
(
substream
);
prtd
=
snd_
soc_dai_get_dma_data
(
rtd
->
cpu_dai
,
substream
);
ssc_writex
(
prtd
->
ssc
->
regs
,
SSC_IER
,
prtd
->
mask
->
ssc_error
);
ssc_writex
(
prtd
->
ssc
->
regs
,
SSC_CR
,
prtd
->
mask
->
ssc_enable
);
...
...
@@ -199,16 +195,9 @@ static int atmel_pcm_open(struct snd_pcm_substream *substream)
return
0
;
}
static
int
atmel_pcm_close
(
struct
snd_pcm_substream
*
substream
)
{
snd_dmaengine_pcm_close
(
substream
);
return
0
;
}
static
struct
snd_pcm_ops
atmel_pcm_ops
=
{
.
open
=
atmel_pcm_open
,
.
close
=
atmel
_pcm_close
,
.
close
=
snd_dmaengine
_pcm_close
,
.
ioctl
=
snd_pcm_lib_ioctl
,
.
hw_params
=
atmel_pcm_hw_params
,
.
prepare
=
atmel_pcm_dma_prepare
,
...
...
sound/soc/cirrus/edb93xx.c
View file @
38e8c895
...
...
@@ -27,7 +27,6 @@
#include <sound/soc.h>
#include <asm/mach-types.h>
#include <mach/hardware.h>
#include "ep93xx-pcm.h"
static
int
edb93xx_hw_params
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
params
)
...
...
sound/soc/cirrus/ep93xx-ac97.c
View file @
38e8c895
...
...
@@ -23,7 +23,6 @@
#include <sound/soc.h>
#include <linux/platform_data/dma-ep93xx.h>
#include "ep93xx-pcm.h"
/*
* Per channel (1-4) registers.
...
...
@@ -101,14 +100,16 @@ struct ep93xx_ac97_info {
/* currently ALSA only supports a single AC97 device */
static
struct
ep93xx_ac97_info
*
ep93xx_ac97_info
;
static
struct
ep93xx_
pcm_dma_params
ep93xx_ac97_pcm_out
=
{
static
struct
ep93xx_
dma_data
ep93xx_ac97_pcm_out
=
{
.
name
=
"ac97-pcm-out"
,
.
dma_port
=
EP93XX_DMA_AAC1
,
.
direction
=
DMA_MEM_TO_DEV
,
};
static
struct
ep93xx_
pcm_dma_params
ep93xx_ac97_pcm_in
=
{
static
struct
ep93xx_
dma_data
ep93xx_ac97_pcm_in
=
{
.
name
=
"ac97-pcm-in"
,
.
dma_port
=
EP93XX_DMA_AAC1
,
.
direction
=
DMA_DEV_TO_MEM
,
};
static
inline
unsigned
ep93xx_ac97_read_reg
(
struct
ep93xx_ac97_info
*
info
,
...
...
@@ -316,7 +317,7 @@ static int ep93xx_ac97_trigger(struct snd_pcm_substream *substream,
static
int
ep93xx_ac97_startup
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
)
{
struct
ep93xx_
pcm_dma_params
*
dma_data
;
struct
ep93xx_
dma_data
*
dma_data
;
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
dma_data
=
&
ep93xx_ac97_pcm_out
;
...
...
sound/soc/cirrus/ep93xx-i2s.c
View file @
38e8c895
...
...
@@ -30,8 +30,6 @@
#include <mach/ep93xx-regs.h>
#include <linux/platform_data/dma-ep93xx.h>
#include "ep93xx-pcm.h"
#define EP93XX_I2S_TXCLKCFG 0x00
#define EP93XX_I2S_RXCLKCFG 0x04
#define EP93XX_I2S_GLCTRL 0x0C
...
...
@@ -62,18 +60,20 @@ struct ep93xx_i2s_info {
struct
clk
*
mclk
;
struct
clk
*
sclk
;
struct
clk
*
lrclk
;
struct
ep93xx_
pcm_dma_params
*
dma_params
;
struct
ep93xx_
dma_data
*
dma_data
;
void
__iomem
*
regs
;
};
struct
ep93xx_
pcm_dma_params
ep93xx_i2s_dma_params
[]
=
{
struct
ep93xx_
dma_data
ep93xx_i2s_dma_data
[]
=
{
[
SNDRV_PCM_STREAM_PLAYBACK
]
=
{
.
name
=
"i2s-pcm-out"
,
.
dma_port
=
EP93XX_DMA_I2S1
,
.
port
=
EP93XX_DMA_I2S1
,
.
direction
=
DMA_MEM_TO_DEV
,
},
[
SNDRV_PCM_STREAM_CAPTURE
]
=
{
.
name
=
"i2s-pcm-in"
,
.
dma_port
=
EP93XX_DMA_I2S1
,
.
port
=
EP93XX_DMA_I2S1
,
.
direction
=
DMA_DEV_TO_MEM
,
},
};
...
...
@@ -147,7 +147,7 @@ static int ep93xx_i2s_startup(struct snd_pcm_substream *substream,
struct
snd_soc_dai
*
cpu_dai
=
rtd
->
cpu_dai
;
snd_soc_dai_set_dma_data
(
cpu_dai
,
substream
,
&
info
->
dma_
params
[
substream
->
stream
]);
&
info
->
dma_
data
[
substream
->
stream
]);
return
0
;
}
...
...
@@ -407,7 +407,7 @@ static int ep93xx_i2s_probe(struct platform_device *pdev)
}
dev_set_drvdata
(
&
pdev
->
dev
,
info
);
info
->
dma_
params
=
ep93xx_i2s_dma_params
;
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 @
38e8c895
...
...
@@ -29,8 +29,6 @@
#include <mach/hardware.h>
#include <mach/ep93xx-regs.h>
#include "ep93xx-pcm.h"
static
const
struct
snd_pcm_hardware
ep93xx_pcm_hardware
=
{
.
info
=
(
SNDRV_PCM_INFO_MMAP
|
SNDRV_PCM_INFO_MMAP_VALID
|
...
...
@@ -68,40 +66,11 @@ static bool ep93xx_pcm_dma_filter(struct dma_chan *chan, void *filter_param)
static
int
ep93xx_pcm_open
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
snd_soc_dai
*
cpu_dai
=
rtd
->
cpu_dai
;
struct
ep93xx_pcm_dma_params
*
dma_params
;
struct
ep93xx_dma_data
*
dma_data
;
int
ret
;
snd_soc_set_runtime_hwparams
(
substream
,
&
ep93xx_pcm_hardware
);
dma_data
=
kmalloc
(
sizeof
(
*
dma_data
),
GFP_KERNEL
);
if
(
!
dma_data
)
return
-
ENOMEM
;
dma_params
=
snd_soc_dai_get_dma_data
(
cpu_dai
,
substream
);
dma_data
->
port
=
dma_params
->
dma_port
;
dma_data
->
name
=
dma_params
->
name
;
dma_data
->
direction
=
snd_pcm_substream_to_dma_direction
(
substream
);
ret
=
snd_dmaengine_pcm_open
(
substream
,
ep93xx_pcm_dma_filter
,
dma_data
);
if
(
ret
)
{
kfree
(
dma_data
);
return
ret
;
}
snd_dmaengine_pcm_set_data
(
substream
,
dma_data
);
return
0
;
}
static
int
ep93xx_pcm_close
(
struct
snd_pcm_substream
*
substream
)
{
struct
dma_data
*
dma_data
=
snd_dmaengine_pcm_get_data
(
substream
);
snd_dmaengine_pcm_close
(
substream
);
kfree
(
dma_data
);
return
0
;
return
snd_dmaengine_pcm_open
(
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
,
...
...
@@ -131,7 +100,7 @@ static int ep93xx_pcm_mmap(struct snd_pcm_substream *substream,
static
struct
snd_pcm_ops
ep93xx_pcm_ops
=
{
.
open
=
ep93xx_pcm_open
,
.
close
=
ep93xx
_pcm_close
,
.
close
=
snd_dmaengine
_pcm_close
,
.
ioctl
=
snd_pcm_lib_ioctl
,
.
hw_params
=
ep93xx_pcm_hw_params
,
.
hw_free
=
ep93xx_pcm_hw_free
,
...
...
sound/soc/cirrus/ep93xx-pcm.h
deleted
100644 → 0
View file @
d66e065c
/*
* sound/soc/ep93xx/ep93xx-pcm.h - EP93xx ALSA PCM interface
*
* Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
* Copyright (C) 2006 Applied Data Systems
*
* 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 _EP93XX_SND_SOC_PCM_H
#define _EP93XX_SND_SOC_PCM_H
struct
ep93xx_pcm_dma_params
{
char
*
name
;
int
dma_port
;
};
#endif
/* _EP93XX_SND_SOC_PCM_H */
sound/soc/cirrus/simone.c
View file @
38e8c895
...
...
@@ -21,8 +21,6 @@
#include <asm/mach-types.h>
#include <mach/hardware.h>
#include "ep93xx-pcm.h"
static
struct
snd_soc_dai_link
simone_dai
=
{
.
name
=
"AC97"
,
.
stream_name
=
"AC97 HiFi"
,
...
...
sound/soc/cirrus/snappercl15.c
View file @
38e8c895
...
...
@@ -21,7 +21,6 @@
#include <mach/hardware.h>
#include "../codecs/tlv320aic23.h"
#include "ep93xx-pcm.h"
#define CODEC_CLOCK 5644800
...
...
sound/soc/fsl/fsl_ssi.c
View file @
38e8c895
...
...
@@ -27,6 +27,7 @@
#include <sound/pcm_params.h>
#include <sound/initval.h>
#include <sound/soc.h>
#include <sound/dmaengine_pcm.h>
#include "fsl_ssi.h"
#include "imx-pcm.h"
...
...
@@ -122,8 +123,10 @@ struct fsl_ssi_private {
bool
ssi_on_imx
;
struct
clk
*
clk
;
struct
platform_device
*
imx_pcm_pdev
;
struct
imx_pcm_dma_params
dma_params_tx
;
struct
imx_pcm_dma_params
dma_params_rx
;
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
;
struct
imx_dma_data
filter_data_rx
;
struct
{
unsigned
int
rfrc
;
...
...
@@ -653,6 +656,7 @@ static int fsl_ssi_probe(struct platform_device *pdev)
const
uint32_t
*
iprop
;
struct
resource
res
;
char
name
[
64
];
bool
shared
;
/* SSIs that are not connected on the board should have a
* status = "disabled"
...
...
@@ -741,14 +745,18 @@ static int fsl_ssi_probe(struct platform_device *pdev)
* We have burstsize be "fifo_depth - 2" to match the SSI
* watermark setting in fsl_ssi_startup().
*/
ssi_private
->
dma_params_tx
.
burstsize
=
ssi_private
->
dma_params_tx
.
maxburst
=
ssi_private
->
fifo_depth
-
2
;
ssi_private
->
dma_params_rx
.
burstsize
=
ssi_private
->
dma_params_rx
.
maxburst
=
ssi_private
->
fifo_depth
-
2
;
ssi_private
->
dma_params_tx
.
dma_
addr
=
ssi_private
->
dma_params_tx
.
addr
=
ssi_private
->
ssi_phys
+
offsetof
(
struct
ccsr_ssi
,
stx0
);
ssi_private
->
dma_params_rx
.
dma_
addr
=
ssi_private
->
dma_params_rx
.
addr
=
ssi_private
->
ssi_phys
+
offsetof
(
struct
ccsr_ssi
,
srx0
);
ssi_private
->
dma_params_tx
.
filter_data
=
&
ssi_private
->
filter_data_tx
;
ssi_private
->
dma_params_rx
.
filter_data
=
&
ssi_private
->
filter_data_rx
;
/*
* TODO: This is a temporary solution and should be changed
* to use generic DMA binding later when the helplers get in.
...
...
@@ -759,14 +767,14 @@ static int fsl_ssi_probe(struct platform_device *pdev)
dev_err
(
&
pdev
->
dev
,
"could not get dma events
\n
"
);
goto
error_clk
;
}
ssi_private
->
dma_params_tx
.
dma
=
dma_events
[
0
];
ssi_private
->
dma_params_rx
.
dma
=
dma_events
[
1
];
ssi_private
->
dma_params_tx
.
shared_peripheral
=
of_device_is_compatible
(
of_get_parent
(
np
),
shared
=
of_device_is_compatible
(
of_get_parent
(
np
),
"fsl,spba-bus"
);
ssi_private
->
dma_params_rx
.
shared_peripheral
=
ssi_private
->
dma_params_tx
.
shared_peripheral
;
imx_pcm_dma_params_init_data
(
&
ssi_private
->
filter_data_tx
,
dma_events
[
0
],
shared
);
imx_pcm_dma_params_init_data
(
&
ssi_private
->
filter_data_rx
,
dma_events
[
1
],
shared
);
}
/* Initialize the the device_attribute structure */
...
...
sound/soc/fsl/imx-pcm-dma.c
View file @
38e8c895
...
...
@@ -30,16 +30,16 @@
#include <sound/soc.h>
#include <sound/dmaengine_pcm.h>
#include <linux/platform_data/dma-imx.h>
#include "imx-pcm.h"
static
bool
filter
(
struct
dma_chan
*
chan
,
void
*
param
)
{
struct
snd_dmaengine_dai_dma_data
*
dma_data
=
param
;
if
(
!
imx_dma_is_general_purpose
(
chan
))
return
false
;
chan
->
private
=
param
;
chan
->
private
=
dma_data
->
filter_data
;
return
true
;
}
...
...
@@ -49,25 +49,16 @@ static int snd_imx_pcm_hw_params(struct snd_pcm_substream *substream,
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
dma_chan
*
chan
=
snd_dmaengine_pcm_get_chan
(
substream
);
struct
imx_pcm_dma_params
*
dma_params
;
struct
dma_slave_config
slave_config
;
int
ret
;
dma_params
=
snd_soc_dai_get_dma_data
(
rtd
->
cpu_dai
,
substream
);
ret
=
snd_hwparams_to_dma_slave_config
(
substream
,
params
,
&
slave_config
);
if
(
ret
)
return
ret
;
slave_config
.
device_fc
=
false
;
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
slave_config
.
dst_addr
=
dma_params
->
dma_addr
;
slave_config
.
dst_maxburst
=
dma_params
->
burstsize
;
}
else
{
slave_config
.
src_addr
=
dma_params
->
dma_addr
;
slave_config
.
src_maxburst
=
dma_params
->
burstsize
;
}
snd_dmaengine_pcm_set_config_from_dai_data
(
substream
,
snd_soc_dai_get_dma_data
(
rtd
->
cpu_dai
,
substream
),
&
slave_config
);
ret
=
dmaengine_slave_config
(
chan
,
&
slave_config
);
if
(
ret
)
...
...
@@ -100,47 +91,16 @@ static struct snd_pcm_hardware snd_imx_hardware = {
static
int
snd_imx_open
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
imx_pcm_dma_params
*
dma_params
;
struct
imx_dma_data
*
dma_data
;
int
ret
;
snd_soc_set_runtime_hwparams
(
substream
,
&
snd_imx_hardware
);
dma_params
=
snd_soc_dai_get_dma_data
(
rtd
->
cpu_dai
,
substream
);
dma_data
=
kzalloc
(
sizeof
(
*
dma_data
),
GFP_KERNEL
);
if
(
!
dma_data
)
return
-
ENOMEM
;
dma_data
->
peripheral_type
=
dma_params
->
shared_peripheral
?
IMX_DMATYPE_SSI_SP
:
IMX_DMATYPE_SSI
;
dma_data
->
priority
=
DMA_PRIO_HIGH
;
dma_data
->
dma_request
=
dma_params
->
dma
;
ret
=
snd_dmaengine_pcm_open
(
substream
,
filter
,
dma_data
);
if
(
ret
)
{
kfree
(
dma_data
);
return
ret
;
}
snd_dmaengine_pcm_set_data
(
substream
,
dma_data
);
return
0
;
}
static
int
snd_imx_close
(
struct
snd_pcm_substream
*
substream
)
{
struct
imx_dma_data
*
dma_data
=
snd_dmaengine_pcm_get_data
(
substream
);
snd_dmaengine_pcm_close
(
substream
);
kfree
(
dma_data
);
return
0
;
return
snd_dmaengine_pcm_open
(
substream
,
filter
,
snd_soc_dai_get_dma_data
(
rtd
->
cpu_dai
,
substream
));
}
static
struct
snd_pcm_ops
imx_pcm_ops
=
{
.
open
=
snd_imx_open
,
.
close
=
snd_
imx
_close
,
.
close
=
snd_
dmaengine_pcm
_close
,
.
ioctl
=
snd_pcm_lib_ioctl
,
.
hw_params
=
snd_imx_pcm_hw_params
,
.
trigger
=
snd_dmaengine_pcm_trigger
,
...
...
sound/soc/fsl/imx-pcm-fiq.c
View file @
38e8c895
...
...
@@ -299,8 +299,8 @@ int imx_pcm_fiq_init(struct platform_device *pdev)
imx_ssi_fiq_base
=
(
unsigned
long
)
ssi
->
base
;
ssi
->
dma_params_tx
.
burstsize
=
4
;
ssi
->
dma_params_rx
.
burstsize
=
6
;
ssi
->
dma_params_tx
.
maxburst
=
4
;
ssi
->
dma_params_rx
.
maxburst
=
6
;
ret
=
snd_soc_register_platform
(
&
pdev
->
dev
,
&
imx_soc_platform_fiq
);
if
(
ret
)
...
...
sound/soc/fsl/imx-pcm.h
View file @
38e8c895
...
...
@@ -13,17 +13,24 @@
#ifndef _IMX_PCM_H
#define _IMX_PCM_H
#include <linux/platform_data/dma-imx.h>
/*
* Do not change this as the FIQ handler depends on this size
*/
#define IMX_SSI_DMABUF_SIZE (64 * 1024)
struct
imx_pcm_dma_params
{
int
dma
;
unsigned
long
dma_addr
;
int
burstsize
;
bool
shared_peripheral
;
/* The peripheral is on SPBA bus */
};
static
inline
void
imx_pcm_dma_params_init_data
(
struct
imx_dma_data
*
dma_data
,
int
dma
,
bool
shared
)
{
dma_data
->
dma_request
=
dma
;
dma_data
->
priority
=
DMA_PRIO_HIGH
;
if
(
shared
)
dma_data
->
peripheral_type
=
IMX_DMATYPE_SSI_SP
;
else
dma_data
->
peripheral_type
=
IMX_DMATYPE_SSI
;
}
int
snd_imx_pcm_mmap
(
struct
snd_pcm_substream
*
substream
,
struct
vm_area_struct
*
vma
);
...
...
sound/soc/fsl/imx-ssi.c
View file @
38e8c895
...
...
@@ -236,7 +236,7 @@ static int imx_ssi_startup(struct snd_pcm_substream *substream,
struct
snd_soc_dai
*
cpu_dai
)
{
struct
imx_ssi
*
ssi
=
snd_soc_dai_get_drvdata
(
cpu_dai
);
struct
imx_pcm_dma_params
*
dma_data
;
struct
snd_dmaengine_dai_dma_data
*
dma_data
;
/* Tx/Rx config */
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
...
...
@@ -369,8 +369,8 @@ static int imx_ssi_dai_probe(struct snd_soc_dai *dai)
snd_soc_dai_set_drvdata
(
dai
,
ssi
);
val
=
SSI_SFCSR_TFWM0
(
ssi
->
dma_params_tx
.
burstsize
)
|
SSI_SFCSR_RFWM0
(
ssi
->
dma_params_rx
.
burstsize
);
val
=
SSI_SFCSR_TFWM0
(
ssi
->
dma_params_tx
.
maxburst
)
|
SSI_SFCSR_RFWM0
(
ssi
->
dma_params_rx
.
maxburst
);
writel
(
val
,
ssi
->
base
+
SSI_SFCSR
);
return
0
;
...
...
@@ -579,19 +579,26 @@ static int imx_ssi_probe(struct platform_device *pdev)
writel
(
0x0
,
ssi
->
base
+
SSI_SIER
);
ssi
->
dma_params_rx
.
dma_
addr
=
res
->
start
+
SSI_SRX0
;
ssi
->
dma_params_tx
.
dma_
addr
=
res
->
start
+
SSI_STX0
;
ssi
->
dma_params_rx
.
addr
=
res
->
start
+
SSI_SRX0
;
ssi
->
dma_params_tx
.
addr
=
res
->
start
+
SSI_STX0
;
ssi
->
dma_params_tx
.
burstsize
=
6
;
ssi
->
dma_params_rx
.
burstsize
=
4
;
ssi
->
dma_params_tx
.
maxburst
=
6
;
ssi
->
dma_params_rx
.
maxburst
=
4
;
ssi
->
dma_params_tx
.
filter_data
=
&
ssi
->
filter_data_tx
;
ssi
->
dma_params_rx
.
filter_data
=
&
ssi
->
filter_data_rx
;
res
=
platform_get_resource_byname
(
pdev
,
IORESOURCE_DMA
,
"tx0"
);
if
(
res
)
ssi
->
dma_params_tx
.
dma
=
res
->
start
;
if
(
res
)
{
imx_pcm_dma_params_init_data
(
&
ssi
->
filter_data_tx
,
res
->
start
,
false
);
}
res
=
platform_get_resource_byname
(
pdev
,
IORESOURCE_DMA
,
"rx0"
);
if
(
res
)
ssi
->
dma_params_rx
.
dma
=
res
->
start
;
if
(
res
)
{
imx_pcm_dma_params_init_data
(
&
ssi
->
filter_data_rx
,
res
->
start
,
false
);
}
platform_set_drvdata
(
pdev
,
ssi
);
...
...
sound/soc/fsl/imx-ssi.h
View file @
38e8c895
...
...
@@ -187,6 +187,7 @@
#include <linux/dmaengine.h>
#include <linux/platform_data/dma-imx.h>
#include <sound/dmaengine_pcm.h>
#include "imx-pcm.h"
struct
imx_ssi
{
...
...
@@ -204,8 +205,10 @@ struct imx_ssi {
void
(
*
ac97_reset
)
(
struct
snd_ac97
*
ac97
);
void
(
*
ac97_warm_reset
)(
struct
snd_ac97
*
ac97
);
struct
imx_pcm_dma_params
dma_params_rx
;
struct
imx_pcm_dma_params
dma_params_tx
;
struct
snd_dmaengine_dai_dma_data
dma_params_rx
;
struct
snd_dmaengine_dai_dma_data
dma_params_tx
;
struct
imx_dma_data
filter_data_tx
;
struct
imx_dma_data
filter_data_rx
;
int
enabled
;
...
...
sound/soc/mxs/mxs-pcm.c
View file @
38e8c895
...
...
@@ -28,7 +28,6 @@
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/dmaengine.h>
#include <linux/fsl/mxs-dma.h>
#include <sound/core.h>
#include <sound/initval.h>
...
...
@@ -39,11 +38,6 @@
#include "mxs-pcm.h"
struct
mxs_pcm_dma_data
{
struct
mxs_dma_data
dma_data
;
struct
mxs_pcm_dma_params
*
dma_params
;
};
static
struct
snd_pcm_hardware
snd_mxs_hardware
=
{
.
info
=
SNDRV_PCM_INFO_MMAP
|
SNDRV_PCM_INFO_MMAP_VALID
|
...
...
@@ -66,8 +60,7 @@ static struct snd_pcm_hardware snd_mxs_hardware = {
static
bool
filter
(
struct
dma_chan
*
chan
,
void
*
param
)
{
struct
mxs_pcm_dma_data
*
pcm_dma_data
=
param
;
struct
mxs_pcm_dma_params
*
dma_params
=
pcm_dma_data
->
dma_params
;
struct
mxs_pcm_dma_params
*
dma_params
=
param
;
if
(
!
mxs_dma_is_apbx
(
chan
))
return
false
;
...
...
@@ -75,7 +68,7 @@ static bool filter(struct dma_chan *chan, void *param)
if
(
chan
->
chan_id
!=
dma_params
->
chan_num
)
return
false
;
chan
->
private
=
&
pcm_dma_data
->
dma_data
;
chan
->
private
=
&
dma_params
->
dma_data
;
return
true
;
}
...
...
@@ -91,37 +84,11 @@ static int snd_mxs_pcm_hw_params(struct snd_pcm_substream *substream,
static
int
snd_mxs_open
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
mxs_pcm_dma_data
*
pcm_dma_data
;
int
ret
;
pcm_dma_data
=
kzalloc
(
sizeof
(
*
pcm_dma_data
),
GFP_KERNEL
);
if
(
pcm_dma_data
==
NULL
)
return
-
ENOMEM
;
pcm_dma_data
->
dma_params
=
snd_soc_dai_get_dma_data
(
rtd
->
cpu_dai
,
substream
);
pcm_dma_data
->
dma_data
.
chan_irq
=
pcm_dma_data
->
dma_params
->
chan_irq
;
ret
=
snd_dmaengine_pcm_open
(
substream
,
filter
,
pcm_dma_data
);
if
(
ret
)
{
kfree
(
pcm_dma_data
);
return
ret
;
}
snd_soc_set_runtime_hwparams
(
substream
,
&
snd_mxs_hardware
);
snd_dmaengine_pcm_set_data
(
substream
,
pcm_dma_data
);
return
0
;
}
static
int
snd_mxs_close
(
struct
snd_pcm_substream
*
substream
)
{
struct
mxs_pcm_dma_data
*
pcm_dma_data
=
snd_dmaengine_pcm_get_data
(
substream
);
snd_dmaengine_pcm_close
(
substream
);
kfree
(
pcm_dma_data
);
return
0
;
return
snd_dmaengine_pcm_open
(
substream
,
filter
,
snd_soc_dai_get_dma_data
(
rtd
->
cpu_dai
,
substream
));
}
static
int
snd_mxs_pcm_mmap
(
struct
snd_pcm_substream
*
substream
,
...
...
@@ -137,7 +104,7 @@ static int snd_mxs_pcm_mmap(struct snd_pcm_substream *substream,
static
struct
snd_pcm_ops
mxs_pcm_ops
=
{
.
open
=
snd_mxs_open
,
.
close
=
snd_
mxs
_close
,
.
close
=
snd_
dmaengine_pcm
_close
,
.
ioctl
=
snd_pcm_lib_ioctl
,
.
hw_params
=
snd_mxs_pcm_hw_params
,
.
trigger
=
snd_dmaengine_pcm_trigger
,
...
...
sound/soc/mxs/mxs-pcm.h
View file @
38e8c895
...
...
@@ -19,8 +19,10 @@
#ifndef _MXS_PCM_H
#define _MXS_PCM_H
#include <linux/fsl/mxs-dma.h>
struct
mxs_pcm_dma_params
{
int
chan_irq
;
struct
mxs_dma_data
dma_data
;
int
chan_num
;
};
...
...
sound/soc/mxs/mxs-saif.c
View file @
38e8c895
...
...
@@ -757,9 +757,9 @@ static int mxs_saif_probe(struct platform_device *pdev)
return
ret
;
}
saif
->
dma_param
.
chan_irq
=
platform_get_irq
(
pdev
,
1
);
if
(
saif
->
dma_param
.
chan_irq
<
0
)
{
ret
=
saif
->
dma_param
.
chan_irq
;
saif
->
dma_param
.
dma_data
.
chan_irq
=
platform_get_irq
(
pdev
,
1
);
if
(
saif
->
dma_param
.
dma_data
.
chan_irq
<
0
)
{
ret
=
saif
->
dma_param
.
dma_data
.
chan_irq
;
dev_err
(
&
pdev
->
dev
,
"failed to get dma irq resource: %d
\n
"
,
ret
);
return
ret
;
...
...
sound/soc/omap/am3517evm.c
View file @
38e8c895
...
...
@@ -28,7 +28,6 @@
#include <linux/platform_data/asoc-ti-mcbsp.h>
#include "omap-mcbsp.h"
#include "omap-pcm.h"
#include "../codecs/tlv320aic23.h"
...
...
sound/soc/omap/ams-delta.c
View file @
38e8c895
...
...
@@ -36,7 +36,6 @@
#include <linux/platform_data/asoc-ti-mcbsp.h>
#include "omap-mcbsp.h"
#include "omap-pcm.h"
#include "../codecs/cx20442.h"
...
...
sound/soc/omap/mcbsp.c
View file @
38e8c895
...
...
@@ -1018,9 +1018,10 @@ int omap_mcbsp_init(struct platform_device *pdev)
return
-
ENODEV
;
}
/* RX DMA request number, and port address configuration */
mcbsp
->
dma_data
[
1
].
name
=
"Audio Capture"
;
mcbsp
->
dma_data
[
1
].
dma_req
=
res
->
start
;
mcbsp
->
dma_data
[
1
].
port_addr
=
omap_mcbsp_dma_reg_params
(
mcbsp
,
1
);
mcbsp
->
dma_req
[
1
]
=
res
->
start
;
mcbsp
->
dma_data
[
1
].
filter_data
=
&
mcbsp
->
dma_req
[
1
];
mcbsp
->
dma_data
[
1
].
addr
=
omap_mcbsp_dma_reg_params
(
mcbsp
,
1
);
mcbsp
->
dma_data
[
1
].
maxburst
=
4
;
res
=
platform_get_resource_byname
(
pdev
,
IORESOURCE_DMA
,
"tx"
);
if
(
!
res
)
{
...
...
@@ -1028,9 +1029,10 @@ int omap_mcbsp_init(struct platform_device *pdev)
return
-
ENODEV
;
}
/* TX DMA request number, and port address configuration */
mcbsp
->
dma_data
[
0
].
name
=
"Audio Playback"
;
mcbsp
->
dma_data
[
0
].
dma_req
=
res
->
start
;
mcbsp
->
dma_data
[
0
].
port_addr
=
omap_mcbsp_dma_reg_params
(
mcbsp
,
0
);
mcbsp
->
dma_req
[
0
]
=
res
->
start
;
mcbsp
->
dma_data
[
0
].
filter_data
=
&
mcbsp
->
dma_req
[
0
];
mcbsp
->
dma_data
[
0
].
addr
=
omap_mcbsp_dma_reg_params
(
mcbsp
,
0
);
mcbsp
->
dma_data
[
0
].
maxburst
=
4
;
mcbsp
->
fclk
=
clk_get
(
&
pdev
->
dev
,
"fck"
);
if
(
IS_ERR
(
mcbsp
->
fclk
))
{
...
...
sound/soc/omap/mcbsp.h
View file @
38e8c895
...
...
@@ -24,14 +24,14 @@
#ifndef __ASOC_MCBSP_H
#define __ASOC_MCBSP_H
#include "omap-pcm.h"
#ifdef CONFIG_ARCH_OMAP1
#define mcbsp_omap1() 1
#else
#define mcbsp_omap1() 0
#endif
#include <sound/dmaengine_pcm.h>
/* McBSP register numbers. Register address offset = num * reg_step */
enum
{
/* Common registers */
...
...
@@ -312,7 +312,8 @@ struct omap_mcbsp {
struct
omap_mcbsp_platform_data
*
pdata
;
struct
omap_mcbsp_st_data
*
st_data
;
struct
omap_mcbsp_reg_cfg
cfg_regs
;
struct
omap_pcm_dma_data
dma_data
[
2
];
struct
snd_dmaengine_dai_dma_data
dma_data
[
2
];
unsigned
int
dma_req
[
2
];
int
dma_op_mode
;
u16
max_tx_thres
;
u16
max_rx_thres
;
...
...
sound/soc/omap/n810.c
View file @
38e8c895
...
...
@@ -34,7 +34,6 @@
#include <linux/platform_data/asoc-ti-mcbsp.h>
#include "omap-mcbsp.h"
#include "omap-pcm.h"
#define N810_HEADSET_AMP_GPIO 10
#define N810_SPEAKER_AMP_GPIO 101
...
...
sound/soc/omap/omap-abe-twl6040.c
View file @
38e8c895
...
...
@@ -34,7 +34,6 @@
#include "omap-dmic.h"
#include "omap-mcpdm.h"
#include "omap-pcm.h"
#include "../codecs/twl6040.h"
struct
abe_twl6040
{
...
...
sound/soc/omap/omap-dmic.c
View file @
38e8c895
...
...
@@ -39,8 +39,8 @@
#include <sound/pcm_params.h>
#include <sound/initval.h>
#include <sound/soc.h>
#include <sound/dmaengine_pcm.h>
#include "omap-pcm.h"
#include "omap-dmic.h"
struct
omap_dmic
{
...
...
@@ -55,13 +55,9 @@ struct omap_dmic {
u32
ch_enabled
;
bool
active
;
struct
mutex
mutex
;
};
/*
* Stream DMA parameters
*/
static
struct
omap_pcm_dma_data
omap_dmic_dai_dma_params
=
{
.
name
=
"DMIC capture"
,
struct
snd_dmaengine_dai_dma_data
dma_data
;
unsigned
int
dma_req
;
};
static
inline
void
omap_dmic_write
(
struct
omap_dmic
*
dmic
,
u16
reg
,
u32
val
)
...
...
@@ -118,7 +114,7 @@ static int omap_dmic_dai_startup(struct snd_pcm_substream *substream,
mutex_unlock
(
&
dmic
->
mutex
);
snd_soc_dai_set_dma_data
(
dai
,
substream
,
&
omap_dmic_dai_dma_params
);
snd_soc_dai_set_dma_data
(
dai
,
substream
,
&
dmic
->
dma_data
);
return
ret
;
}
...
...
@@ -203,7 +199,7 @@ static int omap_dmic_dai_hw_params(struct snd_pcm_substream *substream,
struct
snd_soc_dai
*
dai
)
{
struct
omap_dmic
*
dmic
=
snd_soc_dai_get_drvdata
(
dai
);
struct
omap_pcm
_dma_data
*
dma_data
;
struct
snd_dmaengine_dai
_dma_data
*
dma_data
;
int
channels
;
dmic
->
clk_div
=
omap_dmic_select_divider
(
dmic
,
params_rate
(
params
));
...
...
@@ -230,7 +226,7 @@ static int omap_dmic_dai_hw_params(struct snd_pcm_substream *substream,
/* packet size is threshold * channels */
dma_data
=
snd_soc_dai_get_dma_data
(
dai
,
substream
);
dma_data
->
packet_size
=
dmic
->
threshold
*
channels
;
dma_data
->
maxburst
=
dmic
->
threshold
*
channels
;
return
0
;
}
...
...
@@ -480,7 +476,7 @@ static int asoc_dmic_probe(struct platform_device *pdev)
ret
=
-
ENODEV
;
goto
err_put_clk
;
}
omap_dmic_dai_dma_params
.
port_
addr
=
res
->
start
+
OMAP_DMIC_DATA_REG
;
dmic
->
dma_data
.
addr
=
res
->
start
+
OMAP_DMIC_DATA_REG
;
res
=
platform_get_resource
(
pdev
,
IORESOURCE_DMA
,
0
);
if
(
!
res
)
{
...
...
@@ -488,7 +484,9 @@ static int asoc_dmic_probe(struct platform_device *pdev)
ret
=
-
ENODEV
;
goto
err_put_clk
;
}
omap_dmic_dai_dma_params
.
dma_req
=
res
->
start
;
dmic
->
dma_req
=
res
->
start
;
dmic
->
dma_data
.
filter_data
=
&
dmic
->
dma_req
;
res
=
platform_get_resource_byname
(
pdev
,
IORESOURCE_MEM
,
"mpu"
);
if
(
!
res
)
{
...
...
@@ -497,19 +495,9 @@ static int asoc_dmic_probe(struct platform_device *pdev)
goto
err_put_clk
;
}
if
(
!
devm_request_mem_region
(
&
pdev
->
dev
,
res
->
start
,
resource_size
(
res
),
pdev
->
name
))
{
dev_err
(
dmic
->
dev
,
"memory region already claimed
\n
"
);
ret
=
-
ENODEV
;
goto
err_put_clk
;
}
dmic
->
io_base
=
devm_ioremap
(
&
pdev
->
dev
,
res
->
start
,
resource_size
(
res
));
if
(
!
dmic
->
io_base
)
{
ret
=
-
ENOMEM
;
goto
err_put_clk
;
}
dmic
->
io_base
=
devm_ioremap_resource
(
&
pdev
->
dev
,
res
);
if
(
IS_ERR
(
dmic
->
io_base
))
return
PTR_ERR
(
dmic
->
io_base
);
ret
=
snd_soc_register_component
(
&
pdev
->
dev
,
&
omap_dmic_component
,
&
omap_dmic_dai
,
1
);
...
...
sound/soc/omap/omap-hdmi.c
View file @
38e8c895
...
...
@@ -32,15 +32,16 @@
#include <sound/soc.h>
#include <sound/asound.h>
#include <sound/asoundef.h>
#include <sound/dmaengine_pcm.h>
#include <video/omapdss.h>
#include "omap-pcm.h"
#include "omap-hdmi.h"
#define DRV_NAME "omap-hdmi-audio-dai"
struct
hdmi_priv
{
struct
omap_pcm_dma_data
dma_params
;
struct
snd_dmaengine_dai_dma_data
dma_data
;
unsigned
int
dma_req
;
struct
omap_dss_audio
dss_audio
;
struct
snd_aes_iec958
iec
;
struct
snd_cea_861_aud_if
cea
;
...
...
@@ -68,7 +69,7 @@ static int omap_hdmi_dai_startup(struct snd_pcm_substream *substream,
return
-
ENODEV
;
}
snd_soc_dai_set_dma_data
(
dai
,
substream
,
&
priv
->
dma_
params
);
snd_soc_dai_set_dma_data
(
dai
,
substream
,
&
priv
->
dma_
data
);
return
0
;
}
...
...
@@ -88,25 +89,20 @@ static int omap_hdmi_dai_hw_params(struct snd_pcm_substream *substream,
struct
hdmi_priv
*
priv
=
snd_soc_dai_get_drvdata
(
dai
);
struct
snd_aes_iec958
*
iec
=
&
priv
->
iec
;
struct
snd_cea_861_aud_if
*
cea
=
&
priv
->
cea
;
struct
omap_pcm_dma_data
*
dma_data
;
int
err
=
0
;
dma_data
=
snd_soc_dai_get_dma_data
(
dai
,
substream
);
switch
(
params_format
(
params
))
{
case
SNDRV_PCM_FORMAT_S16_LE
:
dma_data
->
packet_size
=
16
;
priv
->
dma_data
.
maxburst
=
16
;
break
;
case
SNDRV_PCM_FORMAT_S24_LE
:
dma_data
->
packet_size
=
32
;
priv
->
dma_data
.
maxburst
=
32
;
break
;
default:
dev_err
(
dai
->
dev
,
"format not supported!
\n
"
);
return
-
EINVAL
;
}
dma_data
->
data_type
=
32
;
/*
* fill the IEC-60958 channel status word
*/
...
...
@@ -287,8 +283,7 @@ static int omap_hdmi_probe(struct platform_device *pdev)
return
-
ENODEV
;
}
hdmi_data
->
dma_params
.
port_addr
=
hdmi_rsrc
->
start
+
OMAP_HDMI_AUDIO_DMA_PORT
;
hdmi_data
->
dma_data
.
addr
=
hdmi_rsrc
->
start
+
OMAP_HDMI_AUDIO_DMA_PORT
;
hdmi_rsrc
=
platform_get_resource
(
pdev
,
IORESOURCE_DMA
,
0
);
if
(
!
hdmi_rsrc
)
{
...
...
@@ -296,8 +291,9 @@ static int omap_hdmi_probe(struct platform_device *pdev)
return
-
ENODEV
;
}
hdmi_data
->
dma_params
.
dma_req
=
hdmi_rsrc
->
start
;
hdmi_data
->
dma_params
.
name
=
"HDMI playback"
;
hdmi_data
->
dma_req
=
hdmi_rsrc
->
start
;
hdmi_data
->
dma_data
.
filter_data
=
&
hdmi_data
->
dma_req
;
hdmi_data
->
dma_data
.
addr_width
=
DMA_SLAVE_BUSWIDTH_4_BYTES
;
/*
* TODO: We assume that there is only one DSS HDMI device. Future
...
...
sound/soc/omap/omap-mcbsp.c
View file @
38e8c895
...
...
@@ -33,11 +33,11 @@
#include <sound/pcm_params.h>
#include <sound/initval.h>
#include <sound/soc.h>
#include <sound/dmaengine_pcm.h>
#include <linux/platform_data/asoc-ti-mcbsp.h>
#include "mcbsp.h"
#include "omap-mcbsp.h"
#include "omap-pcm.h"
#define OMAP_MCBSP_RATES (SNDRV_PCM_RATE_8000_96000)
...
...
@@ -62,24 +62,22 @@ enum {
* Stream DMA parameters. DMA request line and port address are set runtime
* since they are different between OMAP1 and later OMAPs
*/
static
void
omap_mcbsp_set_threshold
(
struct
snd_pcm_substream
*
substream
)
static
void
omap_mcbsp_set_threshold
(
struct
snd_pcm_substream
*
substream
,
unsigned
int
packet_size
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
snd_soc_dai
*
cpu_dai
=
rtd
->
cpu_dai
;
struct
omap_mcbsp
*
mcbsp
=
snd_soc_dai_get_drvdata
(
cpu_dai
);
struct
omap_pcm_dma_data
*
dma_data
;
int
words
;
dma_data
=
snd_soc_dai_get_dma_data
(
rtd
->
cpu_dai
,
substream
);
/*
* Configure McBSP threshold based on either:
* packet_size, when the sDMA is in packet mode, or based on the
* period size in THRESHOLD mode, otherwise use McBSP threshold = 1
* for mono streams.
*/
if
(
dma_data
->
packet_size
)
words
=
dma_data
->
packet_size
;
if
(
packet_size
)
words
=
packet_size
;
else
words
=
1
;
...
...
@@ -226,7 +224,7 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
{
struct
omap_mcbsp
*
mcbsp
=
snd_soc_dai_get_drvdata
(
cpu_dai
);
struct
omap_mcbsp_reg_cfg
*
regs
=
&
mcbsp
->
cfg_regs
;
struct
omap_pcm
_dma_data
*
dma_data
;
struct
snd_dmaengine_dai
_dma_data
*
dma_data
;
int
wlen
,
channels
,
wpf
;
int
pkt_size
=
0
;
unsigned
int
format
,
div
,
framesize
,
master
;
...
...
@@ -245,7 +243,6 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
return
-
EINVAL
;
}
if
(
mcbsp
->
pdata
->
buffer_size
)
{
dma_data
->
set_threshold
=
omap_mcbsp_set_threshold
;
if
(
mcbsp
->
dma_op_mode
==
MCBSP_DMA_MODE_THRESHOLD
)
{
int
period_words
,
max_thrsh
;
int
divider
=
0
;
...
...
@@ -276,9 +273,10 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
/* Use packet mode for non mono streams */
pkt_size
=
channels
;
}
omap_mcbsp_set_threshold
(
substream
,
pkt_size
);
}
dma_data
->
packet_size
=
pkt_size
;
dma_data
->
maxburst
=
pkt_size
;
if
(
mcbsp
->
configured
)
{
/* McBSP already configured by another stream */
...
...
sound/soc/omap/omap-mcpdm.c
View file @
38e8c895
...
...
@@ -39,11 +39,14 @@
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/dmaengine_pcm.h>
#include "omap-mcpdm.h"
#include "omap-pcm.h"
#define OMAP44XX_MCPDM_L3_BASE 0x49032000
struct
mcpdm_link_config
{
u32
link_mask
;
/* channel mask for the direction */
u32
threshold
;
/* FIFO threshold */
};
struct
omap_mcpdm
{
struct
device
*
dev
;
...
...
@@ -53,29 +56,22 @@ struct omap_mcpdm {
struct
mutex
mutex
;
/* channel data */
u32
dn_channels
;
u32
up_channels
;
/* McPDM FIFO thresholds */
u32
dn_threshold
;
u32
up_threshold
;
/* Playback/Capture configuration */
struct
mcpdm_link_config
config
[
2
];
/* McPDM dn offsets for rx1, and 2 channels */
u32
dn_rx_offset
;
/* McPDM needs to be restarted due to runtime reconfiguration */
bool
restart
;
struct
snd_dmaengine_dai_dma_data
dma_data
[
2
];
unsigned
int
dma_req
[
2
];
};
/*
* Stream DMA parameters
*/
static
struct
omap_pcm_dma_data
omap_mcpdm_dai_dma_params
[]
=
{
{
.
name
=
"Audio playback"
,
},
{
.
name
=
"Audio capture"
,
},
};
static
inline
void
omap_mcpdm_write
(
struct
omap_mcpdm
*
mcpdm
,
u16
reg
,
u32
val
)
{
...
...
@@ -130,11 +126,12 @@ static void omap_mcpdm_reg_dump(struct omap_mcpdm *mcpdm) {}
static
void
omap_mcpdm_start
(
struct
omap_mcpdm
*
mcpdm
)
{
u32
ctrl
=
omap_mcpdm_read
(
mcpdm
,
MCPDM_REG_CTRL
);
u32
link_mask
=
mcpdm
->
config
[
0
].
link_mask
|
mcpdm
->
config
[
1
].
link_mask
;
ctrl
|=
(
MCPDM_SW_DN_RST
|
MCPDM_SW_UP_RST
);
omap_mcpdm_write
(
mcpdm
,
MCPDM_REG_CTRL
,
ctrl
);
ctrl
|=
mcpdm
->
dn_channels
|
mcpdm
->
up_channels
;
ctrl
|=
link_mask
;
omap_mcpdm_write
(
mcpdm
,
MCPDM_REG_CTRL
,
ctrl
);
ctrl
&=
~
(
MCPDM_SW_DN_RST
|
MCPDM_SW_UP_RST
);
...
...
@@ -148,11 +145,12 @@ static void omap_mcpdm_start(struct omap_mcpdm *mcpdm)
static
void
omap_mcpdm_stop
(
struct
omap_mcpdm
*
mcpdm
)
{
u32
ctrl
=
omap_mcpdm_read
(
mcpdm
,
MCPDM_REG_CTRL
);
u32
link_mask
=
MCPDM_PDM_DN_MASK
|
MCPDM_PDM_UP_MASK
;
ctrl
|=
(
MCPDM_SW_DN_RST
|
MCPDM_SW_UP_RST
);
omap_mcpdm_write
(
mcpdm
,
MCPDM_REG_CTRL
,
ctrl
);
ctrl
&=
~
(
mcpdm
->
dn_channels
|
mcpdm
->
up_channels
);
ctrl
&=
~
(
link_mask
);
omap_mcpdm_write
(
mcpdm
,
MCPDM_REG_CTRL
,
ctrl
);
ctrl
&=
~
(
MCPDM_SW_DN_RST
|
MCPDM_SW_UP_RST
);
...
...
@@ -188,8 +186,10 @@ static void omap_mcpdm_open_streams(struct omap_mcpdm *mcpdm)
omap_mcpdm_write
(
mcpdm
,
MCPDM_REG_DN_OFFSET
,
dn_offset
);
}
omap_mcpdm_write
(
mcpdm
,
MCPDM_REG_FIFO_CTRL_DN
,
mcpdm
->
dn_threshold
);
omap_mcpdm_write
(
mcpdm
,
MCPDM_REG_FIFO_CTRL_UP
,
mcpdm
->
up_threshold
);
omap_mcpdm_write
(
mcpdm
,
MCPDM_REG_FIFO_CTRL_DN
,
mcpdm
->
config
[
SNDRV_PCM_STREAM_PLAYBACK
].
threshold
);
omap_mcpdm_write
(
mcpdm
,
MCPDM_REG_FIFO_CTRL_UP
,
mcpdm
->
config
[
SNDRV_PCM_STREAM_CAPTURE
].
threshold
);
omap_mcpdm_write
(
mcpdm
,
MCPDM_REG_DMAENABLE_SET
,
MCPDM_DMA_DN_ENABLE
|
MCPDM_DMA_UP_ENABLE
);
...
...
@@ -267,7 +267,7 @@ static int omap_mcpdm_dai_startup(struct snd_pcm_substream *substream,
mutex_unlock
(
&
mcpdm
->
mutex
);
snd_soc_dai_set_dma_data
(
dai
,
substream
,
&
omap_mcpdm_dai_dma_params
[
substream
->
stream
]);
&
mcpdm
->
dma_data
[
substream
->
stream
]);
return
0
;
}
...
...
@@ -283,6 +283,8 @@ static void omap_mcpdm_dai_shutdown(struct snd_pcm_substream *substream,
if
(
omap_mcpdm_active
(
mcpdm
))
{
omap_mcpdm_stop
(
mcpdm
);
omap_mcpdm_close_streams
(
mcpdm
);
mcpdm
->
config
[
0
].
link_mask
=
0
;
mcpdm
->
config
[
1
].
link_mask
=
0
;
}
}
...
...
@@ -295,7 +297,8 @@ static int omap_mcpdm_dai_hw_params(struct snd_pcm_substream *substream,
{
struct
omap_mcpdm
*
mcpdm
=
snd_soc_dai_get_drvdata
(
dai
);
int
stream
=
substream
->
stream
;
struct
omap_pcm_dma_data
*
dma_data
;
struct
snd_dmaengine_dai_dma_data
*
dma_data
;
u32
threshold
;
int
channels
;
int
link_mask
=
0
;
...
...
@@ -325,16 +328,32 @@ static int omap_mcpdm_dai_hw_params(struct snd_pcm_substream *substream,
dma_data
=
snd_soc_dai_get_dma_data
(
dai
,
substream
);
threshold
=
mcpdm
->
config
[
stream
].
threshold
;
/* Configure McPDM channels, and DMA packet size */
if
(
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
mcpdm
->
dn_channels
=
link_mask
<<
3
;
dma_data
->
packet_size
=
(
MCPDM_DN_THRES_MAX
-
mcpdm
->
dn_threshold
)
*
channels
;
link_mask
<<=
3
;
/* If capture is not running assume a stereo stream to come */
if
(
!
mcpdm
->
config
[
!
stream
].
link_mask
)
mcpdm
->
config
[
!
stream
].
link_mask
=
0x3
;
dma_data
->
maxburst
=
(
MCPDM_DN_THRES_MAX
-
threshold
)
*
channels
;
}
else
{
mcpdm
->
up_channels
=
link_mask
<<
0
;
dma_data
->
packet_size
=
mcpdm
->
up_threshold
*
channels
;
/* If playback is not running assume a stereo stream to come */
if
(
!
mcpdm
->
config
[
!
stream
].
link_mask
)
mcpdm
->
config
[
!
stream
].
link_mask
=
(
0x3
<<
3
);
dma_data
->
maxburst
=
threshold
*
channels
;
}
/* Check if we need to restart McPDM with this stream */
if
(
mcpdm
->
config
[
stream
].
link_mask
&&
mcpdm
->
config
[
stream
].
link_mask
!=
link_mask
)
mcpdm
->
restart
=
true
;
mcpdm
->
config
[
stream
].
link_mask
=
link_mask
;
return
0
;
}
...
...
@@ -346,6 +365,11 @@ static int omap_mcpdm_prepare(struct snd_pcm_substream *substream,
if
(
!
omap_mcpdm_active
(
mcpdm
))
{
omap_mcpdm_start
(
mcpdm
);
omap_mcpdm_reg_dump
(
mcpdm
);
}
else
if
(
mcpdm
->
restart
)
{
omap_mcpdm_stop
(
mcpdm
);
omap_mcpdm_start
(
mcpdm
);
mcpdm
->
restart
=
false
;
omap_mcpdm_reg_dump
(
mcpdm
);
}
return
0
;
...
...
@@ -369,7 +393,7 @@ static int omap_mcpdm_probe(struct snd_soc_dai *dai)
pm_runtime_get_sync
(
mcpdm
->
dev
);
omap_mcpdm_write
(
mcpdm
,
MCPDM_REG_CTRL
,
0x00
);
ret
=
request_irq
(
mcpdm
->
irq
,
omap_mcpdm_irq_handler
,
ret
=
devm_request_irq
(
mcpdm
->
dev
,
mcpdm
->
irq
,
omap_mcpdm_irq_handler
,
0
,
"McPDM"
,
(
void
*
)
mcpdm
);
pm_runtime_put_sync
(
mcpdm
->
dev
);
...
...
@@ -380,8 +404,9 @@ static int omap_mcpdm_probe(struct snd_soc_dai *dai)
}
/* Configure McPDM threshold values */
mcpdm
->
dn_threshold
=
2
;
mcpdm
->
up_threshold
=
MCPDM_UP_THRES_MAX
-
3
;
mcpdm
->
config
[
SNDRV_PCM_STREAM_PLAYBACK
].
threshold
=
2
;
mcpdm
->
config
[
SNDRV_PCM_STREAM_CAPTURE
].
threshold
=
MCPDM_UP_THRES_MAX
-
3
;
return
ret
;
}
...
...
@@ -389,7 +414,6 @@ static int omap_mcpdm_remove(struct snd_soc_dai *dai)
{
struct
omap_mcpdm
*
mcpdm
=
snd_soc_dai_get_drvdata
(
dai
);
free_irq
(
mcpdm
->
irq
,
(
void
*
)
mcpdm
);
pm_runtime_disable
(
mcpdm
->
dev
);
return
0
;
...
...
@@ -450,33 +474,30 @@ static int asoc_mcpdm_probe(struct platform_device *pdev)
if
(
res
==
NULL
)
return
-
ENOMEM
;
omap_mcpdm_dai_dma_params
[
0
].
port_
addr
=
res
->
start
+
MCPDM_REG_DN_DATA
;
omap_mcpdm_dai_dma_params
[
1
].
port_
addr
=
res
->
start
+
MCPDM_REG_UP_DATA
;
mcpdm
->
dma_data
[
0
].
addr
=
res
->
start
+
MCPDM_REG_DN_DATA
;
mcpdm
->
dma_data
[
1
].
addr
=
res
->
start
+
MCPDM_REG_UP_DATA
;
res
=
platform_get_resource_byname
(
pdev
,
IORESOURCE_DMA
,
"dn_link"
);
if
(
!
res
)
return
-
ENODEV
;
omap_mcpdm_dai_dma_params
[
0
].
dma_req
=
res
->
start
;
mcpdm
->
dma_req
[
0
]
=
res
->
start
;
mcpdm
->
dma_data
[
0
].
filter_data
=
&
mcpdm
->
dma_req
[
0
];
res
=
platform_get_resource_byname
(
pdev
,
IORESOURCE_DMA
,
"up_link"
);
if
(
!
res
)
return
-
ENODEV
;
omap_mcpdm_dai_dma_params
[
1
].
dma_req
=
res
->
start
;
mcpdm
->
dma_req
[
1
]
=
res
->
start
;
mcpdm
->
dma_data
[
1
].
filter_data
=
&
mcpdm
->
dma_req
[
1
];
res
=
platform_get_resource_byname
(
pdev
,
IORESOURCE_MEM
,
"mpu"
);
if
(
res
==
NULL
)
return
-
ENOMEM
;
if
(
!
devm_request_mem_region
(
&
pdev
->
dev
,
res
->
start
,
resource_size
(
res
),
"McPDM"
))
return
-
EBUSY
;
mcpdm
->
io_base
=
devm_ioremap
(
&
pdev
->
dev
,
res
->
start
,
resource_size
(
res
));
if
(
!
mcpdm
->
io_base
)
return
-
ENOMEM
;
mcpdm
->
io_base
=
devm_ioremap_resource
(
&
pdev
->
dev
,
res
);
if
(
IS_ERR
(
mcpdm
->
io_base
))
return
PTR_ERR
(
mcpdm
->
io_base
);
mcpdm
->
irq
=
platform_get_irq
(
pdev
,
0
);
if
(
mcpdm
->
irq
<
0
)
...
...
sound/soc/omap/omap-pcm.c
View file @
38e8c895
...
...
@@ -32,8 +32,6 @@
#include <sound/dmaengine_pcm.h>
#include <sound/soc.h>
#include "omap-pcm.h"
#ifdef CONFIG_ARCH_OMAP1
#define pcm_omap1510() cpu_is_omap1510()
#else
...
...
@@ -56,25 +54,6 @@ static const struct snd_pcm_hardware omap_pcm_hardware = {
.
buffer_bytes_max
=
128
*
1024
,
};
static
int
omap_pcm_get_dma_buswidth
(
int
num_bits
)
{
int
buswidth
;
switch
(
num_bits
)
{
case
16
:
buswidth
=
DMA_SLAVE_BUSWIDTH_2_BYTES
;
break
;
case
32
:
buswidth
=
DMA_SLAVE_BUSWIDTH_4_BYTES
;
break
;
default:
buswidth
=
-
EINVAL
;
break
;
}
return
buswidth
;
}
/* this may get called several times by oss emulation */
static
int
omap_pcm_hw_params
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
params
)
...
...
@@ -105,20 +84,9 @@ static int omap_pcm_hw_params(struct snd_pcm_substream *substream,
if
(
err
)
return
err
;
/* Override the *_dma addr_width if requested by the DAI driver */
if
(
dma_data
->
data_type
)
{
int
buswidth
=
omap_pcm_get_dma_buswidth
(
dma_data
->
data_type
);
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
config
.
dst_addr_width
=
buswidth
;
else
config
.
src_addr_width
=
buswidth
;
}
config
.
src_addr
=
dma_data
->
port_addr
;
config
.
dst_addr
=
dma_data
->
port_addr
;
config
.
src_maxburst
=
dma_data
->
packet_size
;
config
.
dst_maxburst
=
dma_data
->
packet_size
;
snd_dmaengine_pcm_set_config_from_dai_data
(
substream
,
snd_soc_dai_get_dma_data
(
rtd
->
cpu_dai
,
substream
),
&
config
);
return
dmaengine_slave_config
(
chan
,
&
config
);
}
...
...
@@ -129,37 +97,6 @@ static int omap_pcm_hw_free(struct snd_pcm_substream *substream)
return
0
;
}
static
int
omap_pcm_trigger
(
struct
snd_pcm_substream
*
substream
,
int
cmd
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
omap_pcm_dma_data
*
dma_data
;
int
ret
=
0
;
dma_data
=
snd_soc_dai_get_dma_data
(
rtd
->
cpu_dai
,
substream
);
switch
(
cmd
)
{
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_RESUME
:
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
/* Configure McBSP internal buffer usage */
if
(
dma_data
->
set_threshold
)
dma_data
->
set_threshold
(
substream
);
break
;
case
SNDRV_PCM_TRIGGER_STOP
:
case
SNDRV_PCM_TRIGGER_SUSPEND
:
case
SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
break
;
default:
ret
=
-
EINVAL
;
}
if
(
ret
==
0
)
ret
=
snd_dmaengine_pcm_trigger
(
substream
,
cmd
);
return
ret
;
}
static
snd_pcm_uframes_t
omap_pcm_pointer
(
struct
snd_pcm_substream
*
substream
)
{
snd_pcm_uframes_t
offset
;
...
...
@@ -175,20 +112,14 @@ static snd_pcm_uframes_t omap_pcm_pointer(struct snd_pcm_substream *substream)
static
int
omap_pcm_open
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
omap_pcm
_dma_data
*
dma_data
;
struct
snd_dmaengine_dai
_dma_data
*
dma_data
;
snd_soc_set_runtime_hwparams
(
substream
,
&
omap_pcm_hardware
);
dma_data
=
snd_soc_dai_get_dma_data
(
rtd
->
cpu_dai
,
substream
);
return
snd_dmaengine_pcm_open
(
substream
,
omap_dma_filter_fn
,
&
dma_data
->
dma_req
);
}
static
int
omap_pcm_close
(
struct
snd_pcm_substream
*
substream
)
{
snd_dmaengine_pcm_close
(
substream
);
return
0
;
dma_data
->
filter_data
);
}
static
int
omap_pcm_mmap
(
struct
snd_pcm_substream
*
substream
,
...
...
@@ -204,11 +135,11 @@ static int omap_pcm_mmap(struct snd_pcm_substream *substream,
static
struct
snd_pcm_ops
omap_pcm_ops
=
{
.
open
=
omap_pcm_open
,
.
close
=
omap
_pcm_close
,
.
close
=
snd_dmaengine
_pcm_close
,
.
ioctl
=
snd_pcm_lib_ioctl
,
.
hw_params
=
omap_pcm_hw_params
,
.
hw_free
=
omap_pcm_hw_free
,
.
trigger
=
omap
_pcm_trigger
,
.
trigger
=
snd_dmaengine
_pcm_trigger
,
.
pointer
=
omap_pcm_pointer
,
.
mmap
=
omap_pcm_mmap
,
};
...
...
sound/soc/omap/omap-pcm.h
deleted
100644 → 0
View file @
d66e065c
/*
* omap-pcm.h
*
* Copyright (C) 2008 Nokia Corporation
*
* Contact: Jarkko Nikula <jarkko.nikula@bitmer.com>
* Peter Ujfalusi <peter.ujfalusi@ti.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.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
*/
#ifndef __OMAP_PCM_H__
#define __OMAP_PCM_H__
struct
snd_pcm_substream
;
struct
omap_pcm_dma_data
{
char
*
name
;
/* stream identifier */
int
dma_req
;
/* DMA request line */
unsigned
long
port_addr
;
/* transmit/receive register */
void
(
*
set_threshold
)(
struct
snd_pcm_substream
*
substream
);
int
data_type
;
/* 8, 16, 32 (bits) or 0 to let omap-pcm
* to decide the sDMA data type */
int
packet_size
;
/* packet size only in PACKET mode */
};
#endif
sound/soc/omap/omap-twl4030.c
View file @
38e8c895
...
...
@@ -43,7 +43,6 @@
#include <sound/jack.h>
#include "omap-mcbsp.h"
#include "omap-pcm.h"
struct
omap_twl4030
{
int
jack_detect
;
/* board can detect jack events */
...
...
sound/soc/omap/omap3pandora.c
View file @
38e8c895
...
...
@@ -34,7 +34,6 @@
#include <linux/platform_data/asoc-ti-mcbsp.h>
#include "omap-mcbsp.h"
#include "omap-pcm.h"
#define OMAP3_PANDORA_DAC_POWER_GPIO 118
#define OMAP3_PANDORA_AMP_POWER_GPIO 14
...
...
@@ -80,12 +79,18 @@ static int omap3pandora_hw_params(struct snd_pcm_substream *substream,
static
int
omap3pandora_dac_event
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
k
,
int
event
)
{
int
ret
;
/*
* The PCM1773 DAC datasheet requires 1ms delay between switching
* VCC power on/off and /PD pin high/low
*/
if
(
SND_SOC_DAPM_EVENT_ON
(
event
))
{
regulator_enable
(
omap3pandora_dac_reg
);
ret
=
regulator_enable
(
omap3pandora_dac_reg
);
if
(
ret
)
{
dev_err
(
w
->
dapm
->
dev
,
"Failed to power DAC: %d
\n
"
,
ret
);
return
ret
;
}
mdelay
(
1
);
gpio_set_value
(
OMAP3_PANDORA_DAC_POWER_GPIO
,
1
);
}
else
{
...
...
sound/soc/omap/osk5912.c
View file @
38e8c895
...
...
@@ -33,7 +33,6 @@
#include <linux/platform_data/asoc-ti-mcbsp.h>
#include "omap-mcbsp.h"
#include "omap-pcm.h"
#include "../codecs/tlv320aic23.h"
#define CODEC_CLOCK 12000000
...
...
sound/soc/omap/rx51.c
View file @
38e8c895
...
...
@@ -37,7 +37,6 @@
#include <asm/mach-types.h>
#include "omap-mcbsp.h"
#include "omap-pcm.h"
#define RX51_TVOUT_SEL_GPIO 40
#define RX51_JACK_DETECT_GPIO 177
...
...
sound/soc/pxa/mmp-pcm.c
View file @
38e8c895
...
...
@@ -118,9 +118,8 @@ static int mmp_pcm_open(struct snd_pcm_substream *substream)
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
platform_device
*
pdev
=
to_platform_device
(
rtd
->
platform
->
dev
);
struct
snd_soc_dai
*
cpu_dai
=
rtd
->
cpu_dai
;
struct
mmp_dma_data
*
dma_data
;
struct
mmp_dma_data
dma_data
;
struct
resource
*
r
;
int
ret
;
r
=
platform_get_resource
(
pdev
,
IORESOURCE_DMA
,
substream
->
stream
);
if
(
!
r
)
...
...
@@ -128,33 +127,11 @@ static int mmp_pcm_open(struct snd_pcm_substream *substream)
snd_soc_set_runtime_hwparams
(
substream
,
&
mmp_pcm_hardware
[
substream
->
stream
]);
dma_data
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
struct
mmp_dma_data
),
GFP_KERNEL
);
if
(
dma_data
==
NULL
)
return
-
ENOMEM
;
dma_data
->
dma_res
=
r
;
dma_data
->
ssp_id
=
cpu_dai
->
id
;
dma_data
.
dma_res
=
r
;
dma_data
.
ssp_id
=
cpu_dai
->
id
;
ret
=
snd_dmaengine_pcm_open
(
substream
,
filter
,
dma_data
);
if
(
ret
)
{
devm_kfree
(
&
pdev
->
dev
,
dma_data
);
return
ret
;
}
snd_dmaengine_pcm_set_data
(
substream
,
dma_data
);
return
0
;
}
static
int
mmp_pcm_close
(
struct
snd_pcm_substream
*
substream
)
{
struct
mmp_dma_data
*
dma_data
=
snd_dmaengine_pcm_get_data
(
substream
);
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
platform_device
*
pdev
=
to_platform_device
(
rtd
->
platform
->
dev
);
snd_dmaengine_pcm_close
(
substream
);
devm_kfree
(
&
pdev
->
dev
,
dma_data
);
return
0
;
return
snd_dmaengine_pcm_open
(
substream
,
filter
,
&
dma_data
);
}
static
int
mmp_pcm_mmap
(
struct
snd_pcm_substream
*
substream
,
...
...
@@ -171,7 +148,7 @@ static int mmp_pcm_mmap(struct snd_pcm_substream *substream,
struct
snd_pcm_ops
mmp_pcm_ops
=
{
.
open
=
mmp_pcm_open
,
.
close
=
mmp
_pcm_close
,
.
close
=
snd_dmaengine
_pcm_close
,
.
ioctl
=
snd_pcm_lib_ioctl
,
.
hw_params
=
mmp_pcm_hw_params
,
.
trigger
=
snd_dmaengine_pcm_trigger
,
...
...
sound/soc/soc-dmaengine-pcm.c
View file @
38e8c895
...
...
@@ -33,8 +33,6 @@ struct dmaengine_pcm_runtime_data {
dma_cookie_t
cookie
;
unsigned
int
pos
;
void
*
data
;
};
static
inline
struct
dmaengine_pcm_runtime_data
*
substream_to_prtd
(
...
...
@@ -43,33 +41,6 @@ static inline struct dmaengine_pcm_runtime_data *substream_to_prtd(
return
substream
->
runtime
->
private_data
;
}
/**
* snd_dmaengine_pcm_set_data - Set dmaengine substream private data
* @substream: PCM substream
* @data: Data to set
*/
void
snd_dmaengine_pcm_set_data
(
struct
snd_pcm_substream
*
substream
,
void
*
data
)
{
struct
dmaengine_pcm_runtime_data
*
prtd
=
substream_to_prtd
(
substream
);
prtd
->
data
=
data
;
}
EXPORT_SYMBOL_GPL
(
snd_dmaengine_pcm_set_data
);
/**
* snd_dmaengine_pcm_get_data - Get dmaeinge substream private data
* @substream: PCM substream
*
* Returns the data previously set with snd_dmaengine_pcm_set_data
*/
void
*
snd_dmaengine_pcm_get_data
(
struct
snd_pcm_substream
*
substream
)
{
struct
dmaengine_pcm_runtime_data
*
prtd
=
substream_to_prtd
(
substream
);
return
prtd
->
data
;
}
EXPORT_SYMBOL_GPL
(
snd_dmaengine_pcm_get_data
);
struct
dma_chan
*
snd_dmaengine_pcm_get_chan
(
struct
snd_pcm_substream
*
substream
)
{
struct
dmaengine_pcm_runtime_data
*
prtd
=
substream_to_prtd
(
substream
);
...
...
@@ -118,10 +89,49 @@ int snd_hwparams_to_dma_slave_config(const struct snd_pcm_substream *substream,
slave_config
->
src_addr_width
=
buswidth
;
}
slave_config
->
device_fc
=
false
;
return
0
;
}
EXPORT_SYMBOL_GPL
(
snd_hwparams_to_dma_slave_config
);
/**
* snd_dmaengine_pcm_set_config_from_dai_data() - Initializes a dma slave config
* using DAI DMA data.
* @substream: PCM substream
* @dma_data: DAI DMA data
* @slave_config: DMA slave configuration
*
* Initializes the {dst,src}_addr, {dst,src}_maxburst, {dst,src}_addr_width and
* slave_id fields of the DMA slave config from the same fields of the DAI DMA
* data struct. The src and dst fields will be initialized depending on the
* direction of the substream. If the substream is a playback stream the dst
* fields will be initialized, if it is a capture stream the src fields will be
* initialized. The {dst,src}_addr_width field will only be initialized if the
* addr_width field of the DAI DMA data struct is not equal to
* DMA_SLAVE_BUSWIDTH_UNDEFINED.
*/
void
snd_dmaengine_pcm_set_config_from_dai_data
(
const
struct
snd_pcm_substream
*
substream
,
const
struct
snd_dmaengine_dai_dma_data
*
dma_data
,
struct
dma_slave_config
*
slave_config
)
{
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
slave_config
->
dst_addr
=
dma_data
->
addr
;
slave_config
->
dst_maxburst
=
dma_data
->
maxburst
;
if
(
dma_data
->
addr_width
!=
DMA_SLAVE_BUSWIDTH_UNDEFINED
)
slave_config
->
dst_addr_width
=
dma_data
->
addr_width
;
}
else
{
slave_config
->
src_addr
=
dma_data
->
addr
;
slave_config
->
src_maxburst
=
dma_data
->
maxburst
;
if
(
dma_data
->
addr_width
!=
DMA_SLAVE_BUSWIDTH_UNDEFINED
)
slave_config
->
src_addr_width
=
dma_data
->
addr_width
;
}
slave_config
->
slave_id
=
dma_data
->
slave_id
;
}
EXPORT_SYMBOL_GPL
(
snd_dmaengine_pcm_set_config_from_dai_data
);
static
void
dmaengine_pcm_dma_complete
(
void
*
arg
)
{
struct
snd_pcm_substream
*
substream
=
arg
;
...
...
sound/soc/spear/spear_pcm.c
View file @
38e8c895
...
...
@@ -64,21 +64,7 @@ static int spear_pcm_open(struct snd_pcm_substream *substream)
if
(
ret
)
return
ret
;
ret
=
snd_dmaengine_pcm_open
(
substream
,
dma_data
->
filter
,
dma_data
);
if
(
ret
)
return
ret
;
snd_dmaengine_pcm_set_data
(
substream
,
dma_data
);
return
0
;
}
static
int
spear_pcm_close
(
struct
snd_pcm_substream
*
substream
)
{
snd_dmaengine_pcm_close
(
substream
);
return
0
;
return
snd_dmaengine_pcm_open
(
substream
,
dma_data
->
filter
,
dma_data
)
}
static
int
spear_pcm_mmap
(
struct
snd_pcm_substream
*
substream
,
...
...
@@ -93,7 +79,7 @@ static int spear_pcm_mmap(struct snd_pcm_substream *substream,
static
struct
snd_pcm_ops
spear_pcm_ops
=
{
.
open
=
spear_pcm_open
,
.
close
=
s
pear
_pcm_close
,
.
close
=
s
nd_dmaengine
_pcm_close
,
.
ioctl
=
snd_pcm_lib_ioctl
,
.
hw_params
=
spear_pcm_hw_params
,
.
hw_free
=
spear_pcm_hw_free
,
...
...
sound/soc/tegra/tegra20_ac97.c
View file @
38e8c895
...
...
@@ -35,6 +35,7 @@
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/dmaengine_pcm.h>
#include "tegra_asoc_utils.h"
#include "tegra20_ac97.h"
...
...
@@ -393,14 +394,14 @@ static int tegra20_ac97_platform_probe(struct platform_device *pdev)
}
ac97
->
capture_dma_data
.
addr
=
mem
->
start
+
TEGRA20_AC97_FIFO_RX1
;
ac97
->
capture_dma_data
.
wrap
=
4
;
ac97
->
capture_dma_data
.
width
=
32
;
ac97
->
capture_dma_data
.
req_sel
=
of_dma
[
1
];
ac97
->
capture_dma_data
.
addr_width
=
DMA_SLAVE_BUSWIDTH_4_BYTES
;
ac97
->
capture_dma_data
.
maxburst
=
4
;
ac97
->
capture_dma_data
.
slave_id
=
of_dma
[
1
];
ac97
->
playback_dma_data
.
addr
=
mem
->
start
+
TEGRA20_AC97_FIFO_TX1
;
ac97
->
playback_dma_data
.
wrap
=
4
;
ac97
->
playback_dma_data
.
width
=
32
;
ac97
->
playback_dma_data
.
req_sel
=
of_dma
[
1
];
ac97
->
capture_dma_data
.
addr_width
=
DMA_SLAVE_BUSWIDTH_4_BYTES
;
ac97
->
capture_dma_data
.
maxburst
=
4
;
ac97
->
capture_dma_data
.
slave_id
=
of_dma
[
0
];
ret
=
snd_soc_register_component
(
&
pdev
->
dev
,
&
tegra20_ac97_component
,
&
tegra20_ac97_dai
,
1
);
...
...
sound/soc/tegra/tegra20_ac97.h
View file @
38e8c895
...
...
@@ -85,8 +85,8 @@
struct
tegra20_ac97
{
struct
clk
*
clk_ac97
;
struct
tegra_pcm_dma_params
capture_dma_data
;
struct
tegra_pcm_dma_params
playback_dma_data
;
struct
snd_dmaengine_dai_dma_data
capture_dma_data
;
struct
snd_dmaengine_dai_dma_data
playback_dma_data
;
struct
regmap
*
regmap
;
int
reset_gpio
;
int
sync_gpio
;
...
...
sound/soc/tegra/tegra20_i2s.c
View file @
38e8c895
...
...
@@ -41,6 +41,7 @@
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/dmaengine_pcm.h>
#include "tegra20_i2s.h"
...
...
@@ -407,14 +408,14 @@ static int tegra20_i2s_platform_probe(struct platform_device *pdev)
}
i2s
->
capture_dma_data
.
addr
=
mem
->
start
+
TEGRA20_I2S_FIFO2
;
i2s
->
capture_dma_data
.
wrap
=
4
;
i2s
->
capture_dma_data
.
width
=
32
;
i2s
->
capture_dma_data
.
req_sel
=
dma_ch
;
i2s
->
capture_dma_data
.
addr_width
=
DMA_SLAVE_BUSWIDTH_4_BYTES
;
i2s
->
capture_dma_data
.
maxburst
=
4
;
i2s
->
capture_dma_data
.
slave_id
=
dma_ch
;
i2s
->
playback_dma_data
.
addr
=
mem
->
start
+
TEGRA20_I2S_FIFO1
;
i2s
->
playback_dma_data
.
wrap
=
4
;
i2s
->
playback_dma_data
.
width
=
32
;
i2s
->
playback_dma_data
.
req_sel
=
dma_ch
;
i2s
->
playback_dma_data
.
addr_width
=
DMA_SLAVE_BUSWIDTH_4_BYTES
;
i2s
->
playback_dma_data
.
maxburst
=
4
;
i2s
->
playback_dma_data
.
slave_id
=
dma_ch
;
pm_runtime_enable
(
&
pdev
->
dev
);
if
(
!
pm_runtime_enabled
(
&
pdev
->
dev
))
{
...
...
sound/soc/tegra/tegra20_i2s.h
View file @
38e8c895
...
...
@@ -155,8 +155,8 @@
struct
tegra20_i2s
{
struct
snd_soc_dai_driver
dai
;
struct
clk
*
clk_i2s
;
struct
tegra_pcm_dma_params
capture_dma_data
;
struct
tegra_pcm_dma_params
playback_dma_data
;
struct
snd_dmaengine_dai_dma_data
capture_dma_data
;
struct
snd_dmaengine_dai_dma_data
playback_dma_data
;
struct
regmap
*
regmap
;
};
...
...
sound/soc/tegra/tegra20_spdif.c
View file @
38e8c895
...
...
@@ -32,6 +32,7 @@
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/dmaengine_pcm.h>
#include "tegra20_spdif.h"
...
...
@@ -322,9 +323,9 @@ static int tegra20_spdif_platform_probe(struct platform_device *pdev)
}
spdif
->
playback_dma_data
.
addr
=
mem
->
start
+
TEGRA20_SPDIF_DATA_OUT
;
spdif
->
playback_dma_data
.
wrap
=
4
;
spdif
->
playback_dma_data
.
width
=
32
;
spdif
->
playback_dma_data
.
req_sel
=
dmareq
->
start
;
spdif
->
capture_dma_data
.
addr_width
=
DMA_SLAVE_BUSWIDTH_4_BYTES
;
spdif
->
capture_dma_data
.
maxburst
=
4
;
spdif
->
playback_dma_data
.
slave_id
=
dmareq
->
start
;
pm_runtime_enable
(
&
pdev
->
dev
);
if
(
!
pm_runtime_enabled
(
&
pdev
->
dev
))
{
...
...
sound/soc/tegra/tegra20_spdif.h
View file @
38e8c895
...
...
@@ -462,8 +462,8 @@
struct
tegra20_spdif
{
struct
clk
*
clk_spdif_out
;
struct
tegra_pcm_dma_params
capture_dma_data
;
struct
tegra_pcm_dma_params
playback_dma_data
;
struct
snd_dmaengine_dai_dma_data
capture_dma_data
;
struct
snd_dmaengine_dai_dma_data
playback_dma_data
;
struct
regmap
*
regmap
;
};
...
...
sound/soc/tegra/tegra30_ahub.c
View file @
38e8c895
...
...
@@ -95,8 +95,8 @@ static int tegra30_ahub_runtime_resume(struct device *dev)
}
int
tegra30_ahub_allocate_rx_fifo
(
enum
tegra30_ahub_rxcif
*
rxcif
,
unsigned
long
*
fiforeg
,
unsigned
long
*
reqsel
)
dma_addr_t
*
fiforeg
,
unsigned
int
*
reqsel
)
{
int
channel
;
u32
reg
,
val
;
...
...
@@ -178,8 +178,8 @@ int tegra30_ahub_free_rx_fifo(enum tegra30_ahub_rxcif rxcif)
EXPORT_SYMBOL_GPL
(
tegra30_ahub_free_rx_fifo
);
int
tegra30_ahub_allocate_tx_fifo
(
enum
tegra30_ahub_txcif
*
txcif
,
unsigned
long
*
fiforeg
,
unsigned
long
*
reqsel
)
dma_addr_t
*
fiforeg
,
unsigned
int
*
reqsel
)
{
int
channel
;
u32
reg
,
val
;
...
...
sound/soc/tegra/tegra30_ahub.h
View file @
38e8c895
...
...
@@ -451,15 +451,15 @@ enum tegra30_ahub_rxcif {
};
extern
int
tegra30_ahub_allocate_rx_fifo
(
enum
tegra30_ahub_rxcif
*
rxcif
,
unsigned
long
*
fiforeg
,
unsigned
long
*
reqsel
);
dma_addr_t
*
fiforeg
,
unsigned
int
*
reqsel
);
extern
int
tegra30_ahub_enable_rx_fifo
(
enum
tegra30_ahub_rxcif
rxcif
);
extern
int
tegra30_ahub_disable_rx_fifo
(
enum
tegra30_ahub_rxcif
rxcif
);
extern
int
tegra30_ahub_free_rx_fifo
(
enum
tegra30_ahub_rxcif
rxcif
);
extern
int
tegra30_ahub_allocate_tx_fifo
(
enum
tegra30_ahub_txcif
*
txcif
,
unsigned
long
*
fiforeg
,
unsigned
long
*
reqsel
);
dma_addr_t
*
fiforeg
,
unsigned
int
*
reqsel
);
extern
int
tegra30_ahub_enable_tx_fifo
(
enum
tegra30_ahub_txcif
txcif
);
extern
int
tegra30_ahub_disable_tx_fifo
(
enum
tegra30_ahub_txcif
txcif
);
extern
int
tegra30_ahub_free_tx_fifo
(
enum
tegra30_ahub_txcif
txcif
);
...
...
sound/soc/tegra/tegra30_i2s.c
View file @
38e8c895
...
...
@@ -38,6 +38,7 @@
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/dmaengine_pcm.h>
#include "tegra30_ahub.h"
#include "tegra30_i2s.h"
...
...
@@ -80,17 +81,17 @@ static int tegra30_i2s_startup(struct snd_pcm_substream *substream,
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
ret
=
tegra30_ahub_allocate_tx_fifo
(
&
i2s
->
playback_fifo_cif
,
&
i2s
->
playback_dma_data
.
addr
,
&
i2s
->
playback_dma_data
.
req_sel
);
i2s
->
playback_dma_data
.
wrap
=
4
;
i2s
->
playback_dma_data
.
width
=
32
;
&
i2s
->
playback_dma_data
.
slave_id
);
i2s
->
playback_dma_data
.
addr_width
=
DMA_SLAVE_BUSWIDTH_4_BYTES
;
i2s
->
playback_dma_data
.
maxburst
=
4
;
tegra30_ahub_set_rx_cif_source
(
i2s
->
playback_i2s_cif
,
i2s
->
playback_fifo_cif
);
}
else
{
ret
=
tegra30_ahub_allocate_rx_fifo
(
&
i2s
->
capture_fifo_cif
,
&
i2s
->
capture_dma_data
.
addr
,
&
i2s
->
capture_dma_data
.
req_sel
);
i2s
->
capture_dma_data
.
wrap
=
4
;
i2s
->
capture_dma_data
.
width
=
32
;
&
i2s
->
capture_dma_data
.
slave_id
);
i2s
->
capture_dma_data
.
addr_width
=
DMA_SLAVE_BUSWIDTH_4_BYTES
;
i2s
->
capture_dma_data
.
maxburst
=
4
;
tegra30_ahub_set_rx_cif_source
(
i2s
->
capture_fifo_cif
,
i2s
->
capture_i2s_cif
);
}
...
...
sound/soc/tegra/tegra30_i2s.h
View file @
38e8c895
...
...
@@ -231,10 +231,10 @@ struct tegra30_i2s {
struct
clk
*
clk_i2s
;
enum
tegra30_ahub_txcif
capture_i2s_cif
;
enum
tegra30_ahub_rxcif
capture_fifo_cif
;
struct
tegra_pcm_dma_params
capture_dma_data
;
struct
snd_dmaengine_dai_dma_data
capture_dma_data
;
enum
tegra30_ahub_rxcif
playback_i2s_cif
;
enum
tegra30_ahub_txcif
playback_fifo_cif
;
struct
tegra_pcm_dma_params
playback_dma_data
;
struct
snd_dmaengine_dai_dma_data
playback_dma_data
;
struct
regmap
*
regmap
;
};
...
...
sound/soc/tegra/tegra_pcm.c
View file @
38e8c895
...
...
@@ -73,24 +73,15 @@ static int tegra_pcm_open(struct snd_pcm_substream *substream)
return
0
;
}
static
int
tegra_pcm_close
(
struct
snd_pcm_substream
*
substream
)
{
snd_dmaengine_pcm_close
(
substream
);
return
0
;
}
static
int
tegra_pcm_hw_params
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
params
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
device
*
dev
=
rtd
->
platform
->
dev
;
struct
dma_chan
*
chan
=
snd_dmaengine_pcm_get_chan
(
substream
);
struct
tegra_pcm_dma_params
*
dmap
;
struct
dma_slave_config
slave_config
;
int
ret
;
dmap
=
snd_soc_dai_get_dma_data
(
rtd
->
cpu_dai
,
substream
);
ret
=
snd_hwparams_to_dma_slave_config
(
substream
,
params
,
&
slave_config
);
if
(
ret
)
{
...
...
@@ -98,16 +89,9 @@ static int tegra_pcm_hw_params(struct snd_pcm_substream *substream,
return
ret
;
}
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
slave_config
.
dst_addr_width
=
DMA_SLAVE_BUSWIDTH_4_BYTES
;
slave_config
.
dst_addr
=
dmap
->
addr
;
slave_config
.
dst_maxburst
=
4
;
}
else
{
slave_config
.
src_addr_width
=
DMA_SLAVE_BUSWIDTH_4_BYTES
;
slave_config
.
src_addr
=
dmap
->
addr
;
slave_config
.
src_maxburst
=
4
;
}
slave_config
.
slave_id
=
dmap
->
req_sel
;
snd_dmaengine_pcm_set_config_from_dai_data
(
substream
,
snd_soc_dai_get_dma_data
(
rtd
->
cpu_dai
,
substream
),
&
slave_config
);
ret
=
dmaengine_slave_config
(
chan
,
&
slave_config
);
if
(
ret
<
0
)
{
...
...
@@ -138,7 +122,7 @@ static int tegra_pcm_mmap(struct snd_pcm_substream *substream,
static
struct
snd_pcm_ops
tegra_pcm_ops
=
{
.
open
=
tegra_pcm_open
,
.
close
=
tegra
_pcm_close
,
.
close
=
snd_dmaengine
_pcm_close
,
.
ioctl
=
snd_pcm_lib_ioctl
,
.
hw_params
=
tegra_pcm_hw_params
,
.
hw_free
=
tegra_pcm_hw_free
,
...
...
sound/soc/tegra/tegra_pcm.h
View file @
38e8c895
...
...
@@ -31,13 +31,6 @@
#ifndef __TEGRA_PCM_H__
#define __TEGRA_PCM_H__
struct
tegra_pcm_dma_params
{
unsigned
long
addr
;
unsigned
long
wrap
;
unsigned
long
width
;
unsigned
long
req_sel
;
};
int
tegra_pcm_platform_register
(
struct
device
*
dev
);
void
tegra_pcm_platform_unregister
(
struct
device
*
dev
);
...
...
sound/soc/ux500/ux500_pcm.c
View file @
38e8c895
...
...
@@ -28,28 +28,19 @@
#include "ux500_msp_i2s.h"
#include "ux500_pcm.h"
static
struct
snd_pcm_hardware
ux500_pcm_hw_playback
=
{
.
info
=
SNDRV_PCM_INFO_INTERLEAVED
|
SNDRV_PCM_INFO_MMAP
|
SNDRV_PCM_INFO_RESUME
|
SNDRV_PCM_INFO_PAUSE
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
|
SNDRV_PCM_FMTBIT_U16_LE
|
SNDRV_PCM_FMTBIT_S16_BE
|
SNDRV_PCM_FMTBIT_U16_BE
,
.
rates
=
SNDRV_PCM_RATE_KNOT
,
.
rate_min
=
UX500_PLATFORM_MIN_RATE_PLAYBACK
,
.
rate_max
=
UX500_PLATFORM_MAX_RATE_PLAYBACK
,
.
channels_min
=
UX500_PLATFORM_MIN_CHANNELS
,
.
channels_max
=
UX500_PLATFORM_MAX_CHANNELS
,
.
buffer_bytes_max
=
UX500_PLATFORM_BUFFER_BYTES_MAX
,
.
period_bytes_min
=
UX500_PLATFORM_PERIODS_BYTES_MIN
,
.
period_bytes_max
=
UX500_PLATFORM_PERIODS_BYTES_MAX
,
.
periods_min
=
UX500_PLATFORM_PERIODS_MIN
,
.
periods_max
=
UX500_PLATFORM_PERIODS_MAX
,
};
#define UX500_PLATFORM_MIN_RATE 8000
#define UX500_PLATFORM_MAX_RATE 48000
#define UX500_PLATFORM_MIN_CHANNELS 1
#define UX500_PLATFORM_MAX_CHANNELS 8
static
struct
snd_pcm_hardware
ux500_pcm_hw_capture
=
{
#define UX500_PLATFORM_PERIODS_BYTES_MIN 128
#define UX500_PLATFORM_PERIODS_BYTES_MAX (64 * PAGE_SIZE)
#define UX500_PLATFORM_PERIODS_MIN 2
#define UX500_PLATFORM_PERIODS_MAX 48
#define UX500_PLATFORM_BUFFER_BYTES_MAX (2048 * PAGE_SIZE)
static
struct
snd_pcm_hardware
ux500_pcm_hw
=
{
.
info
=
SNDRV_PCM_INFO_INTERLEAVED
|
SNDRV_PCM_INFO_MMAP
|
SNDRV_PCM_INFO_RESUME
|
...
...
@@ -59,8 +50,8 @@ static struct snd_pcm_hardware ux500_pcm_hw_capture = {
SNDRV_PCM_FMTBIT_S16_BE
|
SNDRV_PCM_FMTBIT_U16_BE
,
.
rates
=
SNDRV_PCM_RATE_KNOT
,
.
rate_min
=
UX500_PLATFORM_MIN_RATE
_CAPTURE
,
.
rate_max
=
UX500_PLATFORM_MAX_RATE
_CAPTURE
,
.
rate_min
=
UX500_PLATFORM_MIN_RATE
,
.
rate_max
=
UX500_PLATFORM_MAX_RATE
,
.
channels_min
=
UX500_PLATFORM_MIN_CHANNELS
,
.
channels_max
=
UX500_PLATFORM_MAX_CHANNELS
,
.
buffer_bytes_max
=
UX500_PLATFORM_BUFFER_BYTES_MAX
,
...
...
@@ -90,8 +81,6 @@ static void ux500_pcm_dma_hw_free(struct device *dev,
static
int
ux500_pcm_open
(
struct
snd_pcm_substream
*
substream
)
{
int
stream_id
=
substream
->
pstr
->
stream
;
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
snd_soc_dai
*
dai
=
rtd
->
cpu_dai
;
struct
device
*
dev
=
dai
->
dev
;
...
...
@@ -104,26 +93,7 @@ static int ux500_pcm_open(struct snd_pcm_substream *substream)
snd_pcm_stream_str
(
substream
));
dev_dbg
(
dev
,
"%s: Set runtime hwparams.
\n
"
,
__func__
);
if
(
stream_id
==
SNDRV_PCM_STREAM_PLAYBACK
)
snd_soc_set_runtime_hwparams
(
substream
,
&
ux500_pcm_hw_playback
);
else
snd_soc_set_runtime_hwparams
(
substream
,
&
ux500_pcm_hw_capture
);
/* ensure that buffer size is a multiple of period size */
ret
=
snd_pcm_hw_constraint_integer
(
runtime
,
SNDRV_PCM_HW_PARAM_PERIODS
);
if
(
ret
<
0
)
{
dev_err
(
dev
,
"%s: Error: snd_pcm_hw_constraints failed (%d)
\n
"
,
__func__
,
ret
);
return
ret
;
}
dev_dbg
(
dev
,
"%s: Set hw-struct for %s.
\n
"
,
__func__
,
snd_pcm_stream_str
(
substream
));
runtime
->
hw
=
(
stream_id
==
SNDRV_PCM_STREAM_PLAYBACK
)
?
ux500_pcm_hw_playback
:
ux500_pcm_hw_capture
;
snd_soc_set_runtime_hwparams
(
substream
,
&
ux500_pcm_hw
);
mem_data_width
=
STEDMA40_HALFWORD_WIDTH
;
...
...
@@ -164,20 +134,6 @@ static int ux500_pcm_open(struct snd_pcm_substream *substream)
return
ret
;
}
snd_dmaengine_pcm_set_data
(
substream
,
dma_cfg
);
return
0
;
}
static
int
ux500_pcm_close
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
snd_soc_dai
*
dai
=
rtd
->
cpu_dai
;
dev_dbg
(
dai
->
dev
,
"%s: Enter
\n
"
,
__func__
);
snd_dmaengine_pcm_close
(
substream
);
return
0
;
}
...
...
@@ -255,7 +211,7 @@ static int ux500_pcm_mmap(struct snd_pcm_substream *substream,
static
struct
snd_pcm_ops
ux500_pcm_ops
=
{
.
open
=
ux500_pcm_open
,
.
close
=
ux500
_pcm_close
,
.
close
=
snd_dmaengine
_pcm_close
,
.
ioctl
=
snd_pcm_lib_ioctl
,
.
hw_params
=
ux500_pcm_hw_params
,
.
hw_free
=
ux500_pcm_hw_free
,
...
...
sound/soc/ux500/ux500_pcm.h
View file @
38e8c895
...
...
@@ -18,20 +18,6 @@
#include <linux/workqueue.h>
#define UX500_PLATFORM_MIN_RATE_PLAYBACK 8000
#define UX500_PLATFORM_MAX_RATE_PLAYBACK 48000
#define UX500_PLATFORM_MIN_RATE_CAPTURE 8000
#define UX500_PLATFORM_MAX_RATE_CAPTURE 48000
#define UX500_PLATFORM_MIN_CHANNELS 1
#define UX500_PLATFORM_MAX_CHANNELS 8
#define UX500_PLATFORM_PERIODS_BYTES_MIN 128
#define UX500_PLATFORM_PERIODS_BYTES_MAX (64 * PAGE_SIZE)
#define UX500_PLATFORM_PERIODS_MIN 2
#define UX500_PLATFORM_PERIODS_MAX 48
#define UX500_PLATFORM_BUFFER_BYTES_MAX (2048 * PAGE_SIZE)
int
ux500_pcm_register_platform
(
struct
platform_device
*
pdev
);
int
ux500_pcm_unregister_platform
(
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