Message ID | 20250322103606.680401-10-lkml@antheas.dev |
---|---|
State | New |
Headers | show |
Series | hwmon: (oxpsensors) Add devices, features, fix ABI and move to platform/x86 | expand |
On Sat, 22 Mar 2025, Antheas Kapenekakis wrote: > Currently, this driver breaks hwmon ABI by using auto as 0 and manual > as 1. However, for pwm_enable, 0 is full speed, 1 is manual, and 2 is > auto. For the correction to be possible, this means that the pwm_enable > endpoint will need access to both pwm enable and value (as for > the 0th value, the fan needs to be set to full power). > > Therefore, move the pwm value read/write to separate functions. > > Reviewed-by: Derek J. Clark <derekjohn.clark@gmail.com> > Reviewed-by: Thomas Weißschuh <linux@weissschuh.net> > Signed-off-by: Antheas Kapenekakis <lkml@antheas.dev> > --- > drivers/platform/x86/oxpec.c | 162 +++++++++++++++++++---------------- > 1 file changed, 87 insertions(+), 75 deletions(-) > > diff --git a/drivers/platform/x86/oxpec.c b/drivers/platform/x86/oxpec.c > index 2f31490fde64c..67bfd397802d1 100644 > --- a/drivers/platform/x86/oxpec.c > +++ b/drivers/platform/x86/oxpec.c > @@ -599,6 +599,91 @@ static umode_t oxp_ec_hwmon_is_visible(const void *drvdata, > } > } > > +/* PWM input read/write functions */ > +static int oxp_pwm_input_write(long val) > +{ > + if (val < 0 || val > 255) > + return -EINVAL; Please add an empty line here. Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> > + switch (board) { > + case orange_pi_neo: > + /* scale to range [1-244] */ > + val = ((val - 1) * 243 / 254) + 1; > + return write_to_ec(ORANGEPI_SENSOR_PWM_REG, val); > + case oxp_2: > + case oxp_x1: > + /* scale to range [0-184] */ > + val = (val * 184) / 255; > + return write_to_ec(OXP_SENSOR_PWM_REG, val); > + case aya_neo_2: > + case aya_neo_air: > + case aya_neo_air_1s: > + case aya_neo_air_plus_mendo: > + case aya_neo_air_pro: > + case aya_neo_flip: > + case aya_neo_geek: > + case aya_neo_kun: > + case oxp_mini_amd: > + case oxp_mini_amd_a07: > + /* scale to range [0-100] */ > + val = (val * 100) / 255; > + return write_to_ec(OXP_SENSOR_PWM_REG, val); > + case aok_zoe_a1: > + case oxp_fly: > + case oxp_mini_amd_pro: > + return write_to_ec(OXP_SENSOR_PWM_REG, val); > + default: > + return -EOPNOTSUPP; > + } > +} > + > +static int oxp_pwm_input_read(long *val) > +{ > + int ret; > + > + switch (board) { > + case orange_pi_neo: > + ret = read_from_ec(ORANGEPI_SENSOR_PWM_REG, 1, val); > + if (ret) > + return ret; > + /* scale from range [1-244] */ > + *val = ((*val - 1) * 254 / 243) + 1; > + break; > + case oxp_2: > + case oxp_x1: > + ret = read_from_ec(OXP_SENSOR_PWM_REG, 1, val); > + if (ret) > + return ret; > + /* scale from range [0-184] */ > + *val = (*val * 255) / 184; > + break; > + case aya_neo_2: > + case aya_neo_air: > + case aya_neo_air_1s: > + case aya_neo_air_plus_mendo: > + case aya_neo_air_pro: > + case aya_neo_flip: > + case aya_neo_geek: > + case aya_neo_kun: > + case oxp_mini_amd: > + case oxp_mini_amd_a07: > + ret = read_from_ec(OXP_SENSOR_PWM_REG, 1, val); > + if (ret) > + return ret; > + /* scale from range [0-100] */ > + *val = (*val * 255) / 100; > + break; > + case aok_zoe_a1: > + case oxp_fly: > + case oxp_mini_amd_pro: > + default: > + ret = read_from_ec(OXP_SENSOR_PWM_REG, 1, val); > + if (ret) > + return ret; > + break; > + } > + return 0; > +} > + > static int oxp_platform_read(struct device *dev, enum hwmon_sensor_types type, > u32 attr, int channel, long *val) > { > @@ -639,48 +724,7 @@ static int oxp_platform_read(struct device *dev, enum hwmon_sensor_types type, > case hwmon_pwm: > switch (attr) { > case hwmon_pwm_input: > - switch (board) { > - case orange_pi_neo: > - ret = read_from_ec(ORANGEPI_SENSOR_PWM_REG, 1, val); > - if (ret) > - return ret; > - /* scale from range [1-244] */ > - *val = ((*val - 1) * 254 / 243) + 1; > - break; > - case oxp_2: > - case oxp_x1: > - ret = read_from_ec(OXP_SENSOR_PWM_REG, 1, val); > - if (ret) > - return ret; > - /* scale from range [0-184] */ > - *val = (*val * 255) / 184; > - break; > - case aya_neo_2: > - case aya_neo_air: > - case aya_neo_air_1s: > - case aya_neo_air_plus_mendo: > - case aya_neo_air_pro: > - case aya_neo_flip: > - case aya_neo_geek: > - case aya_neo_kun: > - case oxp_mini_amd: > - case oxp_mini_amd_a07: > - ret = read_from_ec(OXP_SENSOR_PWM_REG, 1, val); > - if (ret) > - return ret; > - /* scale from range [0-100] */ > - *val = (*val * 255) / 100; > - break; > - case aok_zoe_a1: > - case oxp_fly: > - case oxp_mini_amd_pro: > - default: > - ret = read_from_ec(OXP_SENSOR_PWM_REG, 1, val); > - if (ret) > - return ret; > - break; > - } > - return 0; > + return oxp_pwm_input_read(val); > case hwmon_pwm_enable: > return oxp_pwm_read(val); > default: > @@ -706,39 +750,7 @@ static int oxp_platform_write(struct device *dev, enum hwmon_sensor_types type, > return oxp_pwm_disable(); > return -EINVAL; > case hwmon_pwm_input: > - if (val < 0 || val > 255) > - return -EINVAL; > - switch (board) { > - case orange_pi_neo: > - /* scale to range [1-244] */ > - val = ((val - 1) * 243 / 254) + 1; > - return write_to_ec(ORANGEPI_SENSOR_PWM_REG, val); > - case oxp_2: > - case oxp_x1: > - /* scale to range [0-184] */ > - val = (val * 184) / 255; > - return write_to_ec(OXP_SENSOR_PWM_REG, val); > - case aya_neo_2: > - case aya_neo_air: > - case aya_neo_air_1s: > - case aya_neo_air_plus_mendo: > - case aya_neo_air_pro: > - case aya_neo_flip: > - case aya_neo_geek: > - case aya_neo_kun: > - case oxp_mini_amd: > - case oxp_mini_amd_a07: > - /* scale to range [0-100] */ > - val = (val * 100) / 255; > - return write_to_ec(OXP_SENSOR_PWM_REG, val); > - case aok_zoe_a1: > - case oxp_fly: > - case oxp_mini_amd_pro: > - return write_to_ec(OXP_SENSOR_PWM_REG, val); > - default: > - break; > - } > - break; > + return oxp_pwm_input_write(val); > default: > break; > } >
diff --git a/drivers/platform/x86/oxpec.c b/drivers/platform/x86/oxpec.c index 2f31490fde64c..67bfd397802d1 100644 --- a/drivers/platform/x86/oxpec.c +++ b/drivers/platform/x86/oxpec.c @@ -599,6 +599,91 @@ static umode_t oxp_ec_hwmon_is_visible(const void *drvdata, } } +/* PWM input read/write functions */ +static int oxp_pwm_input_write(long val) +{ + if (val < 0 || val > 255) + return -EINVAL; + switch (board) { + case orange_pi_neo: + /* scale to range [1-244] */ + val = ((val - 1) * 243 / 254) + 1; + return write_to_ec(ORANGEPI_SENSOR_PWM_REG, val); + case oxp_2: + case oxp_x1: + /* scale to range [0-184] */ + val = (val * 184) / 255; + return write_to_ec(OXP_SENSOR_PWM_REG, val); + case aya_neo_2: + case aya_neo_air: + case aya_neo_air_1s: + case aya_neo_air_plus_mendo: + case aya_neo_air_pro: + case aya_neo_flip: + case aya_neo_geek: + case aya_neo_kun: + case oxp_mini_amd: + case oxp_mini_amd_a07: + /* scale to range [0-100] */ + val = (val * 100) / 255; + return write_to_ec(OXP_SENSOR_PWM_REG, val); + case aok_zoe_a1: + case oxp_fly: + case oxp_mini_amd_pro: + return write_to_ec(OXP_SENSOR_PWM_REG, val); + default: + return -EOPNOTSUPP; + } +} + +static int oxp_pwm_input_read(long *val) +{ + int ret; + + switch (board) { + case orange_pi_neo: + ret = read_from_ec(ORANGEPI_SENSOR_PWM_REG, 1, val); + if (ret) + return ret; + /* scale from range [1-244] */ + *val = ((*val - 1) * 254 / 243) + 1; + break; + case oxp_2: + case oxp_x1: + ret = read_from_ec(OXP_SENSOR_PWM_REG, 1, val); + if (ret) + return ret; + /* scale from range [0-184] */ + *val = (*val * 255) / 184; + break; + case aya_neo_2: + case aya_neo_air: + case aya_neo_air_1s: + case aya_neo_air_plus_mendo: + case aya_neo_air_pro: + case aya_neo_flip: + case aya_neo_geek: + case aya_neo_kun: + case oxp_mini_amd: + case oxp_mini_amd_a07: + ret = read_from_ec(OXP_SENSOR_PWM_REG, 1, val); + if (ret) + return ret; + /* scale from range [0-100] */ + *val = (*val * 255) / 100; + break; + case aok_zoe_a1: + case oxp_fly: + case oxp_mini_amd_pro: + default: + ret = read_from_ec(OXP_SENSOR_PWM_REG, 1, val); + if (ret) + return ret; + break; + } + return 0; +} + static int oxp_platform_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, long *val) { @@ -639,48 +724,7 @@ static int oxp_platform_read(struct device *dev, enum hwmon_sensor_types type, case hwmon_pwm: switch (attr) { case hwmon_pwm_input: - switch (board) { - case orange_pi_neo: - ret = read_from_ec(ORANGEPI_SENSOR_PWM_REG, 1, val); - if (ret) - return ret; - /* scale from range [1-244] */ - *val = ((*val - 1) * 254 / 243) + 1; - break; - case oxp_2: - case oxp_x1: - ret = read_from_ec(OXP_SENSOR_PWM_REG, 1, val); - if (ret) - return ret; - /* scale from range [0-184] */ - *val = (*val * 255) / 184; - break; - case aya_neo_2: - case aya_neo_air: - case aya_neo_air_1s: - case aya_neo_air_plus_mendo: - case aya_neo_air_pro: - case aya_neo_flip: - case aya_neo_geek: - case aya_neo_kun: - case oxp_mini_amd: - case oxp_mini_amd_a07: - ret = read_from_ec(OXP_SENSOR_PWM_REG, 1, val); - if (ret) - return ret; - /* scale from range [0-100] */ - *val = (*val * 255) / 100; - break; - case aok_zoe_a1: - case oxp_fly: - case oxp_mini_amd_pro: - default: - ret = read_from_ec(OXP_SENSOR_PWM_REG, 1, val); - if (ret) - return ret; - break; - } - return 0; + return oxp_pwm_input_read(val); case hwmon_pwm_enable: return oxp_pwm_read(val); default: @@ -706,39 +750,7 @@ static int oxp_platform_write(struct device *dev, enum hwmon_sensor_types type, return oxp_pwm_disable(); return -EINVAL; case hwmon_pwm_input: - if (val < 0 || val > 255) - return -EINVAL; - switch (board) { - case orange_pi_neo: - /* scale to range [1-244] */ - val = ((val - 1) * 243 / 254) + 1; - return write_to_ec(ORANGEPI_SENSOR_PWM_REG, val); - case oxp_2: - case oxp_x1: - /* scale to range [0-184] */ - val = (val * 184) / 255; - return write_to_ec(OXP_SENSOR_PWM_REG, val); - case aya_neo_2: - case aya_neo_air: - case aya_neo_air_1s: - case aya_neo_air_plus_mendo: - case aya_neo_air_pro: - case aya_neo_flip: - case aya_neo_geek: - case aya_neo_kun: - case oxp_mini_amd: - case oxp_mini_amd_a07: - /* scale to range [0-100] */ - val = (val * 100) / 255; - return write_to_ec(OXP_SENSOR_PWM_REG, val); - case aok_zoe_a1: - case oxp_fly: - case oxp_mini_amd_pro: - return write_to_ec(OXP_SENSOR_PWM_REG, val); - default: - break; - } - break; + return oxp_pwm_input_write(val); default: break; }