Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
81a4275b
Commit
81a4275b
authored
May 15, 2009
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-2.6.30' into for-2.6.31
parents
63c26baa
f492ec9f
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
146 additions
and
46 deletions
+146
-46
arch/arm/mach-davinci/include/mach/asp.h
arch/arm/mach-davinci/include/mach/asp.h
+25
-0
sound/soc/davinci/Kconfig
sound/soc/davinci/Kconfig
+4
-3
sound/soc/davinci/davinci-evm.c
sound/soc/davinci/davinci-evm.c
+52
-11
sound/soc/davinci/davinci-i2s.c
sound/soc/davinci/davinci-i2s.c
+23
-3
sound/soc/davinci/davinci-pcm.c
sound/soc/davinci/davinci-pcm.c
+42
-29
No files found.
arch/arm/mach-davinci/include/mach/asp.h
0 → 100644
View file @
81a4275b
/*
* <mach/asp.h> - DaVinci Audio Serial Port support
*/
#ifndef __ASM_ARCH_DAVINCI_ASP_H
#define __ASM_ARCH_DAVINCI_ASP_H
#include <mach/irqs.h>
/* Bases of register banks */
#define DAVINCI_ASP0_BASE 0x01E02000
#define DAVINCI_ASP1_BASE 0x01E04000
/* EDMA channels */
#define DAVINCI_DMA_ASP0_TX 2
#define DAVINCI_DMA_ASP0_RX 3
#define DAVINCI_DMA_ASP1_TX 8
#define DAVINCI_DMA_ASP1_RX 9
/* Interrupts */
#define DAVINCI_ASP0_RX_INT IRQ_MBRINT
#define DAVINCI_ASP0_TX_INT IRQ_MBXINT
#define DAVINCI_ASP1_RX_INT IRQ_MBRINT
#define DAVINCI_ASP1_TX_INT IRQ_MBXINT
#endif
/* __ASM_ARCH_DAVINCI_ASP_H */
sound/soc/davinci/Kconfig
View file @
81a4275b
...
...
@@ -10,13 +10,14 @@ config SND_DAVINCI_SOC_I2S
tristate
config SND_DAVINCI_SOC_EVM
tristate "SoC Audio support for DaVinci EVM"
depends on SND_DAVINCI_SOC && MACH_DAVINCI_EVM
tristate "SoC Audio support for DaVinci DM6446 or DM355 EVM"
depends on SND_DAVINCI_SOC
depends on MACH_DAVINCI_EVM || MACH_DAVINCI_DM355_EVM
select SND_DAVINCI_SOC_I2S
select SND_SOC_TLV320AIC3X
help
Say Y if you want to add support for SoC audio on TI
DaVinci
EVM platform
.
DaVinci
DM6446 or DM355 EVM platforms
.
config SND_DAVINCI_SOC_SFFSDR
tristate "SoC Audio support for SFFSDR"
...
...
sound/soc/davinci/davinci-evm.c
View file @
81a4275b
...
...
@@ -20,7 +20,11 @@
#include <sound/soc-dapm.h>
#include <asm/dma.h>
#include <mach/hardware.h>
#include <asm/mach-types.h>
#include <mach/asp.h>
#include <mach/edma.h>
#include <mach/mux.h>
#include "../codecs/tlv320aic3x.h"
#include "davinci-pcm.h"
...
...
@@ -150,7 +154,7 @@ static struct snd_soc_card snd_soc_card_evm = {
/* evm audio private data */
static
struct
aic3x_setup_data
evm_aic3x_setup
=
{
.
i2c_bus
=
0
,
.
i2c_bus
=
1
,
.
i2c_address
=
0x1b
,
};
...
...
@@ -161,36 +165,73 @@ static struct snd_soc_device evm_snd_devdata = {
.
codec_data
=
&
evm_aic3x_setup
,
};
/* DM6446 EVM uses ASP0; line-out is a pair of RCA jacks */
static
struct
resource
evm_snd_resources
[]
=
{
{
.
start
=
DAVINCI_
MCBSP
_BASE
,
.
end
=
DAVINCI_
MCBSP
_BASE
+
SZ_8K
-
1
,
.
start
=
DAVINCI_
ASP0
_BASE
,
.
end
=
DAVINCI_
ASP0
_BASE
+
SZ_8K
-
1
,
.
flags
=
IORESOURCE_MEM
,
},
};
static
struct
evm_snd_platform_data
evm_snd_data
=
{
.
tx_dma_ch
=
DM644X_DMACH_MCBSP_TX
,
.
rx_dma_ch
=
DM644X_DMACH_MCBSP_RX
,
.
tx_dma_ch
=
DAVINCI_DMA_ASP0_TX
,
.
rx_dma_ch
=
DAVINCI_DMA_ASP0_RX
,
};
/* DM335 EVM uses ASP1; line-out is a stereo mini-jack */
static
struct
resource
dm335evm_snd_resources
[]
=
{
{
.
start
=
DAVINCI_ASP1_BASE
,
.
end
=
DAVINCI_ASP1_BASE
+
SZ_8K
-
1
,
.
flags
=
IORESOURCE_MEM
,
},
};
static
struct
evm_snd_platform_data
dm335evm_snd_data
=
{
.
tx_dma_ch
=
DAVINCI_DMA_ASP1_TX
,
.
rx_dma_ch
=
DAVINCI_DMA_ASP1_RX
,
};
static
struct
platform_device
*
evm_snd_device
;
static
int
__init
evm_init
(
void
)
{
struct
resource
*
resources
;
unsigned
num_resources
;
struct
evm_snd_platform_data
*
data
;
int
index
;
int
ret
;
evm_snd_device
=
platform_device_alloc
(
"soc-audio"
,
0
);
if
(
machine_is_davinci_evm
())
{
davinci_cfg_reg
(
DM644X_MCBSP
);
resources
=
evm_snd_resources
;
num_resources
=
ARRAY_SIZE
(
evm_snd_resources
);
data
=
&
evm_snd_data
;
index
=
0
;
}
else
if
(
machine_is_davinci_dm355_evm
())
{
/* we don't use ASP1 IRQs, or we'd need to mux them ... */
davinci_cfg_reg
(
DM355_EVT8_ASP1_TX
);
davinci_cfg_reg
(
DM355_EVT9_ASP1_RX
);
resources
=
dm335evm_snd_resources
;
num_resources
=
ARRAY_SIZE
(
dm335evm_snd_resources
);
data
=
&
dm335evm_snd_data
;
index
=
1
;
}
else
return
-
EINVAL
;
evm_snd_device
=
platform_device_alloc
(
"soc-audio"
,
index
);
if
(
!
evm_snd_device
)
return
-
ENOMEM
;
platform_set_drvdata
(
evm_snd_device
,
&
evm_snd_devdata
);
evm_snd_devdata
.
dev
=
&
evm_snd_device
->
dev
;
platform_device_add_data
(
evm_snd_device
,
&
evm_snd_data
,
sizeof
(
evm_snd_data
));
platform_device_add_data
(
evm_snd_device
,
data
,
sizeof
(
*
data
));
ret
=
platform_device_add_resources
(
evm_snd_device
,
evm_snd_
resources
,
ARRAY_SIZE
(
evm_snd_resources
)
);
ret
=
platform_device_add_resources
(
evm_snd_device
,
resources
,
num_resources
);
if
(
ret
)
{
platform_device_put
(
evm_snd_device
);
return
ret
;
...
...
sound/soc/davinci/davinci-i2s.c
View file @
81a4275b
...
...
@@ -24,6 +24,26 @@
#include "davinci-pcm.h"
/*
* NOTE: terminology here is confusing.
*
* - This driver supports the "Audio Serial Port" (ASP),
* found on dm6446, dm355, and other DaVinci chips.
*
* - But it labels it a "Multi-channel Buffered Serial Port"
* (McBSP) as on older chips like the dm642 ... which was
* backward-compatible, possibly explaining that confusion.
*
* - OMAP chips have a controller called McBSP, which is
* incompatible with the DaVinci flavor of McBSP.
*
* - Newer DaVinci chips have a controller called McASP,
* incompatible with ASP and with either McBSP.
*
* In short: this uses ASP to implement I2S, not McBSP.
* And it won't be the only DaVinci implemention of I2S.
*/
#define DAVINCI_MCBSP_DRR_REG 0x00
#define DAVINCI_MCBSP_DXR_REG 0x04
#define DAVINCI_MCBSP_SPCR_REG 0x08
...
...
@@ -421,7 +441,7 @@ static int davinci_i2s_probe(struct platform_device *pdev,
{
struct
snd_soc_device
*
socdev
=
platform_get_drvdata
(
pdev
);
struct
snd_soc_card
*
card
=
socdev
->
card
;
struct
snd_soc_dai
*
cpu_dai
=
card
->
dai_link
[
pdev
->
id
].
cpu_dai
;
struct
snd_soc_dai
*
cpu_dai
=
card
->
dai_link
->
cpu_dai
;
struct
davinci_mcbsp_dev
*
dev
;
struct
resource
*
mem
,
*
ioarea
;
struct
evm_snd_platform_data
*
pdata
;
...
...
@@ -448,7 +468,7 @@ static int davinci_i2s_probe(struct platform_device *pdev,
cpu_dai
->
private_data
=
dev
;
dev
->
clk
=
clk_get
(
&
pdev
->
dev
,
"McBSPCLK"
);
dev
->
clk
=
clk_get
(
&
pdev
->
dev
,
NULL
);
if
(
IS_ERR
(
dev
->
clk
))
{
ret
=
-
ENODEV
;
goto
err_free_mem
;
...
...
@@ -483,7 +503,7 @@ static void davinci_i2s_remove(struct platform_device *pdev,
{
struct
snd_soc_device
*
socdev
=
platform_get_drvdata
(
pdev
);
struct
snd_soc_card
*
card
=
socdev
->
card
;
struct
snd_soc_dai
*
cpu_dai
=
card
->
dai_link
[
pdev
->
id
].
cpu_dai
;
struct
snd_soc_dai
*
cpu_dai
=
card
->
dai_link
->
cpu_dai
;
struct
davinci_mcbsp_dev
*
dev
=
cpu_dai
->
private_data
;
struct
resource
*
mem
;
...
...
sound/soc/davinci/davinci-pcm.c
View file @
81a4275b
...
...
@@ -22,6 +22,7 @@
#include <sound/soc.h>
#include <asm/dma.h>
#include <mach/edma.h>
#include "davinci-pcm.h"
...
...
@@ -51,7 +52,7 @@ struct davinci_runtime_data {
spinlock_t
lock
;
int
period
;
/* current DMA period */
int
master_lch
;
/* Master DMA channel */
int
slave_lch
;
/*
Slave DMA channel
*/
int
slave_lch
;
/*
linked parameter RAM reload slot
*/
struct
davinci_pcm_dma_params
*
params
;
/* DMA params */
};
...
...
@@ -90,18 +91,18 @@ static void davinci_pcm_enqueue_dma(struct snd_pcm_substream *substream)
dst_bidx
=
data_type
;
}
davinci_set_dma_src_params
(
lch
,
src
,
INCR
,
W8BIT
);
davinci_set_dma_dest_params
(
lch
,
dst
,
INCR
,
W8BIT
);
davinci_set_dma
_src_index
(
lch
,
src_bidx
,
0
);
davinci_set_dma
_dest_index
(
lch
,
dst_bidx
,
0
);
davinci_set_dma
_transfer_params
(
lch
,
data_type
,
count
,
1
,
0
,
ASYNC
);
edma_set_src
(
lch
,
src
,
INCR
,
W8BIT
);
edma_set_dest
(
lch
,
dst
,
INCR
,
W8BIT
);
edma_set
_src_index
(
lch
,
src_bidx
,
0
);
edma_set
_dest_index
(
lch
,
dst_bidx
,
0
);
edma_set
_transfer_params
(
lch
,
data_type
,
count
,
1
,
0
,
ASYNC
);
prtd
->
period
++
;
if
(
unlikely
(
prtd
->
period
>=
runtime
->
periods
))
prtd
->
period
=
0
;
}
static
void
davinci_pcm_dma_irq
(
int
lch
,
u16
ch_status
,
void
*
data
)
static
void
davinci_pcm_dma_irq
(
unsigned
lch
,
u16
ch_status
,
void
*
data
)
{
struct
snd_pcm_substream
*
substream
=
data
;
struct
davinci_runtime_data
*
prtd
=
substream
->
runtime
->
private_data
;
...
...
@@ -125,7 +126,7 @@ static int davinci_pcm_dma_request(struct snd_pcm_substream *substream)
struct
davinci_runtime_data
*
prtd
=
substream
->
runtime
->
private_data
;
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
davinci_pcm_dma_params
*
dma_data
=
rtd
->
dai
->
cpu_dai
->
dma_data
;
int
tcc
=
TCC_ANY
;
struct
edmacc_param
p_ram
;
int
ret
;
if
(
!
dma_data
)
...
...
@@ -134,22 +135,34 @@ static int davinci_pcm_dma_request(struct snd_pcm_substream *substream)
prtd
->
params
=
dma_data
;
/* Request master DMA channel */
ret
=
davinci_request_dma
(
prtd
->
params
->
channel
,
prtd
->
params
->
name
,
ret
=
edma_alloc_channel
(
prtd
->
params
->
channel
,
davinci_pcm_dma_irq
,
substream
,
&
prtd
->
master_lch
,
&
tcc
,
EVENTQ_0
);
if
(
ret
)
EVENTQ_0
);
if
(
ret
<
0
)
return
ret
;
prtd
->
master_lch
=
ret
;
/* Request slave DMA channel */
ret
=
davinci_request_dma
(
PARAM_ANY
,
"Link"
,
NULL
,
NULL
,
&
prtd
->
slave_lch
,
&
tcc
,
EVENTQ_0
);
if
(
ret
)
{
davinci_free_dma
(
prtd
->
master_lch
);
/* Request parameter RAM reload slot */
ret
=
edma_alloc_slot
(
EDMA_SLOT_ANY
);
if
(
ret
<
0
)
{
edma_free_channel
(
prtd
->
master_lch
);
return
ret
;
}
/* Link slave DMA channel in loopback */
davinci_dma_link_lch
(
prtd
->
slave_lch
,
prtd
->
slave_lch
);
prtd
->
slave_lch
=
ret
;
/* Issue transfer completion IRQ when the channel completes a
* transfer, then always reload from the same slot (by a kind
* of loopback link). The completion IRQ handler will update
* the reload slot with a new buffer.
*
* REVISIT save p_ram here after setting up everything except
* the buffer and its length (ccnt) ... use it as a template
* so davinci_pcm_enqueue_dma() takes less time in IRQ.
*/
edma_read_slot
(
prtd
->
slave_lch
,
&
p_ram
);
p_ram
.
opt
|=
TCINTEN
|
EDMA_TCC
(
prtd
->
master_lch
);
p_ram
.
link_bcntrld
=
prtd
->
slave_lch
<<
5
;
edma_write_slot
(
prtd
->
slave_lch
,
&
p_ram
);
return
0
;
}
...
...
@@ -165,12 +178,12 @@ static int davinci_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_RESUME
:
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
davinci_start_dma
(
prtd
->
master_lch
);
edma_start
(
prtd
->
master_lch
);
break
;
case
SNDRV_PCM_TRIGGER_STOP
:
case
SNDRV_PCM_TRIGGER_SUSPEND
:
case
SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
davinci_stop_dma
(
prtd
->
master_lch
);
edma_stop
(
prtd
->
master_lch
);
break
;
default:
ret
=
-
EINVAL
;
...
...
@@ -185,14 +198,14 @@ static int davinci_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
static
int
davinci_pcm_prepare
(
struct
snd_pcm_substream
*
substream
)
{
struct
davinci_runtime_data
*
prtd
=
substream
->
runtime
->
private_data
;
struct
paramentry_descriptor
temp
;
struct
edmacc_param
temp
;
prtd
->
period
=
0
;
davinci_pcm_enqueue_dma
(
substream
);
/*
Get slave channel dma params for master channel startup
*/
davinci_get_dma_params
(
prtd
->
slave_lch
,
&
temp
);
davinci_set_dma_params
(
prtd
->
master_lch
,
&
temp
);
/*
Copy self-linked parameter RAM entry into master channel
*/
edma_read_slot
(
prtd
->
slave_lch
,
&
temp
);
edma_write_slot
(
prtd
->
master_lch
,
&
temp
);
return
0
;
}
...
...
@@ -208,7 +221,7 @@ davinci_pcm_pointer(struct snd_pcm_substream *substream)
spin_lock
(
&
prtd
->
lock
);
davinci_dma_get
position
(
prtd
->
master_lch
,
&
src
,
&
dst
);
edma_get_
position
(
prtd
->
master_lch
,
&
src
,
&
dst
);
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
count
=
src
-
runtime
->
dma_addr
;
else
...
...
@@ -253,10 +266,10 @@ static int davinci_pcm_close(struct snd_pcm_substream *substream)
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
davinci_runtime_data
*
prtd
=
runtime
->
private_data
;
davinci_dma_unlink_lch
(
prtd
->
slave_lch
,
prtd
->
slave_lch
);
edma_unlink
(
prtd
->
slave_lch
);
davinci_free_dma
(
prtd
->
slave_lch
);
davinci_free_dma
(
prtd
->
master_lch
);
edma_free_slot
(
prtd
->
slave_lch
);
edma_free_channel
(
prtd
->
master_lch
);
kfree
(
prtd
);
...
...
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