From patchwork Fri Aug 30 01:05:41 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13784071 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1D49F1D1317 for ; Fri, 30 Aug 2024 01:06:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979962; cv=none; b=iWUZdzJxIjF6ZFvkXm3fOmyQH/M4lFoV7XgF0ZJsLaMhxYaNdzAElJBW2D1cTI0Z7Kz0hhnwIISfgKsWQQU7iTx1XSnT7BP1p08dmzHkddPY3qnTYXlezmO/0cwCVhbmvIm4JEq9fnW7yN+olo3LHpSrbyy4Tss3LfiKS36Qg8U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979962; c=relaxed/simple; bh=L6FrXn6RXQWwb5kt7DYhZLmzxyBpeo9KMXSas4GPsQo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XDIqLTi6lQa4mP4ngNhwSuN7LDcYRVYkbGY2ialENdVJUx7qsF6vYrOrWQriXTnCWl1wWf60XobAUITvlqX5mVYyL2ndYU1Z2TA09P1UtKBN51W8Lzb01Vxtv+KKFCFvF1FcF/SMHnbcs0Ak3G7dDfsBc78gKtFBY32zMZGbwkc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=TB045/QZ; arc=none smtp.client-ip=209.85.210.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="TB045/QZ" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-7143165f23fso1040027b3a.1 for ; Thu, 29 Aug 2024 18:06:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724979960; x=1725584760; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=zrnwwCZWGbJxQ4hO3t/7VjizGZWjaacREYJ5w+I9hxM=; b=TB045/QZZvqB4J1nIay8Kf3O6Yr3YaS1vKquXfTpd5SY0WsVSfXAQcdYxDezMcv0/P xqJm/wk4d2Z/A/YUbj9CA8ZCdmvXsta57ch+cLHBH1/Gokp79SKpGU7QsiGxtF4tg0U3 Qg/hrfL+7BZImzWGzg0PaPR6RL8Kgtl1uNosNY1UrPD7tw1qEjnDfypZ4WTQi0nTjptO QWmRvp+ZzJqILRPyTO3r5aQdvpe7YcCZNgRVH+TXnu5yAKEq1Yu3+5kduIxve+M9X3lA 1JG3s5Bdw2jL81lTvPUJi4H1SzC/8FbCV1GZe/sK8B2cXd48OmDHJTLAZsn9amn1N5VS tt7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724979960; x=1725584760; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=zrnwwCZWGbJxQ4hO3t/7VjizGZWjaacREYJ5w+I9hxM=; b=mGFu4UoFnAaebiCJqgQlNoz6KvY+F+bvHAYNXWOd1QjljQNovkOJprjfYogkuk9Rq+ Il/nQ9ZraUuypXkFyx36pj6xcrBre3u9WxALzFJiz3Fx1/Laaxf6fLxgYIX5mNRteYyv oiwD1mE/mFo+QfmKwKkY/br80x5ah8/jAG7exj4l7qsK1BwKrLJBbkn66JLRyKjww9In U1Bf46pCYS9a/ErUZGpX6dqlVtcM7Yrtduy4wynkpidFuxgsCwHEH27tU7iLO1wnTpZi IAuqz1LbxsqtAk1HVcRhxZUEptxgAQqQnpKyzpTfHWg132un1ARZr9Z1xPGdA84JnqzB 91lg== X-Gm-Message-State: AOJu0YxrVD6n0cq1liqGfwH5ZXiSK3IOtBNRoNCxwylAy9Na01AuvkIN iK7zBZRC5aJkbeC2gkybk/8fCtpwWJZTndXv//9BsjDjacE6q1TUOEUfgw== X-Google-Smtp-Source: AGHT+IHriRlZG/vgxtFmQBWUnqN+9SkUiASpX5Cq/fJO6wYjBZb+BM+9ja4RTSpgmAyWLJ+edMTfdQ== X-Received: by 2002:a05:6a20:a823:b0:1cc:e4a9:915b with SMTP id adf61e73a8af0-1cce4a99169mr2566006637.47.1724979959898; Thu, 29 Aug 2024 18:05:59 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e5576c90sm1733629b3a.2.2024.08.29.18.05.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Aug 2024 18:05:59 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Tzung-Bi Shih , Guenter Roeck Subject: [PATCH v2 01/14] hwmon: (ina2xx) Reorder include files to alphabetic order Date: Thu, 29 Aug 2024 18:05:41 -0700 Message-ID: <20240830010554.1462861-2-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240830010554.1462861-1-linux@roeck-us.net> References: <20240830010554.1462861-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Simplify driver maintenance by reordering include files to alphabetic order. Whule at it, drop unnecessary / unused jiffies.h. No functional change. Reviewed-by: Tzung-Bi Shih Signed-off-by: Guenter Roeck --- v2: Added Reviewed-by: tag drivers/hwmon/ina2xx.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index 9ab4205622e2..a6a619a85eb6 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -22,19 +22,18 @@ * Thanks to Jan Volkering */ -#include -#include -#include +#include #include -#include -#include #include #include -#include +#include +#include +#include +#include #include -#include -#include #include +#include +#include #include From patchwork Fri Aug 30 01:05:42 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13784072 Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D0F424A24 for ; Fri, 30 Aug 2024 01:06:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979964; cv=none; b=Eq7j6HUGl0VdyG78C662/i4F5dIzJIwwQ27HUeJzz+ZuoOHGky1Q+ACubKUcyea64wLSNVWkSml+3sJfIIvIE/ULofoy9TGlvCQf3BnysOY1YRqrPX5ijQUFSn8FU2vyvMDVubyI3tl52GocUcOWT08IgLiT+tqktbITSzGlYMY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979964; c=relaxed/simple; bh=91nFN2K9+IZgSswnkrAw0ZOUhCjvRKWrtpJoXyO2OEk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RoOYdTTp2A14wZxcQthGjVH7S1RtPd4hm5RGji1Prt6QmyJutRd2nlsAcZ2f9Wa5TuyCc6mheowYHmBSEgNawE7VTFnhMmNlXhzHBTiqXSINDwJjSZLhQZKABksKPimVS4qmyPNUc78VsBCF0H+tu38iC5wEgsFWGn2v1HcIfDM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=JTzjhOsF; arc=none smtp.client-ip=209.85.210.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="JTzjhOsF" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-715abede256so955721b3a.3 for ; Thu, 29 Aug 2024 18:06:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724979962; x=1725584762; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=cjUQvob5m7HF1bspA9uScPU9vLm3Qnjtm1ZiyuXdQI4=; b=JTzjhOsFd7oskVjTVbSkf05XTt12ZYGrxYc4hHFilfKrfVHPVwrUun6IkVKFWLLFjX mzjsmvQEOwWqT2Qw6SbFV7Ld1jK1AGvFwFSavDHEOQrRYQjoe8u+i5ZF0EbZvnnEdFzG fT7VI4eRM0LX0DDEWIll3VPCqH155IMHXmeiiWmMJkEWF7V8wwN8In3QSAI72C0vsiS4 krRoS/SRTyN+HrYYEjzEDCVILRJ/7FA90FGPXUn1cymzqGsci9yRKIaja06WkIzZUKzg NmGlSVvbgevpqc9bx5EoL98pW0LgE3g0f5H3PRP3jtZA5EcN3Crpo+UpcMg5THW+pH16 O14Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724979962; x=1725584762; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=cjUQvob5m7HF1bspA9uScPU9vLm3Qnjtm1ZiyuXdQI4=; b=NjJTyN+rDTV/9T6DKUYCL7Ga/r4bJ3Tmi6vrWJC3lxgbrND2+uvOv9m65BUiWC8eOl TA/gvaYL6BbaENwa8mjxAT1YANdfgahpPATQ3S+1n+zXXcIbAw617VR3PP09JBngelxk mwuTOe2ZKPldxCCV3X7boAEeCUqFeNITCCZDAZ3UXoq3Zmg/NEDyYPK+CEbCJbGcxg8x DNdc0JicJRaEy7kFSt9JjncYCHBh4JQEGQC/LRTQTpENbit3AXOQa1ibsqhfMbdk2ASX v7pnAkJIWnHolblcyduy1Zc1njbXlOp1snesciQJpXjtkoT3ClBtCi/MyIsRH8AUbzGo MjTw== X-Gm-Message-State: AOJu0YwtYhgnh4CtkzHQj/5WB3/K4UtLhFPDPNt0klucfY6JC6Mw5l52 VjDspiSUVwbqHiejmod4Lni+V25oGtc4MSh1NXyqh8jsQcLQOvz0qMHNQA== X-Google-Smtp-Source: AGHT+IEs9xmRoKge/hC/8Zzqaf3RyAxoOgTn9aWmhvbF1MZ2FH4Vw5p+Aaktd5zsX2pszbAe+Wk51w== X-Received: by 2002:a05:6a20:e617:b0:1ca:ccd1:4b33 with SMTP id adf61e73a8af0-1cce0fed420mr4786630637.7.1724979961578; Thu, 29 Aug 2024 18:06:01 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2051553648fsm17140815ad.172.2024.08.29.18.06.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Aug 2024 18:06:00 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Tzung-Bi Shih , Guenter Roeck Subject: [PATCH v2 02/14] hwmon: (ina2xx) Replace platform data with device properties Date: Thu, 29 Aug 2024 18:05:42 -0700 Message-ID: <20240830010554.1462861-3-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240830010554.1462861-1-linux@roeck-us.net> References: <20240830010554.1462861-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 There are no in-tree users of ina2xx platform data. Drop it and support device properties instead as alternative if it should ever be needed. Reviewed-by: Tzung-Bi Shih Signed-off-by: Guenter Roeck --- v2: Added Reviewed-by: tag drivers/hwmon/ina2xx.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index a6a619a85eb6..897657f8d685 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -30,13 +30,11 @@ #include #include #include -#include +#include #include #include #include -#include - /* common register definitions */ #define INA2XX_CONFIG 0x00 #define INA2XX_SHUNT_VOLTAGE 0x01 /* readonly */ @@ -643,14 +641,8 @@ static int ina2xx_probe(struct i2c_client *client) data->config = &ina2xx_config[chip]; mutex_init(&data->config_lock); - if (of_property_read_u32(dev->of_node, "shunt-resistor", &val) < 0) { - struct ina2xx_platform_data *pdata = dev_get_platdata(dev); - - if (pdata) - val = pdata->shunt_uohms; - else - val = INA2XX_RSHUNT_DEFAULT; - } + if (device_property_read_u32(dev, "shunt-resistor", &val) < 0) + val = INA2XX_RSHUNT_DEFAULT; ina2xx_set_shunt(data, val); @@ -667,7 +659,7 @@ static int ina2xx_probe(struct i2c_client *client) return dev_err_probe(dev, ret, "failed to enable vs regulator\n"); if (chip == ina226) { - if (of_property_read_bool(dev->of_node, "ti,alert-polarity-active-high")) { + if (device_property_read_bool(dev, "ti,alert-polarity-active-high")) { ret = ina2xx_set_alert_polarity(data, INA226_ALERT_POL_HIGH); if (ret < 0) { From patchwork Fri Aug 30 01:05:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13784073 Received: from mail-oo1-f43.google.com (mail-oo1-f43.google.com [209.85.161.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 141E61D1313 for ; Fri, 30 Aug 2024 01:06:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979966; cv=none; b=GKPL85EhtxtuG2+ZqOnhV8bzfmg7c+QPDpvtajbl1U8oO9HlYclwBfran5ZHJh9K3DK3Oq2LSoQ/UW1k8YTLZw8LNY6cSn89IIK9lJEBB9D/8dOM27kD6TCB/bLTCjo3ESCFDiTSbgtngQVAPwBuzg2xHiSHgXQx7bcVf9ePuYg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979966; c=relaxed/simple; bh=IEQBBBRng3RwrAuRtje/i8tymL9Ui/qCJBLpIAeaqhc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gXtrD8MI+XPP5IPNj95ZRRYCuq7o/4f5EzTmvpc3lQS2iFIXDO4CJeO2UNRVgYnZ/QExIb/+X2ewA/3HXdyNb9b0xl+gXOpQb00a83kgNFZ1MLuT5w/tBvHrFJJ9dH9vspqxJvun8lJ2SHaKzSiTxEr+6hPSZGhoWaHyrQtBri8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Z9A8HJSx; arc=none smtp.client-ip=209.85.161.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Z9A8HJSx" Received: by mail-oo1-f43.google.com with SMTP id 006d021491bc7-5dfabdbef52so232980eaf.3 for ; Thu, 29 Aug 2024 18:06:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724979963; x=1725584763; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=3Pf77FQ8Na3/kvLxrdMcdN10PN9Q18fKHkGYmLP7bts=; b=Z9A8HJSxybJaJgzO6QqO9ah1IvoH2+0wIT7zGC+M9bpO9SAWU/9OZUgOr0hRkoCFiY xNIMpyQFBHi0rUwrXdoWEPsDAzuiu8MC5HfSlaTgl/A55icYhgegVtROlWr9slO59xKK Cb7KmTLe9Z9QGEQ9wzW0dI3xya2DPx9kqVmVNJe5Q474EWS38jkoW/DgfitVsqZ30p1d P4VOnOdHlgAUMlfj1ialdQ8lBLpGo4J2rtpkGNODmRajwZ4CEWdd+5kTCfM4lEmo5EWh GZC+EavHdFkhTc/w5T8+rOEpxuNeQQVLiRQ2rp4GwOrwP4xXXXxPOmEb79OMTScATOQt txCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724979963; x=1725584763; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=3Pf77FQ8Na3/kvLxrdMcdN10PN9Q18fKHkGYmLP7bts=; b=tjsX03BJalhrqZiHkhEDbaFwA2NPCIH5S0czL3j+gpSJ1b3Ap8UupOqXfL4adsBRU1 CdISPfvm03KAhJFtuLsUoeBrn9u4m47TJM2x4qdfktR8FNRJIBiZHcNxZjclp3CIC4hT IsiyyQJjJr4RVNeZA17/Cc+9h0adJ50PcUDiOAGCaO6sdCYkl4QW+2bdc8VtZ9lzgGQc kkO2SXYHWDRAwDRIIPNanBytNSM40+Ho6h143Vg9Vf+ygfThIibC6CkPYLezKFmyohrf DfGzKReKkeg6giJRcEM12pc2Oh5qo0wjsAPwJEN5wKjTfEaHP9V5gEy/i4Sxa2OFSMCp +Dbw== X-Gm-Message-State: AOJu0Yy/AobfYrPQGRasll566GWSq63Fnhoagnqdt/lFiwKZDIu703Hx OTLEsBtt9TG9toD8yHQ3oagc5NdWK0GKyO8W2gE/NjDw0rz6KQGfD05HVw== X-Google-Smtp-Source: AGHT+IGMeCVc3E+EVM8EBLZYwccMlRvcKkRry5KpZNp1yd3+CbOjJb/eS8WofESIpMj8C5zdP4p0RQ== X-Received: by 2002:a05:6870:819e:b0:261:537:8d8 with SMTP id 586e51a60fabf-27790372974mr5658375fac.49.1724979963320; Thu, 29 Aug 2024 18:06:03 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e56aa485sm1719323b3a.102.2024.08.29.18.06.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Aug 2024 18:06:02 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Tzung-Bi Shih , Guenter Roeck Subject: [PATCH v2 03/14] hwmon: (ina2xx) Use bit operations Date: Thu, 29 Aug 2024 18:05:43 -0700 Message-ID: <20240830010554.1462861-4-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240830010554.1462861-1-linux@roeck-us.net> References: <20240830010554.1462861-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Use bit operations where possible to make the code more generic and to align it with other drivers. Also use compile time conversion from bit to mask to reduce runtime overhead. Reviewed-by: Tzung-Bi Shih Signed-off-by: Guenter Roeck --- v2: Added Reviewed-by: tag drivers/hwmon/ina2xx.c | 84 +++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index 897657f8d685..1b4170d02c94 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -22,6 +22,8 @@ * Thanks to Jan Volkering */ +#include +#include #include #include #include @@ -65,25 +67,23 @@ #define INA2XX_RSHUNT_DEFAULT 10000 /* bit mask for reading the averaging setting in the configuration register */ -#define INA226_AVG_RD_MASK 0x0E00 +#define INA226_AVG_RD_MASK GENMASK(11, 9) -#define INA226_READ_AVG(reg) (((reg) & INA226_AVG_RD_MASK) >> 9) -#define INA226_SHIFT_AVG(val) ((val) << 9) +#define INA226_READ_AVG(reg) FIELD_GET(INA226_AVG_RD_MASK, reg) -#define INA226_ALERT_POLARITY_MASK 0x0002 -#define INA226_SHIFT_ALERT_POLARITY(val) ((val) << 1) -#define INA226_ALERT_POL_LOW 0 -#define INA226_ALERT_POL_HIGH 1 +#define INA226_ALERT_POLARITY_MASK BIT(1) +#define INA226_ALERT_POL_LOW 0 +#define INA226_ALERT_POL_HIGH 1 /* bit number of alert functions in Mask/Enable Register */ -#define INA226_SHUNT_OVER_VOLTAGE_BIT 15 -#define INA226_SHUNT_UNDER_VOLTAGE_BIT 14 -#define INA226_BUS_OVER_VOLTAGE_BIT 13 -#define INA226_BUS_UNDER_VOLTAGE_BIT 12 -#define INA226_POWER_OVER_LIMIT_BIT 11 +#define INA226_SHUNT_OVER_VOLTAGE_MASK BIT(15) +#define INA226_SHUNT_UNDER_VOLTAGE_MASK BIT(14) +#define INA226_BUS_OVER_VOLTAGE_MASK BIT(13) +#define INA226_BUS_UNDER_VOLTAGE_MASK BIT(12) +#define INA226_POWER_OVER_LIMIT_MASK BIT(11) /* bit mask for alert config bits of Mask/Enable Register */ -#define INA226_ALERT_CONFIG_MASK 0xFC00 +#define INA226_ALERT_CONFIG_MASK GENMASK(15, 10) #define INA226_ALERT_FUNCTION_FLAG BIT(4) /* common attrs, ina226 attrs and NULL */ @@ -177,7 +177,7 @@ static u16 ina226_interval_to_reg(int interval) avg_bits = find_closest(avg, ina226_avg_tab, ARRAY_SIZE(ina226_avg_tab)); - return INA226_SHIFT_AVG(avg_bits); + return FIELD_PREP(INA226_AVG_RD_MASK, avg_bits); } static int ina2xx_set_alert_polarity(struct ina2xx_data *data, @@ -185,7 +185,7 @@ static int ina2xx_set_alert_polarity(struct ina2xx_data *data, { return regmap_update_bits(data->regmap, INA226_MASK_ENABLE, INA226_ALERT_POLARITY_MASK, - INA226_SHIFT_ALERT_POLARITY(val)); + FIELD_PREP(INA226_ALERT_POLARITY_MASK, val)); } /* @@ -322,20 +322,20 @@ static ssize_t ina2xx_value_show(struct device *dev, return sysfs_emit(buf, "%d\n", ina2xx_get_value(data, attr->index, regval)); } -static int ina226_reg_to_alert(struct ina2xx_data *data, u8 bit, u16 regval) +static int ina226_reg_to_alert(struct ina2xx_data *data, u32 mask, u16 regval) { int reg; - switch (bit) { - case INA226_SHUNT_OVER_VOLTAGE_BIT: - case INA226_SHUNT_UNDER_VOLTAGE_BIT: + switch (mask) { + case INA226_SHUNT_OVER_VOLTAGE_MASK: + case INA226_SHUNT_UNDER_VOLTAGE_MASK: reg = INA2XX_SHUNT_VOLTAGE; break; - case INA226_BUS_OVER_VOLTAGE_BIT: - case INA226_BUS_UNDER_VOLTAGE_BIT: + case INA226_BUS_OVER_VOLTAGE_MASK: + case INA226_BUS_UNDER_VOLTAGE_MASK: reg = INA2XX_BUS_VOLTAGE; break; - case INA226_POWER_OVER_LIMIT_BIT: + case INA226_POWER_OVER_LIMIT_MASK: reg = INA2XX_POWER; break; default: @@ -351,19 +351,19 @@ static int ina226_reg_to_alert(struct ina2xx_data *data, u8 bit, u16 regval) * Turns alert limit values into register values. * Opposite of the formula in ina2xx_get_value(). */ -static s16 ina226_alert_to_reg(struct ina2xx_data *data, u8 bit, int val) +static s16 ina226_alert_to_reg(struct ina2xx_data *data, u32 mask, int val) { - switch (bit) { - case INA226_SHUNT_OVER_VOLTAGE_BIT: - case INA226_SHUNT_UNDER_VOLTAGE_BIT: + switch (mask) { + case INA226_SHUNT_OVER_VOLTAGE_MASK: + case INA226_SHUNT_UNDER_VOLTAGE_MASK: val *= data->config->shunt_div; return clamp_val(val, SHRT_MIN, SHRT_MAX); - case INA226_BUS_OVER_VOLTAGE_BIT: - case INA226_BUS_UNDER_VOLTAGE_BIT: + case INA226_BUS_OVER_VOLTAGE_MASK: + case INA226_BUS_UNDER_VOLTAGE_MASK: val = (val * 1000) << data->config->bus_voltage_shift; val = DIV_ROUND_CLOSEST(val, data->config->bus_voltage_lsb); return clamp_val(val, 0, SHRT_MAX); - case INA226_POWER_OVER_LIMIT_BIT: + case INA226_POWER_OVER_LIMIT_MASK: val = DIV_ROUND_CLOSEST(val, data->power_lsb_uW); return clamp_val(val, 0, USHRT_MAX); default: @@ -387,7 +387,7 @@ static ssize_t ina226_alert_show(struct device *dev, if (ret) goto abort; - if (regval & BIT(attr->index)) { + if (regval & attr->index) { ret = regmap_read(data->regmap, INA226_ALERT_LIMIT, ®val); if (ret) goto abort; @@ -432,7 +432,7 @@ static ssize_t ina226_alert_store(struct device *dev, if (val != 0) { ret = regmap_update_bits(data->regmap, INA226_MASK_ENABLE, INA226_ALERT_CONFIG_MASK, - BIT(attr->index)); + attr->index); if (ret < 0) goto abort; } @@ -456,7 +456,7 @@ static ssize_t ina226_alarm_show(struct device *dev, if (ret) return ret; - alarm = (regval & BIT(attr->index)) && + alarm = (regval & attr->index) && (regval & INA226_ALERT_FUNCTION_FLAG); return sysfs_emit(buf, "%d\n", alarm); } @@ -552,25 +552,25 @@ static ssize_t ina226_interval_show(struct device *dev, static SENSOR_DEVICE_ATTR_RO(in0_input, ina2xx_value, INA2XX_SHUNT_VOLTAGE); /* shunt voltage over/under voltage alert setting and alarm */ static SENSOR_DEVICE_ATTR_RW(in0_crit, ina226_alert, - INA226_SHUNT_OVER_VOLTAGE_BIT); + INA226_SHUNT_OVER_VOLTAGE_MASK); static SENSOR_DEVICE_ATTR_RW(in0_lcrit, ina226_alert, - INA226_SHUNT_UNDER_VOLTAGE_BIT); + INA226_SHUNT_UNDER_VOLTAGE_MASK); static SENSOR_DEVICE_ATTR_RO(in0_crit_alarm, ina226_alarm, - INA226_SHUNT_OVER_VOLTAGE_BIT); + INA226_SHUNT_OVER_VOLTAGE_MASK); static SENSOR_DEVICE_ATTR_RO(in0_lcrit_alarm, ina226_alarm, - INA226_SHUNT_UNDER_VOLTAGE_BIT); + INA226_SHUNT_UNDER_VOLTAGE_MASK); /* bus voltage */ static SENSOR_DEVICE_ATTR_RO(in1_input, ina2xx_value, INA2XX_BUS_VOLTAGE); /* bus voltage over/under voltage alert setting and alarm */ static SENSOR_DEVICE_ATTR_RW(in1_crit, ina226_alert, - INA226_BUS_OVER_VOLTAGE_BIT); + INA226_BUS_OVER_VOLTAGE_MASK); static SENSOR_DEVICE_ATTR_RW(in1_lcrit, ina226_alert, - INA226_BUS_UNDER_VOLTAGE_BIT); + INA226_BUS_UNDER_VOLTAGE_MASK); static SENSOR_DEVICE_ATTR_RO(in1_crit_alarm, ina226_alarm, - INA226_BUS_OVER_VOLTAGE_BIT); + INA226_BUS_OVER_VOLTAGE_MASK); static SENSOR_DEVICE_ATTR_RO(in1_lcrit_alarm, ina226_alarm, - INA226_BUS_UNDER_VOLTAGE_BIT); + INA226_BUS_UNDER_VOLTAGE_MASK); /* calculated current */ static SENSOR_DEVICE_ATTR_RO(curr1_input, ina2xx_value, INA2XX_CURRENT); @@ -579,9 +579,9 @@ static SENSOR_DEVICE_ATTR_RO(curr1_input, ina2xx_value, INA2XX_CURRENT); static SENSOR_DEVICE_ATTR_RO(power1_input, ina2xx_value, INA2XX_POWER); /* over-limit power alert setting and alarm */ static SENSOR_DEVICE_ATTR_RW(power1_crit, ina226_alert, - INA226_POWER_OVER_LIMIT_BIT); + INA226_POWER_OVER_LIMIT_MASK); static SENSOR_DEVICE_ATTR_RO(power1_crit_alarm, ina226_alarm, - INA226_POWER_OVER_LIMIT_BIT); + INA226_POWER_OVER_LIMIT_MASK); /* shunt resistance */ static SENSOR_DEVICE_ATTR_RW(shunt_resistor, ina2xx_shunt, INA2XX_CALIBRATION); From patchwork Fri Aug 30 01:05:44 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13784074 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 57EE57F6 for ; Fri, 30 Aug 2024 01:06:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979967; cv=none; b=LYtF4jJpVpkkXGvTBcUfhXHnWMR0Ff4X09WKd1DUXZoLDpJ/YYXoea7CX62jJHzOLXe4dwYGVamB2xavl5FwVkk4ZFcnu+3mDuMmtjc8GR3IHf5HDYvuAtLXgLIQAIIG//XGJMUF2cElHNkAURKvpOIHjR7GMswMX+5GPzgP5EM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979967; c=relaxed/simple; bh=J+VyZff681gKPpHLjeF8F1nxkVg4nRboIpwl4g6OPtI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rg5HaeRWjWpLGC1iQdquT0OFhvmxpgElQBXW604rkxezZT79GQtfx8PSCWszkkKOh6hgMJ/twxcny3MN74Rga44zctArRV5WVOVya9oTyu6qvO6lSJkfWKpV3J/VxW4ci80OsP/miWX4qbkupBIHGEVVTWbLzsFsaXz4B61qI2I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=CXa8zs11; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="CXa8zs11" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-20227ba378eso11252485ad.0 for ; Thu, 29 Aug 2024 18:06:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724979965; x=1725584765; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=pa9zNkvp/8ozyhdAM9OZf8RNw7+V+0Mz065nQw6TwVs=; b=CXa8zs11UdlYKJU5gSrPTRzrz6D9LlcRnLLvbBdMqMy6X8VP4LrdADqA/RZyVZaicm DIi8atp88b0rNH5rm4/e2nDjh0ZBwbxQGYxu+iPnauNIW3Gy50nQ+MHV3lS+MATomm1A Lstm9MK8hREhYQPk8n/e29+F1wVga5PtqqRxjf+PkUxWJrx/di5mV0YUGEaJmYepmQ+g 6DmkXogs7CmEjX79nVhggO54j7uo9gyRojVaok4/gNCy0aU7CjWZwdGrPvEQI2gg7pD/ g6wpXu9tThk49j/XYQoNmAbXyIy7lPDP/x+8u/hktara0KSmTMpPDjbiGD3XYGX89EN2 Msbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724979965; x=1725584765; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=pa9zNkvp/8ozyhdAM9OZf8RNw7+V+0Mz065nQw6TwVs=; b=xJ6xxjJEWXcOGFcnj9rjfA2TK2qk7Z7lQcxEgKY5iL1dfqx1++eSWU/2HPGgDUwqbQ 8n2pUZACpSjSwtQiJiC4/GARfgAp+4hltUQ45GyFZ83Lm7mRMy0M/kydMJgrJhvcfvj1 sKU9sszkZmvJBp2MWbyUTY9cAedfO9raYfk8lhSSc/dpJWSKi+2TmcwRd07krtWFpCWx +aPkyexxI9uVdZtzhUgFM9G6ZNRIFumwX/jlC99BhchFA5Pa1lIEUQrbvqD2bXZq/Mwe wWuxkywF7tpUlZSX8mnZRXchGPkRIcY4so6GF3fq50Wqwq36XOPWtIh+cxusUHDjq8/7 XexQ== X-Gm-Message-State: AOJu0Yz1pUXU3a/qQLS3lGjAw9BdhoAvXxv4t4aNMuJnOoXFHijByym/ saUtOp0Tpr+/TPQVlCYd0e1Ts3Mjefm0+vEf9w8kAG/IVIyO9Txcz0L0Zg== X-Google-Smtp-Source: AGHT+IFTDWtarl3lAb0fhvVICRBoHJ/+rw/ldMnuaD6LhNyzZlrKO4rXiI6XuO1TndAeIW1MZ0HuFA== X-Received: by 2002:a17:902:ea0a:b0:201:daee:6fae with SMTP id d9443c01a7336-2050c3f9cb4mr49589975ad.48.1724979965109; Thu, 29 Aug 2024 18:06:05 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-205152d02bfsm17152535ad.111.2024.08.29.18.06.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Aug 2024 18:06:04 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Tzung-Bi Shih , Guenter Roeck Subject: [PATCH v2 04/14] hwmon: (ina2xx) Mark regmap_config as const Date: Thu, 29 Aug 2024 18:05:44 -0700 Message-ID: <20240830010554.1462861-5-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240830010554.1462861-1-linux@roeck-us.net> References: <20240830010554.1462861-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Recent versions of checkpatch complain that struct regmap_config should be declared as const. WARNING: struct regmap_config should normally be const Doing so reveals a potential problem in the driver: If both supported chips are present in a single system, the maximum number of registers may race when devices are instantiated since max_registers is updated in the probe function. Solve the problem by setting .max_registers to the maximum register address of all supported chips. This does not make a practical difference while fixing the potential race condition and reducing code complexity. Signed-off-by: Guenter Roeck Reviewed-by: Tzung-Bi Shih --- v2: Fixed typo in patch description (devic es -> devices) drivers/hwmon/ina2xx.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index 1b4170d02c94..9d93190874d7 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -50,10 +50,6 @@ #define INA226_ALERT_LIMIT 0x07 #define INA226_DIE_ID 0xFF -/* register count */ -#define INA219_REGISTERS 6 -#define INA226_REGISTERS 8 - #define INA2XX_MAX_REGISTERS 8 /* settings - depend on use case */ @@ -95,9 +91,10 @@ */ #define INA226_TOTAL_CONV_TIME_DEFAULT 2200 -static struct regmap_config ina2xx_regmap_config = { +static const struct regmap_config ina2xx_regmap_config = { .reg_bits = 8, .val_bits = 16, + .max_register = INA2XX_MAX_REGISTERS, }; enum ina2xx_ids { ina219, ina226 }; @@ -105,7 +102,6 @@ enum ina2xx_ids { ina219, ina226 }; struct ina2xx_config { u16 config_default; int calibration_value; - int registers; int shunt_div; int bus_voltage_shift; int bus_voltage_lsb; /* uV */ @@ -128,7 +124,6 @@ static const struct ina2xx_config ina2xx_config[] = { [ina219] = { .config_default = INA219_CONFIG_DEFAULT, .calibration_value = 4096, - .registers = INA219_REGISTERS, .shunt_div = 100, .bus_voltage_shift = 3, .bus_voltage_lsb = 4000, @@ -137,7 +132,6 @@ static const struct ina2xx_config ina2xx_config[] = { [ina226] = { .config_default = INA226_CONFIG_DEFAULT, .calibration_value = 2048, - .registers = INA226_REGISTERS, .shunt_div = 400, .bus_voltage_shift = 0, .bus_voltage_lsb = 1250, @@ -646,8 +640,6 @@ static int ina2xx_probe(struct i2c_client *client) ina2xx_set_shunt(data, val); - ina2xx_regmap_config.max_register = data->config->registers; - data->regmap = devm_regmap_init_i2c(client, &ina2xx_regmap_config); if (IS_ERR(data->regmap)) { dev_err(dev, "failed to allocate register map\n"); From patchwork Fri Aug 30 01:05:45 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13784075 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2DD597F6 for ; Fri, 30 Aug 2024 01:06:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979969; cv=none; b=RGTjMXyksn41tc42mx8aGm6euzBCUnzUiJJCKRoPlaF4cLdUvd3z2WQNRtxG2QbcWWIda0pQPdurIOE54bgJjC1yEcei1YEnZoPuYyYwjgYX00xCKjCzBiE03wiBQ44LwjmLMJPIma+qac1mZFd4U8rMvsmspk2q8RTvV8U0T+o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979969; c=relaxed/simple; bh=6+d80kQMhFo48+pc/FeHhX32S350IWDqrBHTCKn/bqQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VCydXqhJQKIy2Cn68tFrtjxblBys7awO/gFOMqj5RNrhSunl/G+gYcLfZKFP/0Ri9M1fsacGXQmS2IqCJK4HYWW8WrdweiH+6Rk+5ovXOcwWJBDCDIA+SrGvPXqyy69o5FCBl2cxrLY7BEtptY5nBY1t3vzpHVOl4IVrzkblH7E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=LFCsG8tE; arc=none smtp.client-ip=209.85.214.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LFCsG8tE" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-201fae21398so9310445ad.1 for ; Thu, 29 Aug 2024 18:06:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724979967; x=1725584767; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=ptaLCT4s9PbJHxC8W/T1HLFBejva6FZdtZH2Of7RSAE=; b=LFCsG8tEWkzi+uT01Sw8saT9o02vuri1gJifNt/bKpyh5c1Toaij3oE/1RsdpmM8vR Gjiu+cnLOHrUJEiTsgrqoksgxcRRPatmJ3GldRc0xQOIR/WbH57AKEXUXV8WQUXUS9PD 6uaHfTpeg30aiiCWiI1zyHZNXFFkcuanznwxeWHINLmDL28iiTX1gtsC9PIveJlmKfO2 en8wlGqFxkbsBh7Kwek9ei3zLn4K6JHay6HuICIFfBqaj/d15WEfUc9nIZPQj/HRLV3h 34zKejDWk88+T00n0ehY7Whyi04Lbo3uFYsQX5w7fUQkSax4RS91K05JlOg+LO0xG4Pg 1/HA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724979967; x=1725584767; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ptaLCT4s9PbJHxC8W/T1HLFBejva6FZdtZH2Of7RSAE=; b=oVYXLp6a5yNbgfjYTmmUoTQGYdl2Anob3qvypMCNC7W52/180jrs+oZM/kl8c+vG+1 LZRYx0S8Ph7/Hl9wW+SBOPq9QgL0PxSw1bZkOWgiu+JCAfUl7aTirYwX2aXXpqFVHo4Y LxNvRFqD2mCnUKyoHoP3FFOA/4ZPrpyk2tanJY9dt6bsJZXHdwfaheKz77FuwpwxhVBO 6QonKJgDGpGuIV4msbzGxI6l8JTBnbpRq0tsaL9VkXOURu75SRcvEljeZ1q/H214fzqX 9aurCDy/qwgf+U1/msoNJAxG9sHpZHzo7YlDAYphU0V/Xkv26HmAxRf/ilZTwQnWX7e+ /T5A== X-Gm-Message-State: AOJu0YyoYkyBtXQEf8N8Va9NTh3kxb6dK0i9RA36RHrp1QaPu8ooeb2V WyNnE5+3piN7pS0KDicrS7/jDnPloApPM7IjC1Kr7tknBFA1L/AJhhOffg== X-Google-Smtp-Source: AGHT+IETiajwBeNWBSEYg9zRiQ98c4MTcDl9NqwNW4so3nUqnMePaO44LRBq3Bbi4s0E7T/tLQ2C6g== X-Received: by 2002:a17:90a:5ac3:b0:2bd:7e38:798e with SMTP id 98e67ed59e1d1-2d856395c6amr4583423a91.28.1724979966893; Thu, 29 Aug 2024 18:06:06 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2d8445e801bsm4869024a91.15.2024.08.29.18.06.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Aug 2024 18:06:06 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Tzung-Bi Shih , Guenter Roeck Subject: [PATCH v2 05/14] hwmon: (ina2xx) Use local regmap pointer if used more than once Date: Thu, 29 Aug 2024 18:05:45 -0700 Message-ID: <20240830010554.1462861-6-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240830010554.1462861-1-linux@roeck-us.net> References: <20240830010554.1462861-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 If regmap is accessed more than once in a function, declare and used local regmap variable. While at it, drop low value debug messages. Reviewed-by: Tzung-Bi Shih Signed-off-by: Guenter Roeck --- v2: Added Reviewed-by: tag drivers/hwmon/ina2xx.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index 9d93190874d7..ed8764a29d3f 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -210,18 +210,14 @@ static int ina2xx_init(struct ina2xx_data *data) static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) { struct ina2xx_data *data = dev_get_drvdata(dev); + struct regmap *regmap = data->regmap; int ret, retry; - dev_dbg(dev, "Starting register %d read\n", reg); - for (retry = 5; retry; retry--) { - - ret = regmap_read(data->regmap, reg, regval); + ret = regmap_read(regmap, reg, regval); if (ret < 0) return ret; - dev_dbg(dev, "read %d, val = 0x%04x\n", reg, *regval); - /* * If the current value in the calibration register is 0, the * power and current registers will also remain at 0. In case @@ -233,8 +229,7 @@ static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) if (*regval == 0) { unsigned int cal; - ret = regmap_read(data->regmap, INA2XX_CALIBRATION, - &cal); + ret = regmap_read(regmap, INA2XX_CALIBRATION, &cal); if (ret < 0) return ret; @@ -372,17 +367,18 @@ static ssize_t ina226_alert_show(struct device *dev, { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct ina2xx_data *data = dev_get_drvdata(dev); + struct regmap *regmap = data->regmap; int regval; int val = 0; int ret; mutex_lock(&data->config_lock); - ret = regmap_read(data->regmap, INA226_MASK_ENABLE, ®val); + ret = regmap_read(regmap, INA226_MASK_ENABLE, ®val); if (ret) goto abort; if (regval & attr->index) { - ret = regmap_read(data->regmap, INA226_ALERT_LIMIT, ®val); + ret = regmap_read(regmap, INA226_ALERT_LIMIT, ®val); if (ret) goto abort; val = ina226_reg_to_alert(data, attr->index, regval); @@ -400,6 +396,7 @@ static ssize_t ina226_alert_store(struct device *dev, { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct ina2xx_data *data = dev_get_drvdata(dev); + struct regmap *regmap = data->regmap; unsigned long val; int ret; @@ -413,18 +410,18 @@ static ssize_t ina226_alert_store(struct device *dev, * if the value is non-zero. */ mutex_lock(&data->config_lock); - ret = regmap_update_bits(data->regmap, INA226_MASK_ENABLE, + ret = regmap_update_bits(regmap, INA226_MASK_ENABLE, INA226_ALERT_CONFIG_MASK, 0); if (ret < 0) goto abort; - ret = regmap_write(data->regmap, INA226_ALERT_LIMIT, + ret = regmap_write(regmap, INA226_ALERT_LIMIT, ina226_alert_to_reg(data, attr->index, val)); if (ret < 0) goto abort; if (val != 0) { - ret = regmap_update_bits(data->regmap, INA226_MASK_ENABLE, + ret = regmap_update_bits(regmap, INA226_MASK_ENABLE, INA226_ALERT_CONFIG_MASK, attr->index); if (ret < 0) From patchwork Fri Aug 30 01:05:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13784076 Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 259077F6 for ; Fri, 30 Aug 2024 01:06:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979971; cv=none; b=DcFgF0FiDCGeCXHniACNbOOfaJJspnO8zV1gPWZEng7r2OxHzMb/buDnvFnuEpS9zG8d9ypP1Pqr4hA9kmuxqiVHdx2H3t3v16R+Zhc276PhQ2OyENrTq/5xc2QVhTDInpyjWl67sMSCbEU5kDW7NlSDFCWCTRG/EWni4ae3TwY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979971; c=relaxed/simple; bh=4XaTQA/O6mfp/UP+Uoxw4busu4xxc6rm7Ug8JTHI6G0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sSa4tkVW0nWsqExuS5NNSwrECbvFmSv3oetXscbQALooHku4h97pnuM1QYGZFaJllF1GP5SxyxE1fA80yl/yjaRYeP91wrbpV+e0yZ8cGw8IYkm0OkpJnwBdpnA6K8xj+AaBtyC6QsW7gJ44r1BTJNETf1nUGMb7BI6KzkTEyrQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ITz1qgaN; arc=none smtp.client-ip=209.85.210.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ITz1qgaN" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-714187df604so1485604b3a.1 for ; Thu, 29 Aug 2024 18:06:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724979969; x=1725584769; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=tMYl2nAhcpI5cuGPIxQzdS0xmAr8bbjDKppj99oecd8=; b=ITz1qgaNOe7RCs1ZJkDPA/rlvdLfyIm+PLnKVInXIlEMfE70+J4qbD9MAKDnKosqWv Fjhm+mTkR/zC/wjEH4+/MHikJr6VnUsbVIPWvyIV57H0+1m7sXDvF8ipk/ucQuMRNJhW /qkEa4cGI/XX1XCWy9bIQn5khY3wfJj2+yKYYTk+wnv0naNRYvGOm1dZJ+thFHGbbbr0 HfannJLSPtNjiOQu4DWAH4QV5T20nmCCDwnNMBrjHzSJB/TkmhrPqavMYPNy07jeGsIw MHIhS2avugSiqtcsd7+/8CzK6wYqG5BINnZJjaYOtt6Wv4RuX5dbw3tMTht0AOlca3Iu PD9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724979969; x=1725584769; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=tMYl2nAhcpI5cuGPIxQzdS0xmAr8bbjDKppj99oecd8=; b=NjPCjr1yXWhLuNPoHLsWZ1G/tWd70DdG75twUtVkhYqmPUqLWJeKmWPE/6/ta43Ye8 XVi4/CzL6HLMSh/xau7VRMTegLeYJAl2xL8TUaLBOtWGPVKNQMOnNvKav6bVupq09ZO2 uBEFnNe4tKgw8zi06GSL0pq4VpBI7Ii/yeyXjzYHiZRF0fNu6gYNSSIGVSJjNn+ZKOVP eg+ySeFSc86G+yngkeKNUFRXWL/kDJFup9X7CoHdp3BrYSe2wBDwPfRzBQet98ZmpYqA G8WxHA8XcX55rzqtmp/+mPVFmfLGOeabNHxNTnb7ViZqZRQw5avsaaWFyOSGIk/5ykrj jorw== X-Gm-Message-State: AOJu0YyAD8JBY5Ub1naxtbvzFHUx+E7hX0jklGCfLVUuJoKsC+0QZWqS rbsNBdJx84WWGjGWQJxtMGCCCWQl39sOgRYwr5HrUZdq+XGPQJU3Yth7EQ== X-Google-Smtp-Source: AGHT+IGVKDSQda4GeMZjZjhfjpx6QMJu/QNYKJliCequjYjrzSFLxrDpOT72W3t61J7gBxfinj5cSQ== X-Received: by 2002:a05:6a21:1706:b0:1be:c41d:b6b7 with SMTP id adf61e73a8af0-1ccee863f1amr1100921637.19.1724979968657; Thu, 29 Aug 2024 18:06:08 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a45a7sm1728301b3a.53.2024.08.29.18.06.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Aug 2024 18:06:08 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Tzung-Bi Shih , Guenter Roeck Subject: [PATCH v2 06/14] hwmon: (ina2xx) Re-initialize chip using regmap functions Date: Thu, 29 Aug 2024 18:05:46 -0700 Message-ID: <20240830010554.1462861-7-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240830010554.1462861-1-linux@roeck-us.net> References: <20240830010554.1462861-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 If it is necessary to re-initialize the chip, for example because it has been power cycled, use regmap functions to update register contents. This ensures that all registers, including the configuration register and alert registers, are updated to previously configured values without having to locally cache everything. For this to work, volatile registers have to be marked as volatile. Also, the cache needs to be bypassed when reading the calibration and mask_enable registers. While the calibration register is not volatile, it will be reset to 0 if the chip has been power cycled. Most of the bits in the mask_enable register are configuration bits, except for bit 4 which reports if an alert has been observed. Both registers need to be marked as non-volatile to be updated after a power cycle, but it is necessary to bypass the cache when reading them to detect if the chip has been power cycled and to read the alert status. The chip does not support register auto-increments. It is therefore necessary to configure regmap to use single register read/write operations. Otherwise regmap tries to write all registers in a single operation when synchronizing register contents with the hardware, and the synchronization fails. Another necessary change is to declare ina226_alert_to_reg() as u16. So far it returned an s16 which is sign extended to a large negative value which is then sent to regmap as unsigned int, causing an -EINVAL error return. Signed-off-by: Guenter Roeck Reviewed-by: Tzung-Bi Shih --- v2: Fixed typo in patch description (ben -> been) Added .use_single_write = true and .use_single_read = true to regmap configuration drivers/hwmon/ina2xx.c | 50 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index ed8764a29d3f..db6432523e59 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -91,10 +91,41 @@ */ #define INA226_TOTAL_CONV_TIME_DEFAULT 2200 +static bool ina2xx_writeable_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case INA2XX_CONFIG: + case INA2XX_CALIBRATION: + case INA226_MASK_ENABLE: + case INA226_ALERT_LIMIT: + return true; + default: + return false; + } +} + +static bool ina2xx_volatile_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case INA2XX_SHUNT_VOLTAGE: + case INA2XX_BUS_VOLTAGE: + case INA2XX_POWER: + case INA2XX_CURRENT: + return true; + default: + return false; + } +} + static const struct regmap_config ina2xx_regmap_config = { .reg_bits = 8, .val_bits = 16, + .use_single_write = true, + .use_single_read = true, .max_register = INA2XX_MAX_REGISTERS, + .cache_type = REGCACHE_MAPLE, + .volatile_reg = ina2xx_volatile_reg, + .writeable_reg = ina2xx_writeable_reg, }; enum ina2xx_ids { ina219, ina226 }; @@ -229,16 +260,16 @@ static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) if (*regval == 0) { unsigned int cal; - ret = regmap_read(regmap, INA2XX_CALIBRATION, &cal); + ret = regmap_read_bypassed(regmap, INA2XX_CALIBRATION, &cal); if (ret < 0) return ret; if (cal == 0) { dev_warn(dev, "chip not calibrated, reinitializing\n"); - ret = ina2xx_init(data); - if (ret < 0) - return ret; + regcache_mark_dirty(regmap); + regcache_sync(regmap); + /* * Let's make sure the power and current * registers have been updated before trying @@ -340,7 +371,7 @@ static int ina226_reg_to_alert(struct ina2xx_data *data, u32 mask, u16 regval) * Turns alert limit values into register values. * Opposite of the formula in ina2xx_get_value(). */ -static s16 ina226_alert_to_reg(struct ina2xx_data *data, u32 mask, int val) +static u16 ina226_alert_to_reg(struct ina2xx_data *data, u32 mask, int val) { switch (mask) { case INA226_SHUNT_OVER_VOLTAGE_MASK: @@ -439,16 +470,17 @@ static ssize_t ina226_alarm_show(struct device *dev, { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct ina2xx_data *data = dev_get_drvdata(dev); - int regval; + unsigned int mask; int alarm = 0; int ret; - ret = regmap_read(data->regmap, INA226_MASK_ENABLE, ®val); + ret = regmap_read_bypassed(data->regmap, INA226_MASK_ENABLE, &mask); if (ret) return ret; - alarm = (regval & attr->index) && - (regval & INA226_ALERT_FUNCTION_FLAG); + alarm = (mask & attr->index) && + (mask & INA226_ALERT_FUNCTION_FLAG); + return sysfs_emit(buf, "%d\n", alarm); } From patchwork Fri Aug 30 01:05:47 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13784077 Received: from mail-pj1-f50.google.com (mail-pj1-f50.google.com [209.85.216.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A7AB7847B for ; Fri, 30 Aug 2024 01:06:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979973; cv=none; b=GLeIR0nVZZCo9pSgSl5Tdn07jj++y7nHZAvgBltzKXKWbt+RXh0XHcLfWUJIP24aE2yk8VKg6whRvsCXQuVszql5YpP3qHLja3F6ufpzFzHrir5YLnZgGMllTZaG3vW9U52XmuQCvWp+A//1Mv+Yw1n689ISen4HdW0I7w7hHyk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979973; c=relaxed/simple; bh=xh9gzvyxbF0epAFa0UB0dAApxXrZh74g+5iv3oVXUCA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=D/7vZ/CU98Kz7I7akEq5eoE62pBSwzldDt7EKGUyB8VsNidFJyZZA1P66mq5oR96x12vxZU7+z+I4hbq0tN7bi52cwndzHO6Jsy0VaAXD6p03XPt3gZznlD4h+i7RYMn9J021kts3lBlYv7WzIjBzAdC5XZN7VD0BHyvqMSdYnk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=jSVCfZLx; arc=none smtp.client-ip=209.85.216.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="jSVCfZLx" Received: by mail-pj1-f50.google.com with SMTP id 98e67ed59e1d1-2d3e46ba5bcso959207a91.0 for ; Thu, 29 Aug 2024 18:06:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724979970; x=1725584770; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=5Qi4qqwjrz0PIrO0kj9LgR51dcx4mhGmY7tZz4k/1tc=; b=jSVCfZLxkf3o+EaPSxfXrOwmedq6eThxRK3HmZjH6Kdbbbi0OLMkW46ufjpjrQgPDZ ahNWso8yHsyArX0qv3yC+MVGDuj67ERl7PNJ3zuoPDjIcmTT5e/rRbb5dDlbMkM9ypu0 lm7r8cipkOOrbT0mWHJoZP4hPXEPpbds+1DADKSWKXFBkJcqzFweoQEF7G0qhz7xgvjV 4adrThnwXk8ZkzWmqIwynSsw7VaBbn4dugX3zZvLSGtBZaIX2rSZISmvlmDCwsR61fFQ Cr9F9G4OxSQFqXFUdRYKufZpZvnZ7vDAjaT5QSAbRe2M5vF31QJ6aS70/dJTrPura79S KuQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724979970; x=1725584770; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=5Qi4qqwjrz0PIrO0kj9LgR51dcx4mhGmY7tZz4k/1tc=; b=ZxHvXOJ44LrfqJSryLk30Sr3eyeYkBptJlva1HuVvO202qe982xiWXpA/Yx3WKaEqQ lVlMVwYFXBnuPHlRWCbqM0D3d5cy9pYsGs9ErjcdQFuQ3CWKw7Crw3iyIbwIjsgheCVj I8rl/Kpk7/3qU72ZXd9XNvNgBcLR1hBrmN/usOg8e8UR9x2WwUQtv11dtI7DnHJLmZs/ iIhLUn/lz8qErelSBaOEbu2qgbgy2rl/u0LSap+3HIYDaEILLK84kkrhDc510MzC04G3 JiuiOGU/+xqVfOZpfBCwHfs8Fuvxx3JUGPITBxWJZnNTr4cguMome5xGRXKRg7Ng/C9L Vjlw== X-Gm-Message-State: AOJu0YzggPyh/P12wVkCU/haZsUed9xNpwwzkk/NwEyybahzjQTWd73A fIVkS4QbxPEgMPHn/iZwQ61vO6FwoGii938mckP4A+nMBkx2mt5QmdUaGw== X-Google-Smtp-Source: AGHT+IEaCUVISEkXr2NrF+Va6S+sbfgpKqr65ShfMDiuCwke/36JRKIBM3LlqRlQPYQ2ry+BWDGDUg== X-Received: by 2002:a17:90a:3983:b0:2c9:3370:56e3 with SMTP id 98e67ed59e1d1-2d856391ebbmr5088313a91.34.1724979970363; Thu, 29 Aug 2024 18:06:10 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2d8445d5e91sm4979369a91.7.2024.08.29.18.06.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Aug 2024 18:06:09 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Tzung-Bi Shih , Guenter Roeck Subject: [PATCH v2 07/14] hwmon: (ina2xx) Fix various overflow issues Date: Thu, 29 Aug 2024 18:05:47 -0700 Message-ID: <20240830010554.1462861-8-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240830010554.1462861-1-linux@roeck-us.net> References: <20240830010554.1462861-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Module tests show various overflow problems when writing limits and other attributes. in0_crit: Suspected overflow: [max=82, read 0, written 2147483648] in0_lcrit: Suspected overflow: [max=82, read 0, written 2147483648] in1_crit: Suspected overflow: [max=40959, read 0, written 2147483647] in1_lcrit: Suspected overflow: [max=40959, read 0, written 2147483647] power1_crit: Suspected overflow: [max=134218750, read 0, written 2147483648] update_interval: Suspected overflow: [max=2253, read 2, written 2147483647] Implement missing clamping on attribute write operations to avoid those problems. While at it, check in the probe function if the shunt resistor value passed from devicetree is valid, and bail out if it isn't. Also limit mutex use to the code calling ina2xx_set_shunt() since it isn't needed when called from the probe function. Reviewed-by: Tzung-Bi Shih Signed-off-by: Guenter Roeck --- v2: Dropped unrelated cosmetic change Added Reviewed-by: tag drivers/hwmon/ina2xx.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index db6432523e59..2aea461b8c6d 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -193,10 +193,16 @@ static int ina226_reg_to_interval(u16 config) * Return the new, shifted AVG field value of CONFIG register, * to use with regmap_update_bits */ -static u16 ina226_interval_to_reg(int interval) +static u16 ina226_interval_to_reg(unsigned long interval) { int avg, avg_bits; + /* + * The maximum supported interval is 1,024 * (2 * 8.244ms) ~= 16.8s. + * Clamp to 32 seconds before calculations to avoid overflows. + */ + interval = clamp_val(interval, 0, 32000); + avg = DIV_ROUND_CLOSEST(interval * 1000, INA226_TOTAL_CONV_TIME_DEFAULT); avg_bits = find_closest(avg, ina226_avg_tab, @@ -371,19 +377,22 @@ static int ina226_reg_to_alert(struct ina2xx_data *data, u32 mask, u16 regval) * Turns alert limit values into register values. * Opposite of the formula in ina2xx_get_value(). */ -static u16 ina226_alert_to_reg(struct ina2xx_data *data, u32 mask, int val) +static u16 ina226_alert_to_reg(struct ina2xx_data *data, u32 mask, unsigned long val) { switch (mask) { case INA226_SHUNT_OVER_VOLTAGE_MASK: case INA226_SHUNT_UNDER_VOLTAGE_MASK: + val = clamp_val(val, 0, SHRT_MAX * data->config->shunt_div); val *= data->config->shunt_div; - return clamp_val(val, SHRT_MIN, SHRT_MAX); + return clamp_val(val, 0, SHRT_MAX); case INA226_BUS_OVER_VOLTAGE_MASK: case INA226_BUS_UNDER_VOLTAGE_MASK: + val = clamp_val(val, 0, 200000); val = (val * 1000) << data->config->bus_voltage_shift; val = DIV_ROUND_CLOSEST(val, data->config->bus_voltage_lsb); - return clamp_val(val, 0, SHRT_MAX); + return clamp_val(val, 0, USHRT_MAX); case INA226_POWER_OVER_LIMIT_MASK: + val = clamp_val(val, 0, UINT_MAX - data->power_lsb_uW); val = DIV_ROUND_CLOSEST(val, data->power_lsb_uW); return clamp_val(val, 0, USHRT_MAX); default: @@ -490,19 +499,17 @@ static ssize_t ina226_alarm_show(struct device *dev, * to shunt_voltage_lsb = 1 / shunt_div multiplied by 10^9 in order * to keep the scale. */ -static int ina2xx_set_shunt(struct ina2xx_data *data, long val) +static int ina2xx_set_shunt(struct ina2xx_data *data, unsigned long val) { unsigned int dividend = DIV_ROUND_CLOSEST(1000000000, data->config->shunt_div); - if (val <= 0 || val > dividend) + if (!val || val > dividend) return -EINVAL; - mutex_lock(&data->config_lock); data->rshunt = val; data->current_lsb_uA = DIV_ROUND_CLOSEST(dividend, val); data->power_lsb_uW = data->config->power_lsb_factor * data->current_lsb_uA; - mutex_unlock(&data->config_lock); return 0; } @@ -527,7 +534,9 @@ static ssize_t ina2xx_shunt_store(struct device *dev, if (status < 0) return status; + mutex_lock(&data->config_lock); status = ina2xx_set_shunt(data, val); + mutex_unlock(&data->config_lock); if (status < 0) return status; return count; @@ -545,9 +554,6 @@ static ssize_t ina226_interval_store(struct device *dev, if (status < 0) return status; - if (val > INT_MAX || val == 0) - return -EINVAL; - status = regmap_update_bits(data->regmap, INA2XX_CONFIG, INA226_AVG_RD_MASK, ina226_interval_to_reg(val)); @@ -667,7 +673,9 @@ static int ina2xx_probe(struct i2c_client *client) if (device_property_read_u32(dev, "shunt-resistor", &val) < 0) val = INA2XX_RSHUNT_DEFAULT; - ina2xx_set_shunt(data, val); + ret = ina2xx_set_shunt(data, val); + if (ret < 0) + return dev_err_probe(dev, ret, "Invalid shunt resistor value\n"); data->regmap = devm_regmap_init_i2c(client, &ina2xx_regmap_config); if (IS_ERR(data->regmap)) { From patchwork Fri Aug 30 01:05:48 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13784078 Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3941B4A32 for ; Fri, 30 Aug 2024 01:06:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979974; cv=none; b=FAVMwt13q2K/1/asqXpb7/XDQEgSMuR9blgqX7TaoqRkstq1IlClfbwZaYY66sIsRFChD3kTsC+YyJaRg7i6nh9sluVHh5rx4MNnFcFIdk+qGr+0J8HDTUzZGHWQeM5ZevH3UYR4jq//OZpRiuQz2I04UPb6frQySOQZxxEJlOg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979974; c=relaxed/simple; bh=//a16qw0qKZwj5bciI/phzfvjM7UNcjAv18SeoL6lyc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VkXbq1vhWl6+8KN0n8x2lPD87sX9S3DhMabiy8j2Q1/F8+zgh2qjo0Zh1CmMvX7rhlkTGqCrxqPcymVPorS7s+y+HziQ0NGnMx0zu+EV8UZG6jK+zHY9oZ85Zfegtvvlg7SAHIj8jUb976Wluoo+IaKcwFMMNKXkgifRQm4SEhg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=OOJcSryY; arc=none smtp.client-ip=209.85.210.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="OOJcSryY" Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-715cdc7a153so1035433b3a.0 for ; Thu, 29 Aug 2024 18:06:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724979972; x=1725584772; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=oy83zOHw45KxLT2Qgddfv6YZl5J11G26RIVAbezO1u0=; b=OOJcSryYRmI0eEFv/Z6RgBkwegPAXdMz1TDMa5AWJAQBCZi0FJCN6S/74Vc3p+IV5n Woiuui3aukecw+lqm8MoaSkEQsJ16HQpSzWvy6fj8F1eE9NTgMgGxb6LkfCPV0hMHJ42 7Sw3c1bAA/5fwLuCtLB/+jW5IiBGq27bHq2alqIfK6B7VvGJMaT6UHUHy8CpimxWvbTY g/Nxkasgo8OZ58c7Ky6CeK2e8viYY7+lSh0I5t54svRtm+jOVEBUPw2E9Iif5Rzd0Dyg xfqSZR/ogeL2LJ+DstL6+3msBvW8s2cjL7EoyHJj7eB5vU/pVEFmi1KWSj+omFVpNH4m OJgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724979972; x=1725584772; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=oy83zOHw45KxLT2Qgddfv6YZl5J11G26RIVAbezO1u0=; b=a6cZWllnVob8Nych1JNMH7QlfDm4ybsH23OsqxC5vEqlb6O/9MNXL3qnRDEZCMtscj DgV0TozkDSJJS6WneDpl/RjmHzh4DLg/r1vFTeiGBahLBiyyFDHj39dHT3Fldcwbs8ED tWUZ/97rYNXsAKTsMTT11cuoZEHC11NrBFuKs62FW+VRSQiCIMUHkchsaKO24oUkExq0 0O5fDdVNmX0BTdOdXgXU1VGcqcXzYk+Q9HmlwAeJw6Upz5p44vnQq+2bsn3Y+P2yK3yL 19xRMhD8zzQnVyRYQQoS2QPgQ37Fc8M9uhYDrTQSuU4kTgzluApg6LA8he0jXbPXBQh4 C/4Q== X-Gm-Message-State: AOJu0YzG8suwOe42x4YKD2bg1CuRZvmRnsgIwcF00mYLRGGte5e0zx6g u/QEWyhWbKKjYqZiUcxLd+R3A3Zhhy2Lh+xzYjpabbLuBbFRw44axyndvw== X-Google-Smtp-Source: AGHT+IEBJ9gEQwE9Iv3xI6P8pRJOJCizDu7QhkE83bHL+SejwFfdLgB7pqwdgRJLV1A23Ym0Xur0dg== X-Received: by 2002:a05:6a00:3a21:b0:706:aa39:d5c1 with SMTP id d2e1a72fcca58-7170676dfddmr1093103b3a.8.1724979972099; Thu, 29 Aug 2024 18:06:12 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e569dccesm1730442b3a.136.2024.08.29.18.06.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Aug 2024 18:06:11 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Tzung-Bi Shih , Guenter Roeck Subject: [PATCH v2 08/14] hwmon: (ina2xx) Consolidate chip initialization code Date: Thu, 29 Aug 2024 18:05:48 -0700 Message-ID: <20240830010554.1462861-9-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240830010554.1462861-1-linux@roeck-us.net> References: <20240830010554.1462861-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Move all chip initialization code into a single function. No functional change. Signed-off-by: Guenter Roeck Reviewed-by: Tzung-Bi Shih --- v2: Fixed setting alert polarity drivers/hwmon/ina2xx.c | 111 ++++++++++++++++------------------------- 1 file changed, 43 insertions(+), 68 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index 2aea461b8c6d..a9e3b23445b4 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -67,9 +67,7 @@ #define INA226_READ_AVG(reg) FIELD_GET(INA226_AVG_RD_MASK, reg) -#define INA226_ALERT_POLARITY_MASK BIT(1) -#define INA226_ALERT_POL_LOW 0 -#define INA226_ALERT_POL_HIGH 1 +#define INA226_ALERT_POLARITY BIT(1) /* bit number of alert functions in Mask/Enable Register */ #define INA226_SHUNT_OVER_VOLTAGE_MASK BIT(15) @@ -141,6 +139,7 @@ struct ina2xx_config { struct ina2xx_data { const struct ina2xx_config *config; + enum ina2xx_ids chip; long rshunt; long current_lsb_uA; @@ -211,39 +210,6 @@ static u16 ina226_interval_to_reg(unsigned long interval) return FIELD_PREP(INA226_AVG_RD_MASK, avg_bits); } -static int ina2xx_set_alert_polarity(struct ina2xx_data *data, - unsigned long val) -{ - return regmap_update_bits(data->regmap, INA226_MASK_ENABLE, - INA226_ALERT_POLARITY_MASK, - FIELD_PREP(INA226_ALERT_POLARITY_MASK, val)); -} - -/* - * Calibration register is set to the best value, which eliminates - * truncation errors on calculating current register in hardware. - * According to datasheet (eq. 3) the best values are 2048 for - * ina226 and 4096 for ina219. They are hardcoded as calibration_value. - */ -static int ina2xx_calibrate(struct ina2xx_data *data) -{ - return regmap_write(data->regmap, INA2XX_CALIBRATION, - data->config->calibration_value); -} - -/* - * Initialize the configuration and calibration registers. - */ -static int ina2xx_init(struct ina2xx_data *data) -{ - int ret = regmap_write(data->regmap, INA2XX_CONFIG, - data->config->config_default); - if (ret < 0) - return ret; - - return ina2xx_calibrate(data); -} - static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) { struct ina2xx_data *data = dev_get_drvdata(dev); @@ -651,12 +617,48 @@ static const struct attribute_group ina226_group = { .attrs = ina226_attrs, }; +/* + * Initialize chip + */ +static int ina2xx_init(struct device *dev, struct ina2xx_data *data) +{ + struct regmap *regmap = data->regmap; + u32 shunt; + int ret; + + if (device_property_read_u32(dev, "shunt-resistor", &shunt) < 0) + shunt = INA2XX_RSHUNT_DEFAULT; + + ret = ina2xx_set_shunt(data, shunt); + if (ret < 0) + return ret; + + ret = regmap_write(regmap, INA2XX_CONFIG, data->config->config_default); + if (ret < 0) + return ret; + + if (data->chip == ina226) { + bool active_high = device_property_read_bool(dev, "ti,alert-polarity-active-high"); + + regmap_update_bits(regmap, INA226_MASK_ENABLE, INA226_ALERT_POLARITY, + FIELD_PREP(INA226_ALERT_POLARITY, active_high)); + } + + /* + * Calibration register is set to the best value, which eliminates + * truncation errors on calculating current register in hardware. + * According to datasheet (eq. 3) the best values are 2048 for + * ina226 and 4096 for ina219. They are hardcoded as calibration_value. + */ + return regmap_write(regmap, INA2XX_CALIBRATION, + data->config->calibration_value); +} + static int ina2xx_probe(struct i2c_client *client) { struct device *dev = &client->dev; struct ina2xx_data *data; struct device *hwmon_dev; - u32 val; int ret, group = 0; enum ina2xx_ids chip; @@ -668,15 +670,9 @@ static int ina2xx_probe(struct i2c_client *client) /* set the device type */ data->config = &ina2xx_config[chip]; + data->chip = chip; mutex_init(&data->config_lock); - if (device_property_read_u32(dev, "shunt-resistor", &val) < 0) - val = INA2XX_RSHUNT_DEFAULT; - - ret = ina2xx_set_shunt(data, val); - if (ret < 0) - return dev_err_probe(dev, ret, "Invalid shunt resistor value\n"); - data->regmap = devm_regmap_init_i2c(client, &ina2xx_regmap_config); if (IS_ERR(data->regmap)) { dev_err(dev, "failed to allocate register map\n"); @@ -687,30 +683,9 @@ static int ina2xx_probe(struct i2c_client *client) if (ret) return dev_err_probe(dev, ret, "failed to enable vs regulator\n"); - if (chip == ina226) { - if (device_property_read_bool(dev, "ti,alert-polarity-active-high")) { - ret = ina2xx_set_alert_polarity(data, - INA226_ALERT_POL_HIGH); - if (ret < 0) { - return dev_err_probe(dev, ret, - "failed to set alert polarity active high\n"); - } - } else { - /* Set default value i.e active low */ - ret = ina2xx_set_alert_polarity(data, - INA226_ALERT_POL_LOW); - if (ret < 0) { - return dev_err_probe(dev, ret, - "failed to set alert polarity active low\n"); - } - } - } - - ret = ina2xx_init(data); - if (ret < 0) { - dev_err(dev, "error configuring the device: %d\n", ret); - return -ENODEV; - } + ret = ina2xx_init(dev, data); + if (ret < 0) + return dev_err_probe(dev, ret, "failed to configure device\n"); data->groups[group++] = &ina2xx_group; if (chip == ina226) From patchwork Fri Aug 30 01:05:49 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13784079 Received: from mail-oo1-f49.google.com (mail-oo1-f49.google.com [209.85.161.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 09BD84A32 for ; Fri, 30 Aug 2024 01:06:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979976; cv=none; b=Kj0FUQNBk3EnjfkR9zJRU7gIWR54e+JscLhDFSjyqPyERC+cXBJLfDo5kF4Rklc6ImLJ19Agi7AAi7MCAklWlQDMNltKxWIngdZ2jjw3KTV3KWN9obOQcbnHG3ZWDHN4ZnFt6eyGy7gEKlU7JcGMsGj8gENmBBX0Kp/Yp3e6BH4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979976; c=relaxed/simple; bh=evgTo3G8HFa3vMDJb4jvAZpDkYMznjQ0/qlROQkKLd4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=S0LKa8uCJzxKWzhtIBLVKR1c96mHaXslLgPEh+9l+ocGGfCus8M53rEvoyLGsuCDMSHGL9Q9onxR8Pbkn1BJjs6mcopfKRcfxbwxT6TRUfWAboRxBcJOVrAn8YiIJQ4rB5EouN4NXCpqmhmZ+MkhKn1kl8WcrfNpMXBazFnxzfE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=EI7X/TCa; arc=none smtp.client-ip=209.85.161.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="EI7X/TCa" Received: by mail-oo1-f49.google.com with SMTP id 006d021491bc7-5dfa315ffbdso640177eaf.3 for ; Thu, 29 Aug 2024 18:06:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724979974; x=1725584774; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=ip9lb1dzBg+M+liXuOQfjKjvsJ11zulJlOJNZdprdCA=; b=EI7X/TCa0AECVXlfI6OrrEurUKtyrULBkogU1neSAh0UFqpA6ih9ErWDikweM4XiJY BStfuoiU+eGvcI802GGk3Z65Ylif5wgt+3a3FSiNOQnCWk2nHSJL3QM1kDuT7DDNHsW/ alfYh1/EmcFrvEXpSeDrNTIzMiKZkpjeMcYwAFcccfX/2H+HiON/C4mgY7tnQffykQBF fcwEmusaY5Xs/enPWJShkgI+lsR5BFzNpKqam/UizHo+bPR37CinfQlR23Z+Kh0FZ/kR FtmXzwdzEVcQZCRjko1GLAYPjU1YOKYX0OQLF5wLgoQ87uiXw3ZhCbMJavje88VyIfAu u8ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724979974; x=1725584774; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ip9lb1dzBg+M+liXuOQfjKjvsJ11zulJlOJNZdprdCA=; b=AcFIkYQDql42RAmCpMd2NAHqqd2YtndGC4c7VFFN2PIuMlQTMR9XAasdGuVT2eXx6U 5B0+q8W+p+08vD8AvCL4UWl4tQlV0wXc+Na+lKhwRHVZY6yXYXaSTKPE9tkXGIi5AmQb jKxDyGSGOzQPPZXVa4hVi9Ka2VzzAIKggzljeUvHb+YXbtxksk0WxJ2Vk6KsPSUnqqso achvNStTdhRrdD7raW+cCCn0O8PnZhslYU1w8UK7cItVs2FOMeOWrzlWuErrG83LsvAi IPTe2ESQ8gwuM09XRHBTAhIBXgBqvKJRA9Ptz+dwEBHabroVKeNKpY/iFvegPldVi8fa 0y4w== X-Gm-Message-State: AOJu0YywhmWN9W/84zhDIxmc5lMkhPA+phCfrTkcdEE9ZL1eYnsJQHOl /A7vKIt0rCtPYwESHu+1nYCh0zfMDdHKf4PZjF72e5OzEwHnPBAC1yZDGg== X-Google-Smtp-Source: AGHT+IH+ONRJBuFSOVVmlbtkmAHUcYy1teNX7Rwajw9Dl8agA/lQzrhdF+7dlw5A4bWWnx6fRoKgjg== X-Received: by 2002:a05:6358:50ca:b0:1ac:f2a5:e79e with SMTP id e5c5f4694b2df-1b603c4430dmr584212955d.16.1724979973692; Thu, 29 Aug 2024 18:06:13 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a5872sm1732130b3a.67.2024.08.29.18.06.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Aug 2024 18:06:13 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Tzung-Bi Shih , Guenter Roeck Subject: [PATCH v2 09/14] hwmon: (ina2xx) Set alert latch Date: Thu, 29 Aug 2024 18:05:49 -0700 Message-ID: <20240830010554.1462861-10-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240830010554.1462861-1-linux@roeck-us.net> References: <20240830010554.1462861-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Alerts should only be cleared after reported, not immediately after the alert condition has been cleared. Set the latch enable bit to keep alerts latched until the alert register has been read from the chip. Signed-off-by: Guenter Roeck Reviewed-by: Tzung-Bi Shih --- v2: Moved patch after consolidation patch to keep it simple Set latch bit once when initializing the chip and keep it active drivers/hwmon/ina2xx.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index a9e3b23445b4..98338b7e7437 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -67,6 +67,7 @@ #define INA226_READ_AVG(reg) FIELD_GET(INA226_AVG_RD_MASK, reg) +#define INA226_ALERT_LATCH_ENABLE BIT(0) #define INA226_ALERT_POLARITY BIT(1) /* bit number of alert functions in Mask/Enable Register */ @@ -640,8 +641,10 @@ static int ina2xx_init(struct device *dev, struct ina2xx_data *data) if (data->chip == ina226) { bool active_high = device_property_read_bool(dev, "ti,alert-polarity-active-high"); - regmap_update_bits(regmap, INA226_MASK_ENABLE, INA226_ALERT_POLARITY, - FIELD_PREP(INA226_ALERT_POLARITY, active_high)); + regmap_update_bits(regmap, INA226_MASK_ENABLE, + INA226_ALERT_LATCH_ENABLE | INA226_ALERT_POLARITY, + INA226_ALERT_LATCH_ENABLE | + FIELD_PREP(INA226_ALERT_POLARITY, active_high)); } /* From patchwork Fri Aug 30 01:05:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13784080 Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CD39AF9E4 for ; Fri, 30 Aug 2024 01:06:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979978; cv=none; b=LJa7r+q2efYpGEogS1/70m4O8Ot2+WpvYYQvY/nDIwIapyx+sczUOJOjEWj7DnRGgBqTwXZ0D0FLAmLZHSQn6YO5M2BJSIJ+nsDibnyH0mAKdX1MeWV6C3uGRt/JFH84FaK/If9tMoln7QnIJcr+/tthfl/hJg+LuF5XuX/yzCY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979978; c=relaxed/simple; bh=QY8MYHljwpjS3z8M7Wm1IQnqvAiK1GgQcR2lFkFPcME=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=K3ZsBNMsAdiPJHjoWCqLW35zig1MIjiFE18s19Y/A++2TJ8uvF5CJ6SUeyNctwo7Vo1YUNpU7dW8bcrA7fIBsDYB17Jtu/AqLMcK0OTyv/4CIRiZRnnJ/4Q14nnmgK5FwgosE+ay87c1DnaF8YmcdfIjvkiwP+9MNXkeAiSAPuw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Z7RZjpN1; arc=none smtp.client-ip=209.85.210.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Z7RZjpN1" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-7142448aaf9so926368b3a.1 for ; Thu, 29 Aug 2024 18:06:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724979975; x=1725584775; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=t8FryLLHfKyK6h+OkcsV6zljseFi7Hl3EvfagubRt50=; b=Z7RZjpN1cOBracGGBCVCmm14grB7JCE/fH6SXUowyowDqUgz9APiC2svrjJ0t8NK5N 2qQ/CQ1VHrdzYGCJw8SiEOWG+QLjrLBi5mILtBykK/kRAwl+0D+6jD8WdUy24YovLizt mUoRtNmaluSA0IP+e6MUMAsZxCgOs1ye4g558tIR1zv6bipXVbn5ZKanM9TXqxzcslq7 Di79YGZE+ZcVymUplE+7TOj7LVdxji3nv7DZTjZqZzv4INY6Zq7IgKx4prRh3wkCs8aS wXECQF8AboB0HZMg3DYQ35mPl90KjVSyXa0ZW8kkW/iJx/YHuVyZAOAqrtTqflDGRhAV NKtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724979975; x=1725584775; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=t8FryLLHfKyK6h+OkcsV6zljseFi7Hl3EvfagubRt50=; b=YYoW3Vma1m01+eHFuoAOFENRdKLYpxGuG+0D5FvBbZtobfc3JAnHLkEllka5GGeiYd kyx0VqdXawOftCe6DiXcBFUJRAf29UdGSY9gZXAJzIy5t/xdlIzZb65Z5InMzsykPhF5 x+i812PvCBNrgqFRAWlwTw6yd1fb+DfU6lkw/K+GEisHaR4jjwikatqvWwv0y1/5OsVV YIiNdcG7YguyQXEwQYj0oDibbGWPuKMlG+Xv8dLae8LkZ4poBLuVFQaNtRqwLnxrIo+L tK42ReoJKQ1441NfGXb/WkHy4QrS7QFWqRgL+HgdtO4+LV+5nNYjowSYP2/hk4AJw6vr y6Bg== X-Gm-Message-State: AOJu0YyfWvLpkq3SdHkCCi+MobyA85Jpay97MJUYOB+j4Q3Gsy1QvSkx YkET1MJX3nSOHbxwqWwZzafVsa6rLYeC9K1r3KmtQMdm0C5ey+crlbLwWQ== X-Google-Smtp-Source: AGHT+IGEwlq0u16Guvd0lFyRX6n1yqd6I8OHuBSWG8MEYJ17KNpOlh1x4Aca9EO9iZXwomE6R63eIw== X-Received: by 2002:a05:6a00:80f:b0:704:151d:dcce with SMTP id d2e1a72fcca58-7170672410bmr1033831b3a.5.1724979975246; Thu, 29 Aug 2024 18:06:15 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7d22e9d5150sm1848070a12.85.2024.08.29.18.06.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Aug 2024 18:06:14 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Tzung-Bi Shih , Guenter Roeck Subject: [PATCH v2 10/14] hwmon: (ina2xx) Move ina2xx_get_value() Date: Thu, 29 Aug 2024 18:05:50 -0700 Message-ID: <20240830010554.1462861-11-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240830010554.1462861-1-linux@roeck-us.net> References: <20240830010554.1462861-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 ina2xx_get_value() will be needed earlier in the next patch, so move it. No functional change. Reviewed-by: Tzung-Bi Shih Signed-off-by: Guenter Roeck --- v2: Added Reviewed-by: tag drivers/hwmon/ina2xx.c | 72 +++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index 98338b7e7437..fe850ee06024 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -211,6 +211,42 @@ static u16 ina226_interval_to_reg(unsigned long interval) return FIELD_PREP(INA226_AVG_RD_MASK, avg_bits); } +static int ina2xx_get_value(struct ina2xx_data *data, u8 reg, + unsigned int regval) +{ + int val; + + switch (reg) { + case INA2XX_SHUNT_VOLTAGE: + /* signed register */ + val = DIV_ROUND_CLOSEST((s16)regval, data->config->shunt_div); + break; + case INA2XX_BUS_VOLTAGE: + val = (regval >> data->config->bus_voltage_shift) * + data->config->bus_voltage_lsb; + val = DIV_ROUND_CLOSEST(val, 1000); + break; + case INA2XX_POWER: + val = regval * data->power_lsb_uW; + break; + case INA2XX_CURRENT: + /* signed register, result in mA */ + val = (s16)regval * data->current_lsb_uA; + val = DIV_ROUND_CLOSEST(val, 1000); + break; + case INA2XX_CALIBRATION: + val = regval; + break; + default: + /* programmer goofed */ + WARN_ON_ONCE(1); + val = 0; + break; + } + + return val; +} + static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) { struct ina2xx_data *data = dev_get_drvdata(dev); @@ -264,42 +300,6 @@ static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) return -ENODEV; } -static int ina2xx_get_value(struct ina2xx_data *data, u8 reg, - unsigned int regval) -{ - int val; - - switch (reg) { - case INA2XX_SHUNT_VOLTAGE: - /* signed register */ - val = DIV_ROUND_CLOSEST((s16)regval, data->config->shunt_div); - break; - case INA2XX_BUS_VOLTAGE: - val = (regval >> data->config->bus_voltage_shift) - * data->config->bus_voltage_lsb; - val = DIV_ROUND_CLOSEST(val, 1000); - break; - case INA2XX_POWER: - val = regval * data->power_lsb_uW; - break; - case INA2XX_CURRENT: - /* signed register, result in mA */ - val = (s16)regval * data->current_lsb_uA; - val = DIV_ROUND_CLOSEST(val, 1000); - break; - case INA2XX_CALIBRATION: - val = regval; - break; - default: - /* programmer goofed */ - WARN_ON_ONCE(1); - val = 0; - break; - } - - return val; -} - static ssize_t ina2xx_value_show(struct device *dev, struct device_attribute *da, char *buf) { From patchwork Fri Aug 30 01:05:51 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13784081 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6106FF9E4 for ; Fri, 30 Aug 2024 01:06:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979980; cv=none; b=igGu2X620ngDYFpJSp2Tn4CnY/S0p1NkwAha1wqFYAI7B0G1n9W0LsXUbSjyXmrd35T5V2vVDzHrbYN3efD77+7PHLdwjcCDIPuB3WkWNZGFtP1giR1OyktFS/vmy6q1Ws/ZqyQ6F4TEj1DXKViGJZTgrPL0DZ+7eOiGPkXfBag= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979980; c=relaxed/simple; bh=4xNkL6F/d9qzAyWP7E+APPfo+9qTEppBRFV3vNqHnQc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XKJxE+/70ypUSP/piYC0Dh0xYBmDuRS0A0/pWfjJrEh/WxRIw6Cn6QA0eiyU52Rd5RUmhBxL+LvDqY62H6lB4ayu7npt1Z7Mrhfvy7f4sNgpIY/DELvhffuQapYSx3sazeuLE07czt8JOjQQ0V1zEWf15DGYpKdcIiokLnf6w30= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=RyUvbOuj; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="RyUvbOuj" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-202146e9538so10657945ad.3 for ; Thu, 29 Aug 2024 18:06:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724979977; x=1725584777; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=e2jAf2OJlH8yWPG1jAFnPsBF45GoslHaPMNFp1UTwuI=; b=RyUvbOujGUBB7j3Qqww6meQ6yDzXrIWkZoZU6oFFwifm5iomK7XKDG5wf5glzWQllp KU5+f6Nr+KFWB3/9x9IqjhS8jY9Kg5Z+vQij9DWfRJ3Ia4mmwGA4ynUkxwaU434j7EL/ HsWnQRrTIys2vNQAb7ajzIhsbnG8OUnXXNar5tGSLE0M6L4SUUtD74Bw92y+811XtB5s uhj3FX18OZqgRkrnB/GIy85hCEy+IDm0eqJ/luq6/n6FrZtTGKgzSbZ8FLzFBL+jFukv eJYziwdJNPONInsVEBD4wjrC3hVxA3M8b3hGplEX+0lnutuGc1/HyagUii3UrsXIwsve RnCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724979977; x=1725584777; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=e2jAf2OJlH8yWPG1jAFnPsBF45GoslHaPMNFp1UTwuI=; b=FSToRs7gTyluuwpdlwlzPsXhbkxJ2wYTHEMWz7n9E1q+IB8I+ALLJr7wFUWapzCFXL K9jujjFTgI+RarA+JyZNTmcovOlRd7M5odwuUgp52Tt2e2V56FyaigL6WJkkAaCW2yEX EMk2MRtD/xhP9Yfkiy92cK/0YAZeZZU4cm6yPUitx4ID6GgVO4VpET27TKzTVHRr1bhj +kHYvonrUUsnramJBJlaqFaj8qkyjuq1CG7/IsGrGvtCWHShG1RA9MJHDGYssthq/6YU TpGizHLKIXBATlBQw0o/S8wVOaFOon0xpxVm6gwKDRH1cZY4GMQGVeSWI6P1GD/RxWiw +hzQ== X-Gm-Message-State: AOJu0YyDIs0bVcO49aEfAVcXqKWD39gs6p8K5DaFMkT1Ha21CekTvsWM /jT08IJfODwF59U+b9RwCctHmKWbSN+L+75IGzYNeqmrj4ml1BCbxQjQmg== X-Google-Smtp-Source: AGHT+IGnFJl5prlr4sPTuxwXIqnRZUfAxk989neescQwGUyaU/A/tes/IykKWrkBD6zi0ETxymp9IQ== X-Received: by 2002:a17:902:ecc3:b0:1fc:2ee3:d460 with SMTP id d9443c01a7336-2050c3743d3mr48764025ad.35.1724979977011; Thu, 29 Aug 2024 18:06:17 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-20515537254sm17102765ad.142.2024.08.29.18.06.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Aug 2024 18:06:16 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Tzung-Bi Shih , Guenter Roeck Subject: [PATCH v2 11/14] hwmon: (ina2xx) Convert to use with_info hwmon API Date: Thu, 29 Aug 2024 18:05:51 -0700 Message-ID: <20240830010554.1462861-12-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240830010554.1462861-1-linux@roeck-us.net> References: <20240830010554.1462861-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Convert driver to use the with_info hardware monitoring API to reduce its dependency on sysfs attribute functions. Signed-off-by: Guenter Roeck Reviewed-by: Tzung-Bi Shih --- v2: No change drivers/hwmon/ina2xx.c | 495 ++++++++++++++++++++++++----------------- 1 file changed, 293 insertions(+), 202 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index fe850ee06024..339d41dfa10e 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -25,9 +25,9 @@ #include #include #include +#include #include #include -#include #include #include #include @@ -35,6 +35,7 @@ #include #include #include +#include #include /* common register definitions */ @@ -81,9 +82,6 @@ #define INA226_ALERT_CONFIG_MASK GENMASK(15, 10) #define INA226_ALERT_FUNCTION_FLAG BIT(4) -/* common attrs, ina226 attrs and NULL */ -#define INA2XX_MAX_ATTRIBUTE_GROUPS 3 - /* * Both bus voltage and shunt voltage conversion times for ina226 are set * to 0b0100 on POR, which translates to 2200 microseconds in total. @@ -147,8 +145,6 @@ struct ina2xx_data { long power_lsb_uW; struct mutex config_lock; struct regmap *regmap; - - const struct attribute_group *groups[INA2XX_MAX_ATTRIBUTE_GROUPS]; }; static const struct ina2xx_config ina2xx_config[] = { @@ -193,7 +189,7 @@ static int ina226_reg_to_interval(u16 config) * Return the new, shifted AVG field value of CONFIG register, * to use with regmap_update_bits */ -static u16 ina226_interval_to_reg(unsigned long interval) +static u16 ina226_interval_to_reg(long interval) { int avg, avg_bits; @@ -247,14 +243,19 @@ static int ina2xx_get_value(struct ina2xx_data *data, u8 reg, return val; } -static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) +/* + * Read and convert register value from chip. If the register value is 0, + * check if the chip has been power cycled or reset. If so, re-initialize it. + */ +static int ina2xx_read_init(struct device *dev, int reg, long *val) { struct ina2xx_data *data = dev_get_drvdata(dev); struct regmap *regmap = data->regmap; + unsigned int regval; int ret, retry; for (retry = 5; retry; retry--) { - ret = regmap_read(regmap, reg, regval); + ret = regmap_read(regmap, reg, ®val); if (ret < 0) return ret; @@ -266,7 +267,7 @@ static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) * We do that extra read of the calibration register if there * is some hint of a chip reset. */ - if (*regval == 0) { + if (regval == 0) { unsigned int cal; ret = regmap_read_bypassed(regmap, INA2XX_CALIBRATION, &cal); @@ -288,6 +289,7 @@ static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) continue; } } + *val = ina2xx_get_value(data, reg, regval); return 0; } @@ -300,46 +302,6 @@ static int ina2xx_read_reg(struct device *dev, int reg, unsigned int *regval) return -ENODEV; } -static ssize_t ina2xx_value_show(struct device *dev, - struct device_attribute *da, char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct ina2xx_data *data = dev_get_drvdata(dev); - unsigned int regval; - - int err = ina2xx_read_reg(dev, attr->index, ®val); - - if (err < 0) - return err; - - return sysfs_emit(buf, "%d\n", ina2xx_get_value(data, attr->index, regval)); -} - -static int ina226_reg_to_alert(struct ina2xx_data *data, u32 mask, u16 regval) -{ - int reg; - - switch (mask) { - case INA226_SHUNT_OVER_VOLTAGE_MASK: - case INA226_SHUNT_UNDER_VOLTAGE_MASK: - reg = INA2XX_SHUNT_VOLTAGE; - break; - case INA226_BUS_OVER_VOLTAGE_MASK: - case INA226_BUS_UNDER_VOLTAGE_MASK: - reg = INA2XX_BUS_VOLTAGE; - break; - case INA226_POWER_OVER_LIMIT_MASK: - reg = INA2XX_POWER; - break; - default: - /* programmer goofed */ - WARN_ON_ONCE(1); - return 0; - } - - return ina2xx_get_value(data, reg, regval); -} - /* * Turns alert limit values into register values. * Opposite of the formula in ina2xx_get_value(). @@ -369,14 +331,10 @@ static u16 ina226_alert_to_reg(struct ina2xx_data *data, u32 mask, unsigned long } } -static ssize_t ina226_alert_show(struct device *dev, - struct device_attribute *da, char *buf) +static int ina226_alert_limit_read(struct ina2xx_data *data, u32 mask, int reg, long *val) { - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct ina2xx_data *data = dev_get_drvdata(dev); struct regmap *regmap = data->regmap; int regval; - int val = 0; int ret; mutex_lock(&data->config_lock); @@ -384,32 +342,26 @@ static ssize_t ina226_alert_show(struct device *dev, if (ret) goto abort; - if (regval & attr->index) { + if (regval & mask) { ret = regmap_read(regmap, INA226_ALERT_LIMIT, ®val); if (ret) goto abort; - val = ina226_reg_to_alert(data, attr->index, regval); + *val = ina2xx_get_value(data, reg, regval); + } else { + *val = 0; } - - ret = sysfs_emit(buf, "%d\n", val); abort: mutex_unlock(&data->config_lock); return ret; } -static ssize_t ina226_alert_store(struct device *dev, - struct device_attribute *da, - const char *buf, size_t count) +static int ina226_alert_limit_write(struct ina2xx_data *data, u32 mask, long val) { - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct ina2xx_data *data = dev_get_drvdata(dev); struct regmap *regmap = data->regmap; - unsigned long val; int ret; - ret = kstrtoul(buf, 10, &val); - if (ret < 0) - return ret; + if (val < 0) + return -EINVAL; /* * Clear all alerts first to avoid accidentally triggering ALERT pin @@ -423,43 +375,285 @@ static ssize_t ina226_alert_store(struct device *dev, goto abort; ret = regmap_write(regmap, INA226_ALERT_LIMIT, - ina226_alert_to_reg(data, attr->index, val)); + ina226_alert_to_reg(data, mask, val)); if (ret < 0) goto abort; - if (val != 0) { + if (val) ret = regmap_update_bits(regmap, INA226_MASK_ENABLE, - INA226_ALERT_CONFIG_MASK, - attr->index); - if (ret < 0) - goto abort; - } - - ret = count; + INA226_ALERT_CONFIG_MASK, mask); abort: mutex_unlock(&data->config_lock); return ret; } -static ssize_t ina226_alarm_show(struct device *dev, - struct device_attribute *da, char *buf) +static int ina2xx_chip_read(struct device *dev, u32 attr, long *val) { - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct ina2xx_data *data = dev_get_drvdata(dev); - unsigned int mask; - int alarm = 0; + u32 regval; int ret; - ret = regmap_read_bypassed(data->regmap, INA226_MASK_ENABLE, &mask); + switch (attr) { + case hwmon_chip_update_interval: + ret = regmap_read(data->regmap, INA2XX_CONFIG, ®val); + if (ret) + return ret; + + *val = ina226_reg_to_interval(regval); + break; + default: + return -EOPNOTSUPP; + } + return 0; +} + +static int ina226_alert_read(struct regmap *regmap, u32 mask, long *val) +{ + unsigned int regval; + int ret; + + ret = regmap_read_bypassed(regmap, INA226_MASK_ENABLE, ®val); if (ret) return ret; - alarm = (mask & attr->index) && - (mask & INA226_ALERT_FUNCTION_FLAG); + *val = (regval & mask) && (regval & INA226_ALERT_FUNCTION_FLAG); - return sysfs_emit(buf, "%d\n", alarm); + return 0; } +static int ina2xx_in_read(struct device *dev, u32 attr, int channel, long *val) +{ + int voltage_reg = channel ? INA2XX_BUS_VOLTAGE : INA2XX_SHUNT_VOLTAGE; + u32 under_voltage_mask = channel ? INA226_BUS_UNDER_VOLTAGE_MASK + : INA226_SHUNT_UNDER_VOLTAGE_MASK; + u32 over_voltage_mask = channel ? INA226_BUS_OVER_VOLTAGE_MASK + : INA226_SHUNT_OVER_VOLTAGE_MASK; + struct ina2xx_data *data = dev_get_drvdata(dev); + struct regmap *regmap = data->regmap; + unsigned int regval; + int ret; + + switch (attr) { + case hwmon_in_input: + ret = regmap_read(regmap, voltage_reg, ®val); + if (ret) + return ret; + *val = ina2xx_get_value(data, voltage_reg, regval); + break; + case hwmon_in_lcrit: + return ina226_alert_limit_read(data, under_voltage_mask, + voltage_reg, val); + case hwmon_in_crit: + return ina226_alert_limit_read(data, over_voltage_mask, + voltage_reg, val); + case hwmon_in_lcrit_alarm: + return ina226_alert_read(regmap, under_voltage_mask, val); + case hwmon_in_crit_alarm: + return ina226_alert_read(regmap, over_voltage_mask, val); + default: + return -EOPNOTSUPP; + } + return 0; +} + +static int ina2xx_power_read(struct device *dev, u32 attr, long *val) +{ + struct ina2xx_data *data = dev_get_drvdata(dev); + + switch (attr) { + case hwmon_power_input: + return ina2xx_read_init(dev, INA2XX_POWER, val); + case hwmon_power_crit: + return ina226_alert_limit_read(data, INA226_POWER_OVER_LIMIT_MASK, + INA2XX_POWER, val); + case hwmon_power_crit_alarm: + return ina226_alert_read(data->regmap, INA226_POWER_OVER_LIMIT_MASK, val); + default: + return -EOPNOTSUPP; + } +} + +static int ina2xx_curr_read(struct device *dev, u32 attr, long *val) +{ + switch (attr) { + case hwmon_curr_input: + return ina2xx_read_init(dev, INA2XX_CURRENT, val); + default: + return -EOPNOTSUPP; + } +} + +static int ina2xx_read(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, long *val) +{ + switch (type) { + case hwmon_chip: + return ina2xx_chip_read(dev, attr, val); + case hwmon_in: + return ina2xx_in_read(dev, attr, channel, val); + case hwmon_power: + return ina2xx_power_read(dev, attr, val); + case hwmon_curr: + return ina2xx_curr_read(dev, attr, val); + default: + return -EOPNOTSUPP; + } +} + +static int ina2xx_chip_write(struct device *dev, u32 attr, long val) +{ + struct ina2xx_data *data = dev_get_drvdata(dev); + + switch (attr) { + case hwmon_chip_update_interval: + return regmap_update_bits(data->regmap, INA2XX_CONFIG, + INA226_AVG_RD_MASK, + ina226_interval_to_reg(val)); + default: + return -EOPNOTSUPP; + } +} + +static int ina2xx_in_write(struct device *dev, u32 attr, int channel, long val) +{ + struct ina2xx_data *data = dev_get_drvdata(dev); + + switch (attr) { + case hwmon_in_lcrit: + return ina226_alert_limit_write(data, + channel ? INA226_BUS_UNDER_VOLTAGE_MASK : INA226_SHUNT_UNDER_VOLTAGE_MASK, + val); + case hwmon_in_crit: + return ina226_alert_limit_write(data, + channel ? INA226_BUS_OVER_VOLTAGE_MASK : INA226_SHUNT_OVER_VOLTAGE_MASK, + val); + default: + return -EOPNOTSUPP; + } + return 0; +} + +static int ina2xx_power_write(struct device *dev, u32 attr, long val) +{ + struct ina2xx_data *data = dev_get_drvdata(dev); + + switch (attr) { + case hwmon_power_crit: + return ina226_alert_limit_write(data, INA226_POWER_OVER_LIMIT_MASK, val); + default: + return -EOPNOTSUPP; + } + return 0; +} + +static int ina2xx_write(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, long val) +{ + switch (type) { + case hwmon_chip: + return ina2xx_chip_write(dev, attr, val); + case hwmon_in: + return ina2xx_in_write(dev, attr, channel, val); + case hwmon_power: + return ina2xx_power_write(dev, attr, val); + default: + return -EOPNOTSUPP; + } +} + +static umode_t ina2xx_is_visible(const void *_data, enum hwmon_sensor_types type, + u32 attr, int channel) +{ + const struct ina2xx_data *data = _data; + enum ina2xx_ids chip = data->chip; + + switch (type) { + case hwmon_in: + switch (attr) { + case hwmon_in_input: + return 0444; + case hwmon_in_lcrit: + case hwmon_in_crit: + if (chip == ina226) + return 0644; + break; + case hwmon_in_lcrit_alarm: + case hwmon_in_crit_alarm: + if (chip == ina226) + return 0444; + break; + default: + break; + } + break; + case hwmon_curr: + switch (attr) { + case hwmon_curr_input: + return 0444; + default: + break; + } + break; + case hwmon_power: + switch (attr) { + case hwmon_power_input: + return 0444; + case hwmon_power_crit: + if (chip == ina226) + return 0644; + break; + case hwmon_power_crit_alarm: + if (chip == ina226) + return 0444; + break; + default: + break; + } + break; + case hwmon_chip: + switch (attr) { + case hwmon_chip_update_interval: + if (chip == ina226) + return 0644; + break; + default: + break; + } + break; + default: + break; + } + return 0; +} + +static const struct hwmon_channel_info * const ina2xx_info[] = { + HWMON_CHANNEL_INFO(chip, + HWMON_C_UPDATE_INTERVAL), + HWMON_CHANNEL_INFO(in, + HWMON_I_INPUT | HWMON_I_CRIT | HWMON_I_CRIT_ALARM | + HWMON_I_LCRIT | HWMON_I_LCRIT_ALARM, + HWMON_I_INPUT | HWMON_I_CRIT | HWMON_I_CRIT_ALARM | + HWMON_I_LCRIT | HWMON_I_LCRIT_ALARM + ), + HWMON_CHANNEL_INFO(curr, HWMON_C_INPUT), + HWMON_CHANNEL_INFO(power, + HWMON_P_INPUT | HWMON_P_CRIT | HWMON_P_CRIT_ALARM), + NULL +}; + +static const struct hwmon_ops ina2xx_hwmon_ops = { + .is_visible = ina2xx_is_visible, + .read = ina2xx_read, + .write = ina2xx_write, +}; + +static const struct hwmon_chip_info ina2xx_chip_info = { + .ops = &ina2xx_hwmon_ops, + .info = ina2xx_info, +}; + +/* shunt resistance */ + /* * In order to keep calibration register value fixed, the product * of current_lsb and shunt_resistor should also be fixed and equal @@ -481,21 +675,21 @@ static int ina2xx_set_shunt(struct ina2xx_data *data, unsigned long val) return 0; } -static ssize_t ina2xx_shunt_show(struct device *dev, - struct device_attribute *da, char *buf) +static ssize_t shunt_resistor_show(struct device *dev, + struct device_attribute *da, char *buf) { struct ina2xx_data *data = dev_get_drvdata(dev); return sysfs_emit(buf, "%li\n", data->rshunt); } -static ssize_t ina2xx_shunt_store(struct device *dev, - struct device_attribute *da, - const char *buf, size_t count) +static ssize_t shunt_resistor_store(struct device *dev, + struct device_attribute *da, + const char *buf, size_t count) { + struct ina2xx_data *data = dev_get_drvdata(dev); unsigned long val; int status; - struct ina2xx_data *data = dev_get_drvdata(dev); status = kstrtoul(buf, 10, &val); if (status < 0) @@ -509,114 +703,14 @@ static ssize_t ina2xx_shunt_store(struct device *dev, return count; } -static ssize_t ina226_interval_store(struct device *dev, - struct device_attribute *da, - const char *buf, size_t count) -{ - struct ina2xx_data *data = dev_get_drvdata(dev); - unsigned long val; - int status; - - status = kstrtoul(buf, 10, &val); - if (status < 0) - return status; - - status = regmap_update_bits(data->regmap, INA2XX_CONFIG, - INA226_AVG_RD_MASK, - ina226_interval_to_reg(val)); - if (status < 0) - return status; - - return count; -} - -static ssize_t ina226_interval_show(struct device *dev, - struct device_attribute *da, char *buf) -{ - struct ina2xx_data *data = dev_get_drvdata(dev); - int status; - unsigned int regval; - - status = regmap_read(data->regmap, INA2XX_CONFIG, ®val); - if (status) - return status; - - return sysfs_emit(buf, "%d\n", ina226_reg_to_interval(regval)); -} - -/* shunt voltage */ -static SENSOR_DEVICE_ATTR_RO(in0_input, ina2xx_value, INA2XX_SHUNT_VOLTAGE); -/* shunt voltage over/under voltage alert setting and alarm */ -static SENSOR_DEVICE_ATTR_RW(in0_crit, ina226_alert, - INA226_SHUNT_OVER_VOLTAGE_MASK); -static SENSOR_DEVICE_ATTR_RW(in0_lcrit, ina226_alert, - INA226_SHUNT_UNDER_VOLTAGE_MASK); -static SENSOR_DEVICE_ATTR_RO(in0_crit_alarm, ina226_alarm, - INA226_SHUNT_OVER_VOLTAGE_MASK); -static SENSOR_DEVICE_ATTR_RO(in0_lcrit_alarm, ina226_alarm, - INA226_SHUNT_UNDER_VOLTAGE_MASK); - -/* bus voltage */ -static SENSOR_DEVICE_ATTR_RO(in1_input, ina2xx_value, INA2XX_BUS_VOLTAGE); -/* bus voltage over/under voltage alert setting and alarm */ -static SENSOR_DEVICE_ATTR_RW(in1_crit, ina226_alert, - INA226_BUS_OVER_VOLTAGE_MASK); -static SENSOR_DEVICE_ATTR_RW(in1_lcrit, ina226_alert, - INA226_BUS_UNDER_VOLTAGE_MASK); -static SENSOR_DEVICE_ATTR_RO(in1_crit_alarm, ina226_alarm, - INA226_BUS_OVER_VOLTAGE_MASK); -static SENSOR_DEVICE_ATTR_RO(in1_lcrit_alarm, ina226_alarm, - INA226_BUS_UNDER_VOLTAGE_MASK); - -/* calculated current */ -static SENSOR_DEVICE_ATTR_RO(curr1_input, ina2xx_value, INA2XX_CURRENT); - -/* calculated power */ -static SENSOR_DEVICE_ATTR_RO(power1_input, ina2xx_value, INA2XX_POWER); -/* over-limit power alert setting and alarm */ -static SENSOR_DEVICE_ATTR_RW(power1_crit, ina226_alert, - INA226_POWER_OVER_LIMIT_MASK); -static SENSOR_DEVICE_ATTR_RO(power1_crit_alarm, ina226_alarm, - INA226_POWER_OVER_LIMIT_MASK); - -/* shunt resistance */ -static SENSOR_DEVICE_ATTR_RW(shunt_resistor, ina2xx_shunt, INA2XX_CALIBRATION); - -/* update interval (ina226 only) */ -static SENSOR_DEVICE_ATTR_RW(update_interval, ina226_interval, 0); +static DEVICE_ATTR_RW(shunt_resistor); /* pointers to created device attributes */ static struct attribute *ina2xx_attrs[] = { - &sensor_dev_attr_in0_input.dev_attr.attr, - &sensor_dev_attr_in1_input.dev_attr.attr, - &sensor_dev_attr_curr1_input.dev_attr.attr, - &sensor_dev_attr_power1_input.dev_attr.attr, - &sensor_dev_attr_shunt_resistor.dev_attr.attr, + &dev_attr_shunt_resistor.attr, NULL, }; - -static const struct attribute_group ina2xx_group = { - .attrs = ina2xx_attrs, -}; - -static struct attribute *ina226_attrs[] = { - &sensor_dev_attr_in0_crit.dev_attr.attr, - &sensor_dev_attr_in0_lcrit.dev_attr.attr, - &sensor_dev_attr_in0_crit_alarm.dev_attr.attr, - &sensor_dev_attr_in0_lcrit_alarm.dev_attr.attr, - &sensor_dev_attr_in1_crit.dev_attr.attr, - &sensor_dev_attr_in1_lcrit.dev_attr.attr, - &sensor_dev_attr_in1_crit_alarm.dev_attr.attr, - &sensor_dev_attr_in1_lcrit_alarm.dev_attr.attr, - &sensor_dev_attr_power1_crit.dev_attr.attr, - &sensor_dev_attr_power1_crit_alarm.dev_attr.attr, - &sensor_dev_attr_update_interval.dev_attr.attr, - NULL, -}; - -static const struct attribute_group ina226_group = { - .attrs = ina226_attrs, -}; +ATTRIBUTE_GROUPS(ina2xx); /* * Initialize chip @@ -662,8 +756,8 @@ static int ina2xx_probe(struct i2c_client *client) struct device *dev = &client->dev; struct ina2xx_data *data; struct device *hwmon_dev; - int ret, group = 0; enum ina2xx_ids chip; + int ret; chip = (uintptr_t)i2c_get_match_data(client); @@ -690,12 +784,9 @@ static int ina2xx_probe(struct i2c_client *client) if (ret < 0) return dev_err_probe(dev, ret, "failed to configure device\n"); - data->groups[group++] = &ina2xx_group; - if (chip == ina226) - data->groups[group++] = &ina226_group; - - hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, - data, data->groups); + hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, + data, &ina2xx_chip_info, + ina2xx_groups); if (IS_ERR(hwmon_dev)) return PTR_ERR(hwmon_dev); From patchwork Fri Aug 30 01:05:52 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13784082 Received: from mail-oi1-f176.google.com (mail-oi1-f176.google.com [209.85.167.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2D664847B for ; Fri, 30 Aug 2024 01:06:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979981; cv=none; b=vA08RMAGJvBFSDBT0znFKoHjeMasgL5C7GqqyMmrq82GvH578kB64T3CM/M4zrw+abH8WE+8fj1hCDexL0PdFO2LUbFSID5xkaFSHlttVLHxI9d0ZwakbJawsFnkE67WqyCooLouI3sUuBh5c5qQrb3vrrjI1HumRrPPegjUvVU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979981; c=relaxed/simple; bh=C+s6bT6/2j20jTabNKIqStu0kaui9YDR1omiL8wrkfk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bzMc0FfY9FnfIzAFELfj9Dmye7vHrtaF8iXGJz7tuFgENgzUhVI6/cLEorQiue8VmBhZ94k25f20G6M6SiEi03PRylN9zPv7RkhUa175TZQNF+p3G7QQHkH/RmgoDo516OZ9S4gj2bgjvW/T4OQ8ubBH/4u0TOc+0v4hQs7d9aY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=h6q10TPV; arc=none smtp.client-ip=209.85.167.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="h6q10TPV" Received: by mail-oi1-f176.google.com with SMTP id 5614622812f47-3df121f7088so167328b6e.2 for ; Thu, 29 Aug 2024 18:06:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724979979; x=1725584779; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=Ga23vIreQQEwRBzfzcdxyXuLyKBrowy0GqiTT1BBV5w=; b=h6q10TPVqKopJnuLcKKjf7ZfIOwe73q6F9jiIpcadGAE4MVPY4a1AR64VgjHmJB5oO hfJ2fSCXxjf8kiXIfWqBw6LpjvfRkDdT710PBz/rsbfehfMA6a098ucHCSR2T2MjrtQI m+ihthDoZXBOyjdZie1wQLD+3IyNbtubQKeJAD21GODQ7fYcBUhK9knitokPRfQys+KO m/PSY1hsAbHNwu8Pcp7CkTU1BCkSPLvfeu8W9AV7H8r9v4GRiTXGObH6pukBVlBTl5hF ASsC5tSg7Y+w7p6uIhdauA0hfIGJhU9qwLktRGtKGMXzwLmkWBsG0lZDjaPc1ssJFjtJ 7tZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724979979; x=1725584779; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Ga23vIreQQEwRBzfzcdxyXuLyKBrowy0GqiTT1BBV5w=; b=nTVTgPiNRXbf09OhM1GHARqCS79pr3fVjcNhcTsO2eJgF7tTFE4ljiv5Q/rBGHhWjs 9WVG3R5/B+HNUisemNZPuIRnIlTPwvZCYM/zVT/+7NnO3b0r1WAUPhQkY5cvmeHuUFsx yqgdw+aGi/LBxliaZEUfNtunWRuANG7/0MCNEOwu4Dl+gB/++BPpDBhw9D8ODJrePEVv VpTAXHcgMEg1hWvuTktSgqY5umevUrbL+QY3d8PGXZHzMCiE/iEKVb6u2Volq+X0bSOT eDfHEJjr7TbQ/7Z15F4ntFGXjSM3QTOLOE7ceSh35JTQv1YdD/URVZj0dUCK+NkkYcX1 SoTQ== X-Gm-Message-State: AOJu0Yz1GNP2lfWvlZVC6R298UFMlNUUW+B4bPTMCQUq+hhat6zD1tC3 xf5+rF74eH5RcdOkfiJ4Qr/vOmY7Mt0Lw/iD5OWYQx2MNClX0yrn0d4b0w== X-Google-Smtp-Source: AGHT+IGj4J484B0uGfmrdOkQWP5DVdZ/QZpWXFUGGrraBMvV6vSnkYN9jH9VvEL3mVsb4LdcrwnEKw== X-Received: by 2002:a05:6870:6386:b0:25b:6d53:d294 with SMTP id 586e51a60fabf-277901652b2mr5433304fac.23.1724979978663; Thu, 29 Aug 2024 18:06:18 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a3b61sm1722625b3a.48.2024.08.29.18.06.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Aug 2024 18:06:18 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Tzung-Bi Shih , Guenter Roeck Subject: [PATCH v2 12/14] hwmon: (ina2xx) Pass register to alert limit write functions Date: Thu, 29 Aug 2024 18:05:52 -0700 Message-ID: <20240830010554.1462861-13-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240830010554.1462861-1-linux@roeck-us.net> References: <20240830010554.1462861-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Pass the to-be-limited register to alert functions and use it to determine conversion from limit to register value. Signed-off-by: Guenter Roeck Reviewed-by: Tzung-Bi Shih --- v2: New patch drivers/hwmon/ina2xx.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index 339d41dfa10e..1cd6fffb1495 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -306,21 +306,19 @@ static int ina2xx_read_init(struct device *dev, int reg, long *val) * Turns alert limit values into register values. * Opposite of the formula in ina2xx_get_value(). */ -static u16 ina226_alert_to_reg(struct ina2xx_data *data, u32 mask, unsigned long val) +static u16 ina226_alert_to_reg(struct ina2xx_data *data, int reg, unsigned long val) { - switch (mask) { - case INA226_SHUNT_OVER_VOLTAGE_MASK: - case INA226_SHUNT_UNDER_VOLTAGE_MASK: + switch (reg) { + case INA2XX_SHUNT_VOLTAGE: val = clamp_val(val, 0, SHRT_MAX * data->config->shunt_div); val *= data->config->shunt_div; return clamp_val(val, 0, SHRT_MAX); - case INA226_BUS_OVER_VOLTAGE_MASK: - case INA226_BUS_UNDER_VOLTAGE_MASK: + case INA2XX_BUS_VOLTAGE: val = clamp_val(val, 0, 200000); val = (val * 1000) << data->config->bus_voltage_shift; val = DIV_ROUND_CLOSEST(val, data->config->bus_voltage_lsb); return clamp_val(val, 0, USHRT_MAX); - case INA226_POWER_OVER_LIMIT_MASK: + case INA2XX_POWER: val = clamp_val(val, 0, UINT_MAX - data->power_lsb_uW); val = DIV_ROUND_CLOSEST(val, data->power_lsb_uW); return clamp_val(val, 0, USHRT_MAX); @@ -355,7 +353,7 @@ static int ina226_alert_limit_read(struct ina2xx_data *data, u32 mask, int reg, return ret; } -static int ina226_alert_limit_write(struct ina2xx_data *data, u32 mask, long val) +static int ina226_alert_limit_write(struct ina2xx_data *data, u32 mask, int reg, long val) { struct regmap *regmap = data->regmap; int ret; @@ -375,7 +373,7 @@ static int ina226_alert_limit_write(struct ina2xx_data *data, u32 mask, long val goto abort; ret = regmap_write(regmap, INA226_ALERT_LIMIT, - ina226_alert_to_reg(data, mask, val)); + ina226_alert_to_reg(data, reg, val)); if (ret < 0) goto abort; @@ -522,10 +520,12 @@ static int ina2xx_in_write(struct device *dev, u32 attr, int channel, long val) case hwmon_in_lcrit: return ina226_alert_limit_write(data, channel ? INA226_BUS_UNDER_VOLTAGE_MASK : INA226_SHUNT_UNDER_VOLTAGE_MASK, + channel ? INA2XX_BUS_VOLTAGE : INA2XX_SHUNT_VOLTAGE, val); case hwmon_in_crit: return ina226_alert_limit_write(data, channel ? INA226_BUS_OVER_VOLTAGE_MASK : INA226_SHUNT_OVER_VOLTAGE_MASK, + channel ? INA2XX_BUS_VOLTAGE : INA2XX_SHUNT_VOLTAGE, val); default: return -EOPNOTSUPP; @@ -539,7 +539,8 @@ static int ina2xx_power_write(struct device *dev, u32 attr, long val) switch (attr) { case hwmon_power_crit: - return ina226_alert_limit_write(data, INA226_POWER_OVER_LIMIT_MASK, val); + return ina226_alert_limit_write(data, INA226_POWER_OVER_LIMIT_MASK, + INA2XX_POWER, val); default: return -EOPNOTSUPP; } From patchwork Fri Aug 30 01:05:53 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13784083 Received: from mail-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 81706EACD for ; Fri, 30 Aug 2024 01:06:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979983; cv=none; b=DUexciBG1Klq79J8wgvH1Wk/Qq30nhb5uDroF0SUO8ytVm4e9W/8MJGiMnkWM4RwRO6w+lR/11pBorv7Db8oTjfNKFkkDU+fjGslGeB//VEbKqU+LU1lekBL6tLbS8HN/qFuSjbfn/ckNYKOsE1IytEcKex2MCJekP0l5LEOJa0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979983; c=relaxed/simple; bh=w1mBxgLZjv71fMmuvVfYgYsP5XEVzFK7SJhtxxNI5Uc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LNvsF+RmsEZ1TaUCdKRoiRFpftukQzA/aAYxO6vPwilIgnPW0HpfsnuCU+BoXwe+aN510oA3qCH4a7n+7fIeRjnACMMyhF2mlDaCFMHkEf/M7z1KlxBr1uxAK+y21t/AuepoD31vHSCGK47AwOYNjSQWUI2gFbKmzMcCTTUpTrM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=LL+Q0CSN; arc=none smtp.client-ip=209.85.215.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LL+Q0CSN" Received: by mail-pg1-f180.google.com with SMTP id 41be03b00d2f7-7cd8c8b07fbso488189a12.3 for ; Thu, 29 Aug 2024 18:06:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724979980; x=1725584780; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=rDZrSIS5dIMDxH+sUlYYCuzZ24vzT+MyOZAn/ypjScU=; b=LL+Q0CSN7EdnRsKwl0vkvk8PLybjm7m5qWxZP/WxPNzqmabULqFzb6EkLHav6aq9jj es94wi245qNy7v07sY3fiTgEEzabyPJiOaTCHir0p8mM9WeLreLrzwytVoCnNHhurmPd xqYLiVhpTZM/FWGpSlELY73SP5OEsKN9haOPi9FaB+eqUj1RjWT854HP0Lj8Xft/UgUd jCeYYQQt1NaVC9yFM60ZMTk0czanDrCzoseovMzHkF3Quvv7pcOAjyOMGDoKt1LE6Ezh fUCe6fDGqU13eNQllZDINgBM6syIPsF7vsdSCkt1xHPQb0Ok+6MTjV7gF5J5Guu7KX1w ox+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724979980; x=1725584780; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=rDZrSIS5dIMDxH+sUlYYCuzZ24vzT+MyOZAn/ypjScU=; b=lCet5B6MVshFOCvaHEvP6/aKipMhTAm10lJrUnezYerKo6PSNDWPDWyr26XU6sdog3 TCrk9pmqweblewIFynjKGZBOQ01uTE9W1YmpnLWsJuMcwfc3lIrTqo5w746N+z7139Nl 4i9T46+kSjVaFQ2pGms7JY8XSHtnjDDYKcp6ry/zhVDzIfs/4B0hDLIXG2jzf5G0lYID rMOH7yWZR7zE3+w+x590dLGLZelQCvPr3cs6V2CxUPTPrt1RvrYk8PrjcwYzVqg5x5Cw vEnIyL0fQ/J8GJKIISbe39aPN54nxhHF1ZGEqgcwkQhAfABGIYHINN+LzeB6o7jnCbll Ne5g== X-Gm-Message-State: AOJu0YxA2rY0LTaUtaPcJJm/Sb6pn1ydoqnB7MIvYOB3WaWEOnfT4xzr Rdju3V9B+GomDoi/vaJDyM1A2Vsz3nZk3qr0CNNxnAJskqlKyqxnqf5U9A== X-Google-Smtp-Source: AGHT+IFkHOu4cw+h0pfPqEcIZV/Hq9VdlcijWnMwxKl48OUWEGbILvXZY58ZP/Tq7DVQLJt+iD8A+g== X-Received: by 2002:a05:6a20:ce43:b0:1cc:df9e:bc3a with SMTP id adf61e73a8af0-1cce104a95fmr4080054637.31.1724979980379; Thu, 29 Aug 2024 18:06:20 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-205155521dbsm17021635ad.258.2024.08.29.18.06.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Aug 2024 18:06:19 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Tzung-Bi Shih , Guenter Roeck Subject: [PATCH v2 13/14] hwmon: (ina2xx) Add support for current limits Date: Thu, 29 Aug 2024 18:05:53 -0700 Message-ID: <20240830010554.1462861-14-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240830010554.1462861-1-linux@roeck-us.net> References: <20240830010554.1462861-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 While the chips supported by this driver do not directly support current limits, they do support setting shunt voltage limits. The shunt voltage divided by the shunt resistor value is the current. On top of that, calibration values are set such that in the shunt voltage register and the current register report the same values. That means we can report and configure current limits based on shunt voltage limits, and we can do so with much better accuracy than by setting shunt voltage limits. Signed-off-by: Guenter Roeck Reviewed-by: Tzung-Bi Shih --- v2: New patch Documentation/hwmon/ina2xx.rst | 4 +++ drivers/hwmon/ina2xx.c | 61 ++++++++++++++++++++++++++++++++-- 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/Documentation/hwmon/ina2xx.rst b/Documentation/hwmon/ina2xx.rst index 27d2e39bc8ac..7f1939b40f74 100644 --- a/Documentation/hwmon/ina2xx.rst +++ b/Documentation/hwmon/ina2xx.rst @@ -99,6 +99,10 @@ Sysfs entries for ina226, ina230 and ina231 only ------------------------------------------------ ======================= ==================================================== +curr1_lcrit Critical low current +curr1_crit Critical high current +curr1_lcrit_alarm Current critical low alarm +curr1_crit_alarm Current critical high alarm in0_lcrit Critical low shunt voltage in0_crit Critical high shunt voltage in0_lcrit_alarm Shunt voltage critical low alarm diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index 1cd6fffb1495..10c8c475c634 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -306,7 +306,7 @@ static int ina2xx_read_init(struct device *dev, int reg, long *val) * Turns alert limit values into register values. * Opposite of the formula in ina2xx_get_value(). */ -static u16 ina226_alert_to_reg(struct ina2xx_data *data, int reg, unsigned long val) +static u16 ina226_alert_to_reg(struct ina2xx_data *data, int reg, long val) { switch (reg) { case INA2XX_SHUNT_VOLTAGE: @@ -322,6 +322,11 @@ static u16 ina226_alert_to_reg(struct ina2xx_data *data, int reg, unsigned long val = clamp_val(val, 0, UINT_MAX - data->power_lsb_uW); val = DIV_ROUND_CLOSEST(val, data->power_lsb_uW); return clamp_val(val, 0, USHRT_MAX); + case INA2XX_CURRENT: + val = clamp_val(val, INT_MIN / 1000, INT_MAX / 1000); + /* signed register, result in mA */ + val = DIV_ROUND_CLOSEST(val * 1000, data->current_lsb_uA); + return clamp_val(val, SHRT_MIN, SHRT_MAX); default: /* programmer goofed */ WARN_ON_ONCE(1); @@ -473,9 +478,31 @@ static int ina2xx_power_read(struct device *dev, u32 attr, long *val) static int ina2xx_curr_read(struct device *dev, u32 attr, long *val) { + struct ina2xx_data *data = dev_get_drvdata(dev); + struct regmap *regmap = data->regmap; + + /* + * While the chips supported by this driver do not directly support + * current limits, they do support setting shunt voltage limits. + * The shunt voltage divided by the shunt resistor value is the current. + * On top of that, calibration values are set such that in the shunt + * voltage register and the current register report the same values. + * That means we can report and configure current limits based on shunt + * voltage limits. + */ switch (attr) { case hwmon_curr_input: return ina2xx_read_init(dev, INA2XX_CURRENT, val); + case hwmon_curr_lcrit: + return ina226_alert_limit_read(data, INA226_SHUNT_UNDER_VOLTAGE_MASK, + INA2XX_CURRENT, val); + case hwmon_curr_crit: + return ina226_alert_limit_read(data, INA226_SHUNT_OVER_VOLTAGE_MASK, + INA2XX_CURRENT, val); + case hwmon_curr_lcrit_alarm: + return ina226_alert_read(regmap, INA226_SHUNT_UNDER_VOLTAGE_MASK, val); + case hwmon_curr_crit_alarm: + return ina226_alert_read(regmap, INA226_SHUNT_OVER_VOLTAGE_MASK, val); default: return -EOPNOTSUPP; } @@ -547,6 +574,23 @@ static int ina2xx_power_write(struct device *dev, u32 attr, long val) return 0; } +static int ina2xx_curr_write(struct device *dev, u32 attr, long val) +{ + struct ina2xx_data *data = dev_get_drvdata(dev); + + switch (attr) { + case hwmon_curr_lcrit: + return ina226_alert_limit_write(data, INA226_SHUNT_UNDER_VOLTAGE_MASK, + INA2XX_CURRENT, val); + case hwmon_curr_crit: + return ina226_alert_limit_write(data, INA226_SHUNT_OVER_VOLTAGE_MASK, + INA2XX_CURRENT, val); + default: + return -EOPNOTSUPP; + } + return 0; +} + static int ina2xx_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, long val) { @@ -557,6 +601,8 @@ static int ina2xx_write(struct device *dev, enum hwmon_sensor_types type, return ina2xx_in_write(dev, attr, channel, val); case hwmon_power: return ina2xx_power_write(dev, attr, val); + case hwmon_curr: + return ina2xx_curr_write(dev, attr, val); default: return -EOPNOTSUPP; } @@ -591,6 +637,16 @@ static umode_t ina2xx_is_visible(const void *_data, enum hwmon_sensor_types type switch (attr) { case hwmon_curr_input: return 0444; + case hwmon_curr_lcrit: + case hwmon_curr_crit: + if (chip == ina226) + return 0644; + break; + case hwmon_curr_lcrit_alarm: + case hwmon_curr_crit_alarm: + if (chip == ina226) + return 0444; + break; default: break; } @@ -636,7 +692,8 @@ static const struct hwmon_channel_info * const ina2xx_info[] = { HWMON_I_INPUT | HWMON_I_CRIT | HWMON_I_CRIT_ALARM | HWMON_I_LCRIT | HWMON_I_LCRIT_ALARM ), - HWMON_CHANNEL_INFO(curr, HWMON_C_INPUT), + HWMON_CHANNEL_INFO(curr, HWMON_C_INPUT | HWMON_C_CRIT | HWMON_C_CRIT_ALARM | + HWMON_C_LCRIT | HWMON_C_LCRIT_ALARM), HWMON_CHANNEL_INFO(power, HWMON_P_INPUT | HWMON_P_CRIT | HWMON_P_CRIT_ALARM), NULL From patchwork Fri Aug 30 01:05:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 13784084 Received: from mail-pg1-f173.google.com (mail-pg1-f173.google.com [209.85.215.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3DB5FEACD for ; Fri, 30 Aug 2024 01:06:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979984; cv=none; b=IXNGky9HH3S1UBP6BkWJnFbupNgcjXMoNbw3wc/PeD6bpkvLkfUqghzTbgDlCDpmZnWhqcpGbEwSe6G7+aOHd3lDMoCk8SgUAyy54ZSaeNUrAfFHqucMDmaErkL4hboQwM5O8Bj7diUkSna9wPBOUvdGLGjJd/JkV3DPk93lCNs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724979984; c=relaxed/simple; bh=DQ8IrRvC18+qbPGoSQyksidnzS9Fu7EIXduD5k6lqhI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=X19mZSSzyQTN3WEzuKfoVKOVPaUYsnCRx9hjSGuVr+KY/JnslbPFmqyN5qYo3GIK5IZoqz2KySKGRKIpbrajRYdl1Uyow0x9JoYef1OYE62RRFEjLKqsoO8HqkfOnevrxqo7l7b5FPpAPSUKUOzh8qMrAt++7TEZVvZt1oG3l4M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=TMk17tzb; arc=none smtp.client-ip=209.85.215.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="TMk17tzb" Received: by mail-pg1-f173.google.com with SMTP id 41be03b00d2f7-6bce380eb96so727106a12.0 for ; Thu, 29 Aug 2024 18:06:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724979982; x=1725584782; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=eKoMTmIMa24CF5rXgpxgytBpmS0Vzby+YrYsIsE0EfI=; b=TMk17tzbk+z7ca+EGrlKGYEmZ5cI4Oiq4BSIvOtk0ApX8gqkrieXWRGBZn8SJPw0Km eYx0n33SrH+4miRbuVhHaAkssMzgSV5oTHtarlH0YHhTAVLo9l+lYsgzL0+enfuQifVY KRV0w+4AaKMYZRlPomVWLHZ1bG+18M2H1ZEJfzQZ/1I+rhs9ArXzywLICNYsyXHhjRkb 2/jyJZFz9+24naf9rqEPjBD6TE+MN7tez9hIdZXq0KyVUizeV4XVrP31AfgRMC6XQ4v2 aG4nrXv2vR8ggJy3g4RSztP2RuUqBqTdgsUSLKSesVm43t1sxryMqWj+XoLtuZwgg6nT bFIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724979982; x=1725584782; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=eKoMTmIMa24CF5rXgpxgytBpmS0Vzby+YrYsIsE0EfI=; b=Oe5mjvLBYa07lXF2kA7GZTjSRG4GXArFW0ELpAVFu7rbAAZyowImUeqUfodShOAJ9G OwR/t7101a1ARi87BDs6BzV/8QNpaNelZaugZDgGmL4EnCjw53lX1yZIXOGXeNfmmMFD +Y8cgGA4STm6Qoc7FAQ64ov/BfxyHlkNjG0YRykZES9Qy/M0Y7rNGng0EH11U3aPIo3j 2ZaRZrgG0Y8jOtX36XxqECrmt8oWN94KhMYvJwVbOPT2fGMEsLz+MOm08SPckM87O0iL RJkIx+xA6rk64PcNLGY95lDqhhejP9bBLHAdXhUKqS5r0Zicqk2th7zjbwfag0YylOcG YsqQ== X-Gm-Message-State: AOJu0YwAvqTi0ujQqJpb6OdoGVpoMirEL4+PiLPhV8WpKyXYqFCSpf9i vnbeGlveKbpy+4VPCZnpMGGFPb73BupgVqE+7PCJR4QaWv3+aa/8mXoQzw== X-Google-Smtp-Source: AGHT+IHWNM6V7JOQIUn1q7fD5usI6Nvtl+tQiZ4F5kSA86Dsok8AYRknx/R1JHpjkvKsMDTB6t9SMQ== X-Received: by 2002:a17:90a:7802:b0:2cb:4c25:f941 with SMTP id 98e67ed59e1d1-2d8561a7107mr4629322a91.17.1724979981981; Thu, 29 Aug 2024 18:06:21 -0700 (PDT) Received: from server.roeck-us.net ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2d85b39d03asm2379129a91.43.2024.08.29.18.06.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Aug 2024 18:06:21 -0700 (PDT) Sender: Guenter Roeck From: Guenter Roeck To: Hardware Monitoring Cc: Tzung-Bi Shih , Guenter Roeck Subject: [PATCH v2 14/14] hwmon: (ina2xx) Use shunt voltage to calculate current Date: Thu, 29 Aug 2024 18:05:54 -0700 Message-ID: <20240830010554.1462861-15-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240830010554.1462861-1-linux@roeck-us.net> References: <20240830010554.1462861-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-hwmon@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Since the shunt voltage and the current register report the same values when the chip is calibrated, we can calculate the current directly from the shunt voltage without relying on chip calibration. With this change, the current register is no longer accessed. Its register address is only used to indicate if reading or writing current or shunt voltage is desired when accessing registers. Signed-off-by: Guenter Roeck Reviewed-by: Tzung-Bi Shih --- v2: New patch drivers/hwmon/ina2xx.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index 10c8c475c634..f0fa6d073627 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c @@ -480,6 +480,8 @@ static int ina2xx_curr_read(struct device *dev, u32 attr, long *val) { struct ina2xx_data *data = dev_get_drvdata(dev); struct regmap *regmap = data->regmap; + unsigned int regval; + int ret; /* * While the chips supported by this driver do not directly support @@ -492,7 +494,17 @@ static int ina2xx_curr_read(struct device *dev, u32 attr, long *val) */ switch (attr) { case hwmon_curr_input: - return ina2xx_read_init(dev, INA2XX_CURRENT, val); + /* + * Since the shunt voltage and the current register report the + * same values when the chip is calibrated, we can calculate + * the current directly from the shunt voltage without relying + * on chip calibration. + */ + ret = regmap_read(regmap, INA2XX_SHUNT_VOLTAGE, ®val); + if (ret) + return ret; + *val = ina2xx_get_value(data, INA2XX_CURRENT, regval); + return 0; case hwmon_curr_lcrit: return ina226_alert_limit_read(data, INA226_SHUNT_UNDER_VOLTAGE_MASK, INA2XX_CURRENT, val);