From nobody Sun Jun 14 18:57:05 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3DDC435C184; Sun, 5 Apr 2026 08:40:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775378439; cv=none; b=N/szSAx0Dqvmc0P9AnG9hfmEMDsmnDeKqCzJRaYS9sOp6xu+SwETRHX+cT7IvGJyCPr4YeadhG5D6zFKwp8oBF62KvYZclqRpX/bOEoyAWqvNXvbhC6XAu78FQyVZGdG51i8Otmd9w/oROrK4z37U6ThTMbExV7AtVJNMRl3IPs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775378439; c=relaxed/simple; bh=LfuHsYjfnq+hxcRlZAtpMp3NbsfwQjcKyi4IHRE9Vfw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=q5UueN8FWhr3JvrSW/aKe5vsfbc1AfYRLoAZdCabP+tZ4ajfL/D6RWGphBlNb0Ob/+0BowVsdEVjQlPoxD2gCqDBxNu+ESw2lADI5zLf8tfgZz/jGKuBvnWUIndck2RrMHxYqC1TYFFnsPRB/rOsvXBnEzelL5TzyNq7bsBsq3Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: 157b4c6630cb11f1aa26b74ffac11d73-20260405 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:d774e2f5-83ea-4d1b-9ccd-23afe017b6e2,IP:0,U RL:0,TC:0,Content:0,EDM:25,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:25 X-CID-META: VersionHash:e7bac3a,CLOUDID:2f613d850e09bc1394558676d112d20f,BulkI D:nil,BulkQuantity:0,Recheck:0,SF:81|82|102|850|898,TC:nil,Content:0|15|50 ,EDM:5,IP:nil,URL:0,File:nil,RT:nil,Bulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OS A:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR:0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 157b4c6630cb11f1aa26b74ffac11d73-20260405 X-User: xiaopei01@kylinos.cn Received: from localhost.localdomain [(10.44.16.150)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 327466018; Sun, 05 Apr 2026 16:40:22 +0800 From: Pei Xiao To: cryolitia@uniontech.com, linux@roeck-us.net, linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Pei Xiao Subject: [PATCH 1/3] hwmon: (gpd-fan): remove global variable gpd_driver_priv Date: Sun, 5 Apr 2026 16:40:16 +0800 Message-Id: <8b19b6bd73d0f9659d41cbeec6fcdfd4ddf59035.1775378028.git.xiaopei01@kylinos.cn> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Replace the global state gpd_driver_priv with per-device private data (struct gpd_fan_data) allocated in probe. This allows the driver to support multiple instances in the future and aligns with kernel best practices. Signed-off-by: Pei Xiao --- drivers/hwmon/gpd-fan.c | 211 ++++++++++++++++++++++------------------ 1 file changed, 116 insertions(+), 95 deletions(-) diff --git a/drivers/hwmon/gpd-fan.c b/drivers/hwmon/gpd-fan.c index 80de5f20781e..5a9d07cd29ab 100644 --- a/drivers/hwmon/gpd-fan.c +++ b/drivers/hwmon/gpd-fan.c @@ -40,12 +40,11 @@ enum FAN_PWM_ENABLE { AUTOMATIC =3D 2, }; =20 -static struct { +struct gpd_fan_data { enum FAN_PWM_ENABLE pwm_enable; u8 pwm_value; - const struct gpd_fan_drvdata *drvdata; -} gpd_driver_priv; +}; =20 struct gpd_fan_drvdata { const char *board_name; // Board name for module param comparison @@ -249,10 +248,10 @@ static const struct gpd_fan_drvdata *gpd_module_drvda= ta[] =3D { }; =20 // Helper functions to handle EC read/write -static void gpd_ecram_read(u16 offset, u8 *val) +static void gpd_ecram_read(const struct gpd_fan_drvdata *drvdata, u16 offs= et, u8 *val) { - u16 addr_port =3D gpd_driver_priv.drvdata->addr_port; - u16 data_port =3D gpd_driver_priv.drvdata->data_port; + u16 addr_port =3D drvdata->addr_port; + u16 data_port =3D drvdata->data_port; =20 outb(0x2E, addr_port); outb(0x11, data_port); @@ -270,10 +269,10 @@ static void gpd_ecram_read(u16 offset, u8 *val) *val =3D inb(data_port); } =20 -static void gpd_ecram_write(u16 offset, u8 value) +static void gpd_ecram_write(const struct gpd_fan_drvdata *drvdata, u16 off= set, u8 value) { - u16 addr_port =3D gpd_driver_priv.drvdata->addr_port; - u16 data_port =3D gpd_driver_priv.drvdata->data_port; + u16 addr_port =3D drvdata->addr_port; + u16 data_port =3D drvdata->data_port; =20 outb(0x2E, addr_port); outb(0x11, data_port); @@ -291,198 +290,198 @@ static void gpd_ecram_write(u16 offset, u8 value) outb(value, data_port); } =20 -static int gpd_generic_read_rpm(void) +static int gpd_generic_read_rpm(struct gpd_fan_data *data) { - const struct gpd_fan_drvdata *const drvdata =3D gpd_driver_priv.drvdata; + const struct gpd_fan_drvdata *drvdata =3D data->drvdata; u8 high, low; =20 - gpd_ecram_read(drvdata->rpm_read, &high); - gpd_ecram_read(drvdata->rpm_read + 1, &low); + gpd_ecram_read(drvdata, drvdata->rpm_read, &high); + gpd_ecram_read(drvdata, drvdata->rpm_read + 1, &low); =20 return (u16)high << 8 | low; } =20 -static int gpd_wm2_read_rpm(void) +static int gpd_wm2_read_rpm(struct gpd_fan_data *data) { + const struct gpd_fan_drvdata *drvdata =3D data->drvdata; + for (u16 pwm_ctr_offset =3D GPD_PWM_CTR_OFFSET; pwm_ctr_offset <=3D GPD_PWM_CTR_OFFSET + 2; pwm_ctr_offset++) { u8 PWMCTR; =20 - gpd_ecram_read(pwm_ctr_offset, &PWMCTR); + gpd_ecram_read(drvdata, pwm_ctr_offset, &PWMCTR); =20 if (PWMCTR !=3D 0xB8) - gpd_ecram_write(pwm_ctr_offset, 0xB8); + gpd_ecram_write(drvdata, pwm_ctr_offset, 0xB8); } =20 - return gpd_generic_read_rpm(); + return gpd_generic_read_rpm(data); } =20 // Read value for fan1_input -static int gpd_read_rpm(void) +static int gpd_read_rpm(struct gpd_fan_data *data) { - switch (gpd_driver_priv.drvdata->board) { + switch (data->drvdata->board) { case win4_6800u: case win_mini: case duo: case mpc2: - return gpd_generic_read_rpm(); + return gpd_generic_read_rpm(data); case win_max_2: - return gpd_wm2_read_rpm(); + return gpd_wm2_read_rpm(data); } =20 return 0; } =20 -static int gpd_wm2_read_pwm(void) +static int gpd_wm2_read_pwm(struct gpd_fan_data *data) { - const struct gpd_fan_drvdata *const drvdata =3D gpd_driver_priv.drvdata; + const struct gpd_fan_drvdata *drvdata =3D data->drvdata; u8 var; =20 - gpd_ecram_read(drvdata->pwm_write, &var); + gpd_ecram_read(drvdata, drvdata->pwm_write, &var); =20 // Match gpd_generic_write_pwm(u8) below return DIV_ROUND_CLOSEST((var - 1) * 255, (drvdata->pwm_max - 1)); } =20 // Read value for pwm1 -static int gpd_read_pwm(void) +static int gpd_read_pwm(struct gpd_fan_data *data) { - switch (gpd_driver_priv.drvdata->board) { + switch (data->drvdata->board) { case win_mini: case duo: case win4_6800u: case mpc2: - switch (gpd_driver_priv.pwm_enable) { + switch (data->pwm_enable) { case DISABLE: return 255; case MANUAL: - return gpd_driver_priv.pwm_value; + return data->pwm_value; case AUTOMATIC: return -EOPNOTSUPP; } break; case win_max_2: - return gpd_wm2_read_pwm(); + return gpd_wm2_read_pwm(data); } return 0; } =20 // PWM value's range in EC is 1 - pwm_max, cast 0 - 255 to it. -static inline u8 gpd_cast_pwm_range(u8 val) +static inline u8 gpd_cast_pwm_range(const struct gpd_fan_drvdata *drvdata,= u8 val) { - const struct gpd_fan_drvdata *const drvdata =3D gpd_driver_priv.drvdata; - return DIV_ROUND_CLOSEST(val * (drvdata->pwm_max - 1), 255) + 1; } =20 -static void gpd_generic_write_pwm(u8 val) +static void gpd_generic_write_pwm(struct gpd_fan_data *data, u8 val) { - const struct gpd_fan_drvdata *const drvdata =3D gpd_driver_priv.drvdata; + const struct gpd_fan_drvdata *drvdata =3D data->drvdata; u8 pwm_reg; =20 - pwm_reg =3D gpd_cast_pwm_range(val); - gpd_ecram_write(drvdata->pwm_write, pwm_reg); + pwm_reg =3D gpd_cast_pwm_range(drvdata, val); + gpd_ecram_write(drvdata, drvdata->pwm_write, pwm_reg); } =20 -static void gpd_duo_write_pwm(u8 val) +static void gpd_duo_write_pwm(struct gpd_fan_data *data, u8 val) { - const struct gpd_fan_drvdata *const drvdata =3D gpd_driver_priv.drvdata; + const struct gpd_fan_drvdata *drvdata =3D data->drvdata; u8 pwm_reg; =20 - pwm_reg =3D gpd_cast_pwm_range(val); - gpd_ecram_write(drvdata->pwm_write, pwm_reg); - gpd_ecram_write(drvdata->pwm_write + 1, pwm_reg); + pwm_reg =3D gpd_cast_pwm_range(drvdata, val); + gpd_ecram_write(drvdata, drvdata->pwm_write, pwm_reg); + gpd_ecram_write(drvdata, drvdata->pwm_write + 1, pwm_reg); } =20 // Write value for pwm1 -static int gpd_write_pwm(u8 val) +static int gpd_write_pwm(struct gpd_fan_data *data, u8 val) { - if (gpd_driver_priv.pwm_enable !=3D MANUAL) + if (data->pwm_enable !=3D MANUAL) return -EPERM; =20 - switch (gpd_driver_priv.drvdata->board) { + switch (data->drvdata->board) { case duo: - gpd_duo_write_pwm(val); + gpd_duo_write_pwm(data, val); break; case win_mini: case win4_6800u: case win_max_2: case mpc2: - gpd_generic_write_pwm(val); + gpd_generic_write_pwm(data, val); break; } =20 return 0; } =20 -static void gpd_win_mini_set_pwm_enable(enum FAN_PWM_ENABLE pwm_enable) +static void gpd_win_mini_set_pwm_enable(struct gpd_fan_data *data, enum FA= N_PWM_ENABLE pwm_enable) { switch (pwm_enable) { case DISABLE: - gpd_generic_write_pwm(255); + gpd_generic_write_pwm(data, 255); break; case MANUAL: - gpd_generic_write_pwm(gpd_driver_priv.pwm_value); + gpd_generic_write_pwm(data, data->pwm_value); break; case AUTOMATIC: - gpd_ecram_write(gpd_driver_priv.drvdata->pwm_write, 0); + gpd_ecram_write(data->drvdata, data->drvdata->pwm_write, 0); break; } } =20 -static void gpd_duo_set_pwm_enable(enum FAN_PWM_ENABLE pwm_enable) +static void gpd_duo_set_pwm_enable(struct gpd_fan_data *data, enum FAN_PWM= _ENABLE pwm_enable) { switch (pwm_enable) { case DISABLE: - gpd_duo_write_pwm(255); + gpd_duo_write_pwm(data, 255); break; case MANUAL: - gpd_duo_write_pwm(gpd_driver_priv.pwm_value); + gpd_duo_write_pwm(data, data->pwm_value); break; case AUTOMATIC: - gpd_ecram_write(gpd_driver_priv.drvdata->pwm_write, 0); + gpd_ecram_write(data->drvdata, data->drvdata->pwm_write, 0); break; } } =20 -static void gpd_wm2_set_pwm_enable(enum FAN_PWM_ENABLE enable) +static void gpd_wm2_set_pwm_enable(struct gpd_fan_data *data, enum FAN_PWM= _ENABLE enable) { - const struct gpd_fan_drvdata *const drvdata =3D gpd_driver_priv.drvdata; + const struct gpd_fan_drvdata *drvdata =3D data->drvdata; =20 switch (enable) { case DISABLE: - gpd_generic_write_pwm(255); - gpd_ecram_write(drvdata->manual_control_enable, 1); + gpd_generic_write_pwm(data, 255); + gpd_ecram_write(drvdata, drvdata->manual_control_enable, 1); break; case MANUAL: - gpd_generic_write_pwm(gpd_driver_priv.pwm_value); - gpd_ecram_write(drvdata->manual_control_enable, 1); + gpd_generic_write_pwm(data, data->pwm_value); + gpd_ecram_write(drvdata, drvdata->manual_control_enable, 1); break; case AUTOMATIC: - gpd_ecram_write(drvdata->manual_control_enable, 0); + gpd_ecram_write(drvdata, drvdata->manual_control_enable, 0); break; } } =20 // Write value for pwm1_enable -static void gpd_set_pwm_enable(enum FAN_PWM_ENABLE enable) +static void gpd_set_pwm_enable(struct gpd_fan_data *data, enum FAN_PWM_ENA= BLE enable) { if (enable =3D=3D MANUAL) // Set pwm_value to max firstly when switching to manual mode, in // consideration of device safety. - gpd_driver_priv.pwm_value =3D 255; + data->pwm_value =3D 255; =20 - switch (gpd_driver_priv.drvdata->board) { + switch (data->drvdata->board) { case win_mini: case win4_6800u: case mpc2: - gpd_win_mini_set_pwm_enable(enable); + gpd_win_mini_set_pwm_enable(data, enable); break; case duo: - gpd_duo_set_pwm_enable(enable); + gpd_duo_set_pwm_enable(data, enable); break; case win_max_2: - gpd_wm2_set_pwm_enable(enable); + gpd_wm2_set_pwm_enable(data, enable); break; } } @@ -505,15 +504,16 @@ static umode_t gpd_fan_hwmon_is_visible(__always_unus= ed const void *drvdata, return 0; } =20 -static int gpd_fan_hwmon_read(__always_unused struct device *dev, +static int gpd_fan_hwmon_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, __always_unused int channel, long *val) { + struct gpd_fan_data *data =3D dev_get_drvdata(dev); int ret; =20 if (type =3D=3D hwmon_fan) { if (attr =3D=3D hwmon_fan_input) { - ret =3D gpd_read_rpm(); + ret =3D gpd_read_rpm(data); =20 if (ret < 0) return ret; @@ -524,10 +524,10 @@ static int gpd_fan_hwmon_read(__always_unused struct = device *dev, } else if (type =3D=3D hwmon_pwm) { switch (attr) { case hwmon_pwm_enable: - *val =3D gpd_driver_priv.pwm_enable; + *val =3D data->pwm_enable; return 0; case hwmon_pwm_input: - ret =3D gpd_read_pwm(); + ret =3D gpd_read_pwm(data); =20 if (ret < 0) return ret; @@ -540,27 +540,29 @@ static int gpd_fan_hwmon_read(__always_unused struct = device *dev, return -EOPNOTSUPP; } =20 -static int gpd_fan_hwmon_write(__always_unused struct device *dev, +static int gpd_fan_hwmon_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, __always_unused int channel, long val) { + struct gpd_fan_data *data =3D dev_get_drvdata(dev); + if (type =3D=3D hwmon_pwm) { switch (attr) { case hwmon_pwm_enable: if (!in_range(val, 0, 3)) return -EINVAL; =20 - gpd_driver_priv.pwm_enable =3D val; + data->pwm_enable =3D val; =20 - gpd_set_pwm_enable(gpd_driver_priv.pwm_enable); + gpd_set_pwm_enable(data, data->pwm_enable); return 0; case hwmon_pwm_input: if (!in_range(val, 0, 256)) return -EINVAL; =20 - gpd_driver_priv.pwm_value =3D val; + data->pwm_value =3D val; =20 - return gpd_write_pwm(val); + return gpd_write_pwm(data, val); } } =20 @@ -584,26 +586,27 @@ static struct hwmon_chip_info gpd_fan_chip_info =3D { .info =3D gpd_fan_hwmon_channel_info }; =20 -static void gpd_win4_init_ec(void) +static void gpd_win4_init_ec(struct gpd_fan_data *data) { + const struct gpd_fan_drvdata *drvdata =3D data->drvdata; u8 chip_id, chip_ver; =20 - gpd_ecram_read(0x2000, &chip_id); + gpd_ecram_read(drvdata, 0x2000, &chip_id); =20 if (chip_id =3D=3D 0x55) { - gpd_ecram_read(0x1060, &chip_ver); - gpd_ecram_write(0x1060, chip_ver | 0x80); + gpd_ecram_read(drvdata, 0x1060, &chip_ver); + gpd_ecram_write(drvdata, 0x1060, chip_ver | 0x80); } } =20 -static void gpd_init_ec(void) +static void gpd_init_ec(struct gpd_fan_data *data) { // The buggy firmware won't initialize EC properly on boot. // Before its initialization, reading RPM will always return 0, // and writing PWM will have no effect. // Initialize it manually on driver load. - if (gpd_driver_priv.drvdata->board =3D=3D win4_6800u) - gpd_win4_init_ec(); + if (data->drvdata->board =3D=3D win4_6800u) + gpd_win4_init_ec(data); } =20 static int gpd_fan_probe(struct platform_device *pdev) @@ -611,7 +614,9 @@ static int gpd_fan_probe(struct platform_device *pdev) struct device *dev =3D &pdev->dev; const struct resource *region; const struct resource *res; - const struct device *hwdev; + struct device *hwdev; + struct gpd_fan_data *data; + const struct gpd_fan_drvdata **match_ptr; =20 res =3D platform_get_resource(pdev, IORESOURCE_IO, 0); if (!res) @@ -624,24 +629,42 @@ static int gpd_fan_probe(struct platform_device *pdev) return dev_err_probe(dev, -EBUSY, "Failed to request region\n"); =20 + data =3D devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + match_ptr =3D dev_get_platdata(dev); + if (!match_ptr) + return -EINVAL; + data->drvdata =3D *match_ptr; + + data->pwm_enable =3D AUTOMATIC; + data->pwm_value =3D 255; + + dev_set_drvdata(dev, data); + + gpd_init_ec(data); + hwdev =3D devm_hwmon_device_register_with_info(dev, DRIVER_NAME, - NULL, + data, &gpd_fan_chip_info, NULL); if (IS_ERR(hwdev)) return dev_err_probe(dev, PTR_ERR(hwdev), "Failed to register hwmon device\n"); =20 - gpd_init_ec(); - return 0; } =20 -static void gpd_fan_remove(__always_unused struct platform_device *pdev) +static void gpd_fan_remove(struct platform_device *pdev) { - gpd_driver_priv.pwm_enable =3D AUTOMATIC; - gpd_set_pwm_enable(AUTOMATIC); + struct gpd_fan_data *data =3D dev_get_drvdata(&pdev->dev); + + if (data) { + data->pwm_enable =3D AUTOMATIC; + gpd_set_pwm_enable(data, AUTOMATIC); + } } =20 static struct platform_driver gpd_fan_driver =3D { @@ -668,6 +691,7 @@ static int __init gpd_fan_init(void) if (!match) { const struct dmi_system_id *dmi_match =3D dmi_first_match(dmi_table); + if (dmi_match) match =3D dmi_match->driver_data; } @@ -675,10 +699,6 @@ static int __init gpd_fan_init(void) if (!match) return -ENODEV; =20 - gpd_driver_priv.pwm_enable =3D AUTOMATIC; - gpd_driver_priv.pwm_value =3D 255; - gpd_driver_priv.drvdata =3D match; - struct resource gpd_fan_resources[] =3D { { .start =3D match->addr_port, @@ -690,7 +710,8 @@ static int __init gpd_fan_init(void) gpd_fan_platform_device =3D platform_create_bundle(&gpd_fan_driver, gpd_fan_probe, gpd_fan_resources, - 1, NULL, 0); + 1, + &match, sizeof(match)); =20 if (IS_ERR(gpd_fan_platform_device)) { pr_warn("Failed to create platform device\n"); --=20 2.25.1 From nobody Sun Jun 14 18:57:05 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 394E932AADE; Sun, 5 Apr 2026 08:40:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775378438; cv=none; b=hRp6T9FMDet5izhUpWSzPN4aAlD5TPLLZmiNUe7oCqnqaRmEK90iH0VjDXeHXdcdwTXGd0+AyTOqsGcBYL/zXyKFfot5/s1EDAilW5Ab7p8HtPaXfuDZMRs4rIZQI125HOFINh/gih0H23GczbCgZrV41IptfKa+8SpcY3DhlsU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775378438; c=relaxed/simple; bh=NLsHC08Gf/BKKuaHtNaF+xwoUM2b1HLo12SDyaQhBIU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=GNF0Vz0PCIoxe9jMcLjJa81f/zgEwLQ5UcBG4aYEi3lyZmdMknP9xoxDdk9iNx6HHgjz+iaCqBVYfpUykAgbY/tbc7v75M/Ex45jeDwdsabx5tQKoyj5rYlHX2bRjKL/OrunGLEjpigp/A0tkWnqfnNnnPVzdh57QSTx7iTHycg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: 159f474230cb11f1aa26b74ffac11d73-20260405 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:14e7cef9-49c2-4f14-adeb-1ae70a863dcb,IP:0,U RL:0,TC:0,Content:0,EDM:25,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:25 X-CID-META: VersionHash:e7bac3a,CLOUDID:ab8c0f9b6c6345f06fb8c431de7791b1,BulkI D:nil,BulkQuantity:0,Recheck:0,SF:81|82|102|850|898,TC:nil,Content:0|15|50 ,EDM:5,IP:nil,URL:0,File:nil,RT:nil,Bulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OS A:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR:0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 159f474230cb11f1aa26b74ffac11d73-20260405 X-User: xiaopei01@kylinos.cn Received: from localhost.localdomain [(10.44.16.150)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 702792376; Sun, 05 Apr 2026 16:40:22 +0800 From: Pei Xiao To: cryolitia@uniontech.com, linux@roeck-us.net, linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Pei Xiao Subject: [PATCH 2/3] hwmon: (gpd-fan): upgrade log level from warn to err for platform device creation failure Date: Sun, 5 Apr 2026 16:40:17 +0800 Message-Id: X-Mailer: git-send-email 2.25.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When platform_create_bundle() fails, the error is fatal and prevents the driver from loading. Use pr_err() instead of pr_warn() to clearly indicate a critical failure. Signed-off-by: Pei Xiao --- drivers/hwmon/gpd-fan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/hwmon/gpd-fan.c b/drivers/hwmon/gpd-fan.c index 5a9d07cd29ab..7df46027177d 100644 --- a/drivers/hwmon/gpd-fan.c +++ b/drivers/hwmon/gpd-fan.c @@ -714,7 +714,7 @@ static int __init gpd_fan_init(void) &match, sizeof(match)); =20 if (IS_ERR(gpd_fan_platform_device)) { - pr_warn("Failed to create platform device\n"); + pr_err("Failed to create platform device\n"); return PTR_ERR(gpd_fan_platform_device); } =20 --=20 2.25.1 From nobody Sun Jun 14 18:57:05 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 31671350298; Sun, 5 Apr 2026 08:40:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775378437; cv=none; b=LKO/xLa8DjRK+cAAJE0sROl0wtesBsVqmJJULvjYmTFIqLFddJoSDXvgzAd6/5ooApLa403KGdb2bS3zKzPCHOS0WuGRnS4fkj8gvneyX5GMehc8tmVcxerb8ZwTtH6+p00AaCUaqBKw3TpTCI3w/TgyHVHm6lugIMylkgTetZY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775378437; c=relaxed/simple; bh=Q4dhdv6FRFZwEK7Hn5mxuKP9i+aVD27jogu2X4IB0IQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=tkyV7LFCAMa4tEw1MPngbjOw4UajSulOxkzwfaK/MkgURGuMRItxiTw6f+/BjtXrugicF7lm/vWqD0vLL7Xe8P7pBy0+Y8xGmXWx6dAcTEw9bHcNAQXJRel04WtPED5HNc90tPYeDuqm6LJzQFR6R9cr7Yh2ts6qRuMsNiZ07gw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: 15c989a830cb11f1aa26b74ffac11d73-20260405 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:847b3aba-2af3-43df-a87b-da3dc3beb57a,IP:0,U RL:0,TC:0,Content:42,EDM:25,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTIO N:release,TS:67 X-CID-META: VersionHash:e7bac3a,CLOUDID:77fcfbaffed45466629e625b7fe24e0d,BulkI D:nil,BulkQuantity:0,Recheck:0,SF:81|82|102|850|898,TC:nil,Content:4|15|50 ,EDM:5,IP:nil,URL:0,File:nil,RT:nil,Bulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OS A:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR:0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 15c989a830cb11f1aa26b74ffac11d73-20260405 X-User: xiaopei01@kylinos.cn Received: from localhost.localdomain [(10.44.16.150)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 1292421645; Sun, 05 Apr 2026 16:40:22 +0800 From: Pei Xiao To: cryolitia@uniontech.com, linux@roeck-us.net, linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Pei Xiao Subject: [PATCH 3/3] hwmon: (gpd-fan): rename enum constants to uppercase as per kernel coding style Date: Sun, 5 Apr 2026 16:40:18 +0800 Message-Id: <4bc7713ed28eb00068b54c3c3008308253ec32a1.1775378028.git.xiaopei01@kylinos.cn> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Kernel coding style requires enum labels to be capitalized. Convert all enum gpd_board constants from lowercase to uppercase. Signed-off-by: Pei Xiao --- drivers/hwmon/gpd-fan.c | 62 ++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/drivers/hwmon/gpd-fan.c b/drivers/hwmon/gpd-fan.c index 7df46027177d..404155dd97bb 100644 --- a/drivers/hwmon/gpd-fan.c +++ b/drivers/hwmon/gpd-fan.c @@ -27,11 +27,11 @@ static char *gpd_fan_board =3D ""; module_param(gpd_fan_board, charp, 0444); =20 enum gpd_board { - win_mini, - win4_6800u, - win_max_2, - duo, - mpc2, + GPD_WIN_MINI, + GPD_WIN4_6800U, + GPD_WIN_MAX_2, + GPD_DUO, + GPD_MPC2, }; =20 enum FAN_PWM_ENABLE { @@ -60,7 +60,7 @@ struct gpd_fan_drvdata { =20 static struct gpd_fan_drvdata gpd_win_mini_drvdata =3D { .board_name =3D "win_mini", - .board =3D win_mini, + .board =3D GPD_WIN_MINI, =20 .addr_port =3D 0x4E, .data_port =3D 0x4F, @@ -72,7 +72,7 @@ static struct gpd_fan_drvdata gpd_win_mini_drvdata =3D { =20 static struct gpd_fan_drvdata gpd_duo_drvdata =3D { .board_name =3D "duo", - .board =3D duo, + .board =3D GPD_DUO, =20 .addr_port =3D 0x4E, .data_port =3D 0x4F, @@ -84,7 +84,7 @@ static struct gpd_fan_drvdata gpd_duo_drvdata =3D { =20 static struct gpd_fan_drvdata gpd_win4_drvdata =3D { .board_name =3D "win4", - .board =3D win4_6800u, + .board =3D GPD_WIN4_6800U, =20 .addr_port =3D 0x2E, .data_port =3D 0x2F, @@ -96,7 +96,7 @@ static struct gpd_fan_drvdata gpd_win4_drvdata =3D { =20 static struct gpd_fan_drvdata gpd_wm2_drvdata =3D { .board_name =3D "wm2", - .board =3D win_max_2, + .board =3D GPD_WIN_MAX_2, =20 .addr_port =3D 0x4E, .data_port =3D 0x4F, @@ -108,7 +108,7 @@ static struct gpd_fan_drvdata gpd_wm2_drvdata =3D { =20 static struct gpd_fan_drvdata gpd_mpc2_drvdata =3D { .board_name =3D "mpc2", - .board =3D mpc2, + .board =3D GPD_MPC2, =20 .addr_port =3D 0x4E, .data_port =3D 0x4F, @@ -322,12 +322,12 @@ static int gpd_wm2_read_rpm(struct gpd_fan_data *data) static int gpd_read_rpm(struct gpd_fan_data *data) { switch (data->drvdata->board) { - case win4_6800u: - case win_mini: - case duo: - case mpc2: + case GPD_WIN4_6800U: + case GPD_WIN_MINI: + case GPD_DUO: + case GPD_MPC2: return gpd_generic_read_rpm(data); - case win_max_2: + case GPD_WIN_MAX_2: return gpd_wm2_read_rpm(data); } =20 @@ -349,10 +349,10 @@ static int gpd_wm2_read_pwm(struct gpd_fan_data *data) static int gpd_read_pwm(struct gpd_fan_data *data) { switch (data->drvdata->board) { - case win_mini: - case duo: - case win4_6800u: - case mpc2: + case GPD_WIN_MINI: + case GPD_DUO: + case GPD_WIN4_6800U: + case GPD_MPC2: switch (data->pwm_enable) { case DISABLE: return 255; @@ -362,7 +362,7 @@ static int gpd_read_pwm(struct gpd_fan_data *data) return -EOPNOTSUPP; } break; - case win_max_2: + case GPD_WIN_MAX_2: return gpd_wm2_read_pwm(data); } return 0; @@ -400,13 +400,13 @@ static int gpd_write_pwm(struct gpd_fan_data *data, u= 8 val) return -EPERM; =20 switch (data->drvdata->board) { - case duo: + case GPD_DUO: gpd_duo_write_pwm(data, val); break; - case win_mini: - case win4_6800u: - case win_max_2: - case mpc2: + case GPD_WIN_MINI: + case GPD_WIN4_6800U: + case GPD_WIN_MAX_2: + case GPD_MPC2: gpd_generic_write_pwm(data, val); break; } @@ -472,15 +472,15 @@ static void gpd_set_pwm_enable(struct gpd_fan_data *d= ata, enum FAN_PWM_ENABLE en data->pwm_value =3D 255; =20 switch (data->drvdata->board) { - case win_mini: - case win4_6800u: - case mpc2: + case GPD_WIN_MINI: + case GPD_WIN4_6800U: + case GPD_MPC2: gpd_win_mini_set_pwm_enable(data, enable); break; - case duo: + case GPD_DUO: gpd_duo_set_pwm_enable(data, enable); break; - case win_max_2: + case GPD_WIN_MAX_2: gpd_wm2_set_pwm_enable(data, enable); break; } @@ -605,7 +605,7 @@ static void gpd_init_ec(struct gpd_fan_data *data) // Before its initialization, reading RPM will always return 0, // and writing PWM will have no effect. // Initialize it manually on driver load. - if (data->drvdata->board =3D=3D win4_6800u) + if (data->drvdata->board =3D=3D GPD_WIN4_6800U) gpd_win4_init_ec(data); } =20 --=20 2.25.1