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
a5f0ac4a
Commit
a5f0ac4a
authored
Oct 24, 2013
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/tegra' into asoc-next
parents
7524be37
5e049fce
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
186 additions
and
28 deletions
+186
-28
sound/soc/tegra/tegra30_ahub.c
sound/soc/tegra/tegra30_ahub.c
+101
-14
sound/soc/tegra/tegra30_ahub.h
sound/soc/tegra/tegra30_ahub.h
+37
-1
sound/soc/tegra/tegra30_i2s.c
sound/soc/tegra/tegra30_i2s.c
+38
-13
sound/soc/tegra/tegra30_i2s.h
sound/soc/tegra/tegra30_i2s.h
+7
-0
sound/soc/tegra/tegra_asoc_utils.c
sound/soc/tegra/tegra_asoc_utils.c
+2
-0
sound/soc/tegra/tegra_asoc_utils.h
sound/soc/tegra/tegra_asoc_utils.h
+1
-0
No files found.
sound/soc/tegra/tegra30_ahub.c
View file @
a5f0ac4a
...
@@ -100,6 +100,7 @@ int tegra30_ahub_allocate_rx_fifo(enum tegra30_ahub_rxcif *rxcif,
...
@@ -100,6 +100,7 @@ int tegra30_ahub_allocate_rx_fifo(enum tegra30_ahub_rxcif *rxcif,
{
{
int
channel
;
int
channel
;
u32
reg
,
val
;
u32
reg
,
val
;
struct
tegra30_ahub_cif_conf
cif_conf
;
channel
=
find_first_zero_bit
(
ahub
->
rx_usage
,
channel
=
find_first_zero_bit
(
ahub
->
rx_usage
,
TEGRA30_AHUB_CHANNEL_CTRL_COUNT
);
TEGRA30_AHUB_CHANNEL_CTRL_COUNT
);
...
@@ -123,15 +124,21 @@ int tegra30_ahub_allocate_rx_fifo(enum tegra30_ahub_rxcif *rxcif,
...
@@ -123,15 +124,21 @@ int tegra30_ahub_allocate_rx_fifo(enum tegra30_ahub_rxcif *rxcif,
TEGRA30_AHUB_CHANNEL_CTRL_RX_PACK_16
;
TEGRA30_AHUB_CHANNEL_CTRL_RX_PACK_16
;
tegra30_apbif_write
(
reg
,
val
);
tegra30_apbif_write
(
reg
,
val
);
cif_conf
.
threshold
=
0
;
cif_conf
.
audio_channels
=
2
;
cif_conf
.
client_channels
=
2
;
cif_conf
.
audio_bits
=
TEGRA30_AUDIOCIF_BITS_16
;
cif_conf
.
client_bits
=
TEGRA30_AUDIOCIF_BITS_16
;
cif_conf
.
expand
=
0
;
cif_conf
.
stereo_conv
=
0
;
cif_conf
.
replicate
=
0
;
cif_conf
.
direction
=
TEGRA30_AUDIOCIF_DIRECTION_RX
;
cif_conf
.
truncate
=
0
;
cif_conf
.
mono_conv
=
0
;
reg
=
TEGRA30_AHUB_CIF_RX_CTRL
+
reg
=
TEGRA30_AHUB_CIF_RX_CTRL
+
(
channel
*
TEGRA30_AHUB_CIF_RX_CTRL_STRIDE
);
(
channel
*
TEGRA30_AHUB_CIF_RX_CTRL_STRIDE
);
val
=
(
0
<<
TEGRA30_AUDIOCIF_CTRL_FIFO_THRESHOLD_SHIFT
)
|
ahub
->
soc_data
->
set_audio_cif
(
ahub
->
regmap_apbif
,
reg
,
&
cif_conf
);
(
1
<<
TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_SHIFT
)
|
(
1
<<
TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_SHIFT
)
|
TEGRA30_AUDIOCIF_CTRL_AUDIO_BITS_16
|
TEGRA30_AUDIOCIF_CTRL_CLIENT_BITS_16
|
TEGRA30_AUDIOCIF_CTRL_DIRECTION_RX
;
tegra30_apbif_write
(
reg
,
val
);
return
0
;
return
0
;
}
}
...
@@ -183,6 +190,7 @@ int tegra30_ahub_allocate_tx_fifo(enum tegra30_ahub_txcif *txcif,
...
@@ -183,6 +190,7 @@ int tegra30_ahub_allocate_tx_fifo(enum tegra30_ahub_txcif *txcif,
{
{
int
channel
;
int
channel
;
u32
reg
,
val
;
u32
reg
,
val
;
struct
tegra30_ahub_cif_conf
cif_conf
;
channel
=
find_first_zero_bit
(
ahub
->
tx_usage
,
channel
=
find_first_zero_bit
(
ahub
->
tx_usage
,
TEGRA30_AHUB_CHANNEL_CTRL_COUNT
);
TEGRA30_AHUB_CHANNEL_CTRL_COUNT
);
...
@@ -206,15 +214,21 @@ int tegra30_ahub_allocate_tx_fifo(enum tegra30_ahub_txcif *txcif,
...
@@ -206,15 +214,21 @@ int tegra30_ahub_allocate_tx_fifo(enum tegra30_ahub_txcif *txcif,
TEGRA30_AHUB_CHANNEL_CTRL_TX_PACK_16
;
TEGRA30_AHUB_CHANNEL_CTRL_TX_PACK_16
;
tegra30_apbif_write
(
reg
,
val
);
tegra30_apbif_write
(
reg
,
val
);
cif_conf
.
threshold
=
0
;
cif_conf
.
audio_channels
=
2
;
cif_conf
.
client_channels
=
2
;
cif_conf
.
audio_bits
=
TEGRA30_AUDIOCIF_BITS_16
;
cif_conf
.
client_bits
=
TEGRA30_AUDIOCIF_BITS_16
;
cif_conf
.
expand
=
0
;
cif_conf
.
stereo_conv
=
0
;
cif_conf
.
replicate
=
0
;
cif_conf
.
direction
=
TEGRA30_AUDIOCIF_DIRECTION_TX
;
cif_conf
.
truncate
=
0
;
cif_conf
.
mono_conv
=
0
;
reg
=
TEGRA30_AHUB_CIF_TX_CTRL
+
reg
=
TEGRA30_AHUB_CIF_TX_CTRL
+
(
channel
*
TEGRA30_AHUB_CIF_TX_CTRL_STRIDE
);
(
channel
*
TEGRA30_AHUB_CIF_TX_CTRL_STRIDE
);
val
=
(
0
<<
TEGRA30_AUDIOCIF_CTRL_FIFO_THRESHOLD_SHIFT
)
|
ahub
->
soc_data
->
set_audio_cif
(
ahub
->
regmap_apbif
,
reg
,
&
cif_conf
);
(
1
<<
TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_SHIFT
)
|
(
1
<<
TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_SHIFT
)
|
TEGRA30_AUDIOCIF_CTRL_AUDIO_BITS_16
|
TEGRA30_AUDIOCIF_CTRL_CLIENT_BITS_16
|
TEGRA30_AUDIOCIF_CTRL_DIRECTION_TX
;
tegra30_apbif_write
(
reg
,
val
);
return
0
;
return
0
;
}
}
...
@@ -437,13 +451,21 @@ static const struct regmap_config tegra30_ahub_ahub_regmap_config = {
...
@@ -437,13 +451,21 @@ static const struct regmap_config tegra30_ahub_ahub_regmap_config = {
static
struct
tegra30_ahub_soc_data
soc_data_tegra30
=
{
static
struct
tegra30_ahub_soc_data
soc_data_tegra30
=
{
.
clk_list_mask
=
CLK_LIST_MASK_TEGRA30
,
.
clk_list_mask
=
CLK_LIST_MASK_TEGRA30
,
.
set_audio_cif
=
tegra30_ahub_set_cif
,
};
};
static
struct
tegra30_ahub_soc_data
soc_data_tegra114
=
{
static
struct
tegra30_ahub_soc_data
soc_data_tegra114
=
{
.
clk_list_mask
=
CLK_LIST_MASK_TEGRA114
,
.
clk_list_mask
=
CLK_LIST_MASK_TEGRA114
,
.
set_audio_cif
=
tegra30_ahub_set_cif
,
};
static
struct
tegra30_ahub_soc_data
soc_data_tegra124
=
{
.
clk_list_mask
=
CLK_LIST_MASK_TEGRA114
,
.
set_audio_cif
=
tegra124_ahub_set_cif
,
};
};
static
const
struct
of_device_id
tegra30_ahub_of_match
[]
=
{
static
const
struct
of_device_id
tegra30_ahub_of_match
[]
=
{
{
.
compatible
=
"nvidia,tegra124-ahub"
,
.
data
=
&
soc_data_tegra124
},
{
.
compatible
=
"nvidia,tegra114-ahub"
,
.
data
=
&
soc_data_tegra114
},
{
.
compatible
=
"nvidia,tegra114-ahub"
,
.
data
=
&
soc_data_tegra114
},
{
.
compatible
=
"nvidia,tegra30-ahub"
,
.
data
=
&
soc_data_tegra30
},
{
.
compatible
=
"nvidia,tegra30-ahub"
,
.
data
=
&
soc_data_tegra30
},
{},
{},
...
@@ -497,6 +519,7 @@ static int tegra30_ahub_probe(struct platform_device *pdev)
...
@@ -497,6 +519,7 @@ static int tegra30_ahub_probe(struct platform_device *pdev)
}
}
dev_set_drvdata
(
&
pdev
->
dev
,
ahub
);
dev_set_drvdata
(
&
pdev
->
dev
,
ahub
);
ahub
->
soc_data
=
soc_data
;
ahub
->
dev
=
&
pdev
->
dev
;
ahub
->
dev
=
&
pdev
->
dev
;
ahub
->
clk_d_audio
=
clk_get
(
&
pdev
->
dev
,
"d_audio"
);
ahub
->
clk_d_audio
=
clk_get
(
&
pdev
->
dev
,
"d_audio"
);
...
@@ -669,6 +692,70 @@ static struct platform_driver tegra30_ahub_driver = {
...
@@ -669,6 +692,70 @@ static struct platform_driver tegra30_ahub_driver = {
};
};
module_platform_driver
(
tegra30_ahub_driver
);
module_platform_driver
(
tegra30_ahub_driver
);
void
tegra30_ahub_set_cif
(
struct
regmap
*
regmap
,
unsigned
int
reg
,
struct
tegra30_ahub_cif_conf
*
conf
)
{
unsigned
int
value
;
value
=
(
conf
->
threshold
<<
TEGRA30_AUDIOCIF_CTRL_FIFO_THRESHOLD_SHIFT
)
|
((
conf
->
audio_channels
-
1
)
<<
TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_SHIFT
)
|
((
conf
->
client_channels
-
1
)
<<
TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_SHIFT
)
|
(
conf
->
audio_bits
<<
TEGRA30_AUDIOCIF_CTRL_AUDIO_BITS_SHIFT
)
|
(
conf
->
client_bits
<<
TEGRA30_AUDIOCIF_CTRL_CLIENT_BITS_SHIFT
)
|
(
conf
->
expand
<<
TEGRA30_AUDIOCIF_CTRL_EXPAND_SHIFT
)
|
(
conf
->
stereo_conv
<<
TEGRA30_AUDIOCIF_CTRL_STEREO_CONV_SHIFT
)
|
(
conf
->
replicate
<<
TEGRA30_AUDIOCIF_CTRL_REPLICATE_SHIFT
)
|
(
conf
->
direction
<<
TEGRA30_AUDIOCIF_CTRL_DIRECTION_SHIFT
)
|
(
conf
->
truncate
<<
TEGRA30_AUDIOCIF_CTRL_TRUNCATE_SHIFT
)
|
(
conf
->
mono_conv
<<
TEGRA30_AUDIOCIF_CTRL_MONO_CONV_SHIFT
);
regmap_write
(
regmap
,
reg
,
value
);
}
EXPORT_SYMBOL_GPL
(
tegra30_ahub_set_cif
);
void
tegra124_ahub_set_cif
(
struct
regmap
*
regmap
,
unsigned
int
reg
,
struct
tegra30_ahub_cif_conf
*
conf
)
{
unsigned
int
value
;
value
=
(
conf
->
threshold
<<
TEGRA124_AUDIOCIF_CTRL_FIFO_THRESHOLD_SHIFT
)
|
((
conf
->
audio_channels
-
1
)
<<
TEGRA124_AUDIOCIF_CTRL_AUDIO_CHANNELS_SHIFT
)
|
((
conf
->
client_channels
-
1
)
<<
TEGRA124_AUDIOCIF_CTRL_CLIENT_CHANNELS_SHIFT
)
|
(
conf
->
audio_bits
<<
TEGRA30_AUDIOCIF_CTRL_AUDIO_BITS_SHIFT
)
|
(
conf
->
client_bits
<<
TEGRA30_AUDIOCIF_CTRL_CLIENT_BITS_SHIFT
)
|
(
conf
->
expand
<<
TEGRA30_AUDIOCIF_CTRL_EXPAND_SHIFT
)
|
(
conf
->
stereo_conv
<<
TEGRA30_AUDIOCIF_CTRL_STEREO_CONV_SHIFT
)
|
(
conf
->
replicate
<<
TEGRA30_AUDIOCIF_CTRL_REPLICATE_SHIFT
)
|
(
conf
->
direction
<<
TEGRA30_AUDIOCIF_CTRL_DIRECTION_SHIFT
)
|
(
conf
->
truncate
<<
TEGRA30_AUDIOCIF_CTRL_TRUNCATE_SHIFT
)
|
(
conf
->
mono_conv
<<
TEGRA30_AUDIOCIF_CTRL_MONO_CONV_SHIFT
);
regmap_write
(
regmap
,
reg
,
value
);
}
EXPORT_SYMBOL_GPL
(
tegra124_ahub_set_cif
);
MODULE_AUTHOR
(
"Stephen Warren <swarren@nvidia.com>"
);
MODULE_AUTHOR
(
"Stephen Warren <swarren@nvidia.com>"
);
MODULE_DESCRIPTION
(
"Tegra30 AHUB driver"
);
MODULE_DESCRIPTION
(
"Tegra30 AHUB driver"
);
MODULE_LICENSE
(
"GPL v2"
);
MODULE_LICENSE
(
"GPL v2"
);
...
...
sound/soc/tegra/tegra30_ahub.h
View file @
a5f0ac4a
...
@@ -25,16 +25,30 @@
...
@@ -25,16 +25,30 @@
#define TEGRA30_AUDIOCIF_CTRL_FIFO_THRESHOLD_MASK_US 0xf
#define TEGRA30_AUDIOCIF_CTRL_FIFO_THRESHOLD_MASK_US 0xf
#define TEGRA30_AUDIOCIF_CTRL_FIFO_THRESHOLD_MASK (TEGRA30_AUDIOCIF_CTRL_FIFO_THRESHOLD_MASK_US << TEGRA30_AUDIOCIF_CTRL_FIFO_THRESHOLD_SHIFT)
#define TEGRA30_AUDIOCIF_CTRL_FIFO_THRESHOLD_MASK (TEGRA30_AUDIOCIF_CTRL_FIFO_THRESHOLD_MASK_US << TEGRA30_AUDIOCIF_CTRL_FIFO_THRESHOLD_SHIFT)
#define TEGRA124_AUDIOCIF_CTRL_FIFO_THRESHOLD_SHIFT 24
#define TEGRA124_AUDIOCIF_CTRL_FIFO_THRESHOLD_MASK_US 0x3f
#define TEGRA124_AUDIOCIF_CTRL_FIFO_THRESHOLD_MASK (TEGRA124_AUDIOCIF_CTRL_FIFO_THRESHOLD_MASK_US << TEGRA124_AUDIOCIF_CTRL_FIFO_THRESHOLD_SHIFT)
/* Channel count minus 1 */
/* Channel count minus 1 */
#define TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_SHIFT 24
#define TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_SHIFT 24
#define TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_MASK_US 7
#define TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_MASK_US 7
#define TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_MASK (TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_MASK_US << TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_SHIFT)
#define TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_MASK (TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_MASK_US << TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_SHIFT)
/* Channel count minus 1 */
#define TEGRA124_AUDIOCIF_CTRL_AUDIO_CHANNELS_SHIFT 20
#define TEGRA124_AUDIOCIF_CTRL_AUDIO_CHANNELS_MASK_US 0xf
#define TEGRA124_AUDIOCIF_CTRL_AUDIO_CHANNELS_MASK (TEGRA124_AUDIOCIF_CTRL_AUDIO_CHANNELS_MASK_US << TEGRA124_AUDIOCIF_CTRL_AUDIO_CHANNELS_SHIFT)
/* Channel count minus 1 */
/* Channel count minus 1 */
#define TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_SHIFT 16
#define TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_SHIFT 16
#define TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_MASK_US 7
#define TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_MASK_US 7
#define TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_MASK (TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_MASK_US << TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_SHIFT)
#define TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_MASK (TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_MASK_US << TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_SHIFT)
/* Channel count minus 1 */
#define TEGRA124_AUDIOCIF_CTRL_CLIENT_CHANNELS_SHIFT 16
#define TEGRA124_AUDIOCIF_CTRL_CLIENT_CHANNELS_MASK_US 0xf
#define TEGRA124_AUDIOCIF_CTRL_CLIENT_CHANNELS_MASK (TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_MASK_US << TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_SHIFT)
#define TEGRA30_AUDIOCIF_BITS_4 0
#define TEGRA30_AUDIOCIF_BITS_4 0
#define TEGRA30_AUDIOCIF_BITS_8 1
#define TEGRA30_AUDIOCIF_BITS_8 1
#define TEGRA30_AUDIOCIF_BITS_12 2
#define TEGRA30_AUDIOCIF_BITS_12 2
...
@@ -86,7 +100,7 @@
...
@@ -86,7 +100,7 @@
#define TEGRA30_AUDIOCIF_CTRL_STEREO_CONV_CH1 (TEGRA30_AUDIOCIF_STEREO_CONV_CH1 << TEGRA30_AUDIOCIF_CTRL_STEREO_CONV_SHIFT)
#define TEGRA30_AUDIOCIF_CTRL_STEREO_CONV_CH1 (TEGRA30_AUDIOCIF_STEREO_CONV_CH1 << TEGRA30_AUDIOCIF_CTRL_STEREO_CONV_SHIFT)
#define TEGRA30_AUDIOCIF_CTRL_STEREO_CONV_AVG (TEGRA30_AUDIOCIF_STEREO_CONV_AVG << TEGRA30_AUDIOCIF_CTRL_STEREO_CONV_SHIFT)
#define TEGRA30_AUDIOCIF_CTRL_STEREO_CONV_AVG (TEGRA30_AUDIOCIF_STEREO_CONV_AVG << TEGRA30_AUDIOCIF_CTRL_STEREO_CONV_SHIFT)
#define TEGRA30_AUDIOCIF_CTRL_REPLICATE
3
#define TEGRA30_AUDIOCIF_CTRL_REPLICATE
_SHIFT
3
#define TEGRA30_AUDIOCIF_DIRECTION_TX 0
#define TEGRA30_AUDIOCIF_DIRECTION_TX 0
#define TEGRA30_AUDIOCIF_DIRECTION_RX 1
#define TEGRA30_AUDIOCIF_DIRECTION_RX 1
...
@@ -468,8 +482,30 @@ extern int tegra30_ahub_set_rx_cif_source(enum tegra30_ahub_rxcif rxcif,
...
@@ -468,8 +482,30 @@ extern int tegra30_ahub_set_rx_cif_source(enum tegra30_ahub_rxcif rxcif,
enum
tegra30_ahub_txcif
txcif
);
enum
tegra30_ahub_txcif
txcif
);
extern
int
tegra30_ahub_unset_rx_cif_source
(
enum
tegra30_ahub_rxcif
rxcif
);
extern
int
tegra30_ahub_unset_rx_cif_source
(
enum
tegra30_ahub_rxcif
rxcif
);
struct
tegra30_ahub_cif_conf
{
unsigned
int
threshold
;
unsigned
int
audio_channels
;
unsigned
int
client_channels
;
unsigned
int
audio_bits
;
unsigned
int
client_bits
;
unsigned
int
expand
;
unsigned
int
stereo_conv
;
unsigned
int
replicate
;
unsigned
int
direction
;
unsigned
int
truncate
;
unsigned
int
mono_conv
;
};
void
tegra30_ahub_set_cif
(
struct
regmap
*
regmap
,
unsigned
int
reg
,
struct
tegra30_ahub_cif_conf
*
conf
);
void
tegra124_ahub_set_cif
(
struct
regmap
*
regmap
,
unsigned
int
reg
,
struct
tegra30_ahub_cif_conf
*
conf
);
struct
tegra30_ahub_soc_data
{
struct
tegra30_ahub_soc_data
{
u32
clk_list_mask
;
u32
clk_list_mask
;
void
(
*
set_audio_cif
)(
struct
regmap
*
regmap
,
unsigned
int
reg
,
struct
tegra30_ahub_cif_conf
*
conf
);
/*
/*
* FIXME: There are many more differences in HW, such as:
* FIXME: There are many more differences in HW, such as:
* - More APBIF channels.
* - More APBIF channels.
...
...
sound/soc/tegra/tegra30_i2s.c
View file @
a5f0ac4a
...
@@ -30,6 +30,7 @@
...
@@ -30,6 +30,7 @@
#include <linux/io.h>
#include <linux/io.h>
#include <linux/module.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/pm_runtime.h>
#include <linux/regmap.h>
#include <linux/regmap.h>
...
@@ -179,6 +180,7 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream,
...
@@ -179,6 +180,7 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream,
struct
tegra30_i2s
*
i2s
=
snd_soc_dai_get_drvdata
(
dai
);
struct
tegra30_i2s
*
i2s
=
snd_soc_dai_get_drvdata
(
dai
);
unsigned
int
mask
,
val
,
reg
;
unsigned
int
mask
,
val
,
reg
;
int
ret
,
sample_size
,
srate
,
i2sclock
,
bitcnt
;
int
ret
,
sample_size
,
srate
,
i2sclock
,
bitcnt
;
struct
tegra30_ahub_cif_conf
cif_conf
;
if
(
params_channels
(
params
)
!=
2
)
if
(
params_channels
(
params
)
!=
2
)
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -217,21 +219,26 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream,
...
@@ -217,21 +219,26 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream,
regmap_write
(
i2s
->
regmap
,
TEGRA30_I2S_TIMING
,
val
);
regmap_write
(
i2s
->
regmap
,
TEGRA30_I2S_TIMING
,
val
);
val
=
(
0
<<
TEGRA30_AUDIOCIF_CTRL_FIFO_THRESHOLD_SHIFT
)
|
cif_conf
.
threshold
=
0
;
(
1
<<
TEGRA30_AUDIOCIF_CTRL_AUDIO_CHANNELS_SHIFT
)
|
cif_conf
.
audio_channels
=
2
;
(
1
<<
TEGRA30_AUDIOCIF_CTRL_CLIENT_CHANNELS_SHIFT
)
|
cif_conf
.
client_channels
=
2
;
TEGRA30_AUDIOCIF_CTRL_AUDIO_BITS_16
|
cif_conf
.
audio_bits
=
TEGRA30_AUDIOCIF_BITS_16
;
TEGRA30_AUDIOCIF_CTRL_CLIENT_BITS_16
;
cif_conf
.
client_bits
=
TEGRA30_AUDIOCIF_BITS_16
;
cif_conf
.
expand
=
0
;
cif_conf
.
stereo_conv
=
0
;
cif_conf
.
replicate
=
0
;
cif_conf
.
truncate
=
0
;
cif_conf
.
mono_conv
=
0
;
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
val
|=
TEGRA30_AUDIOCIF_CTRL
_DIRECTION_RX
;
cif_conf
.
direction
=
TEGRA30_AUDIOCIF
_DIRECTION_RX
;
reg
=
TEGRA30_I2S_CIF_RX_CTRL
;
reg
=
TEGRA30_I2S_CIF_RX_CTRL
;
}
else
{
}
else
{
val
|=
TEGRA30_AUDIOCIF_CTRL
_DIRECTION_TX
;
cif_conf
.
direction
=
TEGRA30_AUDIOCIF
_DIRECTION_TX
;
reg
=
TEGRA30_I2S_CIF_TX_CTRL
;
reg
=
TEGRA30_I2S_CIF_TX_CTRL
;
}
}
regmap_write
(
i2s
->
regmap
,
reg
,
val
);
i2s
->
soc_data
->
set_audio_cif
(
i2s
->
regmap
,
reg
,
&
cif_conf
);
val
=
(
1
<<
TEGRA30_I2S_OFFSET_RX_DATA_OFFSET_SHIFT
)
|
val
=
(
1
<<
TEGRA30_I2S_OFFSET_RX_DATA_OFFSET_SHIFT
)
|
(
1
<<
TEGRA30_I2S_OFFSET_TX_DATA_OFFSET_SHIFT
);
(
1
<<
TEGRA30_I2S_OFFSET_TX_DATA_OFFSET_SHIFT
);
...
@@ -396,9 +403,24 @@ static const struct regmap_config tegra30_i2s_regmap_config = {
...
@@ -396,9 +403,24 @@ static const struct regmap_config tegra30_i2s_regmap_config = {
.
cache_type
=
REGCACHE_RBTREE
,
.
cache_type
=
REGCACHE_RBTREE
,
};
};
static
const
struct
tegra30_i2s_soc_data
tegra30_i2s_config
=
{
.
set_audio_cif
=
tegra30_ahub_set_cif
,
};
static
const
struct
tegra30_i2s_soc_data
tegra124_i2s_config
=
{
.
set_audio_cif
=
tegra124_ahub_set_cif
,
};
static
const
struct
of_device_id
tegra30_i2s_of_match
[]
=
{
{
.
compatible
=
"nvidia,tegra124-i2s"
,
.
data
=
&
tegra124_i2s_config
},
{
.
compatible
=
"nvidia,tegra30-i2s"
,
.
data
=
&
tegra30_i2s_config
},
{},
};
static
int
tegra30_i2s_platform_probe
(
struct
platform_device
*
pdev
)
static
int
tegra30_i2s_platform_probe
(
struct
platform_device
*
pdev
)
{
{
struct
tegra30_i2s
*
i2s
;
struct
tegra30_i2s
*
i2s
;
const
struct
of_device_id
*
match
;
u32
cif_ids
[
2
];
u32
cif_ids
[
2
];
struct
resource
*
mem
,
*
memregion
;
struct
resource
*
mem
,
*
memregion
;
void
__iomem
*
regs
;
void
__iomem
*
regs
;
...
@@ -412,6 +434,14 @@ static int tegra30_i2s_platform_probe(struct platform_device *pdev)
...
@@ -412,6 +434,14 @@ static int tegra30_i2s_platform_probe(struct platform_device *pdev)
}
}
dev_set_drvdata
(
&
pdev
->
dev
,
i2s
);
dev_set_drvdata
(
&
pdev
->
dev
,
i2s
);
match
=
of_match_device
(
tegra30_i2s_of_match
,
&
pdev
->
dev
);
if
(
!
match
)
{
dev_err
(
&
pdev
->
dev
,
"Error: No device match found
\n
"
);
ret
=
-
ENODEV
;
goto
err
;
}
i2s
->
soc_data
=
(
struct
tegra30_i2s_soc_data
*
)
match
->
data
;
i2s
->
dai
=
tegra30_i2s_dai_template
;
i2s
->
dai
=
tegra30_i2s_dai_template
;
i2s
->
dai
.
name
=
dev_name
(
&
pdev
->
dev
);
i2s
->
dai
.
name
=
dev_name
(
&
pdev
->
dev
);
...
@@ -539,11 +569,6 @@ static int tegra30_i2s_resume(struct device *dev)
...
@@ -539,11 +569,6 @@ static int tegra30_i2s_resume(struct device *dev)
}
}
#endif
#endif
static
const
struct
of_device_id
tegra30_i2s_of_match
[]
=
{
{
.
compatible
=
"nvidia,tegra30-i2s"
,
},
{},
};
static
const
struct
dev_pm_ops
tegra30_i2s_pm_ops
=
{
static
const
struct
dev_pm_ops
tegra30_i2s_pm_ops
=
{
SET_RUNTIME_PM_OPS
(
tegra30_i2s_runtime_suspend
,
SET_RUNTIME_PM_OPS
(
tegra30_i2s_runtime_suspend
,
tegra30_i2s_runtime_resume
,
NULL
)
tegra30_i2s_runtime_resume
,
NULL
)
...
...
sound/soc/tegra/tegra30_i2s.h
View file @
a5f0ac4a
...
@@ -225,7 +225,14 @@
...
@@ -225,7 +225,14 @@
#define TEGRA30_I2S_LCOEF_COEF_MASK_US 0xffff
#define TEGRA30_I2S_LCOEF_COEF_MASK_US 0xffff
#define TEGRA30_I2S_LCOEF_COEF_MASK (TEGRA30_I2S_LCOEF_COEF_MASK_US << TEGRA30_I2S_LCOEF_COEF_SHIFT)
#define TEGRA30_I2S_LCOEF_COEF_MASK (TEGRA30_I2S_LCOEF_COEF_MASK_US << TEGRA30_I2S_LCOEF_COEF_SHIFT)
struct
tegra30_i2s_soc_data
{
void
(
*
set_audio_cif
)(
struct
regmap
*
regmap
,
unsigned
int
reg
,
struct
tegra30_ahub_cif_conf
*
conf
);
};
struct
tegra30_i2s
{
struct
tegra30_i2s
{
const
struct
tegra30_i2s_soc_data
*
soc_data
;
struct
snd_soc_dai_driver
dai
;
struct
snd_soc_dai_driver
dai
;
int
cif_id
;
int
cif_id
;
struct
clk
*
clk_i2s
;
struct
clk
*
clk_i2s
;
...
...
sound/soc/tegra/tegra_asoc_utils.c
View file @
a5f0ac4a
...
@@ -182,6 +182,8 @@ int tegra_asoc_utils_init(struct tegra_asoc_utils_data *data,
...
@@ -182,6 +182,8 @@ int tegra_asoc_utils_init(struct tegra_asoc_utils_data *data,
data
->
soc
=
TEGRA_ASOC_UTILS_SOC_TEGRA30
;
data
->
soc
=
TEGRA_ASOC_UTILS_SOC_TEGRA30
;
else
if
(
of_machine_is_compatible
(
"nvidia,tegra114"
))
else
if
(
of_machine_is_compatible
(
"nvidia,tegra114"
))
data
->
soc
=
TEGRA_ASOC_UTILS_SOC_TEGRA114
;
data
->
soc
=
TEGRA_ASOC_UTILS_SOC_TEGRA114
;
else
if
(
of_machine_is_compatible
(
"nvidia,tegra124"
))
data
->
soc
=
TEGRA_ASOC_UTILS_SOC_TEGRA124
;
else
{
else
{
dev_err
(
data
->
dev
,
"SoC unknown to Tegra ASoC utils
\n
"
);
dev_err
(
data
->
dev
,
"SoC unknown to Tegra ASoC utils
\n
"
);
return
-
EINVAL
;
return
-
EINVAL
;
...
...
sound/soc/tegra/tegra_asoc_utils.h
View file @
a5f0ac4a
...
@@ -30,6 +30,7 @@ enum tegra_asoc_utils_soc {
...
@@ -30,6 +30,7 @@ enum tegra_asoc_utils_soc {
TEGRA_ASOC_UTILS_SOC_TEGRA20
,
TEGRA_ASOC_UTILS_SOC_TEGRA20
,
TEGRA_ASOC_UTILS_SOC_TEGRA30
,
TEGRA_ASOC_UTILS_SOC_TEGRA30
,
TEGRA_ASOC_UTILS_SOC_TEGRA114
,
TEGRA_ASOC_UTILS_SOC_TEGRA114
,
TEGRA_ASOC_UTILS_SOC_TEGRA124
,
};
};
struct
tegra_asoc_utils_data
{
struct
tegra_asoc_utils_data
{
...
...
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