Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
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 @@ static int davinci_i2s_probe(struct platform_device *pdev,
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