From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.tuxedocomputers.com (mail.tuxedocomputers.com [157.90.84.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AE9CA35772B; Thu, 4 Dec 2025 21:06:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=157.90.84.7 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764882385; cv=none; b=A9s0LmDfnkkw0hcmCGCyTdWF2XTeO6HvO3J5F1cZD8UlrHAtZzd4U11gG8vMX9lUGrt6LO5wViXtECKdBmLNSSfeA0/ha7ZkMoiZrEmp47JyujW/ef10KEDLDa0Ey/XCVrCrW9goiYA8o0AyOvlDC3GhbqfL9K8562pzkX90D+s= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764882385; c=relaxed/simple; bh=/tgvL/GRha8s+MgFogDEE83v/HFFy4LT8DXGyxaWBrs=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=JJib0XvAnbClssxs66j+8d+4dD2IhYYu7JrW7WPERJ/dm/dYNLea638lne8HYXYw4uKkyqfsuxuNGkP33JX14zjdXG5pZHxCt5yJe5nShDB0OfahSBJd9NlLsN8mHdTfkQQh0sF9bAPJ2I7rIVF1SFkokcf4f5mUX9WfiXY7KX4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=tuxedocomputers.com; spf=pass smtp.mailfrom=tuxedocomputers.com; dkim=pass (1024-bit key) header.d=tuxedocomputers.com header.i=@tuxedocomputers.com header.b=IW2TJMOL; arc=none smtp.client-ip=157.90.84.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=tuxedocomputers.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxedocomputers.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=tuxedocomputers.com header.i=@tuxedocomputers.com header.b="IW2TJMOL" Received: from [192.168.42.27] (pd9e597c7.dip0.t-ipconnect.de [217.229.151.199]) (Authenticated sender: wse@tuxedocomputers.com) by mail.tuxedocomputers.com (Postfix) with ESMTPSA id DBC402FC0093; Thu, 4 Dec 2025 22:06:20 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxedocomputers.com; s=default; t=1764882381; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qmYtPnQPhkJOWGHPvRC3CaBCC3YJkcN8qcUh5zbOq7U=; b=IW2TJMOLq7sOJ5klNxHt6J5opgyxbaLrQlgOTlnkRnPIsklWGDBkX+vivXvZrcjC3KZzcR iRWfo6drjweC5ST3XyR9xsgpfJZpb/uPhe9J7hL57Ao2UNAA2UX4aYOKfwxOeLazSp9TG0 bEmnmb52jxva1bwVXX73vYpTjNHNWYo= Authentication-Results: mail.tuxedocomputers.com; auth=pass smtp.auth=wse@tuxedocomputers.com smtp.mailfrom=wse@tuxedocomputers.com Message-ID: Date: Thu, 4 Dec 2025 22:06:20 +0100 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 2/2] platform/x86/uniwill: Implement cTGP setting To: Armin Wolf , hansg@kernel.org, ilpo.jarvinen@linux.intel.com Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org References: <20251204135121.435905-1-wse@tuxedocomputers.com> <20251204135121.435905-3-wse@tuxedocomputers.com> Content-Language: en-US From: Werner Sembach In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Am 04.12.25 um 17:58 schrieb Armin Wolf: > Am 04.12.25 um 17:11 schrieb Armin Wolf: > >> Am 04.12.25 um 14:50 schrieb Werner Sembach: >> >>> Uniwill offers user setable cTGP for their EC on devices using >>> NVIDIA 3000 >>> Series and newer GPUs. This patch implements this setting as a sysfs >>> attribute. >>> >>> For one device, the TUXEDO InfinityBook Gen7, the variant with and >>> without >>> NVIDIA GPU can't be differentiated using only the DMI strings, so >>> the new >>> probe callback needs to be used to test a bit from the EC memory. >>> >>> Signed-off-by: Werner Sembach >>> --- >>>   drivers/platform/x86/uniwill/uniwill-acpi.c | 160 >>> +++++++++++++++++--- >>>   1 file changed, 135 insertions(+), 25 deletions(-) >>> >>> diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c >>> b/drivers/platform/x86/uniwill/uniwill-acpi.c >>> index 01192c32608e5..f87f6e9d08234 100644 >>> --- a/drivers/platform/x86/uniwill/uniwill-acpi.c >>> +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c >>> @@ -88,6 +88,9 @@ >>>     #define EC_ADDR_GPU_TEMP        0x044F >>>   +#define EC_ADDR_SYSTEM_ID        0x0456 >>> +#define HAS_GPU                BIT(7) >> >> I think you need to tell regmap that this new register is readable >> by modifying uniwill_readable_reg(), otherwise phxarx1_phxaqf1_probe() >> will always fail. >> >> With that being fixed: >> Reviewed-by: Armin Wolf >> >>> + >>>   #define EC_ADDR_MAIN_FAN_RPM_1        0x0464 >>>     #define EC_ADDR_MAIN_FAN_RPM_2        0x0465 >>> @@ -122,11 +125,11 @@ >>>   #define CTGP_DB_DB_ENABLE        BIT(1) >>>   #define CTGP_DB_CTGP_ENABLE        BIT(2) >>>   -#define EC_ADDR_CTGP_OFFSET        0x0744 >>> +#define EC_ADDR_CTGP_DB_CTGP_OFFSET    0x0744 >>>   -#define EC_ADDR_TPP_OFFSET        0x0745 >>> +#define EC_ADDR_CTGP_DB_TPP_OFFSET    0x0745 >>>   -#define EC_ADDR_MAX_TGP            0x0746 >>> +#define EC_ADDR_CTGP_DB_DB_OFFSET    0x0746 >>>     #define EC_ADDR_LIGHTBAR_AC_CTRL    0x0748 >>>   #define LIGHTBAR_APP_EXISTS        BIT(0) >>> @@ -317,6 +320,7 @@ >>>   #define UNIWILL_FEATURE_LIGHTBAR        BIT(3) >>>   #define UNIWILL_FEATURE_BATTERY            BIT(4) >>>   #define UNIWILL_FEATURE_HWMON            BIT(5) >>> +#define UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL    BIT(6) >>>     struct uniwill_data { >>>       struct device *dev; >>> @@ -515,6 +519,10 @@ static bool uniwill_writeable_reg(struct device >>> *dev, unsigned int reg) >>>       case EC_ADDR_LIGHTBAR_BAT_RED: >>>       case EC_ADDR_LIGHTBAR_BAT_GREEN: >>>       case EC_ADDR_LIGHTBAR_BAT_BLUE: >>> +    case EC_ADDR_CTGP_DB_CTRL: >>> +    case EC_ADDR_CTGP_DB_CTGP_OFFSET: >>> +    case EC_ADDR_CTGP_DB_TPP_OFFSET: >>> +    case EC_ADDR_CTGP_DB_DB_OFFSET: >>>           return true; >>>       default: >>>           return false; >>> @@ -548,6 +556,10 @@ static bool uniwill_readable_reg(struct device >>> *dev, unsigned int reg) >>>       case EC_ADDR_LIGHTBAR_BAT_RED: >>>       case EC_ADDR_LIGHTBAR_BAT_GREEN: >>>       case EC_ADDR_LIGHTBAR_BAT_BLUE: >>> +    case EC_ADDR_CTGP_DB_CTRL: >>> +    case EC_ADDR_CTGP_DB_CTGP_OFFSET: >>> +    case EC_ADDR_CTGP_DB_TPP_OFFSET: >>> +    case EC_ADDR_CTGP_DB_DB_OFFSET: >>>           return true; >>>       default: >>>           return false; >>> @@ -803,6 +815,69 @@ static ssize_t breathing_in_suspend_show(struct >>> device *dev, struct device_attri >>>     static DEVICE_ATTR_RW(breathing_in_suspend); >>>   +static ssize_t ctgp_offset_store(struct device *dev, struct >>> device_attribute *attr, >>> +                 const char *buf, size_t count) >>> +{ >>> +    struct uniwill_data *data = dev_get_drvdata(dev); >>> +    unsigned int value; >>> +    int ret; >>> + >>> +    ret = kstrtouint(buf, 0, &value); >>> +    if (ret < 0) >>> +        return ret; > > I forget to mention that you still need to verify that value is > smaller than U8_MAX. ack > > Thanks, > Armin Wolf > >>> + >>> +    ret = regmap_write(data->regmap, EC_ADDR_CTGP_DB_CTGP_OFFSET, >>> value); >>> +    if (ret < 0) >>> +        return ret; >>> + >>> +    return count; >>> +} >>> + >>> +static ssize_t ctgp_offset_show(struct device *dev, struct >>> device_attribute *attr, >>> +                char *buf) >>> +{ >>> +    struct uniwill_data *data = dev_get_drvdata(dev); >>> +    unsigned int value; >>> +    int ret; >>> + >>> +    ret = regmap_read(data->regmap, EC_ADDR_CTGP_DB_CTGP_OFFSET, >>> &value); >>> +    if (ret < 0) >>> +        return ret; >>> + >>> +    return sysfs_emit(buf, "%u\n", value); >>> +} >>> + >>> +static DEVICE_ATTR_RW(ctgp_offset); >>> + >>> +static int uniwill_nvidia_ctgp_init(struct uniwill_data *data) >>> +{ >>> +    int ret; >>> + >>> +    if (!uniwill_device_supports(data, >>> UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL, >>> +                     UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL)) >>> +        return 0; >>> + >>> +    ret = regmap_write(data->regmap, EC_ADDR_CTGP_DB_CTGP_OFFSET, 0); >>> +    if (ret < 0) >>> +        return ret; >>> + >>> +    ret = regmap_write(data->regmap, EC_ADDR_CTGP_DB_TPP_OFFSET, 255); >>> +    if (ret < 0) >>> +        return ret; >>> + >>> +    ret = regmap_write(data->regmap, EC_ADDR_CTGP_DB_DB_OFFSET, 25); >>> +    if (ret < 0) >>> +        return ret; >>> + >>> +    ret = regmap_update_bits(data->regmap, EC_ADDR_CTGP_DB_CTRL, >>> +                 CTGP_DB_GENERAL_ENABLE | CTGP_DB_DB_ENABLE | >>> CTGP_DB_CTGP_ENABLE, >>> +                 CTGP_DB_GENERAL_ENABLE | CTGP_DB_DB_ENABLE | >>> CTGP_DB_CTGP_ENABLE); >>> +    if (ret < 0) >>> +        return ret; >>> + >>> +    return 0; >>> +} >>> + >>>   static struct attribute *uniwill_attrs[] = { >>>       /* Keyboard-related */ >>>       &dev_attr_fn_lock_toggle_enable.attr, >>> @@ -811,6 +886,8 @@ static struct attribute *uniwill_attrs[] = { >>>       /* Lightbar-related */ >>>       &dev_attr_rainbow_animation.attr, >>>       &dev_attr_breathing_in_suspend.attr, >>> +    /* Power-management-related */ >>> +    &dev_attr_ctgp_offset.attr, >>>       NULL >>>   }; >>>   @@ -844,6 +921,12 @@ static umode_t uniwill_attr_is_visible(struct >>> kobject *kobj, struct attribute *a >>>               return attr->mode; >>>       } >>>   +    if (attr == &dev_attr_ctgp_offset.attr) { >>> +        if (uniwill_device_supports(data, >>> UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL, >>> +                        UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL)) >>> +            return attr->mode; >>> +    } >>> + >>>       return 0; >>>   } >>>   @@ -1413,6 +1496,10 @@ static int uniwill_probe(struct >>> platform_device *pdev) >>>       if (ret < 0) >>>           return ret; >>>   +    ret = uniwill_nvidia_ctgp_init(data); >>> +    if (ret < 0) >>> +        return ret; >>> + >>>       return uniwill_input_init(data); >>>   } >>>   @@ -1557,6 +1644,29 @@ static struct uniwill_device_descriptor >>> lapkc71f_descriptor __initdata = { >>>               UNIWILL_FEATURE_HWMON >>>   }; >>>   +static int phxarx1_phxaqf1_probe(struct uniwill_data *data) >>> +{ >>> +    unsigned int value; >>> +    int ret; >>> + >>> +    ret = regmap_read(data->regmap, EC_ADDR_SYSTEM_ID, &value); >>> +    if (ret < 0) >>> +        return ret; >>> + >>> +    if (value & HAS_GPU) >>> +        data->features |= UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL; >>> + >>> +    return 0; >>> +}; >>> + >>> +static struct uniwill_device_descriptor phxarx1_phxaqf1_descriptor >>> __initdata = { >>> +    .probe = phxarx1_phxaqf1_probe >>> +}; >>> + >>> +static struct uniwill_device_descriptor tux_featureset_1_descriptor >>> __initdata = { >>> +    .features = UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL >>> +}; >>> + >>>   static struct uniwill_device_descriptor empty_descriptor >>> __initdata = {}; >>>     static const struct dmi_system_id uniwill_dmi_table[] >>> __initconst = { >>> @@ -1606,7 +1716,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "PHxTQx1"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO InfinityBook Pro 14/16 Gen7 Intel", >>> @@ -1614,7 +1724,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "PHxARX1_PHxAQF1"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &phxarx1_phxaqf1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO InfinityBook Pro 16 Gen7 Intel/Commodore >>> Omnia-Book Pro Gen 7", >>> @@ -1622,7 +1732,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, >>> "PH6AG01_PH6AQ71_PH6AQI1"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO InfinityBook Pro 14/16 Gen8 >>> Intel/Commodore Omnia-Book Pro Gen 8", >>> @@ -1638,7 +1748,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH4PG31"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO InfinityBook Pro 16 Gen8 Intel", >>> @@ -1646,7 +1756,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH6PG01_PH6PG71"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO InfinityBook Pro 14/15 Gen9 AMD", >>> @@ -1814,7 +1924,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxMGxx"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Polaris 15/17 Gen2 Intel", >>> @@ -1822,7 +1932,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxNGxx"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Stellaris/Polaris 15/17 Gen3 AMD", >>> @@ -1830,7 +1940,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxZGxx"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Stellaris/Polaris 15/17 Gen3 Intel", >>> @@ -1838,7 +1948,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxTGxx"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Stellaris/Polaris 15/17 Gen4 AMD", >>> @@ -1846,7 +1956,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxRGxx"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Stellaris 15 Gen4 Intel", >>> @@ -1854,7 +1964,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxAGxx"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Polaris 15/17 Gen5 AMD", >>> @@ -1862,7 +1972,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxXGxx"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Stellaris 16 Gen5 AMD", >>> @@ -1870,7 +1980,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6XGxX"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Stellaris 16/17 Gen5 Intel/Commodore >>> ORION Gen 5", >>> @@ -1878,7 +1988,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxPXxx"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Stellaris Slim 15 Gen6 AMD", >>> @@ -1886,7 +1996,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxHGxx"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Stellaris Slim 15 Gen6 Intel/Commodore >>> ORION Slim 15 Gen6", >>> @@ -1894,7 +2004,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM5IXxA"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Stellaris 16 Gen6 Intel/Commodore ORION >>> 16 Gen6", >>> @@ -1902,7 +2012,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6IXxB_MB1"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Stellaris 16 Gen6 Intel/Commodore ORION >>> 16 Gen6", >>> @@ -1910,7 +2020,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6IXxB_MB2"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Stellaris 17 Gen6 Intel/Commodore ORION >>> 17 Gen6", >>> @@ -1918,7 +2028,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM7IXxN"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Stellaris 16 Gen7 AMD", >>> @@ -1926,7 +2036,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6FR5xxY"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Stellaris 16 Gen7 Intel", >>> @@ -1934,7 +2044,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR5xxY"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Stellaris 16 Gen7 Intel", >>> @@ -1942,7 +2052,7 @@ static const struct dmi_system_id >>> uniwill_dmi_table[] __initconst = { >>>               DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), >>>               DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR5xxY_mLED"), >>>           }, >>> -        .driver_data = &empty_descriptor, >>> +        .driver_data = &tux_featureset_1_descriptor, >>>       }, >>>       { >>>           .ident = "TUXEDO Pulse 14 Gen1 AMD", >>