Commit ebd4bfee authored by Derek J. Clark's avatar Derek J. Clark Committed by Guenter Roeck

hwmon: (oxp-sensors) Add AYANEO AIR and AIR Pro

Add support for the AYANEO AIR and AYANEO AIR Pro models of handheld
devices. These devices use the same EC registers and logic as the One X
Player mini AMD. Previous AYANEO models are not supported as they use a
different EC and do not have the necessary fan speed write enable and
setting registers. The driver is tested on AYANEO AIR while AIR Pro model
EC functionality and DMI data were verified using command line tools by
another user.

Add:
- AYANEO AIR (AMD 5560U)
- AYANEO AIR Pro (AMD 5560U)
- AYANEO AIR Pro (AMD 5825U)

While at it, fix spelling error (appart -> apart).

Link: https://lore.kernel.org/r/20221229025609.147482-1-derekjohn.clark@gmail.comSigned-off-by: default avatarDerek J. Clark <derekjohn.clark@gmail.com>
[groeck: Sanitize commit description]
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 2c552111
...@@ -3,18 +3,21 @@ ...@@ -3,18 +3,21 @@
Kernel driver oxp-sensors Kernel driver oxp-sensors
========================= =========================
Author: Authors:
- Derek John Clark <derekjohn.clark@gmail.com>
- Joaquín Ignacio Aramendía <samsagax@gmail.com> - Joaquín Ignacio Aramendía <samsagax@gmail.com>
Description: Description:
------------ ------------
One X Player devices from One Netbook provide fan readings and fan control Handheld devices from One Netbook and Aya Neo provide fan readings and fan
through its Embedded Controller. control through their embedded controllers.
Currently only supports AMD boards from the One X Player and AOK ZOE lineup. Currently only supports AMD boards from One X Player, AOK ZOE, and some Aya
Intel boards could be supported if we could figure out the EC registers and Neo devices. One X Player Intel boards could be supported if we could figure
values to write to since the EC layout and model is different. out the EC registers and values to write to since the EC layout and model is
different. Aya Neo devices preceding the AIR may not be supportable as the EC
model is different and do not appear to have manual control capabilities.
Supported devices Supported devices
----------------- -----------------
...@@ -22,6 +25,8 @@ Supported devices ...@@ -22,6 +25,8 @@ Supported devices
Currently the driver supports the following handhelds: Currently the driver supports the following handhelds:
- AOK ZOE A1 - AOK ZOE A1
- Aya Neo AIR
- Aya Neo AIR Pro
- OneXPlayer AMD - OneXPlayer AMD
- OneXPlayer mini AMD - OneXPlayer mini AMD
- OneXPlayer mini AMD PRO - OneXPlayer mini AMD PRO
......
...@@ -15574,6 +15574,7 @@ F: drivers/mtd/nand/onenand/ ...@@ -15574,6 +15574,7 @@ F: drivers/mtd/nand/onenand/
F: include/linux/mtd/onenand*.h F: include/linux/mtd/onenand*.h
ONEXPLAYER FAN DRIVER ONEXPLAYER FAN DRIVER
M: Derek John Clark <derekjohn.clark@gmail.com>
M: Joaquín Ignacio Aramendía <samsagax@gmail.com> M: Joaquín Ignacio Aramendía <samsagax@gmail.com>
L: linux-hwmon@vger.kernel.org L: linux-hwmon@vger.kernel.org
S: Maintained S: Maintained
......
// SPDX-License-Identifier: GPL-2.0+ // SPDX-License-Identifier: GPL-2.0+
/* /*
* Platform driver for OXP Handhelds that expose fan reading and control * Platform driver for OneXPlayer, AOK ZOE, and Aya Neo Handhelds that expose
* via hwmon sysfs. * fan reading and control via hwmon sysfs.
* *
* Old boards have the same DMI strings and they are told appart by the * Old OXP boards have the same DMI strings and they are told apart by
* boot cpu vendor (Intel/AMD). Currently only AMD boards are supported * the boot cpu vendor (Intel/AMD). Currently only AMD boards are
* but the code is made to be simple to add other handheld boards in the * supported but the code is made to be simple to add other handheld
* future. * boards in the future.
* Fan control is provided via pwm interface in the range [0-255]. * Fan control is provided via pwm interface in the range [0-255].
* Old AMD boards use [0-100] as range in the EC, the written value is * Old AMD boards use [0-100] as range in the EC, the written value is
* scaled to accommodate for that. Newer boards like the mini PRO and * scaled to accommodate for that. Newer boards like the mini PRO and
...@@ -42,6 +42,8 @@ static bool unlock_global_acpi_lock(void) ...@@ -42,6 +42,8 @@ static bool unlock_global_acpi_lock(void)
enum oxp_board { enum oxp_board {
aok_zoe_a1 = 1, aok_zoe_a1 = 1,
aya_neo_air,
aya_neo_air_pro,
oxp_mini_amd, oxp_mini_amd,
oxp_mini_amd_pro, oxp_mini_amd_pro,
}; };
...@@ -60,6 +62,20 @@ static const struct dmi_system_id dmi_table[] = { ...@@ -60,6 +62,20 @@ static const struct dmi_system_id dmi_table[] = {
}, },
.driver_data = (void *) &(enum oxp_board) {aok_zoe_a1}, .driver_data = (void *) &(enum oxp_board) {aok_zoe_a1},
}, },
{
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
DMI_EXACT_MATCH(DMI_BOARD_NAME, "AIR"),
},
.driver_data = (void *) &(enum oxp_board) {aya_neo_air},
},
{
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
DMI_EXACT_MATCH(DMI_BOARD_NAME, "AIR Pro"),
},
.driver_data = (void *) &(enum oxp_board) {aya_neo_air_pro},
},
{ {
.matches = { .matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"), DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
...@@ -161,8 +177,17 @@ static int oxp_platform_read(struct device *dev, enum hwmon_sensor_types type, ...@@ -161,8 +177,17 @@ static int oxp_platform_read(struct device *dev, enum hwmon_sensor_types type,
ret = read_from_ec(OXP_SENSOR_PWM_REG, 1, val); ret = read_from_ec(OXP_SENSOR_PWM_REG, 1, val);
if (ret) if (ret)
return ret; return ret;
if (board == oxp_mini_amd) switch (board) {
case aya_neo_air:
case aya_neo_air_pro:
case oxp_mini_amd:
*val = (*val * 255) / 100; *val = (*val * 255) / 100;
break;
case oxp_mini_amd_pro:
case aok_zoe_a1:
default:
break;
}
return 0; return 0;
case hwmon_pwm_enable: case hwmon_pwm_enable:
return read_from_ec(OXP_SENSOR_PWM_ENABLE_REG, 1, val); return read_from_ec(OXP_SENSOR_PWM_ENABLE_REG, 1, val);
...@@ -191,8 +216,17 @@ static int oxp_platform_write(struct device *dev, enum hwmon_sensor_types type, ...@@ -191,8 +216,17 @@ static int oxp_platform_write(struct device *dev, enum hwmon_sensor_types type,
case hwmon_pwm_input: case hwmon_pwm_input:
if (val < 0 || val > 255) if (val < 0 || val > 255)
return -EINVAL; return -EINVAL;
if (board == oxp_mini_amd) switch (board) {
case aya_neo_air:
case aya_neo_air_pro:
case oxp_mini_amd:
val = (val * 100) / 255; val = (val * 100) / 255;
break;
case aok_zoe_a1:
case oxp_mini_amd_pro:
default:
break;
}
return write_to_ec(dev, OXP_SENSOR_PWM_REG, val); return write_to_ec(dev, OXP_SENSOR_PWM_REG, val);
default: default:
break; break;
...@@ -233,7 +267,7 @@ static int oxp_platform_probe(struct platform_device *pdev) ...@@ -233,7 +267,7 @@ static int oxp_platform_probe(struct platform_device *pdev)
/* /*
* Have to check for AMD processor here because DMI strings are the * Have to check for AMD processor here because DMI strings are the
* same between Intel and AMD boards, the only way to tell them appart * same between Intel and AMD boards, the only way to tell them apart
* is the CPU. * is the CPU.
* Intel boards seem to have different EC registers and values to * Intel boards seem to have different EC registers and values to
* read/write. * read/write.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment