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
da88b48b
Commit
da88b48b
authored
Mar 17, 2009
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'pxa-ssp' into for-2.6.30
parents
d2314e0e
85fab780
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
68 additions
and
42 deletions
+68
-42
sound/soc/pxa/pxa-ssp.c
sound/soc/pxa/pxa-ssp.c
+43
-12
sound/soc/pxa/zylonite.c
sound/soc/pxa/zylonite.c
+25
-30
No files found.
sound/soc/pxa/pxa-ssp.c
View file @
da88b48b
#define DEBUG
/*
/*
* pxa-ssp.c -- ALSA Soc Audio Layer
* pxa-ssp.c -- ALSA Soc Audio Layer
*
*
...
@@ -558,18 +557,18 @@ static int pxa_ssp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
...
@@ -558,18 +557,18 @@ static int pxa_ssp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
switch
(
fmt
&
SND_SOC_DAIFMT_FORMAT_MASK
)
{
switch
(
fmt
&
SND_SOC_DAIFMT_FORMAT_MASK
)
{
case
SND_SOC_DAIFMT_I2S
:
case
SND_SOC_DAIFMT_I2S
:
sscr0
|=
SSCR0_
MOD
|
SSCR0_
PSP
;
sscr0
|=
SSCR0_PSP
;
sscr1
|=
SSCR1_RWOT
|
SSCR1_TRAIL
;
sscr1
|=
SSCR1_RWOT
|
SSCR1_TRAIL
;
/* See hw_params() */
switch
(
fmt
&
SND_SOC_DAIFMT_INV_MASK
)
{
switch
(
fmt
&
SND_SOC_DAIFMT_INV_MASK
)
{
case
SND_SOC_DAIFMT_NB_NF
:
case
SND_SOC_DAIFMT_NB_NF
:
sspsp
|=
SSPSP_
FSRT
;
sspsp
|=
SSPSP_
SFRMP
;
break
;
break
;
case
SND_SOC_DAIFMT_NB_IF
:
case
SND_SOC_DAIFMT_NB_IF
:
sspsp
|=
SSPSP_SFRMP
|
SSPSP_FSRT
;
break
;
break
;
case
SND_SOC_DAIFMT_IB_IF
:
case
SND_SOC_DAIFMT_IB_IF
:
sspsp
|=
SSPSP_S
FRMP
;
sspsp
|=
SSPSP_S
CMODE
(
3
)
;
break
;
break
;
default:
default:
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -655,33 +654,65 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,
...
@@ -655,33 +654,65 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,
sscr0
|=
SSCR0_FPCKE
;
sscr0
|=
SSCR0_FPCKE
;
#endif
#endif
sscr0
|=
SSCR0_DataSize
(
16
);
sscr0
|=
SSCR0_DataSize
(
16
);
/* use network mode (2 slots) for 16 bit stereo */
break
;
break
;
case
SNDRV_PCM_FORMAT_S24_LE
:
case
SNDRV_PCM_FORMAT_S24_LE
:
sscr0
|=
(
SSCR0_EDSS
|
SSCR0_DataSize
(
8
));
sscr0
|=
(
SSCR0_EDSS
|
SSCR0_DataSize
(
8
));
/* we must be in network mode (2 slots) for 24 bit stereo */
break
;
break
;
case
SNDRV_PCM_FORMAT_S32_LE
:
case
SNDRV_PCM_FORMAT_S32_LE
:
sscr0
|=
(
SSCR0_EDSS
|
SSCR0_DataSize
(
16
));
sscr0
|=
(
SSCR0_EDSS
|
SSCR0_DataSize
(
16
));
/* we must be in network mode (2 slots) for 32 bit stereo */
break
;
break
;
}
}
ssp_write_reg
(
ssp
,
SSCR0
,
sscr0
);
ssp_write_reg
(
ssp
,
SSCR0
,
sscr0
);
switch
(
priv
->
dai_fmt
&
SND_SOC_DAIFMT_FORMAT_MASK
)
{
switch
(
priv
->
dai_fmt
&
SND_SOC_DAIFMT_FORMAT_MASK
)
{
case
SND_SOC_DAIFMT_I2S
:
case
SND_SOC_DAIFMT_I2S
:
/* Cleared when the DAI format is set */
sspsp
=
ssp_read_reg
(
ssp
,
SSPSP
);
sspsp
=
ssp_read_reg
(
ssp
,
SSPSP
)
|
SSPSP_SFRMWDTH
(
width
);
if
(((
sscr0
&
SSCR0_SCR
)
==
SSCR0_SerClkDiv
(
4
))
&&
(
width
==
16
))
{
/* This is a special case where the bitclk is 64fs
* and we're not dealing with 2*32 bits of audio
* samples.
*
* The SSP values used for that are all found out by
* trying and failing a lot; some of the registers
* needed for that mode are only available on PXA3xx.
*/
#ifdef CONFIG_PXA3xx
if
(
!
cpu_is_pxa3xx
())
return
-
EINVAL
;
sspsp
|=
SSPSP_SFRMWDTH
(
width
*
2
);
sspsp
|=
SSPSP_SFRMDLY
(
width
*
4
);
sspsp
|=
SSPSP_EDMYSTOP
(
3
);
sspsp
|=
SSPSP_DMYSTOP
(
3
);
sspsp
|=
SSPSP_DMYSTRT
(
1
);
#else
return
-
EINVAL
;
#endif
}
else
{
/* The frame width is the width the LRCLK is
* asserted for; the delay is expressed in
* half cycle units. We need the extra cycle
* because the data starts clocking out one BCLK
* after LRCLK changes polarity.
*/
sspsp
|=
SSPSP_SFRMWDTH
(
width
+
1
);
sspsp
|=
SSPSP_SFRMDLY
((
width
+
1
)
*
2
);
sspsp
|=
SSPSP_DMYSTRT
(
1
);
}
ssp_write_reg
(
ssp
,
SSPSP
,
sspsp
);
ssp_write_reg
(
ssp
,
SSPSP
,
sspsp
);
break
;
break
;
default:
default:
break
;
break
;
}
}
/* W
e always use a network mode so
we always require TDM slots
/* W
hen we use a network mode,
we always require TDM slots
* - complain loudly and fail if they've not been set up yet.
* - complain loudly and fail if they've not been set up yet.
*/
*/
if
(
!
(
ssp_read_reg
(
ssp
,
SSTSA
)
&
0xf
))
{
if
(
(
sscr0
&
SSCR0_MOD
)
&&
!
(
ssp_read_reg
(
ssp
,
SSTSA
)
&
0xf
))
{
dev_err
(
&
ssp
->
pdev
->
dev
,
"No TDM timeslot configured
\n
"
);
dev_err
(
&
ssp
->
pdev
->
dev
,
"No TDM timeslot configured
\n
"
);
return
-
EINVAL
;
return
-
EINVAL
;
}
}
...
...
sound/soc/pxa/zylonite.c
View file @
da88b48b
...
@@ -96,42 +96,35 @@ static int zylonite_voice_hw_params(struct snd_pcm_substream *substream,
...
@@ -96,42 +96,35 @@ static int zylonite_voice_hw_params(struct snd_pcm_substream *substream,
struct
snd_soc_dai
*
codec_dai
=
rtd
->
dai
->
codec_dai
;
struct
snd_soc_dai
*
codec_dai
=
rtd
->
dai
->
codec_dai
;
struct
snd_soc_dai
*
cpu_dai
=
rtd
->
dai
->
cpu_dai
;
struct
snd_soc_dai
*
cpu_dai
=
rtd
->
dai
->
cpu_dai
;
unsigned
int
pll_out
=
0
;
unsigned
int
pll_out
=
0
;
unsigned
int
acds
=
0
;
unsigned
int
wm9713_div
=
0
;
unsigned
int
wm9713_div
=
0
;
int
ret
=
0
;
int
ret
=
0
;
int
rate
=
params_rate
(
params
);
int
width
=
snd_pcm_format_physical_width
(
params_format
(
params
));
switch
(
params_rate
(
params
))
{
/* Only support ratios that we can generate neatly from the AC97
* based master clock - in particular, this excludes 44.1kHz.
* In most applications the voice DAC will be used for telephony
* data so multiples of 8kHz will be the common case.
*/
switch
(
rate
)
{
case
8000
:
case
8000
:
wm9713_div
=
12
;
wm9713_div
=
12
;
pll_out
=
2048000
;
break
;
break
;
case
16000
:
case
16000
:
wm9713_div
=
6
;
wm9713_div
=
6
;
pll_out
=
4096000
;
break
;
break
;
case
48000
:
case
48000
:
default:
wm9713_div
=
2
;
wm9713_div
=
2
;
pll_out
=
12288000
;
acds
=
1
;
break
;
break
;
default:
/* Don't support OSS emulation */
return
-
EINVAL
;
}
}
ret
=
snd_soc_dai_set_fmt
(
codec_dai
,
SND_SOC_DAIFMT_I2S
|
/* Add 1 to the width for the leading clock cycle */
SND_SOC_DAIFMT_NB_NF
|
SND_SOC_DAIFMT_CBS_CFS
);
pll_out
=
rate
*
(
width
+
1
)
*
8
;
if
(
ret
<
0
)
return
ret
;
ret
=
snd_soc_dai_set_fmt
(
cpu_dai
,
SND_SOC_DAIFMT_I2S
|
SND_SOC_DAIFMT_NB_NF
|
SND_SOC_DAIFMT_CBS_CFS
);
if
(
ret
<
0
)
return
ret
;
/* Use network mode for stereo, one slot per channel. */
ret
=
snd_soc_dai_set_sysclk
(
cpu_dai
,
PXA_SSP_CLK_AUDIO
,
0
,
1
);
if
(
params_channels
(
params
)
>
1
)
ret
=
snd_soc_dai_set_tdm_slot
(
cpu_dai
,
0x3
,
2
);
else
ret
=
snd_soc_dai_set_tdm_slot
(
cpu_dai
,
1
,
1
);
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
return
ret
;
...
@@ -139,14 +132,6 @@ static int zylonite_voice_hw_params(struct snd_pcm_substream *substream,
...
@@ -139,14 +132,6 @@ static int zylonite_voice_hw_params(struct snd_pcm_substream *substream,
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
return
ret
;
ret
=
snd_soc_dai_set_clkdiv
(
cpu_dai
,
PXA_SSP_AUDIO_DIV_ACDS
,
acds
);
if
(
ret
<
0
)
return
ret
;
ret
=
snd_soc_dai_set_sysclk
(
cpu_dai
,
PXA_SSP_CLK_AUDIO
,
0
,
1
);
if
(
ret
<
0
)
return
ret
;
if
(
clk_pout
)
if
(
clk_pout
)
ret
=
snd_soc_dai_set_clkdiv
(
codec_dai
,
WM9713_PCMCLK_PLL_DIV
,
ret
=
snd_soc_dai_set_clkdiv
(
codec_dai
,
WM9713_PCMCLK_PLL_DIV
,
WM9713_PCMDIV
(
wm9713_div
));
WM9713_PCMDIV
(
wm9713_div
));
...
@@ -156,6 +141,16 @@ static int zylonite_voice_hw_params(struct snd_pcm_substream *substream,
...
@@ -156,6 +141,16 @@ static int zylonite_voice_hw_params(struct snd_pcm_substream *substream,
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
return
ret
;
ret
=
snd_soc_dai_set_fmt
(
codec_dai
,
SND_SOC_DAIFMT_I2S
|
SND_SOC_DAIFMT_NB_NF
|
SND_SOC_DAIFMT_CBS_CFS
);
if
(
ret
<
0
)
return
ret
;
ret
=
snd_soc_dai_set_fmt
(
cpu_dai
,
SND_SOC_DAIFMT_I2S
|
SND_SOC_DAIFMT_NB_NF
|
SND_SOC_DAIFMT_CBS_CFS
);
if
(
ret
<
0
)
return
ret
;
return
0
;
return
0
;
}
}
...
...
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