From patchwork Tue Feb 28 00:11:33 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Harvey X-Patchwork-Id: 1749232 X-Patchwork-Delegate: hauke@hauke-m.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.openwrt.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=j1fs53UK; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4PQdCY3GfWz1yWw for ; Tue, 28 Feb 2023 11:14:32 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=PSu264bKGet2cfdPoRrWRVeRotTUd0hAZWwM05Jlkhs=; b=j1fs53UK++sTYG T9wutsiyvX4QQcR9oeJRZ88zp/II4W4ykSgoHg0J67E21g0klncPD0YJlheEySmHo+4cGptHh3biV KAek57aAVqdcZRf7uN+nJx8D6Q6Lo77Xi0Ln0HPN1Uc/9K9bzD6pCeskYeT7Jqu4CTUKi9zMbzvKv cZa6uSm2atNMe1ROXZ+3KXS0ysoaz7eQUU1penkb2ETqtQgIr2SyTiqrLGq14ioO/07XqiQsWLzFN 0a+wfnHx6GRbxfSfkDMy7q7X2JxZXzNNDkH5ire6Vvkh04ZWAHWXJPqRDZam3qMDL+FlG/wcGU7S8 0EIouw7/QXxb8wM4Q2Pw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pWnax-00BdRp-Er; Tue, 28 Feb 2023 00:11:51 +0000 Received: from finn.gateworks.com ([108.161.129.64] helo=finn.localdomain) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pWnas-00BdQk-BR for openwrt-devel@lists.openwrt.org; Tue, 28 Feb 2023 00:11:48 +0000 Received: from 068-189-091-139.biz.spectrum.com ([68.189.91.139] helo=tharvey.pdc.gateworks.com) by finn.localdomain with esmtp (Exim 4.93) (envelope-from ) id 1pWnaj-003O3O-93; Tue, 28 Feb 2023 00:11:37 +0000 From: Tim Harvey To: openwrt-devel@lists.openwrt.org Cc: Hauke Mehrtens , =?utf-8?q?Petr_=C5=A0tetiar?= , Tim Harvey Subject: [PATCH v2] kernel: fix hwmon-gsc driver Date: Mon, 27 Feb 2023 16:11:33 -0800 Message-Id: <20230228001133.4139312-1-tharvey@gateworks.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230227_161146_458689_FF86EEC7 X-CRM114-Status: GOOD ( 18.84 ) X-Spam-Score: 0.0 (/) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Fix hwmon-gsc driver by replacing out-of-tree hwmon-gsc driver with in-tree driver that was merged in Linux v5.8: - remove the old out-of-tree module - add configuration for the in-tree modules Signed-off-by: Tim Harvey --- v2: - build both CONFIG_MFD_GATEWORKS_GSC and CONFIG_SENSORS_GSC as kernel modules. This requires moving module priority and flagging it as a requ [...] Content analysis details: (0.0 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: OpenWrt Development List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "openwrt-devel" Errors-To: openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org Fix hwmon-gsc driver by replacing out-of-tree hwmon-gsc driver with in-tree driver that was merged in Linux v5.8: - remove the old out-of-tree module - add configuration for the in-tree modules Signed-off-by: Tim Harvey --- v2: - build both CONFIG_MFD_GATEWORKS_GSC and CONFIG_SENSORS_GSC as kernel modules. This requires moving module priority and flagging it as a required for boot as it needs to be present before gpio-button-hotplug - add line break in description - updated commmit message to reference this as a fix --- package/kernel/hwmon-gsc/Makefile | 28 --- package/kernel/hwmon-gsc/src/Makefile | 1 - package/kernel/hwmon-gsc/src/gsc.c | 308 -------------------------- package/kernel/linux/modules/hwmon.mk | 19 ++ 4 files changed, 19 insertions(+), 337 deletions(-) delete mode 100644 package/kernel/hwmon-gsc/Makefile delete mode 100644 package/kernel/hwmon-gsc/src/Makefile delete mode 100644 package/kernel/hwmon-gsc/src/gsc.c diff --git a/package/kernel/hwmon-gsc/Makefile b/package/kernel/hwmon-gsc/Makefile deleted file mode 100644 index cd7d4efb1079..000000000000 --- a/package/kernel/hwmon-gsc/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -include $(TOPDIR)/rules.mk -include $(INCLUDE_DIR)/kernel.mk - -PKG_NAME:=hwmon-gsc -PKG_RELEASE:=1 - -include $(INCLUDE_DIR)/package.mk - -define KernelPackage/hwmon-gsc - SUBMENU:=Hardware Monitoring Support - DEPENDS:=@TARGET_imx +kmod-hwmon-core +kmod-i2c-core - TITLE:=Driver for the Gateworks System Controller - AUTOLOAD:=$(call AutoLoad,60,gsc) - FILES:=$(PKG_BUILD_DIR)/gsc.ko -endef - -define KernelPackage/hwmon-gsc/description - Kernel module for the Gateworks System Controller chips. -endef - -define Build/Compile - $(KERNEL_MAKE) \ - M="$(PKG_BUILD_DIR)" \ - EXTRA_CFLAGS="$(BUILDFLAGS)" \ - modules -endef - -$(eval $(call KernelPackage,hwmon-gsc)) diff --git a/package/kernel/hwmon-gsc/src/Makefile b/package/kernel/hwmon-gsc/src/Makefile deleted file mode 100644 index 0e54aed2e376..000000000000 --- a/package/kernel/hwmon-gsc/src/Makefile +++ /dev/null @@ -1 +0,0 @@ -obj-m := gsc.o diff --git a/package/kernel/hwmon-gsc/src/gsc.c b/package/kernel/hwmon-gsc/src/gsc.c deleted file mode 100644 index 737cc599b4e7..000000000000 --- a/package/kernel/hwmon-gsc/src/gsc.c +++ /dev/null @@ -1,308 +0,0 @@ -/* - * A hwmon driver for the Gateworks System Controller - * Copyright (C) 2009 Gateworks Corporation - * - * Author: Chris Lang - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, - * as published by the Free Software Foundation - version 2. - */ - -#include -#include -#include -#include -#include -#include - -#define DRV_VERSION "0.2" - -enum chips { gsp }; - -/* AD7418 registers */ -#define GSP_REG_TEMP_IN 0x00 -#define GSP_REG_VIN 0x02 -#define GSP_REG_3P3 0x05 -#define GSP_REG_BAT 0x08 -#define GSP_REG_5P0 0x0b -#define GSP_REG_CORE 0x0e -#define GSP_REG_CPU1 0x11 -#define GSP_REG_CPU2 0x14 -#define GSP_REG_DRAM 0x17 -#define GSP_REG_EXT_BAT 0x1a -#define GSP_REG_IO1 0x1d -#define GSP_REG_IO2 0x20 -#define GSP_REG_PCIE 0x23 -#define GSP_REG_CURRENT 0x26 -#define GSP_FAN_0 0x2C -#define GSP_FAN_1 0x2E -#define GSP_FAN_2 0x30 -#define GSP_FAN_3 0x32 -#define GSP_FAN_4 0x34 -#define GSP_FAN_5 0x36 - -struct gsp_sensor_info { - const char* name; - int reg; -}; - -static const struct gsp_sensor_info gsp_sensors[] = { - {"temp", GSP_REG_TEMP_IN}, - {"vin", GSP_REG_VIN}, - {"3p3", GSP_REG_3P3}, - {"bat", GSP_REG_BAT}, - {"5p0", GSP_REG_5P0}, - {"core", GSP_REG_CORE}, - {"cpu1", GSP_REG_CPU1}, - {"cpu2", GSP_REG_CPU2}, - {"dram", GSP_REG_DRAM}, - {"ext_bat", GSP_REG_EXT_BAT}, - {"io1", GSP_REG_IO1}, - {"io2", GSP_REG_IO2}, - {"pci2", GSP_REG_PCIE}, - {"current", GSP_REG_CURRENT}, - {"fan_point0", GSP_FAN_0}, - {"fan_point1", GSP_FAN_1}, - {"fan_point2", GSP_FAN_2}, - {"fan_point3", GSP_FAN_3}, - {"fan_point4", GSP_FAN_4}, - {"fan_point5", GSP_FAN_5}, -}; - -struct gsp_data { - struct device *hwmon_dev; - struct attribute_group attrs; - enum chips type; -}; - -static int gsp_probe(struct i2c_client *client, - const struct i2c_device_id *id); -static int gsp_remove(struct i2c_client *client); - -static const struct i2c_device_id gsp_id[] = { - { "gsp", 0 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, gsp_id); - -static struct i2c_driver gsp_driver = { - .driver = { - .name = "gsp", - }, - .probe = gsp_probe, - .remove = gsp_remove, - .id_table = gsp_id, -}; - -/* All registers are word-sized, except for the configuration registers. - * AD7418 uses a high-byte first convention. Do NOT use those functions to - * access the configuration registers CONF and CONF2, as they are byte-sized. - */ -static inline int gsp_read(struct i2c_client *client, u8 reg) -{ - unsigned int adc = 0; - if (reg == GSP_REG_TEMP_IN || reg > GSP_REG_CURRENT) - { - adc |= i2c_smbus_read_byte_data(client, reg); - adc |= i2c_smbus_read_byte_data(client, reg + 1) << 8; - return adc; - } - else - { - adc |= i2c_smbus_read_byte_data(client, reg); - adc |= i2c_smbus_read_byte_data(client, reg + 1) << 8; - adc |= i2c_smbus_read_byte_data(client, reg + 2) << 16; - return adc; - } -} - -static inline int gsp_write(struct i2c_client *client, u8 reg, u16 value) -{ - i2c_smbus_write_byte_data(client, reg, value & 0xff); - i2c_smbus_write_byte_data(client, reg + 1, ((value >> 8) & 0xff)); - return 1; -} - -static ssize_t show_adc(struct device *dev, struct device_attribute *devattr, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); - struct i2c_client *client = to_i2c_client(dev); - return sprintf(buf, "%d\n", gsp_read(client, gsp_sensors[attr->index].reg)); -} - -static ssize_t show_label(struct device *dev, - struct device_attribute *devattr, char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); - - return sprintf(buf, "%s\n", gsp_sensors[attr->index].name); -} - -static ssize_t store_fan(struct device *dev, - struct device_attribute *devattr, const char *buf, size_t count) -{ - u16 val; - struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); - struct i2c_client *client = to_i2c_client(dev); - val = simple_strtoul(buf, NULL, 10); - gsp_write(client, gsp_sensors[attr->index].reg, val); - return count; -} - -static SENSOR_DEVICE_ATTR(temp0_input, S_IRUGO, show_adc, NULL, 0); -static SENSOR_DEVICE_ATTR(temp0_label, S_IRUGO, show_label, NULL, 0); - -static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_adc, NULL, 1); -static SENSOR_DEVICE_ATTR(in0_label, S_IRUGO, show_label, NULL, 1); -static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_adc, NULL, 2); -static SENSOR_DEVICE_ATTR(in1_label, S_IRUGO, show_label, NULL, 2); -static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_adc, NULL, 3); -static SENSOR_DEVICE_ATTR(in2_label, S_IRUGO, show_label, NULL, 3); -static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_adc, NULL, 4); -static SENSOR_DEVICE_ATTR(in3_label, S_IRUGO, show_label, NULL, 4); -static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, show_adc, NULL, 5); -static SENSOR_DEVICE_ATTR(in4_label, S_IRUGO, show_label, NULL, 5); -static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_adc, NULL, 6); -static SENSOR_DEVICE_ATTR(in5_label, S_IRUGO, show_label, NULL, 6); -static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_adc, NULL, 7); -static SENSOR_DEVICE_ATTR(in6_label, S_IRUGO, show_label, NULL, 7); -static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_adc, NULL, 8); -static SENSOR_DEVICE_ATTR(in7_label, S_IRUGO, show_label, NULL, 8); -static SENSOR_DEVICE_ATTR(in8_input, S_IRUGO, show_adc, NULL, 9); -static SENSOR_DEVICE_ATTR(in8_label, S_IRUGO, show_label, NULL, 9); -static SENSOR_DEVICE_ATTR(in9_input, S_IRUGO, show_adc, NULL, 10); -static SENSOR_DEVICE_ATTR(in9_label, S_IRUGO, show_label, NULL, 10); -static SENSOR_DEVICE_ATTR(in10_input, S_IRUGO, show_adc, NULL, 11); -static SENSOR_DEVICE_ATTR(in10_label, S_IRUGO, show_label, NULL, 11); -static SENSOR_DEVICE_ATTR(in11_input, S_IRUGO, show_adc, NULL, 12); -static SENSOR_DEVICE_ATTR(in11_label, S_IRUGO, show_label, NULL, 12); -static SENSOR_DEVICE_ATTR(in12_input, S_IRUGO, show_adc, NULL, 13); -static SENSOR_DEVICE_ATTR(in12_label, S_IRUGO, show_label, NULL, 13); - -static SENSOR_DEVICE_ATTR(fan0_point0, S_IRUGO | S_IWUSR, show_adc, store_fan, 14); -static SENSOR_DEVICE_ATTR(fan0_point1, S_IRUGO | S_IWUSR, show_adc, store_fan, 15); -static SENSOR_DEVICE_ATTR(fan0_point2, S_IRUGO | S_IWUSR, show_adc, store_fan, 16); -static SENSOR_DEVICE_ATTR(fan0_point3, S_IRUGO | S_IWUSR, show_adc, store_fan, 17); -static SENSOR_DEVICE_ATTR(fan0_point4, S_IRUGO | S_IWUSR, show_adc, store_fan, 18); -static SENSOR_DEVICE_ATTR(fan0_point5, S_IRUGO | S_IWUSR, show_adc, store_fan, 19); - -static struct attribute *gsp_attributes[] = { - &sensor_dev_attr_temp0_input.dev_attr.attr, - &sensor_dev_attr_in0_input.dev_attr.attr, - &sensor_dev_attr_in1_input.dev_attr.attr, - &sensor_dev_attr_in2_input.dev_attr.attr, - &sensor_dev_attr_in3_input.dev_attr.attr, - &sensor_dev_attr_in4_input.dev_attr.attr, - &sensor_dev_attr_in5_input.dev_attr.attr, - &sensor_dev_attr_in6_input.dev_attr.attr, - &sensor_dev_attr_in7_input.dev_attr.attr, - &sensor_dev_attr_in8_input.dev_attr.attr, - &sensor_dev_attr_in9_input.dev_attr.attr, - &sensor_dev_attr_in10_input.dev_attr.attr, - &sensor_dev_attr_in11_input.dev_attr.attr, - &sensor_dev_attr_in12_input.dev_attr.attr, - - &sensor_dev_attr_temp0_label.dev_attr.attr, - &sensor_dev_attr_in0_label.dev_attr.attr, - &sensor_dev_attr_in1_label.dev_attr.attr, - &sensor_dev_attr_in2_label.dev_attr.attr, - &sensor_dev_attr_in3_label.dev_attr.attr, - &sensor_dev_attr_in4_label.dev_attr.attr, - &sensor_dev_attr_in5_label.dev_attr.attr, - &sensor_dev_attr_in6_label.dev_attr.attr, - &sensor_dev_attr_in7_label.dev_attr.attr, - &sensor_dev_attr_in8_label.dev_attr.attr, - &sensor_dev_attr_in9_label.dev_attr.attr, - &sensor_dev_attr_in10_label.dev_attr.attr, - &sensor_dev_attr_in11_label.dev_attr.attr, - &sensor_dev_attr_in12_label.dev_attr.attr, - - &sensor_dev_attr_fan0_point0.dev_attr.attr, - &sensor_dev_attr_fan0_point1.dev_attr.attr, - &sensor_dev_attr_fan0_point2.dev_attr.attr, - &sensor_dev_attr_fan0_point3.dev_attr.attr, - &sensor_dev_attr_fan0_point4.dev_attr.attr, - &sensor_dev_attr_fan0_point5.dev_attr.attr, - NULL -}; - - -static int gsp_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct i2c_adapter *adapter = client->adapter; - struct gsp_data *data; - int err; - - if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | - I2C_FUNC_SMBUS_WORD_DATA)) { - err = -EOPNOTSUPP; - goto exit; - } - - if (!(data = kzalloc(sizeof(struct gsp_data), GFP_KERNEL))) { - err = -ENOMEM; - goto exit; - } - - i2c_set_clientdata(client, data); - - data->type = id->driver_data; - - switch (data->type) { - case 0: - data->attrs.attrs = gsp_attributes; - break; - } - - dev_info(&client->dev, "%s chip found\n", client->name); - - /* Register sysfs hooks */ - if ((err = sysfs_create_group(&client->dev.kobj, &data->attrs))) - goto exit_free; - - data->hwmon_dev = hwmon_device_register(&client->dev); - if (IS_ERR(data->hwmon_dev)) { - err = PTR_ERR(data->hwmon_dev); - goto exit_remove; - } - - return 0; - -exit_remove: - sysfs_remove_group(&client->dev.kobj, &data->attrs); -exit_free: - kfree(data); -exit: - return err; -} - -static int gsp_remove(struct i2c_client *client) -{ - struct gsp_data *data = i2c_get_clientdata(client); - hwmon_device_unregister(data->hwmon_dev); - sysfs_remove_group(&client->dev.kobj, &data->attrs); - kfree(data); - return 0; -} - -static int __init gsp_init(void) -{ - return i2c_add_driver(&gsp_driver); -} - -static void __exit gsp_exit(void) -{ - i2c_del_driver(&gsp_driver); -} - -module_init(gsp_init); -module_exit(gsp_exit); - -MODULE_AUTHOR("Chris Lang "); -MODULE_DESCRIPTION("GSC HWMON driver"); -MODULE_LICENSE("GPL"); -MODULE_VERSION(DRV_VERSION); - diff --git a/package/kernel/linux/modules/hwmon.mk b/package/kernel/linux/modules/hwmon.mk index c8d79b622e7a..79df0471ed51 100644 --- a/package/kernel/linux/modules/hwmon.mk +++ b/package/kernel/linux/modules/hwmon.mk @@ -108,6 +108,25 @@ endef $(eval $(call KernelPackage,hwmon-drivetemp)) +define KernelPackage/hwmon-gsc + TITLE:=Gateworks System Controller support + KCONFIG:=CONFIG_MFD_GATEWORKS_GSC \ + CONFIG_SENSORS_GSC + FILES:= \ + $(LINUX_DIR)/drivers/mfd/gateworks-gsc.ko \ + $(LINUX_DIR)/drivers/hwmon/gsc-hwmon.ko + AUTOLOAD:=$(call AutoLoad,20,gsc-hwmon,1) + $(call AddDepends/hwmon,+kmod-i2c-core) +endef + +define KernelPackage/hwmon-gsc/description + Kernel module for Gateworks System Controller with temperature sensor, +ADCs, and FAN controller +endef + +$(eval $(call KernelPackage,hwmon-gsc)) + + define KernelPackage/hwmon-gpiofan TITLE:=Generic GPIO FAN support KCONFIG:=CONFIG_SENSORS_GPIO_FAN