procfs: /proc/acpi/ibm/volume
 
+NOTE: by default, the volume control interface operates in read-only
+mode, as it is supposed to be used for on-screen-display purposes.
+The read/write mode can be enabled through the use of the
+"volume_control=1" module parameter.
+
+NOTE: distros are urged to not enable volume_control by default, this
+should be done by the local admin only.  The ThinkPad UI is for the
+console audio control to be done through the volume keys only, and for
+the desktop environment to just provide on-screen-display feedback.
+Software volume control should be done only in the main AC97/HDA
+mixer.
+
 This feature allows volume control on ThinkPad models with a digital
 volume knob (when available, not all models have it), as well as
 mute/unmute control.  The available commands are:
 0x020600:      Marker for backlight change event support.
 
 0x020700:      Support for mute-only mixers.
+               Volume control in read-only mode by default.
 
 
 static struct {
        u16 hotkey_mask_ff:1;
+       u16 volume_ctrl_forbidden:1;
 } tp_warned;
 
 struct thinkpad_id_data {
        TPACPI_VOL_MODE_MAX;
 
 static enum tpacpi_volume_capabilities volume_capabilities;
+static int volume_control_allowed;
 
 /*
  * Used to syncronize writers to TP_EC_AUDIO and
 
        if (volume_mode != TPACPI_VOL_MODE_ECNVRAM)
                return;
+       if (!volume_control_allowed)
+               return;
 
        vdbg_printk(TPACPI_DBG_MIXER,
                "trying to checkpoint mixer state to NVRAM...\n");
                        "mute is supported, volume control is %s\n",
                        str_supported(!tp_features.mixer_no_level_control));
 
+       printk(TPACPI_INFO
+               "Console audio control enabled, mode: %s\n",
+               (volume_control_allowed) ?
+                       "override (read/write)" :
+                       "monitor (read only)");
+
        return 0;
 }
 
                len += sprintf(p + len, "mute:\t\t%s\n",
                                onoff(status, TP_EC_AUDIO_MUTESW));
 
-               len += sprintf(p + len, "commands:\tunmute, mute\n");
-               if (!tp_features.mixer_no_level_control) {
-                       len += sprintf(p + len, "commands:\tup, down\n");
-                       len += sprintf(p + len, "commands:\tlevel <level>"
-                              " (<level> is 0-%d)\n", TP_EC_VOLUME_MAX);
+               if (volume_control_allowed) {
+                       len += sprintf(p + len, "commands:\tunmute, mute\n");
+                       if (!tp_features.mixer_no_level_control) {
+                               len += sprintf(p + len,
+                                              "commands:\tup, down\n");
+                               len += sprintf(p + len,
+                                              "commands:\tlevel <level>"
+                                              " (<level> is 0-%d)\n",
+                                              TP_EC_VOLUME_MAX);
+                       }
                }
        }
 
        char *cmd;
        int rc;
 
+       /*
+        * We do allow volume control at driver startup, so that the
+        * user can set initial state through the volume=... parameter hack.
+        */
+       if (!volume_control_allowed && tpacpi_lifecycle != TPACPI_LIFE_INIT) {
+               if (unlikely(!tp_warned.volume_ctrl_forbidden)) {
+                       tp_warned.volume_ctrl_forbidden = 1;
+                       printk(TPACPI_NOTICE
+                               "Console audio control in monitor mode, "
+                               "changes are not allowed.\n");
+                       printk(TPACPI_NOTICE
+                               "Use the volume_control=1 module parameter "
+                               "to enable volume control\n");
+               }
+               return -EPERM;
+       }
+
        rc = volume_get_status(&s);
        if (rc < 0)
                return rc;
                 "Selects the mixer capabilites: "
                 "0=auto, 1=volume and mute, 2=mute only");
 
+module_param_named(volume_control, volume_control_allowed, bool, 0444);
+MODULE_PARM_DESC(volume_control,
+                "Enables software override for the console audio "
+                "control when true");
+
 #define TPACPI_PARAM(feature) \
        module_param_call(feature, set_ibm_param, NULL, NULL, 0); \
        MODULE_PARM_DESC(feature, "Simulates thinkpad-acpi procfs command " \