add asus linux patches
This commit is contained in:
parent
c9379765ae
commit
dc067eaadb
@ -0,0 +1,151 @@
|
|||||||
|
From 55426abb60d99efed912d8309498c0c365e8dcec Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Luke D. Jones" <luke@ljones.dev>
|
||||||
|
Date: Sun, 10 Mar 2024 15:14:37 +1300
|
||||||
|
Subject: [PATCH 1/5] platform/x86: asus-wmi: add support for 2024 ROG Mini-LED
|
||||||
|
|
||||||
|
Support the 2024 mini-led backlight and adjust the related functions
|
||||||
|
to select the relevant dev-id. Also add `available_mini_led_mode` to the
|
||||||
|
platform sysfs since the available mini-led levels can be different.
|
||||||
|
|
||||||
|
Signed-off-by: Luke D. Jones <luke@ljones.dev>
|
||||||
|
---
|
||||||
|
.../ABI/testing/sysfs-platform-asus-wmi | 8 ++++
|
||||||
|
drivers/platform/x86/asus-wmi.c | 48 ++++++++++++++++---
|
||||||
|
include/linux/platform_data/x86/asus-wmi.h | 1 +
|
||||||
|
3 files changed, 51 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Documentation/ABI/testing/sysfs-platform-asus-wmi b/Documentation/ABI/testing/sysfs-platform-asus-wmi
|
||||||
|
index 8a7e25bde085..e32b4f0ae15f 100644
|
||||||
|
--- a/Documentation/ABI/testing/sysfs-platform-asus-wmi
|
||||||
|
+++ b/Documentation/ABI/testing/sysfs-platform-asus-wmi
|
||||||
|
@@ -126,6 +126,14 @@ Description:
|
||||||
|
Change the mini-LED mode:
|
||||||
|
* 0 - Single-zone,
|
||||||
|
* 1 - Multi-zone
|
||||||
|
+ * 2 - Multi-zone strong (available on newer generation mini-led)
|
||||||
|
+
|
||||||
|
+What: /sys/devices/platform/<platform>/avilable_mini_led_mode
|
||||||
|
+Date: Jun 2023
|
||||||
|
+KernelVersion: 6.9
|
||||||
|
+Contact: "Luke Jones" <luke@ljones.dev>
|
||||||
|
+Description:
|
||||||
|
+ List the available mini-led modes.
|
||||||
|
|
||||||
|
What: /sys/devices/platform/<platform>/ppt_pl1_spl
|
||||||
|
Date: Jun 2023
|
||||||
|
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
|
||||||
|
index 18be35fdb381..a56152ccfbe7 100644
|
||||||
|
--- a/drivers/platform/x86/asus-wmi.c
|
||||||
|
+++ b/drivers/platform/x86/asus-wmi.c
|
||||||
|
@@ -297,6 +297,7 @@ struct asus_wmi {
|
||||||
|
|
||||||
|
bool panel_overdrive_available;
|
||||||
|
bool mini_led_mode_available;
|
||||||
|
+ u32 mini_led_dev_id;
|
||||||
|
|
||||||
|
struct hotplug_slot hotplug_slot;
|
||||||
|
struct mutex hotplug_lock;
|
||||||
|
@@ -2109,10 +2110,17 @@ static ssize_t mini_led_mode_show(struct device *dev,
|
||||||
|
struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
int result;
|
||||||
|
|
||||||
|
- result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_MINI_LED_MODE);
|
||||||
|
- if (result < 0)
|
||||||
|
- return result;
|
||||||
|
+ result = asus_wmi_get_devstate_simple(asus, asus->mini_led_dev_id);
|
||||||
|
|
||||||
|
+ // Remap the mode values to match previous generation mini-led including
|
||||||
|
+ // if errored -19 since some of these bios return a bad result if set to "2"
|
||||||
|
+ // which is mini-led off
|
||||||
|
+ if (asus->mini_led_dev_id == ASUS_WMI_DEVID_MINI_LED_MODE2) {
|
||||||
|
+ if (result >= 0 || result == -19)
|
||||||
|
+ result = result == 1 ? 2 : result == 0 ? 1 : 0;
|
||||||
|
+ } else if (result < 0) {
|
||||||
|
+ return result;
|
||||||
|
+ }
|
||||||
|
return sysfs_emit(buf, "%d\n", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2129,10 +2137,15 @@ static ssize_t mini_led_mode_store(struct device *dev,
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
- if (mode > 1)
|
||||||
|
+ if (mode > 1 && asus->mini_led_dev_id == ASUS_WMI_DEVID_MINI_LED_MODE)
|
||||||
|
return -EINVAL;
|
||||||
|
+ if (mode > 2 && asus->mini_led_dev_id == ASUS_WMI_DEVID_MINI_LED_MODE2)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ // Remap the mode values to match previous generation mini-led
|
||||||
|
+ if (asus->mini_led_dev_id == ASUS_WMI_DEVID_MINI_LED_MODE2)
|
||||||
|
+ mode = mode == 2 ? 1 : mode == 0 ? 2 : 0;
|
||||||
|
|
||||||
|
- err = asus_wmi_set_devstate(ASUS_WMI_DEVID_MINI_LED_MODE, mode, &result);
|
||||||
|
+ err = asus_wmi_set_devstate(asus->mini_led_dev_id, mode, &result);
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
pr_warn("Failed to set mini-LED: %d\n", err);
|
||||||
|
@@ -2150,6 +2163,21 @@ static ssize_t mini_led_mode_store(struct device *dev,
|
||||||
|
}
|
||||||
|
static DEVICE_ATTR_RW(mini_led_mode);
|
||||||
|
|
||||||
|
+static ssize_t available_mini_led_mode_show(struct device *dev,
|
||||||
|
+ struct device_attribute *attr, char *buf)
|
||||||
|
+{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
+
|
||||||
|
+ if (asus->mini_led_dev_id == ASUS_WMI_DEVID_MINI_LED_MODE)
|
||||||
|
+ return sysfs_emit(buf, "0 1\n");
|
||||||
|
+ if (asus->mini_led_dev_id == ASUS_WMI_DEVID_MINI_LED_MODE2)
|
||||||
|
+ return sysfs_emit(buf, "0 1 2\n");
|
||||||
|
+
|
||||||
|
+ return sysfs_emit(buf, "0\n");
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static DEVICE_ATTR_RO(available_mini_led_mode);
|
||||||
|
+
|
||||||
|
/* Quirks *********************************************************************/
|
||||||
|
|
||||||
|
static void asus_wmi_set_xusb2pr(struct asus_wmi *asus)
|
||||||
|
@@ -4174,6 +4202,7 @@ static struct attribute *platform_attributes[] = {
|
||||||
|
&dev_attr_nv_temp_target.attr,
|
||||||
|
&dev_attr_panel_od.attr,
|
||||||
|
&dev_attr_mini_led_mode.attr,
|
||||||
|
+ &dev_attr_available_mini_led_mode.attr,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -4496,10 +4525,17 @@ static int asus_wmi_add(struct platform_device *pdev)
|
||||||
|
asus->nv_dyn_boost_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_NV_DYN_BOOST);
|
||||||
|
asus->nv_temp_tgt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_NV_THERM_TARGET);
|
||||||
|
asus->panel_overdrive_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PANEL_OD);
|
||||||
|
- asus->mini_led_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MINI_LED_MODE);
|
||||||
|
asus->ally_mcu_usb_switch = acpi_has_method(NULL, ASUS_USB0_PWR_EC0_CSEE)
|
||||||
|
&& dmi_match(DMI_BOARD_NAME, "RC71L");
|
||||||
|
|
||||||
|
+ if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MINI_LED_MODE)) {
|
||||||
|
+ asus->mini_led_mode_available = true;
|
||||||
|
+ asus->mini_led_dev_id = ASUS_WMI_DEVID_MINI_LED_MODE;
|
||||||
|
+ } else if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MINI_LED_MODE2)) {
|
||||||
|
+ asus->mini_led_mode_available = true;
|
||||||
|
+ asus->mini_led_dev_id = ASUS_WMI_DEVID_MINI_LED_MODE2;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
err = fan_boost_mode_check_present(asus);
|
||||||
|
if (err)
|
||||||
|
goto fail_fan_boost_mode;
|
||||||
|
diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h
|
||||||
|
index ab1c7deff118..9cadce10ad9a 100644
|
||||||
|
--- a/include/linux/platform_data/x86/asus-wmi.h
|
||||||
|
+++ b/include/linux/platform_data/x86/asus-wmi.h
|
||||||
|
@@ -71,6 +71,7 @@
|
||||||
|
#define ASUS_WMI_DEVID_LID_FLIP 0x00060062
|
||||||
|
#define ASUS_WMI_DEVID_LID_FLIP_ROG 0x00060077
|
||||||
|
#define ASUS_WMI_DEVID_MINI_LED_MODE 0x0005001E
|
||||||
|
+#define ASUS_WMI_DEVID_MINI_LED_MODE2 0x0005002E
|
||||||
|
|
||||||
|
/* Storage */
|
||||||
|
#define ASUS_WMI_DEVID_CARDREADER 0x00080013
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
||||||
|
|
@ -0,0 +1,100 @@
|
|||||||
|
From 06d5a9b83548d99b70764166d723489cc8336b1d Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Luke D. Jones" <luke@ljones.dev>
|
||||||
|
Date: Sun, 10 Mar 2024 17:10:05 +1300
|
||||||
|
Subject: [PATCH 2/5] platform/x86: asus-wmi: add support for Vivobook GPU MUX
|
||||||
|
|
||||||
|
Adjust existing MUX support to select whichever MUX support is available
|
||||||
|
so that ASUS Vivobook MUX can also be used if detected.
|
||||||
|
|
||||||
|
Signed-off-by: Luke D. Jones <luke@ljones.dev>
|
||||||
|
---
|
||||||
|
drivers/platform/x86/asus-wmi.c | 18 +++++++++++++-----
|
||||||
|
include/linux/platform_data/x86/asus-wmi.h | 1 +
|
||||||
|
2 files changed, 14 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
|
||||||
|
index a56152ccfbe7..b9a2fb8007c0 100644
|
||||||
|
--- a/drivers/platform/x86/asus-wmi.c
|
||||||
|
+++ b/drivers/platform/x86/asus-wmi.c
|
||||||
|
@@ -268,6 +268,7 @@ struct asus_wmi {
|
||||||
|
bool egpu_connect_available;
|
||||||
|
bool dgpu_disable_available;
|
||||||
|
bool gpu_mux_mode_available;
|
||||||
|
+ u32 gpu_mux_dev;
|
||||||
|
|
||||||
|
/* Tunables provided by ASUS for gaming laptops */
|
||||||
|
bool ppt_pl2_sppt_available;
|
||||||
|
@@ -682,7 +683,7 @@ static ssize_t dgpu_disable_store(struct device *dev,
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (asus->gpu_mux_mode_available) {
|
||||||
|
- result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPU_MUX);
|
||||||
|
+ result = asus_wmi_get_devstate_simple(asus, asus->gpu_mux_dev);
|
||||||
|
if (result < 0)
|
||||||
|
/* An error here may signal greater failure of GPU handling */
|
||||||
|
return result;
|
||||||
|
@@ -748,7 +749,7 @@ static ssize_t egpu_enable_store(struct device *dev,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asus->gpu_mux_mode_available) {
|
||||||
|
- result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPU_MUX);
|
||||||
|
+ result = asus_wmi_get_devstate_simple(asus, asus->gpu_mux_dev);
|
||||||
|
if (result < 0) {
|
||||||
|
/* An error here may signal greater failure of GPU handling */
|
||||||
|
pr_warn("Failed to get gpu mux status: %d\n", result);
|
||||||
|
@@ -801,7 +802,7 @@ static ssize_t gpu_mux_mode_show(struct device *dev,
|
||||||
|
struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
int result;
|
||||||
|
|
||||||
|
- result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPU_MUX);
|
||||||
|
+ result = asus_wmi_get_devstate_simple(asus, asus->gpu_mux_dev);
|
||||||
|
if (result < 0)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
@@ -847,7 +848,7 @@ static ssize_t gpu_mux_mode_store(struct device *dev,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- err = asus_wmi_set_devstate(ASUS_WMI_DEVID_GPU_MUX, optimus, &result);
|
||||||
|
+ err = asus_wmi_set_devstate(asus->gpu_mux_dev, optimus, &result);
|
||||||
|
if (err) {
|
||||||
|
dev_err(dev, "Failed to set GPU MUX mode: %d\n", err);
|
||||||
|
return err;
|
||||||
|
@@ -4514,7 +4515,6 @@ static int asus_wmi_add(struct platform_device *pdev)
|
||||||
|
asus->egpu_enable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_EGPU);
|
||||||
|
asus->egpu_connect_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_EGPU_CONNECTED);
|
||||||
|
asus->dgpu_disable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_DGPU);
|
||||||
|
- asus->gpu_mux_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_MUX);
|
||||||
|
asus->kbd_rgb_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_MODE);
|
||||||
|
asus->kbd_rgb_state_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_STATE);
|
||||||
|
asus->ppt_pl2_sppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_PL2_SPPT);
|
||||||
|
@@ -4536,6 +4536,14 @@ static int asus_wmi_add(struct platform_device *pdev)
|
||||||
|
asus->mini_led_dev_id = ASUS_WMI_DEVID_MINI_LED_MODE2;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_MUX)) {
|
||||||
|
+ asus->gpu_mux_mode_available = true;
|
||||||
|
+ asus->gpu_mux_dev = ASUS_WMI_DEVID_GPU_MUX;
|
||||||
|
+ } else if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_MUX_VIVO)) {
|
||||||
|
+ asus->gpu_mux_mode_available = true;
|
||||||
|
+ asus->gpu_mux_dev = ASUS_WMI_DEVID_GPU_MUX_VIVO;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
err = fan_boost_mode_check_present(asus);
|
||||||
|
if (err)
|
||||||
|
goto fail_fan_boost_mode;
|
||||||
|
diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h
|
||||||
|
index 9cadce10ad9a..b48b024dd844 100644
|
||||||
|
--- a/include/linux/platform_data/x86/asus-wmi.h
|
||||||
|
+++ b/include/linux/platform_data/x86/asus-wmi.h
|
||||||
|
@@ -128,6 +128,7 @@
|
||||||
|
|
||||||
|
/* gpu mux switch, 0 = dGPU, 1 = Optimus */
|
||||||
|
#define ASUS_WMI_DEVID_GPU_MUX 0x00090016
|
||||||
|
+#define ASUS_WMI_DEVID_GPU_MUX_VIVO 0x00090026
|
||||||
|
|
||||||
|
/* TUF laptop RGB modes/colours */
|
||||||
|
#define ASUS_WMI_DEVID_TUF_RGB_MODE 0x00100056
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,74 @@
|
|||||||
|
From 9b038d6db81b457738cf65e43f401ccb8bf505e6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Luke D. Jones" <luke@ljones.dev>
|
||||||
|
Date: Sun, 10 Mar 2024 17:20:02 +1300
|
||||||
|
Subject: [PATCH 3/5] platform/x86: asus-wmi: add support variant of TUF RGB
|
||||||
|
|
||||||
|
Adds support for a second TUF RGB wmi call that some versions of the TUF
|
||||||
|
laptop come with. Also adjusts existing support to select whichever is
|
||||||
|
available.
|
||||||
|
|
||||||
|
Signed-off-by: Luke D. Jones <luke@ljones.dev>
|
||||||
|
---
|
||||||
|
drivers/platform/x86/asus-wmi.c | 12 +++++++++++-
|
||||||
|
include/linux/platform_data/x86/asus-wmi.h | 1 +
|
||||||
|
2 files changed, 12 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
|
||||||
|
index b9a2fb8007c0..e1100726de53 100644
|
||||||
|
--- a/drivers/platform/x86/asus-wmi.c
|
||||||
|
+++ b/drivers/platform/x86/asus-wmi.c
|
||||||
|
@@ -280,6 +280,7 @@ struct asus_wmi {
|
||||||
|
bool nv_temp_tgt_available;
|
||||||
|
|
||||||
|
bool kbd_rgb_mode_available;
|
||||||
|
+ u32 kbd_rgb_dev;
|
||||||
|
bool kbd_rgb_state_available;
|
||||||
|
|
||||||
|
bool throttle_thermal_policy_available;
|
||||||
|
@@ -870,6 +871,7 @@ static ssize_t kbd_rgb_mode_store(struct device *dev,
|
||||||
|
struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
u32 cmd, mode, r, g, b, speed;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
@@ -906,7 +908,7 @@ static ssize_t kbd_rgb_mode_store(struct device *dev,
|
||||||
|
speed = 0xeb;
|
||||||
|
}
|
||||||
|
|
||||||
|
- err = asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS, ASUS_WMI_DEVID_TUF_RGB_MODE,
|
||||||
|
+ err = asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS, asus->kbd_rgb_dev,
|
||||||
|
cmd | (mode << 8) | (r << 16) | (g << 24), b | (speed << 8), NULL);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
@@ -4544,6 +4546,14 @@ static int asus_wmi_add(struct platform_device *pdev)
|
||||||
|
asus->gpu_mux_dev = ASUS_WMI_DEVID_GPU_MUX_VIVO;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_MODE)) {
|
||||||
|
+ asus->kbd_rgb_mode_available = true;
|
||||||
|
+ asus->kbd_rgb_dev = ASUS_WMI_DEVID_TUF_RGB_MODE;
|
||||||
|
+ } else if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_MODE2)) {
|
||||||
|
+ asus->kbd_rgb_mode_available = true;
|
||||||
|
+ asus->kbd_rgb_dev = ASUS_WMI_DEVID_TUF_RGB_MODE2;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
err = fan_boost_mode_check_present(asus);
|
||||||
|
if (err)
|
||||||
|
goto fail_fan_boost_mode;
|
||||||
|
diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h
|
||||||
|
index b48b024dd844..3e9a01467c67 100644
|
||||||
|
--- a/include/linux/platform_data/x86/asus-wmi.h
|
||||||
|
+++ b/include/linux/platform_data/x86/asus-wmi.h
|
||||||
|
@@ -132,6 +132,7 @@
|
||||||
|
|
||||||
|
/* TUF laptop RGB modes/colours */
|
||||||
|
#define ASUS_WMI_DEVID_TUF_RGB_MODE 0x00100056
|
||||||
|
+#define ASUS_WMI_DEVID_TUF_RGB_MODE2 0x0010005A
|
||||||
|
|
||||||
|
/* TUF laptop RGB power/state */
|
||||||
|
#define ASUS_WMI_DEVID_TUF_RGB_STATE 0x00100057
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,139 @@
|
|||||||
|
From 1c0f375634b3ddbcf479c4ddb81639e397795802 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Luke D. Jones" <luke@ljones.dev>
|
||||||
|
Date: Sun, 10 Mar 2024 19:03:11 +1300
|
||||||
|
Subject: [PATCH 4/5] platform/x86: asus-wmi: support toggling POST sound
|
||||||
|
|
||||||
|
Add support for toggling the BIOS POST sound on some ASUS laptops.
|
||||||
|
|
||||||
|
Signed-off-by: Luke D. Jones <luke@ljones.dev>
|
||||||
|
---
|
||||||
|
.../ABI/testing/sysfs-platform-asus-wmi | 7 +++
|
||||||
|
drivers/platform/x86/asus-wmi.c | 54 +++++++++++++++++++
|
||||||
|
include/linux/platform_data/x86/asus-wmi.h | 3 ++
|
||||||
|
3 files changed, 64 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/Documentation/ABI/testing/sysfs-platform-asus-wmi b/Documentation/ABI/testing/sysfs-platform-asus-wmi
|
||||||
|
index e32b4f0ae15f..f3c53b7453f0 100644
|
||||||
|
--- a/Documentation/ABI/testing/sysfs-platform-asus-wmi
|
||||||
|
+++ b/Documentation/ABI/testing/sysfs-platform-asus-wmi
|
||||||
|
@@ -194,3 +194,10 @@ Contact: "Luke Jones" <luke@ljones.dev>
|
||||||
|
Description:
|
||||||
|
Set the target temperature limit of the Nvidia dGPU:
|
||||||
|
* min=75, max=87
|
||||||
|
+
|
||||||
|
+What: /sys/devices/platform/<platform>/boot_sound
|
||||||
|
+Date: Jun 2023
|
||||||
|
+KernelVersion: 6.9
|
||||||
|
+Contact: "Luke Jones" <luke@ljones.dev>
|
||||||
|
+Description:
|
||||||
|
+ Set if the BIOS POST sound is played on boot.
|
||||||
|
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
|
||||||
|
index e1100726de53..e4341abb71e0 100644
|
||||||
|
--- a/drivers/platform/x86/asus-wmi.c
|
||||||
|
+++ b/drivers/platform/x86/asus-wmi.c
|
||||||
|
@@ -297,6 +297,7 @@ struct asus_wmi {
|
||||||
|
// The RSOC controls the maximum charging percentage.
|
||||||
|
bool battery_rsoc_available;
|
||||||
|
|
||||||
|
+ bool boot_sound_available;
|
||||||
|
bool panel_overdrive_available;
|
||||||
|
bool mini_led_mode_available;
|
||||||
|
u32 mini_led_dev_id;
|
||||||
|
@@ -2106,6 +2107,55 @@ static ssize_t panel_od_store(struct device *dev,
|
||||||
|
}
|
||||||
|
static DEVICE_ATTR_RW(panel_od);
|
||||||
|
|
||||||
|
+/* Bootup sound ***************************************************************/
|
||||||
|
+
|
||||||
|
+static ssize_t boot_sound_show(struct device *dev,
|
||||||
|
+ struct device_attribute *attr, char *buf)
|
||||||
|
+{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
+ int result;
|
||||||
|
+
|
||||||
|
+ result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_BOOT_SOUND);
|
||||||
|
+ if (result < 0)
|
||||||
|
+ return result;
|
||||||
|
+
|
||||||
|
+ return sysfs_emit(buf, "%d\n", result);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static ssize_t boot_sound_store(struct device *dev,
|
||||||
|
+ struct device_attribute *attr,
|
||||||
|
+ const char *buf, size_t count)
|
||||||
|
+{
|
||||||
|
+ int result, err;
|
||||||
|
+ u32 snd;
|
||||||
|
+
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
+
|
||||||
|
+ result = kstrtou32(buf, 10, &snd);
|
||||||
|
+ if (result)
|
||||||
|
+ return result;
|
||||||
|
+
|
||||||
|
+ if (snd > 1)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BOOT_SOUND, snd, &result);
|
||||||
|
+
|
||||||
|
+ if (err) {
|
||||||
|
+ pr_warn("Failed to set boot sound: %d\n", err);
|
||||||
|
+ return err;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (result > 1) {
|
||||||
|
+ pr_warn("Failed to set panel boot sound (result): 0x%x\n", result);
|
||||||
|
+ return -EIO;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ sysfs_notify(&asus->platform_device->dev.kobj, NULL, "boot_sound");
|
||||||
|
+
|
||||||
|
+ return count;
|
||||||
|
+}
|
||||||
|
+static DEVICE_ATTR_RW(boot_sound);
|
||||||
|
+
|
||||||
|
/* Mini-LED mode **************************************************************/
|
||||||
|
static ssize_t mini_led_mode_show(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
@@ -4203,6 +4253,7 @@ static struct attribute *platform_attributes[] = {
|
||||||
|
&dev_attr_ppt_platform_sppt.attr,
|
||||||
|
&dev_attr_nv_dynamic_boost.attr,
|
||||||
|
&dev_attr_nv_temp_target.attr,
|
||||||
|
+ &dev_attr_boot_sound.attr,
|
||||||
|
&dev_attr_panel_od.attr,
|
||||||
|
&dev_attr_mini_led_mode.attr,
|
||||||
|
&dev_attr_available_mini_led_mode.attr,
|
||||||
|
@@ -4255,6 +4306,8 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj,
|
||||||
|
ok = asus->nv_dyn_boost_available;
|
||||||
|
else if (attr == &dev_attr_nv_temp_target.attr)
|
||||||
|
ok = asus->nv_temp_tgt_available;
|
||||||
|
+ else if (attr == &dev_attr_boot_sound.attr)
|
||||||
|
+ ok = asus->boot_sound_available;
|
||||||
|
else if (attr == &dev_attr_panel_od.attr)
|
||||||
|
ok = asus->panel_overdrive_available;
|
||||||
|
else if (attr == &dev_attr_mini_led_mode.attr)
|
||||||
|
@@ -4526,6 +4579,7 @@ static int asus_wmi_add(struct platform_device *pdev)
|
||||||
|
asus->ppt_plat_sppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_PLAT_SPPT);
|
||||||
|
asus->nv_dyn_boost_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_NV_DYN_BOOST);
|
||||||
|
asus->nv_temp_tgt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_NV_THERM_TARGET);
|
||||||
|
+ asus->boot_sound_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_BOOT_SOUND);
|
||||||
|
asus->panel_overdrive_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PANEL_OD);
|
||||||
|
asus->ally_mcu_usb_switch = acpi_has_method(NULL, ASUS_USB0_PWR_EC0_CSEE)
|
||||||
|
&& dmi_match(DMI_BOARD_NAME, "RC71L");
|
||||||
|
diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h
|
||||||
|
index 3e9a01467c67..3eb5cd6773ad 100644
|
||||||
|
--- a/include/linux/platform_data/x86/asus-wmi.h
|
||||||
|
+++ b/include/linux/platform_data/x86/asus-wmi.h
|
||||||
|
@@ -137,6 +137,9 @@
|
||||||
|
/* TUF laptop RGB power/state */
|
||||||
|
#define ASUS_WMI_DEVID_TUF_RGB_STATE 0x00100057
|
||||||
|
|
||||||
|
+/* Bootup sound control */
|
||||||
|
+#define ASUS_WMI_DEVID_BOOT_SOUND 0x00130022
|
||||||
|
+
|
||||||
|
/* DSTS masks */
|
||||||
|
#define ASUS_WMI_DSTS_STATUS_BIT 0x00000001
|
||||||
|
#define ASUS_WMI_DSTS_UNKNOWN_BIT 0x00000002
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,342 @@
|
|||||||
|
From 6045f385154a2c0a4aaa692d13bb0fa14bbe1d12 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Luke D. Jones" <luke@ljones.dev>
|
||||||
|
Date: Mon, 11 Mar 2024 12:15:46 +1300
|
||||||
|
Subject: [PATCH 5/5] platform/x86: asus-wmi: store a min default for ppt
|
||||||
|
options
|
||||||
|
|
||||||
|
Laptops with any of the ppt or nv tunables default to the minimum setting
|
||||||
|
on boot so we can safely assume a stored value is correct.
|
||||||
|
|
||||||
|
This patch adds storing of those values in the local struct, and enables
|
||||||
|
reading of those values back.
|
||||||
|
|
||||||
|
Secondary to the above it renames some internal variables to be more
|
||||||
|
consistent (which makes code grepping show all related parts)
|
||||||
|
|
||||||
|
Signed-off-by: Luke D. Jones <luke@ljones.dev>
|
||||||
|
---
|
||||||
|
drivers/platform/x86/asus-wmi.c | 141 +++++++++++++++++++++++++-------
|
||||||
|
1 file changed, 111 insertions(+), 30 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
|
||||||
|
index e4341abb71e0..482e23b55e1e 100644
|
||||||
|
--- a/drivers/platform/x86/asus-wmi.c
|
||||||
|
+++ b/drivers/platform/x86/asus-wmi.c
|
||||||
|
@@ -272,12 +272,19 @@ struct asus_wmi {
|
||||||
|
|
||||||
|
/* Tunables provided by ASUS for gaming laptops */
|
||||||
|
bool ppt_pl2_sppt_available;
|
||||||
|
+ u32 ppt_pl2_sppt;
|
||||||
|
bool ppt_pl1_spl_available;
|
||||||
|
+ u32 ppt_pl1_spl;
|
||||||
|
bool ppt_apu_sppt_available;
|
||||||
|
- bool ppt_plat_sppt_available;
|
||||||
|
+ u32 ppt_apu_sppt;
|
||||||
|
+ bool ppt_platform_sppt_available;
|
||||||
|
+ u32 ppt_platform_sppt;
|
||||||
|
bool ppt_fppt_available;
|
||||||
|
- bool nv_dyn_boost_available;
|
||||||
|
- bool nv_temp_tgt_available;
|
||||||
|
+ u32 ppt_fppt;
|
||||||
|
+ bool nv_dynamic_boost_available;
|
||||||
|
+ u32 nv_dynamic_boost;
|
||||||
|
+ bool nv_temp_target_available;
|
||||||
|
+ u32 nv_temp_target;
|
||||||
|
|
||||||
|
bool kbd_rgb_mode_available;
|
||||||
|
u32 kbd_rgb_dev;
|
||||||
|
@@ -999,11 +1006,10 @@ static ssize_t ppt_pl2_sppt_store(struct device *dev,
|
||||||
|
struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
int result, err;
|
||||||
|
u32 value;
|
||||||
|
|
||||||
|
- struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
-
|
||||||
|
result = kstrtou32(buf, 10, &value);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
@@ -1022,22 +1028,31 @@ static ssize_t ppt_pl2_sppt_store(struct device *dev,
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ asus->ppt_pl2_sppt = value;
|
||||||
|
sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_pl2_sppt");
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
-static DEVICE_ATTR_WO(ppt_pl2_sppt);
|
||||||
|
+
|
||||||
|
+static ssize_t ppt_pl2_sppt_show(struct device *dev,
|
||||||
|
+ struct device_attribute *attr,
|
||||||
|
+ char *buf)
|
||||||
|
+{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
+
|
||||||
|
+ return sysfs_emit(buf, "%d\n", asus->ppt_pl2_sppt);
|
||||||
|
+}
|
||||||
|
+static DEVICE_ATTR_RW(ppt_pl2_sppt);
|
||||||
|
|
||||||
|
/* Tunable: PPT, Intel=PL1, AMD=SPL ******************************************/
|
||||||
|
static ssize_t ppt_pl1_spl_store(struct device *dev,
|
||||||
|
struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
int result, err;
|
||||||
|
u32 value;
|
||||||
|
|
||||||
|
- struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
-
|
||||||
|
result = kstrtou32(buf, 10, &value);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
@@ -1056,22 +1071,30 @@ static ssize_t ppt_pl1_spl_store(struct device *dev,
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ asus->ppt_pl1_spl = value;
|
||||||
|
sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_pl1_spl");
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
-static DEVICE_ATTR_WO(ppt_pl1_spl);
|
||||||
|
+static ssize_t ppt_pl1_spl_show(struct device *dev,
|
||||||
|
+ struct device_attribute *attr,
|
||||||
|
+ char *buf)
|
||||||
|
+{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
+
|
||||||
|
+ return sysfs_emit(buf, "%d\n", asus->ppt_pl1_spl);
|
||||||
|
+}
|
||||||
|
+static DEVICE_ATTR_RW(ppt_pl1_spl);
|
||||||
|
|
||||||
|
/* Tunable: PPT APU FPPT ******************************************************/
|
||||||
|
static ssize_t ppt_fppt_store(struct device *dev,
|
||||||
|
struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
int result, err;
|
||||||
|
u32 value;
|
||||||
|
|
||||||
|
- struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
-
|
||||||
|
result = kstrtou32(buf, 10, &value);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
@@ -1090,22 +1113,31 @@ static ssize_t ppt_fppt_store(struct device *dev,
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ asus->ppt_fppt = value;
|
||||||
|
sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_fpu_sppt");
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
-static DEVICE_ATTR_WO(ppt_fppt);
|
||||||
|
+
|
||||||
|
+static ssize_t ppt_fppt_show(struct device *dev,
|
||||||
|
+ struct device_attribute *attr,
|
||||||
|
+ char *buf)
|
||||||
|
+{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
+
|
||||||
|
+ return sysfs_emit(buf, "%d\n", asus->ppt_fppt);
|
||||||
|
+}
|
||||||
|
+static DEVICE_ATTR_RW(ppt_fppt);
|
||||||
|
|
||||||
|
/* Tunable: PPT APU SPPT *****************************************************/
|
||||||
|
static ssize_t ppt_apu_sppt_store(struct device *dev,
|
||||||
|
struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
int result, err;
|
||||||
|
u32 value;
|
||||||
|
|
||||||
|
- struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
-
|
||||||
|
result = kstrtou32(buf, 10, &value);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
@@ -1124,22 +1156,31 @@ static ssize_t ppt_apu_sppt_store(struct device *dev,
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ asus->ppt_apu_sppt = value;
|
||||||
|
sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_apu_sppt");
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
-static DEVICE_ATTR_WO(ppt_apu_sppt);
|
||||||
|
+
|
||||||
|
+static ssize_t ppt_apu_sppt_show(struct device *dev,
|
||||||
|
+ struct device_attribute *attr,
|
||||||
|
+ char *buf)
|
||||||
|
+{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
+
|
||||||
|
+ return sysfs_emit(buf, "%d\n", asus->ppt_apu_sppt);
|
||||||
|
+}
|
||||||
|
+static DEVICE_ATTR_RW(ppt_apu_sppt);
|
||||||
|
|
||||||
|
/* Tunable: PPT platform SPPT ************************************************/
|
||||||
|
static ssize_t ppt_platform_sppt_store(struct device *dev,
|
||||||
|
struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
int result, err;
|
||||||
|
u32 value;
|
||||||
|
|
||||||
|
- struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
-
|
||||||
|
result = kstrtou32(buf, 10, &value);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
@@ -1158,22 +1199,31 @@ static ssize_t ppt_platform_sppt_store(struct device *dev,
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ asus->ppt_platform_sppt = value;
|
||||||
|
sysfs_notify(&asus->platform_device->dev.kobj, NULL, "ppt_platform_sppt");
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
-static DEVICE_ATTR_WO(ppt_platform_sppt);
|
||||||
|
+
|
||||||
|
+static ssize_t ppt_platform_sppt_show(struct device *dev,
|
||||||
|
+ struct device_attribute *attr,
|
||||||
|
+ char *buf)
|
||||||
|
+{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
+
|
||||||
|
+ return sysfs_emit(buf, "%d\n", asus->ppt_platform_sppt);
|
||||||
|
+}
|
||||||
|
+static DEVICE_ATTR_RW(ppt_platform_sppt);
|
||||||
|
|
||||||
|
/* Tunable: NVIDIA dynamic boost *********************************************/
|
||||||
|
static ssize_t nv_dynamic_boost_store(struct device *dev,
|
||||||
|
struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
int result, err;
|
||||||
|
u32 value;
|
||||||
|
|
||||||
|
- struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
-
|
||||||
|
result = kstrtou32(buf, 10, &value);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
@@ -1192,22 +1242,31 @@ static ssize_t nv_dynamic_boost_store(struct device *dev,
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ asus->nv_dynamic_boost = value;
|
||||||
|
sysfs_notify(&asus->platform_device->dev.kobj, NULL, "nv_dynamic_boost");
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
-static DEVICE_ATTR_WO(nv_dynamic_boost);
|
||||||
|
+
|
||||||
|
+static ssize_t nv_dynamic_boost_show(struct device *dev,
|
||||||
|
+ struct device_attribute *attr,
|
||||||
|
+ char *buf)
|
||||||
|
+{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
+
|
||||||
|
+ return sysfs_emit(buf, "%d\n", asus->nv_dynamic_boost);
|
||||||
|
+}
|
||||||
|
+static DEVICE_ATTR_RW(nv_dynamic_boost);
|
||||||
|
|
||||||
|
/* Tunable: NVIDIA temperature target ****************************************/
|
||||||
|
static ssize_t nv_temp_target_store(struct device *dev,
|
||||||
|
struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
int result, err;
|
||||||
|
u32 value;
|
||||||
|
|
||||||
|
- struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
-
|
||||||
|
result = kstrtou32(buf, 10, &value);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
@@ -1226,11 +1285,21 @@ static ssize_t nv_temp_target_store(struct device *dev,
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ asus->nv_temp_target = value;
|
||||||
|
sysfs_notify(&asus->platform_device->dev.kobj, NULL, "nv_temp_target");
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
-static DEVICE_ATTR_WO(nv_temp_target);
|
||||||
|
+
|
||||||
|
+static ssize_t nv_temp_target_show(struct device *dev,
|
||||||
|
+ struct device_attribute *attr,
|
||||||
|
+ char *buf)
|
||||||
|
+{
|
||||||
|
+ struct asus_wmi *asus = dev_get_drvdata(dev);
|
||||||
|
+
|
||||||
|
+ return sysfs_emit(buf, "%d\n", asus->nv_temp_target);
|
||||||
|
+}
|
||||||
|
+static DEVICE_ATTR_RW(nv_temp_target);
|
||||||
|
|
||||||
|
/* Battery ********************************************************************/
|
||||||
|
|
||||||
|
@@ -4301,11 +4370,11 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj,
|
||||||
|
else if (attr == &dev_attr_ppt_apu_sppt.attr)
|
||||||
|
ok = asus->ppt_apu_sppt_available;
|
||||||
|
else if (attr == &dev_attr_ppt_platform_sppt.attr)
|
||||||
|
- ok = asus->ppt_plat_sppt_available;
|
||||||
|
+ ok = asus->ppt_platform_sppt_available;
|
||||||
|
else if (attr == &dev_attr_nv_dynamic_boost.attr)
|
||||||
|
- ok = asus->nv_dyn_boost_available;
|
||||||
|
+ ok = asus->nv_dynamic_boost_available;
|
||||||
|
else if (attr == &dev_attr_nv_temp_target.attr)
|
||||||
|
- ok = asus->nv_temp_tgt_available;
|
||||||
|
+ ok = asus->nv_temp_target_available;
|
||||||
|
else if (attr == &dev_attr_boot_sound.attr)
|
||||||
|
ok = asus->boot_sound_available;
|
||||||
|
else if (attr == &dev_attr_panel_od.attr)
|
||||||
|
@@ -4566,6 +4635,15 @@ static int asus_wmi_add(struct platform_device *pdev)
|
||||||
|
if (err)
|
||||||
|
goto fail_platform;
|
||||||
|
|
||||||
|
+ /* ensure defaults for tunables */
|
||||||
|
+ asus->ppt_pl2_sppt = 5;
|
||||||
|
+ asus->ppt_pl1_spl = 5;
|
||||||
|
+ asus->ppt_apu_sppt = 5;
|
||||||
|
+ asus->ppt_platform_sppt = 5;
|
||||||
|
+ asus->ppt_fppt = 5;
|
||||||
|
+ asus->nv_dynamic_boost = 5;
|
||||||
|
+ asus->nv_temp_target = 75;
|
||||||
|
+
|
||||||
|
asus->charge_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CHARGE_MODE);
|
||||||
|
asus->egpu_enable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_EGPU);
|
||||||
|
asus->egpu_connect_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_EGPU_CONNECTED);
|
||||||
|
@@ -4576,9 +4654,12 @@ static int asus_wmi_add(struct platform_device *pdev)
|
||||||
|
asus->ppt_pl1_spl_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_PL1_SPL);
|
||||||
|
asus->ppt_fppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_FPPT);
|
||||||
|
asus->ppt_apu_sppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_APU_SPPT);
|
||||||
|
- asus->ppt_plat_sppt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PPT_PLAT_SPPT);
|
||||||
|
- asus->nv_dyn_boost_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_NV_DYN_BOOST);
|
||||||
|
- asus->nv_temp_tgt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_NV_THERM_TARGET);
|
||||||
|
+ asus->ppt_platform_sppt_available = asus_wmi_dev_is_present(asus,
|
||||||
|
+ ASUS_WMI_DEVID_PPT_PLAT_SPPT);
|
||||||
|
+ asus->nv_dynamic_boost_available = asus_wmi_dev_is_present(asus,
|
||||||
|
+ ASUS_WMI_DEVID_NV_DYN_BOOST);
|
||||||
|
+ asus->nv_temp_target_available = asus_wmi_dev_is_present(asus,
|
||||||
|
+ ASUS_WMI_DEVID_NV_THERM_TARGET);
|
||||||
|
asus->boot_sound_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_BOOT_SOUND);
|
||||||
|
asus->panel_overdrive_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PANEL_OD);
|
||||||
|
asus->ally_mcu_usb_switch = acpi_has_method(NULL, ASUS_USB0_PWR_EC0_CSEE)
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -1,12 +0,0 @@
|
|||||||
diff --git a/drivers/hwmon/nct6775-platform.c b/drivers/hwmon/nct6775-platform.c
|
|
||||||
index 81bf03d..96d875b 100644
|
|
||||||
--- a/drivers/hwmon/nct6775-platform.c
|
|
||||||
+++ b/drivers/hwmon/nct6775-platform.c
|
|
||||||
@@ -1359,6 +1359,7 @@ static const char * const asus_msi_boards[] = {
|
|
||||||
"ProArt X670E-CREATOR WIFI",
|
|
||||||
"ProArt Z690-CREATOR WIFI",
|
|
||||||
"ProArt Z790-CREATOR WIFI",
|
|
||||||
+ "RC71L",
|
|
||||||
"ROG CROSSHAIR X670E EXTREME",
|
|
||||||
"ROG CROSSHAIR X670E GENE",
|
|
||||||
"ROG CROSSHAIR X670E HERO",
|
|
@ -1,390 +0,0 @@
|
|||||||
From 76556b655f7b50afe5c58006f44221900e5711a9 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Luke D. Jones" <luke@ljones.dev>
|
|
||||||
Date: Wed, 23 Aug 2023 11:05:59 +1200
|
|
||||||
Subject: [PATCH v2] ALSA: hda: cs35l41: Support ASUS 2023 laptops with missing
|
|
||||||
DSD
|
|
||||||
|
|
||||||
Support adding the missing DSD properties required for ASUS ROG 2023
|
|
||||||
laptops and other ASUS laptops to properly utilise the cs35l41.
|
|
||||||
|
|
||||||
The currently added laptops are:
|
|
||||||
- ASUS GS650P, i2c
|
|
||||||
- ASUS GA402X, i2c
|
|
||||||
- ASUS GU604V, spi
|
|
||||||
- ASUS GU603V, spi
|
|
||||||
- ASUS GV601V, spi
|
|
||||||
- ASUS GZ301V, spi
|
|
||||||
- ASUS ROG ALLY, i2c
|
|
||||||
- ASUS G614J, spi
|
|
||||||
- ASUS G634J, spi
|
|
||||||
- ASUS G614JI, spi
|
|
||||||
- ASUS G713P, i2c
|
|
||||||
- ASUS H7604JV, spi
|
|
||||||
|
|
||||||
The SPI connected amps may be required to use an external DSD patch
|
|
||||||
to fix or add the "cs-gpios" property.
|
|
||||||
|
|
||||||
Co-developed-by: Jonathan LoBue <jlobue10@gmail.com>
|
|
||||||
Signed-off-by: Jonathan LoBue <jlobue10@gmail.com>
|
|
||||||
Co-developed-by: Luke D. Jones <luke@ljones.dev>
|
|
||||||
Signed-off-by: Luke D. Jones <luke@ljones.dev>
|
|
||||||
---
|
|
||||||
sound/pci/hda/cs35l41_hda_property.c | 57 ++++++++++++++++++++++++++++
|
|
||||||
1 file changed, 57 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/sound/pci/hda/cs35l41_hda_property.c b/sound/pci/hda/cs35l41_hda_property.c
|
|
||||||
index c83328971728..de0802859849 100644
|
|
||||||
--- a/sound/pci/hda/cs35l41_hda_property.c
|
|
||||||
+++ b/sound/pci/hda/cs35l41_hda_property.c
|
|
||||||
@@ -76,6 +76,49 @@ static int hp_vision_acpi_fix(struct cs35l41_hda *cs35l41, struct device *physde
|
|
||||||
hw_cfg->bst_ind = 1000;
|
|
||||||
hw_cfg->bst_ipk = 4500;
|
|
||||||
hw_cfg->bst_cap = 24;
|
|
||||||
+
|
|
||||||
+ hw_cfg->valid = true;
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * The CSC3551 is used in almost the entire ROG laptop range in 2023, this is likely to
|
|
||||||
+ * also include many non ROG labelled laptops. It is also used with either I2C connection or
|
|
||||||
+ * SPI connection. The SPI connected versions may be missing a chip select GPIO and require
|
|
||||||
+ * an DSD table patch.
|
|
||||||
+ */
|
|
||||||
+static int asus_rog_2023_no_acpi(struct cs35l41_hda *cs35l41, struct device *physdev, int id,
|
|
||||||
+ const char *hid)
|
|
||||||
+{
|
|
||||||
+ struct cs35l41_hw_cfg *hw_cfg = &cs35l41->hw_cfg;
|
|
||||||
+ int reset_gpio = 0;
|
|
||||||
+ int spkr_gpio = 2;
|
|
||||||
+
|
|
||||||
+ /* check SPI or I2C address to assign the index */
|
|
||||||
+ cs35l41->index = (id == 0 || id == 0x40) ? 0 : 1;
|
|
||||||
+ cs35l41->channel_index = 0;
|
|
||||||
+ hw_cfg->spk_pos = cs35l41->index;
|
|
||||||
+ hw_cfg->bst_type = CS35L41_EXT_BOOST;
|
|
||||||
+ hw_cfg->gpio1.func = CS35l41_VSPK_SWITCH;
|
|
||||||
+ hw_cfg->gpio1.valid = true;
|
|
||||||
+ hw_cfg->gpio2.func = CS35L41_INTERRUPT;
|
|
||||||
+ hw_cfg->gpio2.valid = true;
|
|
||||||
+
|
|
||||||
+ if (strcmp(cs35l41->acpi_subsystem_id, "10431483") == 0)
|
|
||||||
+ spkr_gpio = 1;
|
|
||||||
+ cs35l41->speaker_id = cs35l41_get_speaker_id(physdev, 0, 0, spkr_gpio);
|
|
||||||
+
|
|
||||||
+ if (strcmp(cs35l41->acpi_subsystem_id, "10431473") == 0
|
|
||||||
+ || strcmp(cs35l41->acpi_subsystem_id, "10431483") == 0
|
|
||||||
+ || strcmp(cs35l41->acpi_subsystem_id, "10431493") == 0
|
|
||||||
+ || strcmp(cs35l41->acpi_subsystem_id, "10431CAF") == 0
|
|
||||||
+ || strcmp(cs35l41->acpi_subsystem_id, "10431CCF") == 0
|
|
||||||
+ || strcmp(cs35l41->acpi_subsystem_id, "10431E02") == 0) {
|
|
||||||
+ reset_gpio = 1;
|
|
||||||
+ }
|
|
||||||
+ cs35l41->reset_gpio = gpiod_get_index(physdev, NULL, reset_gpio, GPIOD_OUT_HIGH);
|
|
||||||
+
|
|
||||||
hw_cfg->valid = true;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
@@ -92,6 +135,20 @@ static const struct cs35l41_prop_model cs35l41_prop_model_table[] = {
|
|
||||||
{ "CLSA0100", NULL, lenovo_legion_no_acpi },
|
|
||||||
{ "CLSA0101", NULL, lenovo_legion_no_acpi },
|
|
||||||
{ "CSC3551", "103C89C6", hp_vision_acpi_fix },
|
|
||||||
+ { "CSC3551", "10431433", asus_rog_2023_no_acpi }, // GS650P i2c
|
|
||||||
+ { "CSC3551", "10431463", asus_rog_2023_no_acpi }, // GA402X/N i2c, rst=0
|
|
||||||
+ { "CSC3551", "10431473", asus_rog_2023_no_acpi }, // GU604V spi, rst=1
|
|
||||||
+ { "CSC3551", "10431483", asus_rog_2023_no_acpi }, // GU603V spi, rst=1, spkr=1
|
|
||||||
+ { "CSC3551", "10431493", asus_rog_2023_no_acpi }, // GV601V spi, rst=1
|
|
||||||
+ { "CSC3551", "10431573", asus_rog_2023_no_acpi }, // GZ301V spi, rst=0
|
|
||||||
+ { "CSC3551", "104317F3", asus_rog_2023_no_acpi }, // ROG ALLY i2c, rst=0
|
|
||||||
+ { "CSC3551", "10431B93", asus_rog_2023_no_acpi }, // G614J spi, rst=0
|
|
||||||
+ { "CSC3551", "10431C9F", asus_rog_2023_no_acpi }, // G614JI spi, rst=0
|
|
||||||
+ { "CSC3551", "10431CAF", asus_rog_2023_no_acpi }, // G634J spi, rst=1
|
|
||||||
+ { "CSC3551", "10431CCF", asus_rog_2023_no_acpi }, // G814J spi, rst=1
|
|
||||||
+ { "CSC3551", "10431D1F", asus_rog_2023_no_acpi }, // G713P i2c, rst=0
|
|
||||||
+ { "CSC3551", "10431E02", asus_rog_2023_no_acpi }, // UX3042Z spi, rst=1
|
|
||||||
+ { "CSC3551", "10431F1F", asus_rog_2023_no_acpi }, // H7604JV spi, rst=0
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
||||||
--
|
|
||||||
2.41.0
|
|
||||||
|
|
||||||
From b35a4c957b3f0e5b4c7c73dec4fe3a5b9dbc4873 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Luke D. Jones" <luke@ljones.dev>
|
|
||||||
Date: Sun, 30 Apr 2023 10:56:34 +1200
|
|
||||||
Subject: [PATCH v6 1/1] platform/x86: asus-wmi: add support for ASUS screenpad
|
|
||||||
|
|
||||||
Add support for the WMI methods used to turn off and adjust the
|
|
||||||
brightness of the secondary "screenpad" device found on some high-end
|
|
||||||
ASUS laptops like the GX650P series and others.
|
|
||||||
|
|
||||||
There are some small quirks with this device when considering only the
|
|
||||||
raw WMI methods:
|
|
||||||
1. The Off method can only switch the device off
|
|
||||||
2. Changing the brightness turns the device back on
|
|
||||||
3. To turn the device back on the brightness must be > 1
|
|
||||||
4. When the device is off the brightness can't be changed (so it is
|
|
||||||
stored by the driver if device is off).
|
|
||||||
5. Booting with a value of 0 brightness (retained by bios) means the bios
|
|
||||||
will set a value of >0 <15
|
|
||||||
6. When the device is off it is "unplugged"
|
|
||||||
|
|
||||||
asus_wmi sets the minimum brightness as 20 in general use, and 60 for
|
|
||||||
booting with values <= min.
|
|
||||||
|
|
||||||
The ACPI methods are used in a new backlight device named asus_screenpad.
|
|
||||||
|
|
||||||
Signed-off-by: Luke D. Jones <luke@ljones.dev>
|
|
||||||
---
|
|
||||||
drivers/platform/x86/asus-wmi.c | 133 +++++++++++++++++++++
|
|
||||||
drivers/platform/x86/asus-wmi.h | 1 +
|
|
||||||
include/linux/platform_data/x86/asus-wmi.h | 4 +
|
|
||||||
3 files changed, 138 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
|
|
||||||
index f54178d6f780..0b13be703856 100644
|
|
||||||
--- a/drivers/platform/x86/asus-wmi.c
|
|
||||||
+++ b/drivers/platform/x86/asus-wmi.c
|
|
||||||
@@ -25,6 +25,7 @@
|
|
||||||
#include <linux/input/sparse-keymap.h>
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/leds.h>
|
|
||||||
+#include <linux/minmax.h>
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <linux/pci.h>
|
|
||||||
#include <linux/pci_hotplug.h>
|
|
||||||
@@ -127,6 +128,10 @@ module_param(fnlock_default, bool, 0444);
|
|
||||||
#define NVIDIA_TEMP_MIN 75
|
|
||||||
#define NVIDIA_TEMP_MAX 87
|
|
||||||
|
|
||||||
+#define ASUS_SCREENPAD_BRIGHT_MIN 20
|
|
||||||
+#define ASUS_SCREENPAD_BRIGHT_MAX 255
|
|
||||||
+#define ASUS_SCREENPAD_BRIGHT_DEFAULT 60
|
|
||||||
+
|
|
||||||
static const char * const ashs_ids[] = { "ATK4001", "ATK4002", NULL };
|
|
||||||
|
|
||||||
static int throttle_thermal_policy_write(struct asus_wmi *);
|
|
||||||
@@ -212,6 +217,7 @@ struct asus_wmi {
|
|
||||||
|
|
||||||
struct input_dev *inputdev;
|
|
||||||
struct backlight_device *backlight_device;
|
|
||||||
+ struct backlight_device *screenpad_backlight_device;
|
|
||||||
struct platform_device *platform_device;
|
|
||||||
|
|
||||||
struct led_classdev wlan_led;
|
|
||||||
@@ -3776,6 +3782,124 @@ static int is_display_toggle(int code)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
+/* Screenpad backlight *******************************************************/
|
|
||||||
+
|
|
||||||
+static int read_screenpad_backlight_power(struct asus_wmi *asus)
|
|
||||||
+{
|
|
||||||
+ int ret;
|
|
||||||
+
|
|
||||||
+ ret = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_SCREENPAD_POWER);
|
|
||||||
+ if (ret < 0)
|
|
||||||
+ return ret;
|
|
||||||
+ /* 1 == powered */
|
|
||||||
+ return ret ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int read_screenpad_brightness(struct backlight_device *bd)
|
|
||||||
+{
|
|
||||||
+ struct asus_wmi *asus = bl_get_data(bd);
|
|
||||||
+ u32 retval;
|
|
||||||
+ int err;
|
|
||||||
+
|
|
||||||
+ err = read_screenpad_backlight_power(asus);
|
|
||||||
+ if (err < 0)
|
|
||||||
+ return err;
|
|
||||||
+ /* The device brightness can only be read if powered, so return stored */
|
|
||||||
+ if (err == FB_BLANK_POWERDOWN)
|
|
||||||
+ return asus->driver->screenpad_brightness - ASUS_SCREENPAD_BRIGHT_MIN;
|
|
||||||
+
|
|
||||||
+ err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT, &retval);
|
|
||||||
+ if (err < 0)
|
|
||||||
+ return err;
|
|
||||||
+
|
|
||||||
+ return (retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK) - ASUS_SCREENPAD_BRIGHT_MIN;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int update_screenpad_bl_status(struct backlight_device *bd)
|
|
||||||
+{
|
|
||||||
+ struct asus_wmi *asus = bl_get_data(bd);
|
|
||||||
+ int power, err = 0;
|
|
||||||
+ u32 ctrl_param;
|
|
||||||
+
|
|
||||||
+ power = read_screenpad_backlight_power(asus);
|
|
||||||
+ if (power < 0)
|
|
||||||
+ return power;
|
|
||||||
+
|
|
||||||
+ if (bd->props.power != power) {
|
|
||||||
+ if (power != FB_BLANK_UNBLANK) {
|
|
||||||
+ /* Only brightness > 0 can power it back on */
|
|
||||||
+ ctrl_param = asus->driver->screenpad_brightness - ASUS_SCREENPAD_BRIGHT_MIN;
|
|
||||||
+ err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_LIGHT,
|
|
||||||
+ ctrl_param, NULL);
|
|
||||||
+ } else {
|
|
||||||
+ err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_POWER, 0, NULL);
|
|
||||||
+ }
|
|
||||||
+ } else if (power == FB_BLANK_UNBLANK) {
|
|
||||||
+ /* Only set brightness if powered on or we get invalid/unsync state */
|
|
||||||
+ ctrl_param = bd->props.brightness + ASUS_SCREENPAD_BRIGHT_MIN;
|
|
||||||
+ err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_LIGHT, ctrl_param, NULL);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Ensure brightness is stored to turn back on with */
|
|
||||||
+ if (err == 0)
|
|
||||||
+ asus->driver->screenpad_brightness = bd->props.brightness + ASUS_SCREENPAD_BRIGHT_MIN;
|
|
||||||
+
|
|
||||||
+ return err;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct backlight_ops asus_screenpad_bl_ops = {
|
|
||||||
+ .get_brightness = read_screenpad_brightness,
|
|
||||||
+ .update_status = update_screenpad_bl_status,
|
|
||||||
+ .options = BL_CORE_SUSPENDRESUME,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static int asus_screenpad_init(struct asus_wmi *asus)
|
|
||||||
+{
|
|
||||||
+ struct backlight_device *bd;
|
|
||||||
+ struct backlight_properties props;
|
|
||||||
+ int err, power;
|
|
||||||
+ int brightness = 0;
|
|
||||||
+
|
|
||||||
+ power = read_screenpad_backlight_power(asus);
|
|
||||||
+ if (power < 0)
|
|
||||||
+ return power;
|
|
||||||
+
|
|
||||||
+ if (power != FB_BLANK_POWERDOWN) {
|
|
||||||
+ err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT, &brightness);
|
|
||||||
+ if (err < 0)
|
|
||||||
+ return err;
|
|
||||||
+ }
|
|
||||||
+ /* default to an acceptable min brightness on boot if too low */
|
|
||||||
+ if (brightness < ASUS_SCREENPAD_BRIGHT_MIN)
|
|
||||||
+ brightness = ASUS_SCREENPAD_BRIGHT_DEFAULT;
|
|
||||||
+
|
|
||||||
+ memset(&props, 0, sizeof(struct backlight_properties));
|
|
||||||
+ props.type = BACKLIGHT_RAW; /* ensure this bd is last to be picked */
|
|
||||||
+ props.max_brightness = ASUS_SCREENPAD_BRIGHT_MAX - ASUS_SCREENPAD_BRIGHT_MIN;
|
|
||||||
+ bd = backlight_device_register("asus_screenpad",
|
|
||||||
+ &asus->platform_device->dev, asus,
|
|
||||||
+ &asus_screenpad_bl_ops, &props);
|
|
||||||
+ if (IS_ERR(bd)) {
|
|
||||||
+ pr_err("Could not register backlight device\n");
|
|
||||||
+ return PTR_ERR(bd);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ asus->screenpad_backlight_device = bd;
|
|
||||||
+ asus->driver->screenpad_brightness = brightness;
|
|
||||||
+ bd->props.brightness = brightness;
|
|
||||||
+ bd->props.power = power;
|
|
||||||
+ backlight_update_status(bd);
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void asus_screenpad_exit(struct asus_wmi *asus)
|
|
||||||
+{
|
|
||||||
+ backlight_device_unregister(asus->screenpad_backlight_device);
|
|
||||||
+
|
|
||||||
+ asus->screenpad_backlight_device = NULL;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/* Fn-lock ********************************************************************/
|
|
||||||
|
|
||||||
static bool asus_wmi_has_fnlock_key(struct asus_wmi *asus)
|
|
||||||
@@ -4431,6 +4555,12 @@ static int asus_wmi_add(struct platform_device *pdev)
|
|
||||||
} else if (asus->driver->quirks->wmi_backlight_set_devstate)
|
|
||||||
err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT, 2, NULL);
|
|
||||||
|
|
||||||
+ if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT)) {
|
|
||||||
+ err = asus_screenpad_init(asus);
|
|
||||||
+ if (err && err != -ENODEV)
|
|
||||||
+ goto fail_screenpad;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if (asus_wmi_has_fnlock_key(asus)) {
|
|
||||||
asus->fnlock_locked = fnlock_default;
|
|
||||||
asus_wmi_fnlock_update(asus);
|
|
||||||
@@ -4454,6 +4584,8 @@ static int asus_wmi_add(struct platform_device *pdev)
|
|
||||||
asus_wmi_backlight_exit(asus);
|
|
||||||
fail_backlight:
|
|
||||||
asus_wmi_rfkill_exit(asus);
|
|
||||||
+fail_screenpad:
|
|
||||||
+ asus_screenpad_exit(asus);
|
|
||||||
fail_rfkill:
|
|
||||||
asus_wmi_led_exit(asus);
|
|
||||||
fail_leds:
|
|
||||||
@@ -4480,6 +4612,7 @@ static int asus_wmi_remove(struct platform_device *device)
|
|
||||||
asus = platform_get_drvdata(device);
|
|
||||||
wmi_remove_notify_handler(asus->driver->event_guid);
|
|
||||||
asus_wmi_backlight_exit(asus);
|
|
||||||
+ asus_screenpad_exit(asus);
|
|
||||||
asus_wmi_input_exit(asus);
|
|
||||||
asus_wmi_led_exit(asus);
|
|
||||||
asus_wmi_rfkill_exit(asus);
|
|
||||||
diff --git a/drivers/platform/x86/asus-wmi.h b/drivers/platform/x86/asus-wmi.h
|
|
||||||
index a478ebfd34df..5fbdd0eafa02 100644
|
|
||||||
--- a/drivers/platform/x86/asus-wmi.h
|
|
||||||
+++ b/drivers/platform/x86/asus-wmi.h
|
|
||||||
@@ -57,6 +57,7 @@ struct quirk_entry {
|
|
||||||
struct asus_wmi_driver {
|
|
||||||
int brightness;
|
|
||||||
int panel_power;
|
|
||||||
+ int screenpad_brightness;
|
|
||||||
int wlan_ctrl_by_user;
|
|
||||||
|
|
||||||
const char *name;
|
|
||||||
diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h
|
|
||||||
index 16e99a1c37fc..63e630276499 100644
|
|
||||||
--- a/include/linux/platform_data/x86/asus-wmi.h
|
|
||||||
+++ b/include/linux/platform_data/x86/asus-wmi.h
|
|
||||||
@@ -58,6 +58,10 @@
|
|
||||||
#define ASUS_WMI_DEVID_KBD_BACKLIGHT 0x00050021
|
|
||||||
#define ASUS_WMI_DEVID_LIGHT_SENSOR 0x00050022 /* ?? */
|
|
||||||
#define ASUS_WMI_DEVID_LIGHTBAR 0x00050025
|
|
||||||
+/* This can only be used to disable the screen, not re-enable */
|
|
||||||
+#define ASUS_WMI_DEVID_SCREENPAD_POWER 0x00050031
|
|
||||||
+/* Writing a brightness re-enables the screen if disabled */
|
|
||||||
+#define ASUS_WMI_DEVID_SCREENPAD_LIGHT 0x00050032
|
|
||||||
#define ASUS_WMI_DEVID_FAN_BOOST_MODE 0x00110018
|
|
||||||
#define ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY 0x00120075
|
|
||||||
|
|
||||||
--
|
|
||||||
2.41.0
|
|
||||||
|
|
||||||
From 7760e10674dbb9127450629308c6ee1c35d5fc19 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Luke D. Jones" <luke@ljones.dev>
|
|
||||||
Date: Thu, 9 Nov 2023 09:41:13 +1300
|
|
||||||
Subject: [PATCH] ALSA: hda/realtek: Add quirk for ASUS ROG G814Jx
|
|
||||||
|
|
||||||
Adds the required quirk to enable the Cirrus amp and correct pins
|
|
||||||
on the ASUS ROG G814J series which uses an SPI connected Cirrus amp.
|
|
||||||
|
|
||||||
While this works if the related _DSD properties are made available, these
|
|
||||||
aren't included in the ACPI of these laptops (yet).
|
|
||||||
|
|
||||||
Signed-off-by: Luke D. Jones <luke@ljones.dev>
|
|
||||||
---
|
|
||||||
sound/pci/hda/patch_realtek.c | 1 +
|
|
||||||
1 file changed, 1 insertion(+)
|
|
||||||
|
|
||||||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
|
|
||||||
index 58006c8bcfb9..a690baa202c5 100644
|
|
||||||
--- a/sound/pci/hda/patch_realtek.c
|
|
||||||
+++ b/sound/pci/hda/patch_realtek.c
|
|
||||||
@@ -9924,6 +9924,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|
||||||
SND_PCI_QUIRK(0x1043, 0x1c9f, "ASUS G614JI", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
|
||||||
SND_PCI_QUIRK(0x1043, 0x1caf, "ASUS G634JYR/JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
|
|
||||||
SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
|
|
||||||
+ SND_PCI_QUIRK(0x1043, 0x1ccf, "ASUS G814JI", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
|
|
||||||
SND_PCI_QUIRK(0x1043, 0x1d1f, "ASUS ROG Strix G17 2023 (G713PV)", ALC287_FIXUP_CS35L41_I2C_2),
|
|
||||||
SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
|
|
||||||
SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
|
|
||||||
--
|
|
||||||
2.41.0
|
|
@ -1,64 +0,0 @@
|
|||||||
diff --git a/sound/pci/hda/cd35l41_hda_property.c b/sound/pci/hda/cs35l41_hda_property.c
|
|
||||||
index 6b704fd..d63617f 100644
|
|
||||||
--- a/sound/pci/hda/cs35l41_hda_property.c
|
|
||||||
+++ b/sound/pci/hda/cs35l41_hda_property.c
|
|
||||||
@@ -6,7 +6,9 @@
|
|
||||||
//
|
|
||||||
// Author: Stefan Binding <sbinding@opensource.cirrus.com>
|
|
||||||
|
|
||||||
+#include <linux/dmi.h>
|
|
||||||
#include <linux/gpio/consumer.h>
|
|
||||||
+#include <linux/kernel.h>
|
|
||||||
#include <linux/string.h>
|
|
||||||
#include "cs35l41_hda_property.h"
|
|
||||||
|
|
||||||
@@ -117,6 +119,40 @@ static int asus_rog_2023_no_acpi(struct cs35l41_hda *cs35l41, struct device *phy
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static int asus_rog_2023_ally_fix(struct cs35l41_hda *cs35l41, struct device *physdev, int id,
|
|
||||||
+ const char *hid)
|
|
||||||
+{
|
|
||||||
+ const char *rog_ally_bios_ver = dmi_get_system_info(DMI_BIOS_VERSION);
|
|
||||||
+ const char *rog_ally_bios_num = rog_ally_bios_ver + 6; // Dropping the RC71L. part before the number
|
|
||||||
+ int rog_ally_bios_int;
|
|
||||||
+ kstrtoint(rog_ally_bios_num, 10, &rog_ally_bios_int);
|
|
||||||
+ if(rog_ally_bios_int >= 330){
|
|
||||||
+ printk(KERN_INFO "DSD properties exist in the %d BIOS. Not applying DSD override...\n", rog_ally_bios_int);
|
|
||||||
+ return -ENOENT; //Patch not applicable. Exiting...
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ struct cs35l41_hw_cfg *hw_cfg = &cs35l41->hw_cfg;
|
|
||||||
+
|
|
||||||
+ dev_info(cs35l41->dev, "Adding DSD properties for %s\n", cs35l41->acpi_subsystem_id);
|
|
||||||
+
|
|
||||||
+ cs35l41->index = id == 0x40 ? 0 : 1;
|
|
||||||
+ cs35l41->channel_index = 0;
|
|
||||||
+ cs35l41->reset_gpio = gpiod_get_index(physdev, NULL, 0, GPIOD_OUT_HIGH);
|
|
||||||
+ cs35l41->speaker_id = cs35l41_get_speaker_id(physdev, 0, 0, 2);
|
|
||||||
+ hw_cfg->spk_pos = cs35l41->index;
|
|
||||||
+ hw_cfg->gpio1.func = CS35L41_NOT_USED;
|
|
||||||
+ hw_cfg->gpio1.valid = true;
|
|
||||||
+ hw_cfg->gpio2.func = CS35L41_INTERRUPT;
|
|
||||||
+ hw_cfg->gpio2.valid = true;
|
|
||||||
+ hw_cfg->bst_type = CS35L41_INT_BOOST;
|
|
||||||
+ hw_cfg->bst_ind = 1000; /* 1,000nH Inductance value */
|
|
||||||
+ hw_cfg->bst_ipk = 4500; /* 4,500mA peak current */
|
|
||||||
+ hw_cfg->bst_cap = 24; /* 24 microFarad cap value */
|
|
||||||
+ hw_cfg->valid = true;
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
struct cs35l41_prop_model {
|
|
||||||
const char *hid;
|
|
||||||
const char *ssid;
|
|
||||||
@@ -134,7 +170,7 @@ static const struct cs35l41_prop_model cs35l41_prop_model_table[] = {
|
|
||||||
{ "CSC3551", "10431483", asus_rog_2023_no_acpi }, // GU603V spi, rst=1, spkr=1
|
|
||||||
{ "CSC3551", "10431493", asus_rog_2023_no_acpi }, // GV601V spi, rst=1
|
|
||||||
{ "CSC3551", "10431573", asus_rog_2023_no_acpi }, // GZ301V spi, rst=0
|
|
||||||
- { "CSC3551", "104317F3", asus_rog_2023_no_acpi }, // ROG ALLY i2c, rst=0
|
|
||||||
+ { "CSC3551", "104317F3", asus_rog_2023_ally_fix }, // ASUS ROG ALLY - i2c, rst=0
|
|
||||||
{ "CSC3551", "10431B93", asus_rog_2023_no_acpi }, // G614J spi, rst=0
|
|
||||||
{ "CSC3551", "10431C9F", asus_rog_2023_no_acpi }, // G614JI spi, rst=0
|
|
||||||
{ "CSC3551", "10431CAF", asus_rog_2023_no_acpi }, // G634J spi, rst=1
|
|
File diff suppressed because it is too large
Load Diff
@ -1,113 +0,0 @@
|
|||||||
From 0a399a37fbe6f6b2b9062e1c076df28608b628c9 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Luke D. Jones" <luke@ljones.dev>
|
|
||||||
Date: Fri, 24 Nov 2023 21:13:11 +1300
|
|
||||||
Subject: [PATCH v2] platform/x86: asus-wmi: disable USB0 hub on ROG Ally
|
|
||||||
before suspend
|
|
||||||
|
|
||||||
ASUS have worked around an issue in XInput where it doesn't support USB
|
|
||||||
selective suspend, whcih causes suspend issues in Windows. They worked
|
|
||||||
around this by adjusting the MCU firmware to disable the USB0 hub when
|
|
||||||
the screen is switched off during the Microsoft DSM suspend path in ACPI.
|
|
||||||
|
|
||||||
The issue we have with this however is one of timing - the call the tells
|
|
||||||
the MCU to this isn't able to complete before suspend is done so we call
|
|
||||||
this in a prepare() and add a small msleep() to ensure it is done. This
|
|
||||||
must be done before the screen is switched off to prevent a variety of
|
|
||||||
possible races.
|
|
||||||
|
|
||||||
Without this the MCU is unable to initialise itself correctly on resume.
|
|
||||||
|
|
||||||
Signed-off-by: Luke D. Jones <luke@ljones.dev>
|
|
||||||
---
|
|
||||||
drivers/platform/x86/asus-wmi.c | 40 +++++++++++++++++++++++++++++++++
|
|
||||||
1 file changed, 40 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
|
|
||||||
index 6a79f16233ab..563c9ab31bc7 100644
|
|
||||||
--- a/drivers/platform/x86/asus-wmi.c
|
|
||||||
+++ b/drivers/platform/x86/asus-wmi.c
|
|
||||||
@@ -16,6 +16,7 @@
|
|
||||||
#include <linux/acpi.h>
|
|
||||||
#include <linux/backlight.h>
|
|
||||||
#include <linux/debugfs.h>
|
|
||||||
+#include <linux/delay.h>
|
|
||||||
#include <linux/dmi.h>
|
|
||||||
#include <linux/fb.h>
|
|
||||||
#include <linux/hwmon.h>
|
|
||||||
@@ -132,6 +133,9 @@ module_param(fnlock_default, bool, 0444);
|
|
||||||
#define ASUS_SCREENPAD_BRIGHT_MAX 255
|
|
||||||
#define ASUS_SCREENPAD_BRIGHT_DEFAULT 60
|
|
||||||
|
|
||||||
+/* Controls the power state of the USB0 hub on ROG Ally which input is on */
|
|
||||||
+#define ASUS_USB0_PWR_EC0_CSEE "\\_SB.PCI0.SBRG.EC0.CSEE"
|
|
||||||
+
|
|
||||||
static const char * const ashs_ids[] = { "ATK4001", "ATK4002", NULL };
|
|
||||||
|
|
||||||
static int throttle_thermal_policy_write(struct asus_wmi *);
|
|
||||||
@@ -300,6 +304,9 @@ struct asus_wmi {
|
|
||||||
|
|
||||||
bool fnlock_locked;
|
|
||||||
|
|
||||||
+ /* The ROG Ally device requires the USB hub to be disabled before suspend */
|
|
||||||
+ bool pre_suspend_ec0_csee_disable;
|
|
||||||
+
|
|
||||||
struct asus_wmi_debug debug;
|
|
||||||
|
|
||||||
struct asus_wmi_driver *driver;
|
|
||||||
@@ -4488,6 +4495,8 @@ static int asus_wmi_add(struct platform_device *pdev)
|
|
||||||
asus->nv_temp_tgt_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_NV_THERM_TARGET);
|
|
||||||
asus->panel_overdrive_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PANEL_OD);
|
|
||||||
asus->mini_led_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MINI_LED_MODE);
|
|
||||||
+ asus->pre_suspend_ec0_csee_disable = acpi_has_method(NULL, ASUS_USB0_PWR_EC0_CSEE)
|
|
||||||
+ && dmi_match(DMI_BOARD_NAME, "RC71L");
|
|
||||||
|
|
||||||
err = fan_boost_mode_check_present(asus);
|
|
||||||
if (err)
|
|
||||||
@@ -4654,6 +4663,35 @@ static int asus_hotk_resume(struct device *device)
|
|
||||||
asus_wmi_fnlock_update(asus);
|
|
||||||
|
|
||||||
asus_wmi_tablet_mode_get_state(asus);
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int asus_hotk_resume_early(struct device *device)
|
|
||||||
+{
|
|
||||||
+ struct asus_wmi *asus = dev_get_drvdata(device);
|
|
||||||
+
|
|
||||||
+ if (asus->pre_suspend_ec0_csee_disable) {
|
|
||||||
+ /* sleep required to ensure USB0 is enabled before drivers notice */
|
|
||||||
+ if (ACPI_FAILURE(acpi_execute_simple_method(NULL, ASUS_USB0_PWR_EC0_CSEE, 0xB8)))
|
|
||||||
+ pr_warn("ASUS ROG Ally failed to set USB hub power on\n");
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int asus_hotk_prepare(struct device *device)
|
|
||||||
+{
|
|
||||||
+ struct asus_wmi *asus = dev_get_drvdata(device);
|
|
||||||
+
|
|
||||||
+ if (asus->pre_suspend_ec0_csee_disable) {
|
|
||||||
+ /* sleep required to ensure USB0 is disabled before sleep continues */
|
|
||||||
+ if (ACPI_FAILURE(acpi_execute_simple_method(NULL, ASUS_USB0_PWR_EC0_CSEE, 0xB7)))
|
|
||||||
+ pr_warn("ASUS ROG Ally failed to set USB hub power off\n");
|
|
||||||
+ else
|
|
||||||
+ msleep(100);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -4701,6 +4739,8 @@ static const struct dev_pm_ops asus_pm_ops = {
|
|
||||||
.thaw = asus_hotk_thaw,
|
|
||||||
.restore = asus_hotk_restore,
|
|
||||||
.resume = asus_hotk_resume,
|
|
||||||
+ .resume_early = asus_hotk_resume_early,
|
|
||||||
+ .prepare = asus_hotk_prepare,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Registration ***************************************************************/
|
|
||||||
--
|
|
||||||
2.43.0
|
|
||||||
|
|
@ -11,3 +11,8 @@ nobara/0001-acpi-proc-idle-skip-dummy-wait.patch
|
|||||||
nobara/0001-add-acpi_call.patch
|
nobara/0001-add-acpi_call.patch
|
||||||
nobara/OpenRGB.patch
|
nobara/OpenRGB.patch
|
||||||
nobara/amdgpu-si-cik-default.patch
|
nobara/amdgpu-si-cik-default.patch
|
||||||
|
asuslinux/0001-platform-x86-asus-wmi-add-support-for-2024-ROG-Mini-.patch
|
||||||
|
asuslinux/0002-platform-x86-asus-wmi-add-support-for-Vivobook-GPU-M.patch
|
||||||
|
asuslinux/0003-platform-x86-asus-wmi-add-support-variant-of-TUF-RGB.patch
|
||||||
|
asuslinux/0004-platform-x86-asus-wmi-support-toggling-POST-sound.patch
|
||||||
|
asuslinux/0005-platform-x86-asus-wmi-store-a-min-default-for-ppt-op.patch
|
||||||
|
@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
echo "Pika Kernel - Building"
|
echo "Pika Kernel - Building"
|
||||||
|
|
||||||
make -j`nproc` bindeb-pkg LOCALVERSION=-pikaos KDEB_PKGVERSION=$(make kernelversion)-4
|
make -j`nproc` bindeb-pkg LOCALVERSION=-pikaos KDEB_PKGVERSION=$(make kernelversion)-100pika1
|
||||||
|
Loading…
Reference in New Issue
Block a user