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
8a8b0e87
Commit
8a8b0e87
authored
Aug 22, 2013
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/pcm3008' into asoc-next
parents
9e4fbee9
4fc932c6
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
72 additions
and
78 deletions
+72
-78
sound/soc/codecs/pcm3008.c
sound/soc/codecs/pcm3008.c
+72
-78
No files found.
sound/soc/codecs/pcm3008.c
View file @
8a8b0e87
...
...
@@ -28,7 +28,54 @@
#include "pcm3008.h"
#define PCM3008_VERSION "0.2"
static
int
pcm3008_dac_ev
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
snd_soc_codec
*
codec
=
w
->
codec
;
struct
pcm3008_setup_data
*
setup
=
codec
->
dev
->
platform_data
;
gpio_set_value_cansleep
(
setup
->
pdda_pin
,
SND_SOC_DAPM_EVENT_ON
(
event
));
return
0
;
}
static
int
pcm3008_adc_ev
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
snd_soc_codec
*
codec
=
w
->
codec
;
struct
pcm3008_setup_data
*
setup
=
codec
->
dev
->
platform_data
;
gpio_set_value_cansleep
(
setup
->
pdad_pin
,
SND_SOC_DAPM_EVENT_ON
(
event
));
return
0
;
}
static
const
struct
snd_soc_dapm_widget
pcm3008_dapm_widgets
[]
=
{
SND_SOC_DAPM_INPUT
(
"VINL"
),
SND_SOC_DAPM_INPUT
(
"VINR"
),
SND_SOC_DAPM_DAC_E
(
"DAC"
,
NULL
,
SND_SOC_NOPM
,
0
,
0
,
pcm3008_dac_ev
,
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMD
),
SND_SOC_DAPM_ADC_E
(
"ADC"
,
NULL
,
SND_SOC_NOPM
,
0
,
0
,
pcm3008_adc_ev
,
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMD
),
SND_SOC_DAPM_OUTPUT
(
"VOUTL"
),
SND_SOC_DAPM_OUTPUT
(
"VOUTR"
),
};
static
const
struct
snd_soc_dapm_route
pcm3008_dapm_routes
[]
=
{
{
"PCM3008 Capture"
,
NULL
,
"ADC"
},
{
"ADC"
,
NULL
,
"VINL"
},
{
"ADC"
,
NULL
,
"VINR"
},
{
"DAC"
,
NULL
,
"PCM3008 Playback"
},
{
"VOUTL"
,
NULL
,
"DAC"
},
{
"VOUTR"
,
NULL
,
"DAC"
},
};
#define PCM3008_RATES (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
SNDRV_PCM_RATE_48000)
...
...
@@ -51,20 +98,20 @@ static struct snd_soc_dai_driver pcm3008_dai = {
},
};
static
void
pcm3008_gpio_free
(
struct
pcm3008_setup_data
*
setup
)
{
gpio_free
(
setup
->
dem0_pin
);
gpio_free
(
setup
->
dem1_pin
);
gpio_free
(
setup
->
pdad_pin
);
gpio_free
(
setup
->
pdda_pin
);
}
static
struct
snd_soc_codec_driver
soc_codec_dev_pcm3008
=
{
.
dapm_widgets
=
pcm3008_dapm_widgets
,
.
num_dapm_widgets
=
ARRAY_SIZE
(
pcm3008_dapm_widgets
),
.
dapm_routes
=
pcm3008_dapm_routes
,
.
num_dapm_routes
=
ARRAY_SIZE
(
pcm3008_dapm_routes
),
};
static
int
pcm3008_
soc_probe
(
struct
snd_soc_codec
*
codec
)
static
int
pcm3008_
codec_probe
(
struct
platform_device
*
pdev
)
{
struct
pcm3008_setup_data
*
setup
=
codec
->
dev
->
platform_data
;
int
ret
=
0
;
struct
pcm3008_setup_data
*
setup
=
pdev
->
dev
.
platform_data
;
int
ret
;
printk
(
KERN_INFO
"PCM3008 SoC Audio Codec %s
\n
"
,
PCM3008_VERSION
);
if
(
!
setup
)
return
-
EINVAL
;
/* DEM1 DEM0 DE-EMPHASIS_MODE
* Low Low De-emphasis 44.1 kHz ON
...
...
@@ -74,83 +121,29 @@ static int pcm3008_soc_probe(struct snd_soc_codec *codec)
*/
/* Configure DEM0 GPIO (turning OFF DAC De-emphasis). */
ret
=
gpio_request
(
setup
->
dem0_pin
,
"codec_dem0"
);
if
(
ret
==
0
)
ret
=
gpio_direction_output
(
setup
->
dem0_pin
,
1
);
ret
=
devm_gpio_request_one
(
&
pdev
->
dev
,
setup
->
dem0_pin
,
GPIOF_OUT_INIT_HIGH
,
"codec_dem0"
);
if
(
ret
!=
0
)
goto
gpio_err
;
return
ret
;
/* Configure DEM1 GPIO (turning OFF DAC De-emphasis). */
ret
=
gpio_request
(
setup
->
dem1_pin
,
"codec_dem1"
);
if
(
ret
==
0
)
ret
=
gpio_direction_output
(
setup
->
dem1_pin
,
0
);
ret
=
devm_gpio_request_one
(
&
pdev
->
dev
,
setup
->
dem1_pin
,
GPIOF_OUT_INIT_LOW
,
"codec_dem1"
);
if
(
ret
!=
0
)
goto
gpio_err
;
return
ret
;
/* Configure PDAD GPIO. */
ret
=
gpio_request
(
setup
->
pdad_pin
,
"codec_pdad"
);
if
(
ret
==
0
)
ret
=
gpio_direction_output
(
setup
->
pdad_pin
,
1
);
ret
=
devm_gpio_request_one
(
&
pdev
->
dev
,
setup
->
pdad_pin
,
GPIOF_OUT_INIT_LOW
,
"codec_pdad"
);
if
(
ret
!=
0
)
goto
gpio_err
;
return
ret
;
/* Configure PDDA GPIO. */
ret
=
gpio_request
(
setup
->
pdda_pin
,
"codec_pdda"
);
if
(
ret
==
0
)
ret
=
gpio_direction_output
(
setup
->
pdda_pin
,
1
);
ret
=
devm_gpio_request_one
(
&
pdev
->
dev
,
setup
->
pdda_pin
,
GPIOF_OUT_INIT_LOW
,
"codec_pdda"
);
if
(
ret
!=
0
)
goto
gpio_err
;
return
ret
;
gpio_err:
pcm3008_gpio_free
(
setup
);
return
ret
;
return
ret
;
}
static
int
pcm3008_soc_remove
(
struct
snd_soc_codec
*
codec
)
{
struct
pcm3008_setup_data
*
setup
=
codec
->
dev
->
platform_data
;
pcm3008_gpio_free
(
setup
);
return
0
;
}
#ifdef CONFIG_PM
static
int
pcm3008_soc_suspend
(
struct
snd_soc_codec
*
codec
)
{
struct
pcm3008_setup_data
*
setup
=
codec
->
dev
->
platform_data
;
gpio_set_value
(
setup
->
pdad_pin
,
0
);
gpio_set_value
(
setup
->
pdda_pin
,
0
);
return
0
;
}
static
int
pcm3008_soc_resume
(
struct
snd_soc_codec
*
codec
)
{
struct
pcm3008_setup_data
*
setup
=
codec
->
dev
->
platform_data
;
gpio_set_value
(
setup
->
pdad_pin
,
1
);
gpio_set_value
(
setup
->
pdda_pin
,
1
);
return
0
;
}
#else
#define pcm3008_soc_suspend NULL
#define pcm3008_soc_resume NULL
#endif
static
struct
snd_soc_codec_driver
soc_codec_dev_pcm3008
=
{
.
probe
=
pcm3008_soc_probe
,
.
remove
=
pcm3008_soc_remove
,
.
suspend
=
pcm3008_soc_suspend
,
.
resume
=
pcm3008_soc_resume
,
};
static
int
pcm3008_codec_probe
(
struct
platform_device
*
pdev
)
{
return
snd_soc_register_codec
(
&
pdev
->
dev
,
&
soc_codec_dev_pcm3008
,
&
pcm3008_dai
,
1
);
}
...
...
@@ -158,6 +151,7 @@ static int pcm3008_codec_probe(struct platform_device *pdev)
static
int
pcm3008_codec_remove
(
struct
platform_device
*
pdev
)
{
snd_soc_unregister_codec
(
&
pdev
->
dev
);
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