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
40c20fa0
Commit
40c20fa0
authored
Jul 06, 2009
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ALSA: hda - Add CS420x-specific coef setup
Signed-off-by:
Takashi Iwai
<
tiwai@suse.de
>
parent
ea35929b
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
110 additions
and
0 deletions
+110
-0
sound/pci/hda/patch_cirrus.c
sound/pci/hda/patch_cirrus.c
+110
-0
No files found.
sound/pci/hda/patch_cirrus.c
View file @
40c20fa0
...
...
@@ -58,6 +58,64 @@ struct cs_spec {
unsigned
int
mic_detect
:
1
;
};
/* Vendor-specific processing widget */
#define CS420X_VENDOR_NID 0x11
#define CS_DIG_OUT1_PIN_NID 0x10
#define CS_DIG_OUT2_PIN_NID 0x15
#define CS_DMIC1_PIN_NID 0x12
#define CS_DMIC2_PIN_NID 0x0e
/* coef indices */
#define IDX_SPDIF_STAT 0x0000
#define IDX_SPDIF_CTL 0x0001
#define IDX_ADC_CFG 0x0002
/* SZC bitmask, 4 modes below:
* 0 = immediate,
* 1 = digital immediate, analog zero-cross
* 2 = digtail & analog soft-ramp
* 3 = digital soft-ramp, analog zero-cross
*/
#define CS_COEF_ADC_SZC_MASK (3 << 0)
#define CS_COEF_ADC_MIC_SZC_MODE (3 << 0)
/* SZC setup for mic */
#define CS_COEF_ADC_LI_SZC_MODE (3 << 0)
/* SZC setup for line-in */
/* PGA mode: 0 = differential, 1 = signle-ended */
#define CS_COEF_ADC_MIC_PGA_MODE (1 << 5)
/* PGA setup for mic */
#define CS_COEF_ADC_LI_PGA_MODE (1 << 6)
/* PGA setup for line-in */
#define IDX_DAC_CFG 0x0003
/* SZC bitmask, 4 modes below:
* 0 = Immediate
* 1 = zero-cross
* 2 = soft-ramp
* 3 = soft-ramp on zero-cross
*/
#define CS_COEF_DAC_HP_SZC_MODE (3 << 0)
/* nid 0x02 */
#define CS_COEF_DAC_LO_SZC_MODE (3 << 2)
/* nid 0x03 */
#define CS_COEF_DAC_SPK_SZC_MODE (3 << 4)
/* nid 0x04 */
#define IDX_BEEP_CFG 0x0004
/* 0x0008 - test reg key */
/* 0x0009 - 0x0014 -> 12 test regs */
/* 0x0015 - visibility reg */
static
int
cs_vendor_coef_get
(
struct
hda_codec
*
codec
,
unsigned
int
idx
)
{
snd_hda_codec_write
(
codec
,
CS420X_VENDOR_NID
,
0
,
AC_VERB_SET_COEF_INDEX
,
idx
);
return
snd_hda_codec_read
(
codec
,
CS420X_VENDOR_NID
,
0
,
AC_VERB_GET_PROC_COEF
,
0
);
}
static
void
cs_vendor_coef_set
(
struct
hda_codec
*
codec
,
unsigned
int
idx
,
unsigned
int
coef
)
{
snd_hda_codec_write
(
codec
,
CS420X_VENDOR_NID
,
0
,
AC_VERB_SET_COEF_INDEX
,
idx
);
snd_hda_codec_write
(
codec
,
CS420X_VENDOR_NID
,
0
,
AC_VERB_SET_PROC_COEF
,
coef
);
}
#define HP_EVENT 1
#define MIC_EVENT 2
...
...
@@ -295,6 +353,14 @@ static hda_nid_t get_adc(struct hda_codec *codec, hda_nid_t pin,
return
0
;
}
static
int
is_active_pin
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
{
struct
cs_spec
*
spec
=
codec
->
spec
;
unsigned
int
val
;
val
=
snd_hda_codec_get_pincfg
(
codec
,
nid
);
return
(
get_defcfg_connect
(
val
)
!=
AC_JACK_PORT_NONE
);
}
static
int
parse_output
(
struct
hda_codec
*
codec
)
{
struct
cs_spec
*
spec
=
codec
->
spec
;
...
...
@@ -833,6 +899,7 @@ static void init_input(struct hda_codec *codec)
{
struct
cs_spec
*
spec
=
codec
->
spec
;
struct
auto_pin_cfg
*
cfg
=
&
spec
->
autocfg
;
unsigned
int
coef
;
int
i
;
for
(
i
=
0
;
i
<
AUTO_PIN_LAST
;
i
++
)
{
...
...
@@ -861,14 +928,57 @@ static void init_input(struct hda_codec *codec)
change_cur_input
(
codec
,
spec
->
cur_input
,
1
);
if
(
spec
->
mic_detect
)
cs_automic
(
codec
);
coef
=
0x000a
;
/* ADC1/2 - Digital and Analog Soft Ramp */
if
(
is_active_pin
(
codec
,
CS_DMIC2_PIN_NID
))
coef
|=
0x0500
;
/* DMIC2 enable 2 channels, disable GPIO1 */
if
(
is_active_pin
(
codec
,
CS_DMIC1_PIN_NID
))
coef
|=
0x1800
;
/* DMIC1 enable 2 channels, disable GPIO0
* No effect if SPDIF_OUT2 is slected in
* IDX_SPDIF_CTL.
*/
cs_vendor_coef_set
(
codec
,
IDX_ADC_CFG
,
coef
);
}
static
struct
hda_verb
cs_coef_init_verbs
[]
=
{
{
0x11
,
AC_VERB_SET_PROC_STATE
,
1
},
{
0x11
,
AC_VERB_SET_COEF_INDEX
,
IDX_DAC_CFG
},
{
0x11
,
AC_VERB_SET_PROC_COEF
,
(
0x002a
/* DAC1/2/3 SZCMode Soft Ramp */
|
0x0040
/* Mute DACs on FIFO error */
|
0x1000
/* Enable DACs High Pass Filter */
|
0x0400
/* Disable Coefficient Auto increment */
)},
/* Beep */
{
0x11
,
AC_VERB_SET_COEF_INDEX
,
IDX_DAC_CFG
},
{
0x11
,
AC_VERB_SET_PROC_COEF
,
0x0007
},
/* Enable Beep thru DAC1/2/3 */
{}
/* terminator */
};
/* SPDIF setup */
static
void
init_digital
(
struct
hda_codec
*
codec
)
{
unsigned
int
coef
;
coef
=
0x0002
;
/* SRC_MUTE soft-mute on SPDIF (if no lock) */
coef
|=
0x0008
;
/* Replace with mute on error */
if
(
is_active_pin
(
codec
,
CS_DIG_OUT2_PIN_NID
))
coef
|=
0x4000
;
/* RX to TX1 or TX2 Loopthru / SPDIF2
* SPDIF_OUT2 is shared with GPIO1 and
* DMIC_SDA2.
*/
cs_vendor_coef_set
(
codec
,
IDX_SPDIF_CTL
,
coef
);
}
static
int
cs_init
(
struct
hda_codec
*
codec
)
{
struct
cs_spec
*
spec
=
codec
->
spec
;
snd_hda_sequence_write
(
codec
,
cs_coef_init_verbs
);
init_output
(
codec
);
init_input
(
codec
);
init_digital
(
codec
);
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