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
ea840aa2
Commit
ea840aa2
authored
Dec 30, 2009
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'thinkpad' into release
parents
1ae22af7
6e5b08ee
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
123 additions
and
22 deletions
+123
-22
Documentation/laptops/thinkpad-acpi.txt
Documentation/laptops/thinkpad-acpi.txt
+50
-8
drivers/platform/x86/Kconfig
drivers/platform/x86/Kconfig
+28
-0
drivers/platform/x86/thinkpad_acpi.c
drivers/platform/x86/thinkpad_acpi.c
+45
-14
No files found.
Documentation/laptops/thinkpad-acpi.txt
View file @
ea840aa2
...
@@ -1092,8 +1092,8 @@ WARNING:
...
@@ -1092,8 +1092,8 @@ WARNING:
its level up and down at every change.
its level up and down at every change.
Volume control
Volume control
(Console Audio control)
--------------
--------------
------------------------
procfs: /proc/acpi/ibm/volume
procfs: /proc/acpi/ibm/volume
ALSA: "ThinkPad Console Audio Control", default ID: "ThinkPadEC"
ALSA: "ThinkPad Console Audio Control", default ID: "ThinkPadEC"
...
@@ -1110,9 +1110,53 @@ the desktop environment to just provide on-screen-display feedback.
...
@@ -1110,9 +1110,53 @@ the desktop environment to just provide on-screen-display feedback.
Software volume control should be done only in the main AC97/HDA
Software volume control should be done only in the main AC97/HDA
mixer.
mixer.
This feature allows volume control on ThinkPad models with a digital
volume knob (when available, not all models have it), as well as
About the ThinkPad Console Audio control:
mute/unmute control. The available commands are:
ThinkPads have a built-in amplifier and muting circuit that drives the
console headphone and speakers. This circuit is after the main AC97
or HDA mixer in the audio path, and under exclusive control of the
firmware.
ThinkPads have three special hotkeys to interact with the console
audio control: volume up, volume down and mute.
It is worth noting that the normal way the mute function works (on
ThinkPads that do not have a "mute LED") is:
1. Press mute to mute. It will *always* mute, you can press it as
many times as you want, and the sound will remain mute.
2. Press either volume key to unmute the ThinkPad (it will _not_
change the volume, it will just unmute).
This is a very superior design when compared to the cheap software-only
mute-toggle solution found on normal consumer laptops: you can be
absolutely sure the ThinkPad will not make noise if you press the mute
button, no matter the previous state.
The IBM ThinkPads, and the earlier Lenovo ThinkPads have variable-gain
amplifiers driving the speakers and headphone output, and the firmware
also handles volume control for the headphone and speakers on these
ThinkPads without any help from the operating system (this volume
control stage exists after the main AC97 or HDA mixer in the audio
path).
The newer Lenovo models only have firmware mute control, and depend on
the main HDA mixer to do volume control (which is done by the operating
system). In this case, the volume keys are filtered out for unmute
key press (there are some firmware bugs in this area) and delivered as
normal key presses to the operating system (thinkpad-acpi is not
involved).
The ThinkPad-ACPI volume control:
The preferred way to interact with the Console Audio control is the
ALSA interface.
The legacy procfs interface allows one to read the current state,
and if volume control is enabled, accepts the following commands:
echo up >/proc/acpi/ibm/volume
echo up >/proc/acpi/ibm/volume
echo down >/proc/acpi/ibm/volume
echo down >/proc/acpi/ibm/volume
...
@@ -1121,12 +1165,10 @@ mute/unmute control. The available commands are:
...
@@ -1121,12 +1165,10 @@ mute/unmute control. The available commands are:
echo 'level <level>' >/proc/acpi/ibm/volume
echo 'level <level>' >/proc/acpi/ibm/volume
The <level> number range is 0 to 14 although not all of them may be
The <level> number range is 0 to 14 although not all of them may be
distinct. T
he
unmute the volume after the mute command, use either the
distinct. T
o
unmute the volume after the mute command, use either the
up or down command (the level command will not unmute the volume), or
up or down command (the level command will not unmute the volume), or
the unmute command.
the unmute command.
The current volume level and mute state is shown in the file.
You can use the volume_capabilities parameter to tell the driver
You can use the volume_capabilities parameter to tell the driver
whether your thinkpad has volume control or mute-only control:
whether your thinkpad has volume control or mute-only control:
volume_capabilities=1 for mixers with mute and volume control,
volume_capabilities=1 for mixers with mute and volume control,
...
...
drivers/platform/x86/Kconfig
View file @
ea840aa2
...
@@ -231,8 +231,36 @@ config THINKPAD_ACPI
...
@@ -231,8 +231,36 @@ config THINKPAD_ACPI
This driver was formerly known as ibm-acpi.
This driver was formerly known as ibm-acpi.
Extra functionality will be available if the rfkill (CONFIG_RFKILL)
and/or ALSA (CONFIG_SND) subsystems are available in the kernel.
Note that if you want ThinkPad-ACPI to be built-in instead of
modular, ALSA and rfkill will also have to be built-in.
If you have an IBM or Lenovo ThinkPad laptop, say Y or M here.
If you have an IBM or Lenovo ThinkPad laptop, say Y or M here.
config THINKPAD_ACPI_ALSA_SUPPORT
bool "Console audio control ALSA interface"
depends on THINKPAD_ACPI
depends on SND
depends on SND = y || THINKPAD_ACPI = SND
default y
---help---
Enables monitoring of the built-in console audio output control
(headphone and speakers), which is operated by the mute and (in
some ThinkPad models) volume hotkeys.
If this option is enabled, ThinkPad-ACPI will export an ALSA card
with a single read-only mixer control, which should be used for
on-screen-display feedback purposes by the Desktop Environment.
Optionally, the driver will also allow software control (the
ALSA mixer will be made read-write). Please refer to the driver
documentation for details.
All IBM models have both volume and mute control. Newer Lenovo
models only have mute control (the volume hotkeys are just normal
keys and volume control is done through the main HDA mixer).
config THINKPAD_ACPI_DEBUGFACILITIES
config THINKPAD_ACPI_DEBUGFACILITIES
bool "Maintainer debug facilities"
bool "Maintainer debug facilities"
depends on THINKPAD_ACPI
depends on THINKPAD_ACPI
...
...
drivers/platform/x86/thinkpad_acpi.c
View file @
ea840aa2
...
@@ -6384,11 +6384,13 @@ static struct ibm_struct brightness_driver_data = {
...
@@ -6384,11 +6384,13 @@ static struct ibm_struct brightness_driver_data = {
* and we leave them unchanged.
* and we leave them unchanged.
*/
*/
#ifdef CONFIG_THINKPAD_ACPI_ALSA_SUPPORT
#define TPACPI_ALSA_DRVNAME "ThinkPad EC"
#define TPACPI_ALSA_DRVNAME "ThinkPad EC"
#define TPACPI_ALSA_SHRTNAME "ThinkPad Console Audio Control"
#define TPACPI_ALSA_SHRTNAME "ThinkPad Console Audio Control"
#define TPACPI_ALSA_MIXERNAME TPACPI_ALSA_SHRTNAME
#define TPACPI_ALSA_MIXERNAME TPACPI_ALSA_SHRTNAME
static
int
alsa_index
=
SNDRV_DEFAULT_IDX1
;
static
int
alsa_index
=
~
((
1
<<
(
SNDRV_CARDS
-
3
))
-
1
);
/* last three slots */
static
char
*
alsa_id
=
"ThinkPadEC"
;
static
char
*
alsa_id
=
"ThinkPadEC"
;
static
int
alsa_enable
=
SNDRV_DEFAULT_ENABLE1
;
static
int
alsa_enable
=
SNDRV_DEFAULT_ENABLE1
;
...
@@ -6705,10 +6707,11 @@ static int __init volume_create_alsa_mixer(void)
...
@@ -6705,10 +6707,11 @@ static int __init volume_create_alsa_mixer(void)
rc
=
snd_card_create
(
alsa_index
,
alsa_id
,
THIS_MODULE
,
rc
=
snd_card_create
(
alsa_index
,
alsa_id
,
THIS_MODULE
,
sizeof
(
struct
tpacpi_alsa_data
),
&
card
);
sizeof
(
struct
tpacpi_alsa_data
),
&
card
);
if
(
rc
<
0
)
if
(
rc
<
0
||
!
card
)
{
return
rc
;
printk
(
TPACPI_ERR
if
(
!
card
)
"Failed to create ALSA card structures: %d
\n
"
,
rc
);
return
-
ENOMEM
;
return
1
;
}
BUG_ON
(
!
card
->
private_data
);
BUG_ON
(
!
card
->
private_data
);
data
=
card
->
private_data
;
data
=
card
->
private_data
;
...
@@ -6741,8 +6744,9 @@ static int __init volume_create_alsa_mixer(void)
...
@@ -6741,8 +6744,9 @@ static int __init volume_create_alsa_mixer(void)
rc
=
snd_ctl_add
(
card
,
ctl_vol
);
rc
=
snd_ctl_add
(
card
,
ctl_vol
);
if
(
rc
<
0
)
{
if
(
rc
<
0
)
{
printk
(
TPACPI_ERR
printk
(
TPACPI_ERR
"Failed to create ALSA volume control
\n
"
);
"Failed to create ALSA volume control: %d
\n
"
,
goto
err_out
;
rc
);
goto
err_exit
;
}
}
data
->
ctl_vol_id
=
&
ctl_vol
->
id
;
data
->
ctl_vol_id
=
&
ctl_vol
->
id
;
}
}
...
@@ -6750,22 +6754,25 @@ static int __init volume_create_alsa_mixer(void)
...
@@ -6750,22 +6754,25 @@ static int __init volume_create_alsa_mixer(void)
ctl_mute
=
snd_ctl_new1
(
&
volume_alsa_control_mute
,
NULL
);
ctl_mute
=
snd_ctl_new1
(
&
volume_alsa_control_mute
,
NULL
);
rc
=
snd_ctl_add
(
card
,
ctl_mute
);
rc
=
snd_ctl_add
(
card
,
ctl_mute
);
if
(
rc
<
0
)
{
if
(
rc
<
0
)
{
printk
(
TPACPI_ERR
"Failed to create ALSA mute control
\n
"
);
printk
(
TPACPI_ERR
"Failed to create ALSA mute control: %d
\n
"
,
goto
err_out
;
rc
);
goto
err_exit
;
}
}
data
->
ctl_mute_id
=
&
ctl_mute
->
id
;
data
->
ctl_mute_id
=
&
ctl_mute
->
id
;
snd_card_set_dev
(
card
,
&
tpacpi_pdev
->
dev
);
snd_card_set_dev
(
card
,
&
tpacpi_pdev
->
dev
);
rc
=
snd_card_register
(
card
);
rc
=
snd_card_register
(
card
);
err_out:
if
(
rc
<
0
)
{
if
(
rc
<
0
)
{
snd_card_free
(
card
);
printk
(
TPACPI_ERR
"Failed to register ALSA card: %d
\n
"
,
rc
);
card
=
NULL
;
goto
err_exit
;
}
}
alsa_card
=
card
;
alsa_card
=
card
;
return
rc
;
return
0
;
err_exit:
snd_card_free
(
card
);
return
1
;
}
}
#define TPACPI_VOL_Q_MUTEONLY 0x0001
/* Mute-only control available */
#define TPACPI_VOL_Q_MUTEONLY 0x0001
/* Mute-only control available */
...
@@ -7016,6 +7023,28 @@ static struct ibm_struct volume_driver_data = {
...
@@ -7016,6 +7023,28 @@ static struct ibm_struct volume_driver_data = {
.
shutdown
=
volume_shutdown
,
.
shutdown
=
volume_shutdown
,
};
};
#else
/* !CONFIG_THINKPAD_ACPI_ALSA_SUPPORT */
#define alsa_card NULL
static
void
inline
volume_alsa_notify_change
(
void
)
{
}
static
int
__init
volume_init
(
struct
ibm_init_struct
*
iibm
)
{
printk
(
TPACPI_INFO
"volume: disabled as there is no ALSA support in this kernel
\n
"
);
return
1
;
}
static
struct
ibm_struct
volume_driver_data
=
{
.
name
=
"volume"
,
};
#endif
/* CONFIG_THINKPAD_ACPI_ALSA_SUPPORT */
/*************************************************************************
/*************************************************************************
* Fan subdriver
* Fan subdriver
*/
*/
...
@@ -8738,6 +8767,7 @@ MODULE_PARM_DESC(hotkey_report_mode,
...
@@ -8738,6 +8767,7 @@ MODULE_PARM_DESC(hotkey_report_mode,
"used for backwards compatibility with userspace, "
"used for backwards compatibility with userspace, "
"see documentation"
);
"see documentation"
);
#ifdef CONFIG_THINKPAD_ACPI_ALSA_SUPPORT
module_param_named
(
volume_mode
,
volume_mode
,
uint
,
0444
);
module_param_named
(
volume_mode
,
volume_mode
,
uint
,
0444
);
MODULE_PARM_DESC
(
volume_mode
,
MODULE_PARM_DESC
(
volume_mode
,
"Selects volume control strategy: "
"Selects volume control strategy: "
...
@@ -8760,6 +8790,7 @@ module_param_named(id, alsa_id, charp, 0444);
...
@@ -8760,6 +8790,7 @@ module_param_named(id, alsa_id, charp, 0444);
MODULE_PARM_DESC
(
id
,
"ALSA id for the ACPI EC Mixer"
);
MODULE_PARM_DESC
(
id
,
"ALSA id for the ACPI EC Mixer"
);
module_param_named
(
enable
,
alsa_enable
,
bool
,
0444
);
module_param_named
(
enable
,
alsa_enable
,
bool
,
0444
);
MODULE_PARM_DESC
(
enable
,
"Enable the ALSA interface for the ACPI EC Mixer"
);
MODULE_PARM_DESC
(
enable
,
"Enable the ALSA interface for the ACPI EC Mixer"
);
#endif
/* CONFIG_THINKPAD_ACPI_ALSA_SUPPORT */
#define TPACPI_PARAM(feature) \
#define TPACPI_PARAM(feature) \
module_param_call(feature, set_ibm_param, NULL, NULL, 0); \
module_param_call(feature, set_ibm_param, NULL, NULL, 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