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
3f405b46
Commit
3f405b46
authored
Jul 07, 2009
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'davinci' into for-2.6.32
Conflicts: sound/soc/davinci/davinci-i2s.c
parents
4ec5c969
efd13be0
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
1073 additions
and
113 deletions
+1073
-113
sound/soc/davinci/Kconfig
sound/soc/davinci/Kconfig
+13
-0
sound/soc/davinci/Makefile
sound/soc/davinci/Makefile
+3
-0
sound/soc/davinci/davinci-evm.c
sound/soc/davinci/davinci-evm.c
+48
-54
sound/soc/davinci/davinci-i2s.c
sound/soc/davinci/davinci-i2s.c
+70
-51
sound/soc/davinci/davinci-mcasp.c
sound/soc/davinci/davinci-mcasp.c
+874
-0
sound/soc/davinci/davinci-mcasp.h
sound/soc/davinci/davinci-mcasp.h
+55
-0
sound/soc/davinci/davinci-pcm.h
sound/soc/davinci/davinci-pcm.h
+10
-8
No files found.
sound/soc/davinci/Kconfig
View file @
3f405b46
...
...
@@ -9,6 +9,9 @@ config SND_DAVINCI_SOC
config SND_DAVINCI_SOC_I2S
tristate
config SND_DAVINCI_SOC_MCASP
tristate
config SND_DAVINCI_SOC_EVM
tristate "SoC Audio support for DaVinci DM6446 or DM355 EVM"
depends on SND_DAVINCI_SOC
...
...
@@ -19,6 +22,16 @@ config SND_DAVINCI_SOC_EVM
Say Y if you want to add support for SoC audio on TI
DaVinci DM6446 or DM355 EVM platforms.
config SND_DM6467_SOC_EVM
tristate "SoC Audio support for DaVinci DM6467 EVM"
depends on SND_DAVINCI_SOC && MACH_DAVINCI_DM6467_EVM
select SND_DAVINCI_SOC_MCASP
select SND_SOC_TLV320AIC3X
select SND_SOC_SPDIF
help
Say Y if you want to add support for SoC audio on TI
config SND_DAVINCI_SOC_SFFSDR
tristate "SoC Audio support for SFFSDR"
depends on SND_DAVINCI_SOC && MACH_SFFSDR
...
...
sound/soc/davinci/Makefile
View file @
3f405b46
# DAVINCI Platform Support
snd-soc-davinci-objs
:=
davinci-pcm.o
snd-soc-davinci-i2s-objs
:=
davinci-i2s.o
snd-soc-davinci-mcasp-objs
:=
davinci-mcasp.o
obj-$(CONFIG_SND_DAVINCI_SOC)
+=
snd-soc-davinci.o
obj-$(CONFIG_SND_DAVINCI_SOC_I2S)
+=
snd-soc-davinci-i2s.o
obj-$(CONFIG_SND_DAVINCI_SOC_MCASP)
+=
snd-soc-davinci-mcasp.o
# DAVINCI Machine Support
snd-soc-evm-objs
:=
davinci-evm.o
snd-soc-sffsdr-objs
:=
davinci-sffsdr.o
obj-$(CONFIG_SND_DAVINCI_SOC_EVM)
+=
snd-soc-evm.o
obj-$(CONFIG_SND_DM6467_SOC_EVM)
+=
snd-soc-evm.o
obj-$(CONFIG_SND_DAVINCI_SOC_SFFSDR)
+=
snd-soc-sffsdr.o
sound/soc/davinci/davinci-evm.c
View file @
3f405b46
...
...
@@ -27,9 +27,10 @@
#include <mach/mux.h>
#include "../codecs/tlv320aic3x.h"
#include "../codecs/spdif_transciever.h"
#include "davinci-pcm.h"
#include "davinci-i2s.h"
#include "davinci-mcasp.h"
#define AUDIO_FORMAT (SND_SOC_DAIFMT_DSP_B | \
SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_IB_NF)
...
...
@@ -43,7 +44,7 @@ static int evm_hw_params(struct snd_pcm_substream *substream,
unsigned
sysclk
;
/* ASP1 on DM355 EVM is clocked by an external oscillator */
if
(
machine_is_davinci_dm355_evm
())
if
(
machine_is_davinci_dm355_evm
()
||
machine_is_davinci_dm6467_evm
()
)
sysclk
=
27000000
;
/* ASP0 in DM6446 EVM is clocked by U55, as configured by
...
...
@@ -144,6 +145,24 @@ static struct snd_soc_dai_link evm_dai = {
.
ops
=
&
evm_ops
,
};
static
struct
snd_soc_dai_link
dm6467_evm_dai
[]
=
{
{
.
name
=
"TLV320AIC3X"
,
.
stream_name
=
"AIC3X"
,
.
cpu_dai
=
&
davinci_mcasp_dai
[
DAVINCI_MCASP_I2S_DAI
],
.
codec_dai
=
&
aic3x_dai
,
.
init
=
evm_aic3x_init
,
.
ops
=
&
evm_ops
,
},
{
.
name
=
"McASP"
,
.
stream_name
=
"spdif"
,
.
cpu_dai
=
&
davinci_mcasp_dai
[
DAVINCI_MCASP_DIT_DAI
],
.
codec_dai
=
&
dit_stub_dai
,
.
ops
=
&
evm_ops
,
},
};
/* davinci-evm audio machine driver */
static
struct
snd_soc_card
snd_soc_card_evm
=
{
.
name
=
"DaVinci EVM"
,
...
...
@@ -152,12 +171,26 @@ static struct snd_soc_card snd_soc_card_evm = {
.
num_links
=
1
,
};
/* davinci dm6467 evm audio machine driver */
static
struct
snd_soc_card
dm6467_snd_soc_card_evm
=
{
.
name
=
"DaVinci DM6467 EVM"
,
.
platform
=
&
davinci_soc_platform
,
.
dai_link
=
dm6467_evm_dai
,
.
num_links
=
ARRAY_SIZE
(
dm6467_evm_dai
),
};
/* evm audio private data */
static
struct
aic3x_setup_data
evm_aic3x_setup
=
{
.
i2c_bus
=
1
,
.
i2c_address
=
0x1b
,
};
/* dm6467 evm audio private data */
static
struct
aic3x_setup_data
dm6467_evm_aic3x_setup
=
{
.
i2c_bus
=
1
,
.
i2c_address
=
0x18
,
};
/* evm audio subsystem */
static
struct
snd_soc_device
evm_snd_devdata
=
{
.
card
=
&
snd_soc_card_evm
,
...
...
@@ -165,60 +198,30 @@ 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_ASP0_BASE
,
.
end
=
DAVINCI_ASP0_BASE
+
SZ_8K
-
1
,
.
flags
=
IORESOURCE_MEM
,
},
};
static
struct
evm_snd_platform_data
evm_snd_data
=
{
.
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
,
/* evm audio subsystem */
static
struct
snd_soc_device
dm6467_evm_snd_devdata
=
{
.
card
=
&
dm6467_snd_soc_card_evm
,
.
codec_dev
=
&
soc_codec_dev_aic3x
,
.
codec_data
=
&
dm6467_evm_aic3x_setup
,
};
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
;
struct
snd_soc_device
*
evm_snd_dev_data
;
int
index
;
int
ret
;
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
;
evm_snd_dev_data
=
&
evm_snd_devdata
;
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
;
evm_snd_dev_data
=
&
evm_snd_devdata
;
index
=
1
;
}
else
if
(
machine_is_davinci_dm6467_evm
())
{
evm_snd_dev_data
=
&
dm6467_evm_snd_devdata
;
index
=
0
;
}
else
return
-
EINVAL
;
...
...
@@ -226,17 +229,8 @@ static int __init evm_init(void)
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
,
data
,
sizeof
(
*
data
));
ret
=
platform_device_add_resources
(
evm_snd_device
,
resources
,
num_resources
);
if
(
ret
)
{
platform_device_put
(
evm_snd_device
);
return
ret
;
}
platform_set_drvdata
(
evm_snd_device
,
evm_snd_dev_data
);
evm_snd_dev_data
->
dev
=
&
evm_snd_device
->
dev
;
ret
=
platform_device_add
(
evm_snd_device
);
if
(
ret
)
platform_device_put
(
evm_snd_device
);
...
...
sound/soc/davinci/davinci-i2s.c
View file @
3f405b46
...
...
@@ -470,15 +470,41 @@ static void davinci_i2s_shutdown(struct snd_pcm_substream *substream,
davinci_mcbsp_stop
(
dev
,
playback
);
}
static
int
davinci_i2s_probe
(
struct
platform_device
*
pdev
,
struct
snd_soc_dai
*
dai
)
#define DAVINCI_I2S_RATES SNDRV_PCM_RATE_8000_96000
static
struct
snd_soc_dai_ops
davinci_i2s_dai_ops
=
{
.
startup
=
davinci_i2s_startup
,
.
shutdown
=
davinci_i2s_shutdown
,
.
prepare
=
davinci_i2s_prepare
,
.
trigger
=
davinci_i2s_trigger
,
.
hw_params
=
davinci_i2s_hw_params
,
.
set_fmt
=
davinci_i2s_set_dai_fmt
,
};
struct
snd_soc_dai
davinci_i2s_dai
=
{
.
name
=
"davinci-i2s"
,
.
id
=
0
,
.
playback
=
{
.
channels_min
=
2
,
.
channels_max
=
2
,
.
rates
=
DAVINCI_I2S_RATES
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
,},
.
capture
=
{
.
channels_min
=
2
,
.
channels_max
=
2
,
.
rates
=
DAVINCI_I2S_RATES
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
,},
.
ops
=
&
davinci_i2s_dai_ops
,
};
EXPORT_SYMBOL_GPL
(
davinci_i2s_dai
);
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
->
cpu_dai
;
struct
snd_platform_data
*
pdata
=
pdev
->
dev
.
platform_data
;
struct
davinci_mcbsp_dev
*
dev
;
struct
resource
*
mem
,
*
ioarea
;
struct
evm_snd_platform_data
*
pdata
;
struct
resource
*
mem
,
*
ioarea
,
*
res
;
int
ret
;
mem
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
...
...
@@ -500,9 +526,7 @@ static int davinci_i2s_probe(struct platform_device *pdev,
goto
err_release_region
;
}
cpu_dai
->
private_data
=
dev
;
dev
->
clk
=
clk_get
(
&
pdev
->
dev
,
NULL
);
dev
->
clk
=
clk_get
(
&
pdev
->
dev
,
pdata
->
clk_name
);
if
(
IS_ERR
(
dev
->
clk
))
{
ret
=
-
ENODEV
;
goto
err_free_mem
;
...
...
@@ -510,18 +534,37 @@ static int davinci_i2s_probe(struct platform_device *pdev,
clk_enable
(
dev
->
clk
);
dev
->
base
=
(
void
__iomem
*
)
IO_ADDRESS
(
mem
->
start
);
pdata
=
pdev
->
dev
.
platform_data
;
dev
->
dma_params
[
SNDRV_PCM_STREAM_PLAYBACK
]
=
&
davinci_i2s_pcm_out
;
dev
->
dma_params
[
SNDRV_PCM_STREAM_PLAYBACK
]
->
channel
=
pdata
->
tx_dma_ch
;
dev
->
dma_params
[
SNDRV_PCM_STREAM_PLAYBACK
]
->
dma_addr
=
(
dma_addr_t
)(
io_v2p
(
dev
->
base
)
+
DAVINCI_MCBSP_DXR_REG
);
dev
->
dma_params
[
SNDRV_PCM_STREAM_CAPTURE
]
=
&
davinci_i2s_pcm_in
;
dev
->
dma_params
[
SNDRV_PCM_STREAM_CAPTURE
]
->
channel
=
pdata
->
rx_dma_ch
;
dev
->
dma_params
[
SNDRV_PCM_STREAM_CAPTURE
]
->
dma_addr
=
(
dma_addr_t
)(
io_v2p
(
dev
->
base
)
+
DAVINCI_MCBSP_DRR_REG
);
/* first TX, then RX */
res
=
platform_get_resource
(
pdev
,
IORESOURCE_DMA
,
0
);
if
(
!
res
)
{
dev_err
(
&
pdev
->
dev
,
"no DMA resource
\n
"
);
ret
=
-
ENXIO
;
goto
err_free_mem
;
}
dev
->
dma_params
[
SNDRV_PCM_STREAM_PLAYBACK
]
->
channel
=
res
->
start
;
res
=
platform_get_resource
(
pdev
,
IORESOURCE_DMA
,
1
);
if
(
!
res
)
{
dev_err
(
&
pdev
->
dev
,
"no DMA resource
\n
"
);
ret
=
-
ENXIO
;
goto
err_free_mem
;
}
dev
->
dma_params
[
SNDRV_PCM_STREAM_CAPTURE
]
->
channel
=
res
->
start
;
davinci_i2s_dai
.
private_data
=
dev
;
ret
=
snd_soc_register_dai
(
&
davinci_i2s_dai
);
if
(
ret
!=
0
)
goto
err_free_mem
;
return
0
;
err_free_mem:
...
...
@@ -532,64 +575,40 @@ err_release_region:
return
ret
;
}
static
void
davinci_i2s_remove
(
struct
platform_device
*
pdev
,
struct
snd_soc_dai
*
dai
)
static
int
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
->
cpu_dai
;
struct
davinci_mcbsp_dev
*
dev
=
cpu_dai
->
private_data
;
struct
davinci_mcbsp_dev
*
dev
=
davinci_i2s_dai
.
private_data
;
struct
resource
*
mem
;
snd_soc_unregister_dai
(
&
davinci_i2s_dai
);
clk_disable
(
dev
->
clk
);
clk_put
(
dev
->
clk
);
dev
->
clk
=
NULL
;
kfree
(
dev
);
mem
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
release_mem_region
(
mem
->
start
,
(
mem
->
end
-
mem
->
start
)
+
1
);
}
#define DAVINCI_I2S_RATES SNDRV_PCM_RATE_8000_96000
static
struct
snd_soc_dai_ops
davinci_i2s_dai_ops
=
{
.
startup
=
davinci_i2s_startup
,
.
shutdown
=
davinci_i2s_shutdown
,
.
prepare
=
davinci_i2s_prepare
,
.
trigger
=
davinci_i2s_trigger
,
.
hw_params
=
davinci_i2s_hw_params
,
.
set_fmt
=
davinci_i2s_set_dai_fmt
,
};
return
0
;
}
struct
snd_soc_dai
davinci_i2s_dai
=
{
.
name
=
"davinci-i2s"
,
.
id
=
0
,
.
probe
=
davinci_i2s_probe
,
.
remove
=
davinci_i2s_remove
,
.
playback
=
{
.
channels_min
=
2
,
.
channels_max
=
2
,
.
rates
=
DAVINCI_I2S_RATES
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
,},
.
capture
=
{
.
channels_min
=
2
,
.
channels_max
=
2
,
.
rates
=
DAVINCI_I2S_RATES
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
,},
.
ops
=
&
davinci_i2s_dai_ops
,
static
struct
platform_driver
davinci_mcbsp_driver
=
{
.
probe
=
davinci_i2s_probe
,
.
remove
=
davinci_i2s_remove
,
.
driver
=
{
.
name
=
"davinci-asp"
,
.
owner
=
THIS_MODULE
,
},
};
EXPORT_SYMBOL_GPL
(
davinci_i2s_dai
);
static
int
__init
davinci_i2s_init
(
void
)
{
return
snd_soc_register_dai
(
&
davinci_i2s_dai
);
return
platform_driver_register
(
&
davinci_mcbsp_driver
);
}
module_init
(
davinci_i2s_init
);
static
void
__exit
davinci_i2s_exit
(
void
)
{
snd_soc_unregister_dai
(
&
davinci_i2s_dai
);
platform_driver_unregister
(
&
davinci_mcbsp_driver
);
}
module_exit
(
davinci_i2s_exit
);
...
...
sound/soc/davinci/davinci-mcasp.c
0 → 100644
View file @
3f405b46
This diff is collapsed.
Click to expand it.
sound/soc/davinci/davinci-mcasp.h
0 → 100644
View file @
3f405b46
/*
* ALSA SoC McASP Audio Layer for TI DAVINCI processor
*
* MCASP related definitions
*
* Author: Nirmal Pandey <n-pandey@ti.com>,
* Suresh Rajashekara <suresh.r@ti.com>
* Steve Chen <schen@.mvista.com>
*
* Copyright: (C) 2009 MontaVista Software, Inc., <source@mvista.com>
* Copyright: (C) 2009 Texas Instruments, India
*
* 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 DAVINCI_MCASP_H
#define DAVINCI_MCASP_H
#include <linux/io.h>
#include <mach/asp.h>
#include "davinci-pcm.h"
extern
struct
snd_soc_dai
davinci_mcasp_dai
[];
#define DAVINCI_MCASP_RATES SNDRV_PCM_RATE_8000_96000
#define DAVINCI_MCASP_I2S_DAI 0
#define DAVINCI_MCASP_DIT_DAI 1
enum
{
DAVINCI_AUDIO_WORD_8
=
0
,
DAVINCI_AUDIO_WORD_12
,
DAVINCI_AUDIO_WORD_16
,
DAVINCI_AUDIO_WORD_20
,
DAVINCI_AUDIO_WORD_24
,
DAVINCI_AUDIO_WORD_32
,
DAVINCI_AUDIO_WORD_28
,
/* This is only valid for McASP */
};
struct
davinci_audio_dev
{
void
__iomem
*
base
;
int
sample_rate
;
struct
clk
*
clk
;
struct
davinci_pcm_dma_params
*
dma_params
[
2
];
unsigned
int
codec_fmt
;
/* McASP specific data */
int
tdm_slots
;
u8
op_mode
;
u8
num_serializer
;
u8
*
serial_dir
;
};
#endif
/* DAVINCI_MCASP_H */
sound/soc/davinci/davinci-pcm.h
View file @
3f405b46
...
...
@@ -12,17 +12,19 @@
#ifndef _DAVINCI_PCM_H
#define _DAVINCI_PCM_H
#include <mach/edma.h>
#include <mach/asp.h>
struct
davinci_pcm_dma_params
{
char
*
name
;
/* stream identifier */
int
channel
;
/* sync dma channel ID */
dma_addr_t
dma_addr
;
/* device physical address for DMA */
unsigned
int
data_type
;
/* xfer data type */
char
*
name
;
/* stream identifier */
int
channel
;
/* sync dma channel ID */
dma_addr_t
dma_addr
;
/* device physical address for DMA */
enum
dma_event_q
eventq_no
;
/* event queue number */
unsigned
char
data_type
;
/* xfer data type */
unsigned
char
convert_mono_stereo
;
};
struct
evm_snd_platform_data
{
int
tx_dma_ch
;
int
rx_dma_ch
;
};
extern
struct
snd_soc_platform
davinci_soc_platform
;
...
...
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