Re: [PATCH 1/3] hwmon: (oxp-sensors): remove static board variable

From: Guenter Roeck
Date: Tue Jul 04 2023 - 09:39:20 EST


On 7/4/23 06:17, Greg Kroah-Hartman wrote:
Drivers should not have a single static variable for the type of device
they are bound to. While this driver is really going to only have one
device at a time in the system, remove the static variable and instead,
look up the device type when needed.


This is expensive. I think it would be much better to just move
the board type detection into the init code and not instantiate
the driver in the fist place if the board type is unknown.

We can handle the static variable separately if it really bothers
you that much.

Cc: Joaquín Ignacio Aramendía <samsagax@xxxxxxxxx>
Cc: Guenter Roeck <linux@xxxxxxxxxxxx>
Cc: linux-hwmon@xxxxxxxxxxxxxxx
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
---
drivers/hwmon/oxp-sensors.c | 47 ++++++++++++++++++++-----------------
1 file changed, 25 insertions(+), 22 deletions(-)

diff --git a/drivers/hwmon/oxp-sensors.c b/drivers/hwmon/oxp-sensors.c
index e1a907cae820..3bcba0c476c4 100644
--- a/drivers/hwmon/oxp-sensors.c
+++ b/drivers/hwmon/oxp-sensors.c
@@ -48,10 +48,9 @@ enum oxp_board {
oxp_mini_amd,
oxp_mini_amd_a07,
oxp_mini_amd_pro,
+ UNKNOWN,
};
-static enum oxp_board board;
-
/* Fan reading and PWM */
#define OXP_SENSOR_FAN_REG 0x76 /* Fan reading is 2 registers long */
#define OXP_SENSOR_PWM_ENABLE_REG 0x4A /* PWM enable is 1 register long */
@@ -136,6 +135,24 @@ static const struct dmi_system_id dmi_table[] = {
{},
};
+static enum oxp_board get_board_type(void)
+{
+ const struct dmi_system_id *dmi_entry;
+
+ /*
+ * Have to check for AMD processor here because DMI strings are the
+ * same between Intel and AMD boards, the only way to tell them apart
+ * is the CPU.
+ * Intel boards seem to have different EC registers and values to
+ * read/write.
+ */
+ dmi_entry = dmi_first_match(dmi_table);
+ if (!dmi_entry || boot_cpu_data.x86_vendor != X86_VENDOR_AMD)
+ return UNKNOWN;
+
+ return (enum oxp_board)(unsigned long)dmi_entry->driver_data;
+}
+
/* Helper functions to handle EC read/write */
static int read_from_ec(u8 reg, int size, long *val)
{
@@ -182,7 +199,7 @@ static int tt_toggle_enable(void)
u8 reg;
u8 val;
- switch (board) {
+ switch (get_board_type()) {
case oxp_mini_amd_a07:
reg = OXP_OLD_TURBO_SWITCH_REG;
val = OXP_OLD_TURBO_TAKE_VAL;
@@ -203,7 +220,7 @@ static int tt_toggle_disable(void)
u8 reg;
u8 val;
- switch (board) {
+ switch (get_board_type()) {
case oxp_mini_amd_a07:
reg = OXP_OLD_TURBO_SWITCH_REG;
val = OXP_OLD_TURBO_RETURN_VAL;
@@ -249,7 +266,7 @@ static ssize_t tt_toggle_show(struct device *dev,
u8 reg;
long val;
- switch (board) {
+ switch (get_board_type()) {
case oxp_mini_amd_a07:
reg = OXP_OLD_TURBO_SWITCH_REG;
break;
@@ -315,7 +332,7 @@ static int oxp_platform_read(struct device *dev, enum hwmon_sensor_types type,
ret = read_from_ec(OXP_SENSOR_PWM_REG, 1, val);
if (ret)
return ret;
- switch (board) {
+ switch (get_board_type()) {
case aya_neo_2:
case aya_neo_air:
case aya_neo_air_pro:
@@ -357,7 +374,7 @@ static int oxp_platform_write(struct device *dev, enum hwmon_sensor_types type,
case hwmon_pwm_input:
if (val < 0 || val > 255)
return -EINVAL;
- switch (board) {
+ switch (get_board_type()) {
case aya_neo_2:
case aya_neo_air:
case aya_neo_air_pro:
@@ -412,25 +429,11 @@ static const struct hwmon_chip_info oxp_ec_chip_info = {
/* Initialization logic */
static int oxp_platform_probe(struct platform_device *pdev)
{
- const struct dmi_system_id *dmi_entry;
struct device *dev = &pdev->dev;
struct device *hwdev;
int ret;
- /*
- * Have to check for AMD processor here because DMI strings are the
- * same between Intel and AMD boards, the only way to tell them apart
- * is the CPU.
- * Intel boards seem to have different EC registers and values to
- * read/write.
- */
- dmi_entry = dmi_first_match(dmi_table);
- if (!dmi_entry || boot_cpu_data.x86_vendor != X86_VENDOR_AMD)
- return -ENODEV;
-
- board = (enum oxp_board)(unsigned long)dmi_entry->driver_data;
-
- switch (board) {
+ switch (get_board_type()) {

This now always registers the hwmon device, which really should not happen.

Guenter

case aok_zoe_a1:
case oxp_mini_amd_a07:
case oxp_mini_amd_pro: