Author: eadler
Date: Sun Jun 17 20:44:20 2018
New Revision: 335304
URL: https://svnweb.freebsd.org/changeset/base/335304

Log:
  acpi: Add support for Thinkpads Mic led
  
  PR:           229074
  Submitted by: "Ali Abdallah" <ali...@gmail.com>

Modified:
  head/sys/dev/acpi_support/acpi_ibm.c

Modified: head/sys/dev/acpi_support/acpi_ibm.c
==============================================================================
--- head/sys/dev/acpi_support/acpi_ibm.c        Sun Jun 17 20:33:02 2018        
(r335303)
+++ head/sys/dev/acpi_support/acpi_ibm.c        Sun Jun 17 20:44:20 2018        
(r335304)
@@ -74,6 +74,7 @@ ACPI_MODULE_NAME("IBM")
 #define ACPI_IBM_METHOD_FANSTATUS      12
 #define ACPI_IBM_METHOD_THERMAL                13
 #define ACPI_IBM_METHOD_HANDLEREVENTS  14
+#define ACPI_IBM_METHOD_MIC_LED                15
 
 /* Hotkeys/Buttons */
 #define IBM_RTC_HOTKEY1                        0x64
@@ -175,6 +176,10 @@ struct acpi_ibm_softc {
        int             led_busy;
        int             led_state;
 
+       /* Mic led handle */
+       ACPI_HANDLE     mic_led_handle;
+       int             mic_led_state;
+
        int             wlan_bt_flags;
        int             thermal_updt_supported;
 
@@ -258,7 +263,11 @@ static struct {
                .method         = ACPI_IBM_METHOD_FANSTATUS,
                .description    = "Fan enable",
        },
-
+       {
+               .name           = "mic_led",
+               .method         = ACPI_IBM_METHOD_MIC_LED,
+               .description    = "Mic led",
+       },
        { NULL, 0, NULL, 0 }
 };
 
@@ -371,6 +380,35 @@ ibm_led_task(struct acpi_ibm_softc *sc, int pending __
 }
 
 static int
+acpi_ibm_mic_led_set (struct acpi_ibm_softc *sc, int arg)
+{
+       ACPI_OBJECT_LIST input;
+       ACPI_OBJECT params[1];
+       ACPI_STATUS status;
+
+       if (arg < 0 || arg > 1)
+               return (EINVAL);
+
+       if (sc->mic_led_handle) {
+               params[0].Type = ACPI_TYPE_INTEGER;
+               params[0].Integer.Value = 0;
+               /* mic led: 0 off, 2 on */
+               if (arg == 1)
+                       params[0].Integer.Value = 2;
+
+               input.Pointer = params;
+               input.Count = 1;
+
+               status = AcpiEvaluateObject (sc->handle, "MMTS", &input, NULL);
+               if (ACPI_SUCCESS(status))
+                       sc->mic_led_state = arg;
+               return(status);
+       }
+
+       return (0);
+}
+
+static int
 acpi_ibm_probe(device_t dev)
 {
        if (acpi_disabled("ibm") ||
@@ -552,6 +590,9 @@ acpi_ibm_resume(device_t dev)
        }
        ACPI_SERIAL_END(ibm);
 
+       /* The mic led does not turn back on when sysctl_set is called in the 
above loop */
+       acpi_ibm_mic_led_set(sc, sc->mic_led_state);
+
        return (0);
 }
 
@@ -739,6 +780,12 @@ acpi_ibm_sysctl_get(struct acpi_ibm_softc *sc, int met
                else
                        val = -1;
                break;
+       case ACPI_IBM_METHOD_MIC_LED:
+               if (sc->mic_led_handle)
+                       return sc->mic_led_state;
+               else
+                       val = -1;
+               break;
        }
 
        return (val);
@@ -783,6 +830,10 @@ acpi_ibm_sysctl_set(struct acpi_ibm_softc *sc, int met
                return acpi_ibm_mute_set(sc, arg);
                break;
 
+       case ACPI_IBM_METHOD_MIC_LED:
+               return acpi_ibm_mic_led_set (sc, arg);
+               break;
+
        case ACPI_IBM_METHOD_THINKLIGHT:
                return acpi_ibm_thinklight_set(sc, arg);
                break;
@@ -841,6 +892,17 @@ acpi_ibm_sysctl_init(struct acpi_ibm_softc *sc, int me
        case ACPI_IBM_METHOD_MUTE:
                /* EC is required here, which was already checked before */
                return (TRUE);
+
+       case ACPI_IBM_METHOD_MIC_LED:
+               if (ACPI_SUCCESS(AcpiGetHandle(sc->handle, "MMTS", 
&sc->mic_led_handle)))
+               {
+                       /* Turn off mic led by default */
+                       acpi_ibm_mic_led_set (sc, 0);
+                       return(TRUE);
+               }
+               else
+                       sc->mic_led_handle = NULL;
+               return (FALSE);
 
        case ACPI_IBM_METHOD_THINKLIGHT:
                sc->cmos_handle = NULL;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to